admin管理员组

文章数量:1638208

<link href="https://csdnimg/public/favicon.ico" rel="SHORTCUT ICON">
<title>LabVIEW如何方便地调用DLL文件_c/c++_weixin_33991418的博客-CSDN博客</title>
<meta name="description" content="转自:http://bbs.elecfans/jishu_469502_1_1.htmlLabVIEW调用DLL文件  LabVIEW支持通过调用DLL文件的方式与其它编程语言混合使用。比如,在实际的工程项目中,用户可以用C++语言实现软件的运算部分,并把这些功能构建在DLL文件中,然后再使用 LabVIEW编写程序的界面部分,并通过调用编写好的DLL来调用运算部分的功能...c/c++">
<script src='//g.csdnimg/tingyun/1.8.3/blog.js' type='text/javascript'></script>
    
                <link rel="stylesheet" href="https://csdnimg/release/phoenix/template/new_css/detail_enter-09a7a75ce5.min.css">
                        <script type="application/ld+json">{"@context":"https:\/\/ziyuan.baidu\/contexts\/cambrian.jsonld","@id":"https:\/\/blog.csdn\/weixin_33991418\/article\/details\/93900028","appid":1638831770136827,"title":"LabVIEW\u5982\u4f55\u65b9\u4fbf\u5730\u8c03\u7528DLL\u6587\u4ef6_c\/c++_weixin_33991418\u7684\u535a\u5ba2-CSDN\u535a\u5ba2","pubDate":"2018-01-22T16:18:00","upDate":"2018-01-22T16:18:00"}</script>

        <link rel="stylesheet" href="https://csdnimg/release/phoenix/template/themes_skin/skin3-template/skin3-template-3faf0f2897.min.css">
<script type="text/javascript">
    var username = "weixin_33991418";
    var blog_address = "https://blog.csdn/weixin_33991418";
    var static_host = "https://csdnimg/release/phoenix/";
    var currentUserName = "qq_35431097";
    var isOwner = false;
    var loginUrl = "http://passport.csdn/account/login?from=https://blog.csdn/weixin_33991418/article/details/93900028"
    var blogUrl = "https://blog.csdn/";

    var curSkin = "skin3-template";
    // 收藏所需数据
    var articleTitle = "LabVIEW如何方便地调用DLL文件";
    var articleDesc = "转自:http://bbs.elecfans/jishu_469502_1_1.htmlLabVIEW调用DLL文件  LabVIEW支持通过调用DLL文件的方式与其它编程语言混合使用。比如,在实际的工程项目中,用户可以用C++语言实现软件的运算部分,并把这些功能构建在DLL文件中,然后再使用 LabVIEW编写程序的界面部分,并通过调用编写好的DLL来调用运算部分的功能...c/c++";

    var articleTitles = "LabVIEW如何方便地调用DLL文件_c/c++_weixin_33991418的博客-CSDN博客";
    
    var nickName = "weixin_33991418";
    var isCorporate = false;
    var subDomainBlogUrl = "https://blog.csdn/"
    var digg_base_url = "https://blog.csdn/weixin_33991418";
    var articleDetailUrl = "https://blog.csdn/weixin_33991418/article/details/93900028";
    var isShowThird = "0"
    var skinStatus = "White"
    var canRead = true;
    
    var sideToolbarVersion = 2.2;
</script>
<script src="https://csdnimg/public/common/libs/jquery/jquery-1.9.1.min.js" type="text/javascript"></script>
<!--js引用-->
        <script src="//g.csdnimg/??fixed-sidebar/1.1.6/fixed-sidebar.js,report/1.5.0/report.js" type="text/javascript"></script>
<link rel="stylesheet" href="https://csdnimg/public/sandalstrap/1.4/css/sandalstrap.min.css">
<style>
    .MathJax, .MathJax_Message, .MathJax_Preview{
        display: none
    }
</style>
<div id="asideProfile" class="aside-box">
<div class="profile-intro d-flex">
    <div class="avatar-box d-flex justify-content-center flex-column">
        <a href="https://blog.csdn/weixin_33991418"  data-report-click='{"mod":"popu_379","dest":"https://blog.csdn/weixin_33991418","ab":"new"}'>
            <img src="https://profile.csdnimg/5/D/B/3_weixin_33991418" class="avatar_pic" username='weixin_33991418'>
        </a>
    </div>
    <div class="user-info d-flex flex-column profile-intro-name-box">
        <div>
                            <a href="https://blog.csdn/weixin_33991418" class="" id="uid" title='weixin_33991418' data-report-click='{"mod":"popu_379","dest":"https://blog.csdn/weixin_33991418","ab":"new"}' >
                <span class="name " username='weixin_33991418'>
                    weixin_33991418                    </span>
            </a>
            <span></span>
            <span class="flag expert-blog"><span class="bubble">CSDN认证博客专家</span></span>
            <span class="flag company-blog"><span class="bubble">CSDN认证企业博客</span></span>
        </div>
        <div class="profile-intro-name-boxFooter">
            <span class="personal-home-page">码龄4年</span>
        </div>
    </div>
</div>
<div class="data-info d-flex item-tiling">
            <dl class="text-center" title="170">
                        <dt><a href="https://blog.csdn/weixin_33991418" data-report-query="t=1"><span class="count">170</span></a></dt>
            <dd><a href="https://blog.csdn/weixin_33991418" data-report-query="t=1">原创</a></dd>
                </dl>
    <dl class="text-center" id="fanBox" title="735">
        <dt><span class="count" id="fan">735</span></dt>
        <dd>粉丝</dd>
    </dl>
    <dl class="text-center" title="47">
        <dt><span class="count">47</span></dt>
        <dd>获赞</dd>
    </dl>
    <dl class="text-center" title="1">
        <dt><span class="count">1</span></dt>
        <dd>评论</dd>
    </dl>
    <dl class="text-center" style="min-width:58px" title="302307">  
        <dt><span class="count">30万+</span></dt>
        <dd>访问</dd>
    </dl>
</div>
<div class="item-rank"></div>
<div class="data-info d-flex item-tiling">
    <dl class="text-center" title="1572">
        <dt><span class="count">1572</span></dt>
        <dd>积分</dd>
    </dl>
    <dl class="text-center" title="171">
        <dt><span class="count">171</span></dt>
        <dd>收藏</dd>
    </dl>
    <dl class="text-center" title="86730">
        <dt><span class="count">8万+</span></dt>
        <dd><a href="https://blog.csdn/rank/writing_rank" target="_blank">周排名</a></dd>
    </dl>
    <dl class="text-center" title="47811">
        <dt><span class="count">4万+</span></dt>
        <dd><a href="https://blog.csdn/rank/writing_rank_total" target="_blank">总排名</a></dd>
    </dl>
    <dl class="text-center" title="4级,点击查看等级说明">
        <dt><a href="https://blog.csdn/home/help.html#level"  target="_blank">
        <img class="level" src="https://csdnimg/identity/blog4.png"/>            </a>
        </dt>
        <dd>等级</dd>
    </dl>
</div>
<div class="aside-box-footer">
                <div class="badge-box d-flex">
            <div class="badge d-flex">
                                                                                                    <div class="icon-badge" title="1024勋章">
                                <div class="mouse-box">
                                    <img src="https://csdnimg/medal/1024@240.png" alt="">
                                    <div class="icon-arrow"></div>
                                </div>
                                <div class="grade-detail-box">
                                    <div class="pos-box">
                                        <div class="left-box d-flex justify-content-center align-items-center flex-column">
                                            <img src="https://csdnimg/medal/1024@240.png" alt="">
                                        </div>
                                        <div class="right-box">
                                            <div class="title">1024勋章</div>
                                            <div class="desc">#1024程序员节#活动勋章,当日发布原创博客即可获得</div>
                                        </div>
                                    </div>
                                </div>
                            </div>
                                                                                    </div>
            <script>
                (function($) {
                    setTimeout(function() {
                        $('div.icon-badge.show-moment').removeClass('show-moment');
                    }, 5000);
                })(window.jQuery)
            </script>
        </div>
            
</div>
    <div class="profile-intro-name-boxOpration">
    <div class='opt-letter-watch-box'>
        <a class="bt-button personal-letter" href="https://me.csdn/weixin_33991418" target="_blank" rel="noopener">TA的主页</a>
    </div>
    <div class='opt-letter-watch-box'>
        <a class="bt-button personal-letter" href=https://im.csdn/im/main.html?userName=weixin_33991418 target="_blank" rel="noopener">私信</a>
    </div>
    <div class="opt-letter-watch-box">
                        <a class="personal-watch bt-button" id="btnAttent" data-report-click='{"mod":"popu_379","ab":"new","extend1":"个人主页未关注"}'>关注</a>
                </div>
</div>
</div>
<div class="aside-content text-center" id="cpro_u2734133">
    <div id="kp_box_56" data-pid="56"><script  data-ad-client="ca-pub-1076724771190722" async src="//pagead2.googlesyndication/pagead/js/adsbygoogle.js"></script>

最新文章

  • 熟悉并了解uml的使用(一)
  • 关于“企业文化”的联想
  • LeetCode 53. Maximum Subarray 最大连续字段和问题
  • 15种独特能力让你在社会中鹤立鸡群
  • 美国绿卡申请条件

归档

2019 7月 6篇 6月 72篇 5月 48篇 4月 56篇 3月 59篇 2月 63篇 1月 99篇 2018 12月 59篇 11月 57篇 10月 39篇 9月 56篇 8月 66篇 7月 61篇 6月 41篇 5月 62篇 4月 49篇 3月 74篇 2月 38篇 1月 61篇 2017 12月 73篇 11月 244篇 10月 63篇 9月 70篇 8月 84篇 7月 93篇 6月 65篇 5月 65篇 4月 58篇 3月 54篇 2月 39篇 1月 38篇 2016 12月 41篇 11月 43篇 10月 32篇 9月 43篇 8月 55篇 7月 38篇 6月 44篇 5月 56篇 4月 49篇 3月 68篇 2月 24篇 1月 33篇 2015 12月 41篇 11月 39篇 10月 38篇 9月 35篇 8月 38篇 7月 43篇 6月 33篇 5月 30篇 4月 38篇 3月 40篇 2月 17篇 1月 27篇 2014 12月 14篇 11月 37篇 10月 32篇 9月 17篇 8月 25篇 7月 33篇 6月 30篇 5月 37篇 4月 31篇 3月 31篇 2月 15篇 1月 21篇 2013 12月 21篇 11月 22篇 10月 15篇 9月 17篇 8月 27篇 7月 28篇 6月 26篇 5月 33篇 4月 24篇 3月 28篇 2月 17篇 1月 30篇 2012 12月 28篇 11月 28篇 10月 23篇 9月 24篇 8月 23篇 7月 24篇 6月 20篇 5月 29篇 4月 10篇 3月 33篇 2月 19篇 1月 10篇 2011 12月 17篇 11月 18篇 10月 20篇 9月 11篇 8月 16篇 7月 20篇 6月 17篇 5月 19篇 4月 18篇 3月 24篇 2月 13篇 1月 9篇 2010 12月 13篇 11月 17篇 10月 9篇 9月 13篇 8月 19篇 7月 13篇 6月 5篇 5月 13篇 4月 15篇 3月 19篇 2月 4篇 1月 14篇 2009 12月 9篇 11月 14篇 10月 11篇 9月 13篇 8月 10篇 7月 13篇 6月 9篇 5月 9篇 4月 10篇 3月 8篇 2月 5篇 1月 8篇 2008 12月 5篇 11月 8篇 10月 13篇 9月 7篇 8月 11篇 7月 7篇 6月 7篇 5月 16篇 4月 14篇 3月 7篇 2月 4篇 1月 7篇 2007 12月 10篇 11月 9篇 10月 8篇 9月 6篇 8月 1篇 7月 6篇 6月 7篇 5月 6篇 4月 5篇 3月 5篇 2月 4篇 1月 5篇 2006 12月 3篇 11月 8篇 10月 10篇 9月 4篇 8月 2篇 7月 6篇 6月 2篇 4月 4篇 3月 1篇 2月 1篇 1月 2篇 2005 12月 1篇 11月 4篇 10月 4篇 9月 1篇 7月 5篇 6月 1篇 3月 3篇 2月 2篇 1月 3篇 2004 12月 2篇 10月 3篇 9月 1篇

热门文章

  •                 <a
                    data-report-click='{"mod":"popu_541","dest":"https://blog.csdn/weixin_33991418/article/details/86279174","ab":"new"}' 
                     href="https://blog.csdn/weixin_33991418/article/details/86279174" >
                                                win10怎么进入和退出安全模式?                        <img src="https://i-blog.csdnimg/blog_migrate/8ebe88751793e28d3ed60fa0b2a9fa59.png" alt=""><span class="read">6622</span>
                    </a>
    			</li>
    						<li>
    
                    <a
                    data-report-click='{"mod":"popu_541","dest":"https://blog.csdn/weixin_33991418/article/details/91496755","ab":"new"}' 
                     href="https://blog.csdn/weixin_33991418/article/details/91496755" >
                                                解决4G网络移动打不开网站,WiFi可以正常访问                        <img src="https://i-blog.csdnimg/blog_migrate/8ebe88751793e28d3ed60fa0b2a9fa59.png" alt=""><span class="read">4590</span>
                    </a>
    			</li>
    						<li>
    
                    <a
                    data-report-click='{"mod":"popu_541","dest":"https://blog.csdn/weixin_33991418/article/details/91440111","ab":"new"}' 
                     href="https://blog.csdn/weixin_33991418/article/details/91440111" >
                                                JS 应用篇(四):JS获取元素的高度                        <img src="https://i-blog.csdnimg/blog_migrate/8ebe88751793e28d3ed60fa0b2a9fa59.png" alt=""><span class="read">3969</span>
                    </a>
    			</li>
    						<li>
    
                    <a
                    data-report-click='{"mod":"popu_541","dest":"https://blog.csdn/weixin_33991418/article/details/93174581","ab":"new"}' 
                     href="https://blog.csdn/weixin_33991418/article/details/93174581" >
                                                uni-app · 支付宝小程序踩坑                        <img src="https://i-blog.csdnimg/blog_migrate/8ebe88751793e28d3ed60fa0b2a9fa59.png" alt=""><span class="read">2803</span>
                    </a>
    			</li>
    						<li>
    
                    <a
                    data-report-click='{"mod":"popu_541","dest":"https://blog.csdn/weixin_33991418/article/details/91419153","ab":"new"}' 
                     href="https://blog.csdn/weixin_33991418/article/details/91419153" >
                                                Java BufferedImage设置透明背景                        <img src="https://i-blog.csdnimg/blog_migrate/8ebe88751793e28d3ed60fa0b2a9fa59.png" alt=""><span class="read">2695</span>
                    </a>
    			</li>
    				</ul>
    </div>
    

LabVIEW如何方便地调用DLL文件

weixin_33991418 2018-01-22 16:18:00 72 收藏 2 最后发布:2018-01-22 16:18:00 首发:2018-01-22 16:18:00 原文链接: http://wwwblogs/zhengfa-af/p/8329576.html 展开 转自:http://bbs.elecfans/jishu_469502_1_1.html LabVIEW调用DLL文件   LabVIEW支持通过调用DLL文件的方式与其它编程语言混合使用。比如,在实际的工程项目中,用户可以用C++语言实现软件的运算部分,并把这些功能构建在DLL文件中,然后再使用 LabVIEW编写程序的界面部分,并通过调用编写好的DLL来调用运算部分的功能。   LabVIEW 中是通过Call Library Function Node(CLN)节点来完成DLL文件调用的。创建一个新的VI,右击程序框图,在Functions Palette中依次选中Connectivity——Libraries&Executables工具栏即可找到该节点(图1)。 <ignore_js_op>

1.jpg (24.15 KB, 下载次数: 2)

下载附件 保存到相册

2015-2-12 11:22 上传

图1 Call Library Function Node   将节点放置在程序框图中,双击会出现它的配置对话框,共有四页。第一页用于填写被调用函数的信息(图2)。Library name or path需给出DLL文件名和路径,操作系统路径下的DLL文件,直接输入文件名也可调用,否则必须输入全路径。在这里已经给出名字的DLL是被静态加载到程序中的,也就是说当调用了这个DLL的VI被装入内存时,DLL同时被装入内存。LabVIEW也可动态加载DLL,只要勾选上Specify path on diagram的选项即可。选择了这个选项,在 Library name or path中输入的内容就无效了,取而代之的是CLN 节点多出一对输入输出,用于指明所需要使用的DLL的路径。这样,当VI被打开时,DLL不会被装入内存,只用程序运行到需要使用这个DLL中的函数时,才把其装入内存。Function name是需要调用的函数的名称,LabVIEW会把DLL中所有的暴露出来的函数都列出,用户只要在下拉框中选取即可。Thread栏用于设定哪个线程里运行被调用的函数。用户可以通过 CLN 节点的配置面板来指定被调用函数运行所在的线程。CLN 的线程选项非常简单,只有两项: Run in UI thread和Run in any thread。LabVIEW的程序框图上直接可以看出一个 CLN节点是选用 的什么线程。如果Run in UI thread,节点颜色是橙色的;Run in any thread则是浅黄色的(图3)。 <ignore_js_op>

2.jpg (17.07 KB, 下载次数: 0)

下载附件 保存到相册

2015-2-12 11:22 上传

图2 填写被调用函数信息 <ignore_js_op>

3.jpg (6.68 KB, 下载次数: 0)

下载附件 保存到相册

2015-2-12 11:23 上传

图3 CLN不同线程对比   通常情况下,除非使用的动态链接库是多线程安全的,CLN 中选择Run in any thread方式;否则必须选择Run in UI thread方式。判断一个动态链接库是不是多线程安全的,需通过以下方法:如果一个动态链接库的文档中没有明确说明它是多线程安全的,那么就要当作是非多线程安全的;在可以看到动态链接库源代码的条件下,如果代码中存在全局变量、静态变量或者代码中看不到有lock一类的操作,那么这个动态链接库也就肯定不是多线程安全的。   选择了Run in any thread方式,LabVIEW会在最方便的线程内运行动态链接库函数,且一般会与调用它的VI在同一个线程内运行。因为LabVIEW是自动多线程的语言,它也很可能会把动态链接库函数分配给一个单独的线程运行。如果程序中存在没有直接或间接先后关系的两个CLN节点,LabVIEW很可能会同时在不同的线程内运行它们所调用的函数,也许是同一函数。对于非多线程安全的动态链接库,这是很危险的操作。很容易引起数据混乱,甚至是程序崩溃。   选择Run in UI thread方式,因为LabVIEW只有一个界面线程,所以如果所有的CLN设置都是界面线程,那么就可以保证这些CLN调用的函数肯定全部都运行在同一线程下,肯定不会被同时调用。对于非多线程安全的动态链接库,这种方式就保证了它的安全。   让我们回到配置对话框第一页,Calling convention用于指明被调用函数的调用约定。这里只支持两种约定:stdcall和C call。它们之间的区别在于,stdcall由被调用者负责清理堆栈,C call由调用者清理堆栈。这个设置错误时,可能会引起LabVIEW崩溃,也就是说如果LabVIEW调用DLL函数时出现异常,首先应该考虑这个设置是否正确。(Windows API一般使用的都是stdcall;标准C的库函数大多使用C call。如果函数声明中有类似__stdcall这样的关键字,它就是stdcall的。)第二页是函数参数的配置(图4)。 <ignore_js_>

4.jpg (13.76 KB, 下载次数: 0)

下载附件 保存到相册

2015-2-12 11:23 上传

图4 配置函数的参数   DLL和LabVIEW之间传递参数,最常用的三种数据类型是数值、数值型数组和字符串。C语言中经常把指针或者数据的地址在函数间传递,在32位操作系统中,可以使用int32数值来表示指针。因此,当需要在LabVIEW中传递指针数据时,可以使用I32或U32数值类型来表示这个地址类型的数据。但是,64位的程序中,数据的地址只能使用I64或U64来表示。这样,如果一个调用了DLL函数的VI,并且函数参数中有地址型数据,使用固定数据类型的数值来表示地址,就要准备两份代码。解决方法是使用LabVIEW中的新的数据类型Pointer-sized Integer。这个数据类型的长度在不同的平台上会自动使用32位或64位长度。如果在C语言函数参数声明中有const关键字,可以选中Constant选项。布尔类型在DLL函数和LabVIEW VI之间传递没有专有的数据类型,是利用数值类型来传递的。输入时先把布尔值转变为数值,在传递给DLL函数;输出时再把数值转为布尔值。对于数组的传递,LabVIEW只支持C数据类型中的数值型数组,传递数组类型需要注意的的是“Array Format”要选择“Array Data Pointer”。这个设置中还有其他两个选项,带有“Handle”的参数类型都是表示LabVIEW定义的特殊类型的。在第三方的DLL中不会使用到数组参数作为输出值时,要记得为输出的数组数开辟空间。开辟数据空间的方法有两种:第一种方法,创建一个长度满足要求的数组,作为初始值传递给参数,输出数的数据就会被放置在输入数组的所在的内存空间内。第二种方法是直接在参数配置面板上进行设置。在Minimum size中写入一个固定的数值,LabVIEW就会按此大小为输出的数组开辟空间。在 Minimum size 中选择函数的其它数值参数,而不是固定数值。这样LabVIEW会按照当时被选择的参数值的大小来开辟空间。字符串与使用与数组是非常类似的,实际上在C语言中字符串就是一个I8数组。 在NI软件的安装路径下打开当前使用版本的LabVIEW文件夹,通过 examples\dll\data passing\Call NativeCode.llb找到简单数据类型在LabVIEW与C之间的对应关系。部分常见关系见表1。 <ignore_js_op>

5.jpg (39.05 KB, 下载次数: 0)

下载附件 保存到相册

2015-2-12 11:23 上传

<ignore_js_op>

6.jpg (19.95 KB, 下载次数: 0)

下载附件 保存到相册

2015-2-12 11:23 上传

<ignore_js_op>

7.jpg (33.51 KB, 下载次数: 0)

下载附件 保存到相册

2015-2-12 11:23 上传

<ignore_js_op>

8.jpg (45.04 KB, 下载次数: 0)

下载附件 保存到相册

2015-2-12 11:23 上传

表1 数据类型对比   第三页用于为DLL设置一些回调函数,可以使用这些回调函数在特定的情形下完成初始化、清理资源等工作(图5)。 <ignore_js_op>

9.jpg (15.24 KB, 下载次数: 0)

下载附件 保存到相册

2015-2-12 11:24 上传

图5 设置回调函数   如果为Reserve选择了一个回调函数,那么当一个新的线程开始调用这个DLL时,这个回调函数首先被调用。可以利用这个函数为新线程使用到的数据做初始化工作。线程在使用完这个DLL之后,它会去调用Unreserve中指定的回调函数。Abort中指定的函数用于VI非正常结束时被调用,也就是让一个程序在运行完前停止。这些回调函数的原型在Prototype for these procedures中列出,必须要由DLL的开发者按照特定的格式实现。如果使用的DLL不是专为LabVIEW设计的,一般不会包含这样的回调函数。   第四页是错误处理方式,用户可根据需要选择相应的错误检查级别。   另外还需要注意的是,C语言中的struct在LabVIEW中可以使用cluster来表示,但有时需要作出相应的调整。这是因为在C语言中,struct的字节对齐是可以进行设置的,这就决定了其各元素的存放地址的可变性。C语言中的对字节对齐数可通过#pragma pack指令或在工程属性中进行指定。而在LabVIEW的cluster中,所有元素只能是1字节对齐的,所以如果要和C语言中非1字节对齐的struct对应,需要做出一些调整。比如,对于C语言中2字节对齐的struct,第一个元素如果是I8型的,在LabVIEW的cluster中第一个元素对应不变,但不能紧挨着放第二个元素,必须留一个无意义的空位。C语言的struct其实也是如此,只不过没有表现出来。所以为了方便,如果自己用C语言生成DLL文件供LabVIEW调用最好将struct都设为1字节对齐。C语言的struct中可以嵌套数组,但是这和LabVIEW中含有数组元素的cluster是不一样的,LabVIEW中需要将数组中的元素都拆开放入cluster中。   如果C语言的struct中含有一个指针,LabVIEW中的cluster只能用一个U32数值(32位系统上,64位系统上使用U64)来表示指针的地址,而不能将指针所指向的内容放到Cluster中去。如果声明的是指向struct的指针,才能在LabVIEW中使用cluster与之对应。CLN节点的配置面板中,没有一个专门命名的“struct”或者“cluster”参数类型,应选择“Adapt to Type”就可以了。如果参数的类型就是结构而非指针,考虑到C函数参数的压栈顺序,把一个结构体作为参数传给函数,相当于把结构中每个元素分别作为参数传递给函数。图6为C语言中struct和LabVIEW中cluster的部分匹配图。 <ignore_js_op>

10.jpg (20.07 KB, 下载次数: 0)

下载附件 保存到相册

2015-2-12 11:24 上传

图6 struct和cluster匹配 LabVIEW打包DLL文件 我们接下来学习如何使用LabVIEW来打包一个DLL文件。   首先我们编写一个名为Scale.vi的程序,功能很简单就是对输入的数据乘上10,然后再输出(图7)。 <ignore_js_op>

11.jpg (18.08 KB, 下载次数: 0)

下载附件 保存到相册

2015-2-12 11:24 上传

图7 scale.vi   必须在任务管理器中才能生成.dll文件。所以我们首先建立一个project,过程如下: 点击File>>New Project: <ignore_js_op>

12.jpg (20.14 KB, 下载次数: 0)

下载附件 保存到相册

2015-2-12 11:24 上传

图8 生成新项目   接着弹出是否将该VI添加到新项目的对话框: <ignore_js_op>

13.jpg (13.71 KB, 下载次数: 0)

下载附件 保存到相册

2015-2-12 11:24 上传

图9 是否添加VI到新建项目   选择Add,生成新的项目管理器,将其保存在需要的路径下: <ignore_js_op>

14.jpg (16.51 KB, 下载次数: 0)

下载附件 保存到相册

2015-2-12 11:24 上传

图10 项目管理器   右键单击项目浏览器窗口中的Build Specifications,在快捷菜单中选择New>>Shared Library(DLL),弹出对DLL文件进行设置的对话框。点击Category>>Information,根据自己需求修改Build specification name和Target filename: <ignore_js_op>

15.jpg (16.02 KB, 下载次数: 0)

下载附件 保存到相册

2015-2-12 11:25 上传

图11 Information页面   点击Source Files>>Project Files>> Scale.vi>> ,弹出对话框,直接用默认值,点击OK: <ignore_js_op>

16.jpg (18.16 KB, 下载次数: 0)

下载附件 保存到相册

2015-2-12 11:25 上传

图12 Define VI Prototype   点击Destination>> Scale.dll,点击 ,可选择需要保存的路径。然后再点击Support Directory,这是指明了DLL支持文件的路径(比如数据文件之类的放在哪个文件夹),选择默认即可: <ignore_js_op>

17.jpg (14.52 KB, 下载次数: 0)

下载附件 保存到相册

2015-2-12 11:25 上传

图13 Destination页面   Category中的Source Files可供用户对打包VI的属性和密码做一些设置;Advanced和Additional Exclusions可以做一些高级的设置,这些均按默认值即可。Version Information可让用户填写版本号、名称、版权、公司等信息: <ignore_js_op>

18.jpg (19.1 KB, 下载次数: 0)

下载附件 保存到相册

2015-2-12 11:25 上传

图14 Version Information 点击Run-Time Languages,可对支持语言进行选择,默认即可。点击Preview>>Generate Preview,可以预览到结果: <ignore_js_op>

19.jpg (16.45 KB, 下载次数: 0)

下载附件 保存到相册

2015-2-12 11:25 上传

图15 预览生成 点击Build,弹出生成状态对话框: <ignore_js_op>

20.jpg (13.28 KB, 下载次数: 0)

下载附件 保存到相册

2015-2-12 11:25 上传

图16 生成状态框 点击Done,生成完成,打开DLL文件保存的路径查看: <ignore_js_op>

21.jpg (28 KB, 下载次数: 0)

下载附件 保存到相册

2015-2-12 11:26 上传

图17 DLL文件保存路径 LabVIEW调用DLL文件   LabVIEW可以方便地调用DLL文件,这些DLL文件可以是其他编译工具,如VC,生成的。   LabVIEW可以直接通过CLN节点来调用DLL文件,以前面生成的Scale.dll文件为例。现有一个内部定时连续采集程序,通过调用该DLL文件,使读取的值为实际采集值的10倍(图18)。 <ignore_js_op>

22.jpg (14.89 KB, 下载次数: 0)

下载附件 保存到相册

2015-2-12 11:26 上传

图18 连续采集程序 方法一   在程序框图放入Call Library Function Node,双击弹出对话框。在Function页面的Library name or path中给入生成的Scale.dll文件的路径,Function name选择Scale,其他选项默认。 <ignore_js_op>

23.jpg (21.43 KB, 下载次数: 0)

下载附件 保存到相册

2015-2-12 11:26 上传

图19 Function页面   由于是LabVIEW生成的DLL文件,在Parameters页面不需要做改动,但是由于VI还有一路输出,所以还需要添加一个参数y,作为DLL文件的输出。   如果是C语言等非LabVIEW生成的DLL函数,需要将retuen type的type选项和Data type选项改成函数定义的参数类型,对于函数里输入的参数也都需要自行添加。Callbacks和Error Checking则不需要改动。 <ignore_js_op>

24.jpg (25.39 KB, 下载次数: 0)

下载附件 保存到相册

2015-2-12 11:26 上传

图20 Parameters页面   点击“OK”,将生成的CLN的输入段连接到DAQmx Read.vi,return type输出连接到波形图表上,即可实现采集值放大10倍的功能。 <ignore_js_op>

25.jpg (15.98 KB, 下载次数: 0)

下载附件 保存到相册

2015-2-12 11:26 上传

图21 完成后的程序 方法二 LabVIEW中还有一种方法可以调用DLL文件,在VI的选项栏,依次选择Tools——Import——Shared Library(.dll),弹出Import Shared Library对话框。 <ignore_js_op>

26.jpg (33.08 KB, 下载次数: 0)

下载附件 保存到相册

2015-2-12 11:27 上传

图22 生成Import Shared Library对话框   选择Create VIs for a shared library,点击Next,在Shared Library(.dll) Files中输入Scale.dll文件的路径,Head(.h) File里填写头文件的路径。 <ignore_js_op>

27.jpg (15.83 KB, 下载次数: 0)

下载附件 保存到相册

2015-2-12 11:27 上传

图23 选择DLL文件路径和头文件路径   点击Next,如果DLL文件中依赖其他的一些DLL文件,需要在Include Paths中填写这些文件的路径。其他选项可以根据客户需求设置,一般默认即可。这样一直点击Next到最后,选择Open the generated library,点击Finish。这样可以生成一个.lvlib格式的库文件,里面包含了Scale.vi,这是将调用该DLL文件的方法封装好的VI,只留下输入和输出接口,方便运用到LabVIEW的程序中。直接将Scale.vi拖放到刚才的连续采集中即可完成方法一的功能。 <ignore_js_op>

28.jpg (14.56 KB, 下载次数: 0)

下载附件 保存到相册

2015-2-12 11:27 上传

图24 完成的程序 VC调用LabVIEW生成的DLL文件   刚才介绍了LabVIEW调用DLL文件的方法,使用VC调用LabVIEW生成的DLL文件也很简单。还是以之前生成Scale 的DLL文件为例,不同的是采集电压程序使用的是C语言的例程,但和LavVIEW实现的功能相同。   首先将先前生成Scale DLL文件时,路径下所有的文件全部复制粘帖到C语言例程的文件夹下。打开连续采集程序,点击状态栏的Project——Settings,在Project Settings对话框中加载入Scale.lib的静态链接库。   在程序中键入#include "Scale.h",以便引入该DLL函数。下面是C程序的代码,功能是有限点采集电压,通过Scale.dll文件实现采样值放大10倍的功能。加粗部分是因为调用DLL文件所做的改动。
  1 #include
  2 #include "NIDAQmx.h"
  3 #include "Scale.h"
  4 
  5 #define DAQmxErrChk(functionCall) if( DAQmxFailed(error=(functionCall)) ) goto Error; else
  6 
  7 
  8 
  9 int main(void)
 10 
 11 {
 12 
 13 int32 error=0;
 14 
 15 TaskHandle taskHandle=0;
 16 
 17 int32 read;
 18 
 19 float64 data[1000];
 20 
 21 char errBuff[2048]={'\0'};
 22 
 23 int i=0;
 24 
 25 double x10=0;
 26 
 27 
 28 
 29 
 30 
 31 /*********************************************/
 32 
 33 // DAQmx Configure Code
 34 
 35 /*********************************************/
 36 
 37 DAQmxErrChk (DAQmxCreateTask("",&taskHandle));
 38 
 39 DAQmxErrChk (DAQmxCreateAIVoltageChan(taskHandle,"Dev1/ai0"/*Config correct device*/,"",DAQmx_Val_Cfg_Default,-10.0,10.0,DAQmx_Val_Volts,NULL));//
 40 
 41 DAQmxErrChk (DAQmxCfgSampClkTiming(taskHandle,"",10000.0,DAQmx_Val_Rising,DAQmx_Val_FiniteSamps,1000));
 42 
 43 
 44 
 45 /*********************************************/
 46 
 47 // DAQmx Start Code
 48 
 49 /*********************************************/
 50 
 51 DAQmxErrChk (DAQmxStartTask(taskHandle));
 52 
 53 
 54 
 55 /*********************************************/
 56 
 57 // DAQmx Read Code
 58 
 59 /*********************************************/
 60 
 61 DAQmxErrChk (DAQmxReadAnalogF64(taskHandle,1000,10.0,DAQmx_Val_GroupByChannel,data,1000,&read,NULL));
 62 
 63 
 64 
 65 printf("Acquired %d points\n",read);
 66 
 67 
 68 
 69 for(i=0;i<1000;i++){
 70 
 71 Scale(data, &x10);
 72 
 73 printf("the %d Value is : %f \n",i,x10);
 74 
 75 
 76 
 77 }
 78 
 79 Error:
 80 
 81 if( DAQmxFailed(error) )
 82 
 83 DAQmxGetExtendedErrorInfo(errBuff,2048);
 84 
 85 if( taskHandle!=0 ) {
 86 
 87 /*********************************************/
 88 
 89 // DAQmx Stop Code
 90 
 91 /*********************************************/
 92 
 93 DAQmxStopTask(taskHandle);
 94 
 95 DAQmxClearTask(taskHandle);
 96 
 97 }
 98 
 99 if( DAQmxFailed(error) )
100 
101 printf("DAQmx Error: %s\n",errBuff);
102 
103 printf("End of program, press Enter key to quit\n");
104 
105 getchar();
106 
107 return 0;
108 
109 }

所以,使用LabVIEW不仅可以方便地调用各种编译软件生成的DLL文件,自己也能生成DLL文件供其他编译软件调用。这样,用户在编写大型项目时更加灵活,也为熟悉C语言的工程师提供了巨大的方便。本文只对LabVIEW和VC相互调用DLL文件做了简单的介绍,很多高级功能和技巧,用户可以在实际运用中逐渐掌握。

转载于:https://wwwblogs/zhengfa-af/p/8329576.html

本文标签: LabVIEWdll