Matlab M file與PLC進(jìn)行ADS通訊接口MEX文件的編寫方法(2014.01.05)_第1頁
Matlab M file與PLC進(jìn)行ADS通訊接口MEX文件的編寫方法(2014.01.05)_第2頁
Matlab M file與PLC進(jìn)行ADS通訊接口MEX文件的編寫方法(2014.01.05)_第3頁
Matlab M file與PLC進(jìn)行ADS通訊接口MEX文件的編寫方法(2014.01.05)_第4頁
Matlab M file與PLC進(jìn)行ADS通訊接口MEX文件的編寫方法(2014.01.05)_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

AllRightReservedbyBeckhoffCreatedbyHarveyMatlabMfile與PLC進(jìn)行ADS通訊接口MEX文件的編寫方法(2014.01.08)Matlab中的M文件需要直接和PLC進(jìn)行ADS通訊時(shí),需要編寫一個(gè)MEX接口文件,通過此接口文件調(diào)用Beckhoff提供的TcADSDLL.dll文件,然后才能調(diào)用Beckhoff在cADSDLL.dll文件中的功能函數(shù),實(shí)現(xiàn)與PLC進(jìn)行ADS通訊。在Windows系統(tǒng)下,MEX文件是經(jīng)過Matlab對VS下開發(fā)的源文件(C++開發(fā)的文件后綴為cpp)編譯后,最終形成一個(gè)mexw32或mexw64文件,Mfile可以通過文件名直接調(diào)用此文件。具體實(shí)現(xiàn)方法示例如下:實(shí)現(xiàn)平臺VS2010Ultimate:C++程序開發(fā)Matlab2012b(83)64bits(win64):M文件編寫TwinCAT3v3.1.4016.12:PLC程序編寫Windows7Ultimate64bits:64位操作系統(tǒng)MEX文件編寫打開VS2010,新建一個(gè)Project向?qū)Т翱谥?,選擇Win32Project,并給項(xiàng)目起個(gè)名字,這里Solutionname可以隨意,但項(xiàng)目的名稱Name,將成為隨后形成的cpp文件的名字,最終形成能被Mfile調(diào)用功能塊的名字,所以最好與直接功能相關(guān),如AdsPorClose,AdsRead等。全部設(shè)置完成后,點(diǎn)擊OK。出現(xiàn)信息窗口,點(diǎn)擊NextApplicationType選擇DLL,其他保持默認(rèn),點(diǎn)擊Finish。項(xiàng)目建立完成,在左側(cè)會出現(xiàn)VS2010為項(xiàng)目AdsPortClose建立的相關(guān)文件,其中AdsPortClose.cpp就是進(jìn)行程序編寫的文件。但是在編寫程序之前,需要對環(huán)境進(jìn)行配置。右擊Solution的名字,出現(xiàn)下拉菜單中,選擇Properties。彈出的屬性設(shè)置窗口中,選擇C/C++項(xiàng)目下的General,在右側(cè)的AdditionalIncludeDirectories中需要添加隨后編寫的C++程序中所需引用的.H文件的所在位置。單擊AdditionalIncludeDirectories右側(cè)的空白處,將出現(xiàn)下拉菜單,點(diǎn)擊其中的Edit…選型,將出現(xiàn)設(shè)置窗口。在彈出的設(shè)置窗口中,點(diǎn)擊右上角的“新建”快捷圖標(biāo),添加下列兩個(gè)路徑Matlab安裝目錄下的路徑“extern\include”TwinCAT安裝目錄下的路徑“TwinCAT\AdsApi\TcAdsDll\Include”添加完畢后,如下圖所示。然后,點(diǎn)擊OK?;氐絊olution的屬性設(shè)置窗口中,選擇Linker項(xiàng)目下的General,在右側(cè)的AdditionalLibraryDirectories中需要添加隨后編寫的C++程序中所需的.lib文件的所在位置。單擊AdditionalLibraryDirectories右側(cè)的空白處,將出現(xiàn)下拉菜單,點(diǎn)擊其中的Edit…選型,將出現(xiàn)設(shè)置窗口。在彈出的設(shè)置窗口中,點(diǎn)擊右上角的“新建”快捷圖標(biāo),添加下列兩個(gè)路徑Matlab安裝目錄下的路徑“extern\lib\win64\microsoft”TwinCAT安裝目錄下的路徑“\TwinCAT\AdsApi\TcAdsDll\x64\lib”添加完畢后,如下圖所示。然后,點(diǎn)擊OK?;氐絊olution的屬性設(shè)置窗口中,選擇Linker項(xiàng)目下的Input,在右側(cè)的AdditionalDependencies中需要添加下述幾個(gè)lib文件:libmx.lib、libmex.lib、libmat.lib、libeng.lib、TcAdsDll.lib添加完畢后,點(diǎn)擊OK。完成上述設(shè)置后,對于64位系統(tǒng),還需設(shè)置編譯器,選擇VS2010工具欄中編譯器選擇位置如下圖,在下拉菜單中選擇ConfigurationManager…在彈出的設(shè)置菜單中,platform的位置,點(diǎn)擊下拉菜單,選擇New…彈出的設(shè)置菜單中,NewPlatform位置選擇x64,如下圖,然后點(diǎn)擊OK。至此,環(huán)境設(shè)置完畢。點(diǎn)擊AdsPortClose.cpp,在右側(cè)的空白位置編寫所需程序,詳見例程AdsPortOpen.sln、AdsPortClose.sln、AdsRead.sln、AdsWrite.sln及下文程序編寫注意事項(xiàng)。程序編寫完畢后,點(diǎn)擊菜單欄的RebuildSolution,對程序進(jìn)行編譯一切正常的話,將在output窗口出現(xiàn)下述信息,表示編譯通過。打開Matlab,并將當(dāng)前目錄設(shè)置為文件AdsPortClose.cpp所在目錄,如下圖命令行輸入mex–setup提示信息后,輸入y選擇,MicrosoftVisualC++2010的選項(xiàng),本例子中選擇,1彈出信息后,選擇y彈出下述信息和提示框,表示設(shè)置完成。將MEXrun.m文件拷貝到AdsPortClose.cpp所在的目錄,然后將其中的TargetFileName更改為目標(biāo)文件名稱,此處為AdsPortClose.cpp。運(yùn)行MEXrun.m文件,MATLAB開始對AdsPortClose.cpp進(jìn)行編譯,編譯完成后,會在相同文件夾下出現(xiàn)AdsPortClose.mexw64文件,表示編譯完成。至此,mexw64接口文件的制作完成,將AdsPortClose.mexw64拷貝到需要對其進(jìn)行調(diào)用的M文件所在的文件夾,在M文件中直接輸入文件名,即可進(jìn)行調(diào)用。在本例中,可以直接在輸入[pErr]=AdsPortClose();將完成對ADS通訊口的關(guān)閉。如有錯(cuò)誤,返回值將寫入pErr矩陣。MEX程序編寫說明及注意事項(xiàng):MEX是一種MATLAB調(diào)用DLL文件的接口文件,成功的MEX文件編寫,需要注意一些問題,下面以AdsRead.mexw64文件為例,說明程序各部分的注意事項(xiàng)。MATLAB在對MEX文件進(jìn)行調(diào)用時(shí),實(shí)際上是通過其中的mexFunction函數(shù)進(jìn)行的,其4個(gè)參量的意義分別為:nlhs:輸入?yún)⒘康膫€(gè)數(shù)*plhs[]:指向輸入?yún)⒘康刂返闹羔樉仃噉rhs:輸出參量個(gè)數(shù)*prhs[]:指向輸出參量地址的指針矩陣其中,將需要輸入的矩陣或變量都依次定義為prhs[0]、prhs[1]、prhs[2]…..,將需要輸出的矩陣或變量都依次定義為plhs[0]、plhs[1]、plhs[2]…..當(dāng)Matlab進(jìn)行調(diào)用時(shí),將按順序?qū)⑤斎刖仃囈来蝹鬏斀oprhs[0]、prhs[1]、prhs[2]…..運(yùn)算完成后,又依次將plhs[0]、plhs[1]、plhs[2]…..中的變量傳輸給Matlab。mexFunction函數(shù)內(nèi)部可以直接編寫需要的運(yùn)算程序,對于ADS功能塊的調(diào)用,可以直接寫功能塊的名稱如AdsSyncReadReq。可以調(diào)用的ADS功能塊可以參考,Beckhoff幫助文件,TwinCATADS-DLL位置查找詳細(xì)說明。由于Matlab的默認(rèn)數(shù)據(jù)類型試double型,所以Matlab與PLC進(jìn)行數(shù)據(jù)交換時(shí),盡量以double型進(jìn)行交換,在MEX文件編寫中,涉及到接口的位置都使用double型,在PLC內(nèi)需要與Matlab進(jìn)行交換的數(shù)據(jù)都定義為LREAL型。由于32位操作系統(tǒng)和64位操作系統(tǒng)中,相同數(shù)據(jù)類型長度是不同的,所以兩種系統(tǒng)上運(yùn)行的文件是不一樣的,后綴分別為mexw32和mexw64,兩者不能通用,可以在相應(yīng)系統(tǒng)上,用matlab對源文件進(jìn)行重新編譯,即可形成所需的mex文件。在M文件中進(jìn)行調(diào)用時(shí),可以直接輸入mex文件的名稱,引用格式為[output1,output2]=AdsRead(input1,input2);其中,output1,output2根據(jù)其引用時(shí)的輸入位置,依次對應(yīng)mex文件中的plhs[0]、plhs[1];input1,input2根據(jù)其引用時(shí)的輸入位置,依次對應(yīng)mex文件中的prhs[0]、prhs[1];本例程以變量地址的方式,進(jìn)行ADS尋址,對于需要訪問變量的地址可以通過TwinCAT界面的Scope功能進(jìn)行查找。當(dāng)PLC程序運(yùn)行時(shí),在下圖位置可查看相應(yīng)變量的地址和長度。AdsRead.cpp源程序//AdsRead.cpp:DefinestheexportedfunctionsfortheDLLapplication.//#include"stdafx.h"#include"TcAdsDef.h"#include"TcAdsAPI.h"#include"mex.h"http:////defineinput#defineAmsNetIDprhs[0]#definePortNumprhs[1]#defineInPut01prhs[2]#defineInPut02prhs[3]//defineoutput#defineReadStateplhs[0]#defineOutPut01plhs[1]#defineOutPut02plhs[2]voidmexFunction(intnlhs,mxArray*plhs[],//inputargumentnumbersandinputMaxtrixintnrhs,constmxArray*prhs[])//outputargumentnumbersandonputMaxtrix{ intr1,c1,r2,c2; double*pAmsNetID,*pPortNum,*pInPut01,*pInPut02; double*pReadState,*pOutPut01,*pOutPut02; AmsAddrstAddr; AmsAddr*pstAddr; //getaddressoftheinputMaxtrix pAmsNetID=mxGetPr(AmsNetID); pPortNum=mxGetPr(PortNum); pInPut01=mxGetPr(InPut01); pInPut02=mxGetPr(InPut02); //getrowandculomnnumbersoftheOutputMaxtrixdeserved r1=pInPut01[3]; c1=pInPut01[4]; r2=pInPut02[3]; c2=pInPut02[4]; //createoutputMaxtrix ReadState=mxCreateDoubleMatrix(1,2,mxREAL); OutPut01=mxCreateDoubleMatrix(r1,c1,mxREAL); OutPut02=mxCreateDoubleMatrix(r2,c2,mxREAL); //getadressoftheoutputMaxtrix pReadState=mxGetPr(ReadState); pOutPut01=mxGetPr(OutPut01); pOutPut02=mxGetPr(OutPut02); //ReadADSData stAId.b[0]=pAmsNetID[0]; stAId.b[1]=pAmsNetID[1]; stAId.b[2]=pAmsNetID[2]; stAId.b[3]=pAmsNetID[3]; stAId.b[4]=pAmsNetID[4]; stAId.b[5]=pAmsNetID[5]; stAddr.port=pPortNum[0]; pstAddr=&stAddr; unsignedlong indexGroup=pInPut01[0]; // indexgroupinADSserverinterface unsignedlong indexOffset=pInPut01[1]; //indexoffsetinADSserverinterface unsignedlong length=pInPut01[2]; //countofbytestoread pReadState[0]=AdsSyncReadReq(pstAddr, //AmsaddressofADSserver indexGroup, // indexgroupinADSserverinterface indexOffset, //indexoffsetinADSserverinterface length, //countofbytestoread pOutPut01 //pointer

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論