孔令剛,范多旺,夏榮斌,2(.蘭州交通大學(xué)國(guó)家綠色鍍膜技術(shù)與裝備工程技術(shù)研究中心,甘肅蘭州730070;2.常州大成綠色鍍膜科技有限公司,江蘇常州23000)
?
LabWindows/CVI調(diào)用動(dòng)態(tài)鏈接庫(kù)與PLC實(shí)現(xiàn)以太網(wǎng)通信
孔令剛1,范多旺1,夏榮斌1,2
(1.蘭州交通大學(xué)國(guó)家綠色鍍膜技術(shù)與裝備工程技術(shù)研究中心,甘肅蘭州730070;2.常州大成綠色鍍膜科技有限公司,江蘇常州213000)
摘要:以LabWindows/CVI跨平臺(tái)調(diào)用動(dòng)態(tài)鏈接庫(kù)存在的問(wèn)題為切入點(diǎn),以調(diào)用基于Visual Basic開發(fā)的第3方動(dòng)態(tài)鏈接庫(kù)為例詳細(xì)闡述了LabWindows/CVI內(nèi)嵌的ActiveX控制器向?qū)?shí)現(xiàn)動(dòng)態(tài)鏈接庫(kù)的調(diào)用過(guò)程,以此為基礎(chǔ),在LabWindows/CVI環(huán)境下調(diào)用omron_plc_ethernet.dll,實(shí)現(xiàn)與歐姆龍PLC的工業(yè)以太網(wǎng)通信。為L(zhǎng)abWindows/CVI應(yīng)用工業(yè)以太網(wǎng)通信提供了一種解決方法,該通信已成功應(yīng)用于大型連續(xù)真空鍍膜生產(chǎn)線測(cè)控系統(tǒng),長(zhǎng)期運(yùn)行結(jié)果表明穩(wěn)定可靠。
關(guān)鍵詞:虛擬儀器軟件;動(dòng)態(tài)鏈接庫(kù);可編程邏輯控制器;以太網(wǎng)通信
LabWindows/CVI是美國(guó)NI(national instruments)公司開發(fā)的面向計(jì)算機(jī)測(cè)控領(lǐng)域的虛擬儀器軟件開發(fā)平臺(tái),為C語(yǔ)言程序員提供集成開發(fā)環(huán)境(IDE),在此開發(fā)環(huán)境中可以創(chuàng)建數(shù)據(jù)采集、分析和顯示以及儀器控制的應(yīng)用程序;開發(fā)IVI儀器驅(qū)動(dòng)程序和創(chuàng)建ActiveX服務(wù)器;為其它程序開發(fā)C目標(biāo)模塊、動(dòng)態(tài)連接庫(kù)(DLL)、C語(yǔ)言庫(kù)等[1-3]。動(dòng)態(tài)鏈接庫(kù)技術(shù)(DLL)是Windows的一種極其重要的代碼共享技術(shù),可為其他可執(zhí)行文件提供共享函數(shù)[4-5]。DLL獨(dú)立于編程語(yǔ)言,通過(guò)導(dǎo)出函數(shù)將特定的變量和函數(shù)交給應(yīng)用程序使用。
在LabWindows/CVI環(huán)境中,上位機(jī)在以太網(wǎng)上采用TCP/IP協(xié)議與PLC通信,利用Socket編程,通過(guò)IP地址、端口號(hào)向PLC發(fā)送數(shù)據(jù)并接收應(yīng)答數(shù)據(jù),通過(guò)頭文件TCP.H中的TCP/IP函數(shù),向PLC發(fā)送命令。需要注意的是,向PLC發(fā)送的數(shù)據(jù)必須進(jìn)一步按照FINS協(xié)議進(jìn)行封裝,接收時(shí)需要解開封裝,這需要對(duì)充分理解FIN協(xié)議[6]。為簡(jiǎn)化應(yīng)用,OMRON公司或第3方提供通信協(xié)議驅(qū)動(dòng)程序FINSGETWAY、動(dòng)態(tài)鏈接OMRON_ PLC_FINS等提供的接口函數(shù),可以更方便、更可靠地實(shí)現(xiàn)上位機(jī)與PLC之間的Ethernet通信。
本文主要闡述LabWindows/CVI環(huán)境下通過(guò)跨平臺(tái)調(diào)用ActiveX DLL實(shí)現(xiàn)與歐姆龍PLC進(jìn)行Ethernet通信的方法。
1.1DLL調(diào)用的一般方法
DLL調(diào)用即將DLL文件映射到用戶進(jìn)程地址空間,然后進(jìn)行函數(shù)調(diào)用,調(diào)用方法與進(jìn)程內(nèi)部一般函數(shù)的調(diào)用方法相同,Windowins提供隱式調(diào)用與顯式調(diào)用兩種方式將DLL映射到進(jìn)程空間。
隱式調(diào)用需要在客戶端引入頭文件,并在鏈接時(shí)指明dll對(duì)應(yīng)的lib文件位置和名稱。此文件包含DLL允許應(yīng)用程序調(diào)用的所有函數(shù)列表。LINKER檢測(cè)應(yīng)用程序調(diào)用了LIB文件中的某個(gè)函數(shù)時(shí),就會(huì)在應(yīng)用程序EXE文件中加入相關(guān)信息。該應(yīng)用程序運(yùn)行時(shí),系統(tǒng)會(huì)查看這個(gè)文件的DLL信息,后將DLL文件映射到地址空間。LabWindows/CVI使用一個(gè)外部的DLL時(shí),典型的應(yīng)用如在調(diào)用第3方提供的儀器驅(qū)動(dòng)時(shí),儀器生產(chǎn)廠商會(huì)提供一個(gè)DLL。但通常不會(huì)為CVI這樣的編譯器提供導(dǎo)入library,但會(huì)帶有一個(gè)C的頭文件(.h),包含有DLL中函數(shù)的原型。使用對(duì)應(yīng)的頭文件在CVI開發(fā)環(huán)境可以為DLL創(chuàng)建導(dǎo)入library。在CVI中打開頭文件,從頭文件源代碼窗口的菜單欄中選擇“Options”,再選擇“Generate DLL Import Library”,通過(guò)瀏覽文件的方式選擇DLL,生成導(dǎo)入library。
在只提供DLL文件而沒(méi)有其相關(guān)的LIB文件和頭文件的情況下,可通過(guò)Windows API函數(shù)如LoadLibrary(),GetProcAddress(),F(xiàn)reeLibrary()進(jìn)行顯示調(diào)用。顯示調(diào)用能夠更加有效地使用內(nèi)存,編寫大型程序時(shí)往往使用顯示調(diào)用。該方法使用LoadLibrary或AfxLoadLibrary函數(shù)對(duì)DLL進(jìn)行動(dòng)態(tài)加載;使用GetProcessAdress獲得所調(diào)用函數(shù)的指針,再通過(guò)函數(shù)指針來(lái)調(diào)用DLL的導(dǎo)出函數(shù);使用完畢后以Free Library或者Afx-FreeLibrary將DLL從地址空間中卸載。
1.2LabWindows/CVI跨平臺(tái)調(diào)用DLL存在的問(wèn)題
顯式調(diào)用DLL時(shí)的方法,當(dāng)生成DLL文件的導(dǎo)出函數(shù)列表時(shí),編譯器可能改變導(dǎo)出函數(shù)的名稱,若采用C編譯環(huán)境,可以在前面加上一個(gè)extern“C”來(lái)讓避免編譯器將導(dǎo)出函數(shù)改名,也可以給DLL工程中加入一個(gè).def文件,在.def文件中的EXPORTS下面寫上你的導(dǎo)出函數(shù)的名稱例如:EXPORTS void MyFunction();這樣在其他應(yīng)用程序中調(diào)用這個(gè)導(dǎo)出函數(shù)的時(shí)候,就不會(huì)出現(xiàn)找不到這個(gè)函數(shù)的問(wèn)題了(一般情況下,如果找不到函數(shù)GetProcAddress()函數(shù)的返回值為空),而且如果調(diào)用DLL中導(dǎo)出函數(shù)的應(yīng)用程序是其他開發(fā)語(yǔ)言編寫的程序,用.def這種方法同樣適用,而第1種方法就不適用了。但VB-COM組建類DLL不提供LIB文件和頭文件,LabWindows/CVI既不能直接采用隱式調(diào)用的方法,也不能直接采用顯式調(diào)用的方法。
2.1LabWindows/CVI ActiveX控制器向?qū)Ш?jiǎn)介
LabWindows/CVI ActiveX控制器向?qū)檎{(diào)用ActiveX servers進(jìn)行C語(yǔ)言的轉(zhuǎn)換。完整的轉(zhuǎn)換步驟如下所示:1)選擇Tools?Create ActiveX Controller打開ActiveX控制器向?qū)В?)選擇LabWindows/CVIActiveX控制器向?qū)е辛谐龅囊言谟?jì)算機(jī)中登記的ActiveX servers或控件;3)控制器向?qū)凑蛰斎氲哪繕?biāo)文件名和后綴進(jìn)行轉(zhuǎn)換,生成LabWindows/CVI儀器面板形式的C代碼。如:MyClient.fp,LabWindows/CVI自動(dòng)生成4個(gè)文件,如MyClient.fp,MyClient.sub,MyClient.c,and MyClient.h。
2.2控制器向?qū)мD(zhuǎn)換規(guī)則
本文以AServer.Dll命名的ActiveX Server為例來(lái)介紹LabWindows/CVI內(nèi)嵌的ActiveX控制器向?qū)Чぞ哌M(jìn)行C語(yǔ)言包裝轉(zhuǎn)換的規(guī)則和過(guò)程,生成的Aobject對(duì)象包括2個(gè)導(dǎo)出接口,其中接口AInterface1包含AMethod1()方法和AProperty1“整數(shù)”屬性,接口AInterface2包含AMethod2()方法和AProperty2“整數(shù)”屬性。Object對(duì)象的結(jié)構(gòu)如圖1所示。
圖1 Object對(duì)象的結(jié)構(gòu)示意圖Fig.1 Structural diagram of object
2.2.1包裝命名約定
ActiveX控制器向?qū)樵贏ctiveX server中生效的每個(gè)接口生成一個(gè)函數(shù)面板類,每一個(gè)函數(shù)面板類中向?qū)⑸蒒ew,Active和Open函數(shù),函數(shù)的命名規(guī)則如下:
如果同一個(gè)的接口被另一個(gè)對(duì)象應(yīng)用,函數(shù)的命名規(guī)則如下:
應(yīng)用上述命名規(guī)則,得到下面的函數(shù)名:
AServer_NewExampleObject1AInterface1
AServer_NewExampleObject2AInterface1
AServer_NewExampleObject1AInterface1和AServer_NewExampleObject2AInterface1 2個(gè)包裝函數(shù)創(chuàng)建對(duì)象的新實(shí)例,相當(dāng)于Visual Basic中的CreateObject函數(shù),在包裝函數(shù)中,ActiveX對(duì)象對(duì)應(yīng)于LabWindows/CVI中的CAObjHandle類型,相當(dāng)于Visual Basic中的Object類型,通過(guò)LabWindows/CVI用戶接口庫(kù)中的函數(shù)GetObjHandleFromActiveXCtrl可得到加載面板中該對(duì)象的句柄。
CAObjHandle obj1,obj2;
AServer_NewAInterface1(0,1,LOCALE_NEUTRAL,0,&obj1);
AServer_NewAInterface2(0,1,LOCALE_NEUTRAL,0,&obj2).
2.2.2接口中方法與屬性包裝命名約定
對(duì)應(yīng)于ActiveX接口的函數(shù)面板類,LabWindows/CVI ActiveX控制器向?qū)榻涌谥蟹椒ㄅc屬性生成包裝函數(shù),命名規(guī)則如下:
調(diào)用AMethod1:
CAObjHandle obj;
AServer_NewIAInterface1(0,1,LOCALE_ NEUTRAL,0,&obj);
AServer_IAInterface1AMethod1(obj,0);
調(diào)用Get,SetAProperty1:
CAObjHandle obj;
int AProp;
AServer_NewIAInterface1(0,1,LOCALE_NEUTRAL,0,&obj);
AServer_IAInterface1GetAProperty1(obj,0,&AProp);
AServer_IAInterface1SetAProperty1(obj,0,42);
當(dāng)停止使用ActiveX對(duì)象時(shí),需調(diào)用CA_DiscardObjHandle函數(shù)銷毀對(duì)象句柄,相當(dāng)于在Visual Basic中將對(duì)象設(shè)置為Nothing。
CAObjHandle obj;
AServer_NewIAInterface1(0,1,LOCALE_NEUTRAL,0,&obj);
CA_DiscardObjHandle(obj).
首先在WINDOWS系統(tǒng)中登記注冊(cè)“OMRON_PLC_FINS.dll”,并將dll文件復(fù)制到CVI工程目錄中,打開CVI工程,從工具下找到“Creative ActiveX Controller Wizard”,打開ActiveX控制器向?qū)?,按?.1中介紹的步驟進(jìn)行C包裝轉(zhuǎn)化,生成“.fp、.sub、.c,、.h”文件。在主函數(shù)中調(diào)用的過(guò)程如下:
int __stdcall WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpszCmdLine,int nCmd-Show)
{
CAObjHandle objecthandle=NULL;
OMRONFINS_New_OMRON_PLC_ENT(0,1,LOCALE_NEUTRAL,0,&objecthandle);
OMROFINS_OMRON_PLC_ENTLink(objecthandle,0,pcIP,pcPort,plcIP,plcPort,arg5);
OMRONFINS _OMRON_PLC_ENTCIO_Read(objecthandle,NULL,0,1,&dAry,arg4);
OMRONFINS _OMRON_PLC_ENTCIO_Write(objecthandle,NULL,0,1,&dAry,arg4);
CA_DiscardObjHandle(objecthandle);
return 0;
}
上述基于LabWindows/CVI和OMRON-PLC 的Ethernet通信網(wǎng)絡(luò)方式可以構(gòu)建IPC與歐姆龍全系列PLC的M:N(最大32臺(tái))控制系統(tǒng)架構(gòu),為設(shè)計(jì)大型生產(chǎn)線測(cè)控系統(tǒng)提供穩(wěn)定可靠的技術(shù)方案。該方案已成功應(yīng)用于大型連續(xù)真空鍍
膜生產(chǎn)線測(cè)控系統(tǒng),系統(tǒng)結(jié)構(gòu)如圖2所示。
圖2 生產(chǎn)線Ethernet控制網(wǎng)絡(luò)示意圖Fig.2 Ethernet control diagram of product line
通過(guò)第3方提供通信協(xié)議驅(qū)動(dòng)程序可以方便可靠地實(shí)現(xiàn)IPC與歐姆龍PLC之間較為復(fù)雜的Ethernet通信,LabWindows/CVI集成的ActiveX控制器向?qū)榭缙脚_(tái)調(diào)用ActiveX DLL提供了快捷有效的工具,本文介紹的調(diào)用Visual Basic語(yǔ)言的ActiveX servers的方法也同樣適用于C++,Java,C#等語(yǔ)言的情況。基于LabWindows/CVI和OMRON-PLC的Ethernet通信網(wǎng)絡(luò)架構(gòu)已成功應(yīng)用于大型連續(xù)真空鍍膜生產(chǎn)線控制系統(tǒng),具有很強(qiáng)的可擴(kuò)展性,長(zhǎng)期運(yùn)行結(jié)果表明通信穩(wěn)定可靠。
參考文獻(xiàn)
[1]劉君華.虛擬儀器編程語(yǔ)言LabWindows/CVI教程[M].北京:電子工業(yè)出版社,2001.
[2]王建新,隋美麗. LabWindows/CVI虛擬儀器高級(jí)應(yīng)用[M].北京:化學(xué)工業(yè)出版社,2013.
[3]雷金波,陳進(jìn),李毅,等.基于LabWindows/CVI的卷曲機(jī)實(shí)時(shí)狀態(tài)監(jiān)測(cè)系統(tǒng)[J].計(jì)算機(jī)工程與應(yīng)用,2007,43(16):222-224.
[4]耿娟,原亮,吳彩華. DLL在LabWindows/CVI的虛擬儀器中的應(yīng)用[J].微計(jì)算機(jī)信息,2006,28(22):115-116.
[5]姜飛,謝致龍,岳蕊霞.對(duì)話框方式下的DLL軟件混合編程與工程運(yùn)用[J].電氣傳動(dòng),2007,37(5):49-52.
[6]戴斌,朱建平,袁焱.基于FINS協(xié)議的OMRON PLC與上位機(jī)以太網(wǎng)通信的實(shí)現(xiàn)[J].電子技術(shù),2009,36(9):13-16.
修改稿日期:2015-07-12
Method on Ethernet Communication Between LabWindows /CVI with PLC Via Cross-platform DLL
KONG Linggang1,F(xiàn)AN Duowang1,XIA Rongbin1,2
(1. National Engineering Research Center for Technology and Equipment of Environmental Deposition,Lanzhou Jiaotong University,Lanzhou 730070,Gansu,China;2. Changzhou Dacheng Environmental Deposition Technology Co.,Ltd.,Changzhou 213000,Jiangsu,China)
Abstract:Discussed the problems of LabWindows/CVI cross-platform DLL invoking. Detailed the DLL invoking methods via LabWindows/CVI embedded ActiveX control wizard based on the examples of calling the third-party DLL programmed in Visual Basic. On this basis,we achieved industrial Ethernet communication between LabWindows/CVI with Omron PLC by calling‘omron_plc_ethernet.Dll’,the case has been successfully applied to the measurement and control system of large vacuum coating line.
Key words:virtual instrument software;dynamic link library(DLL);programmable logic controller;ethernet commun-ication
收稿日期:2015-03-17
作者簡(jiǎn)介:孔令剛(1978-)男,博士研究生,講師,Email:konglg_1978@163.com
基金項(xiàng)目:國(guó)家科技支撐計(jì)劃項(xiàng)目(2014BF00)
中圖分類號(hào):TP391.7
文獻(xiàn)標(biāo)識(shí)碼:A