TwinCAT 3 PLC通過(guò)接口調(diào)用C++的函數(shù)_第1頁(yè)
TwinCAT 3 PLC通過(guò)接口調(diào)用C++的函數(shù)_第2頁(yè)
TwinCAT 3 PLC通過(guò)接口調(diào)用C++的函數(shù)_第3頁(yè)
TwinCAT 3 PLC通過(guò)接口調(diào)用C++的函數(shù)_第4頁(yè)
TwinCAT 3 PLC通過(guò)接口調(diào)用C++的函數(shù)_第5頁(yè)
已閱讀5頁(yè),還剩14頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第1頁(yè)TTwinCAT3PLC通過(guò)接口調(diào)用C++的函數(shù)作者:余洋職務(wù):技術(shù)支持工程師郵箱:yang.yu@日期:2023-08-07摘要:TwinCAT3中不同的模塊(如PLC、C++、Matlab等等)可以通過(guò)TcCom以不同的方式交互從而完成整個(gè)項(xiàng)目對(duì)于高精度算法以及實(shí)時(shí)性的需求。一般交互的方式分為四種:IO變量直接映射、接口調(diào)用、IO數(shù)據(jù)指針以及ADS通訊。本文將在C++中創(chuàng)建一個(gè)簡(jiǎn)單的狀態(tài)機(jī),其他模塊(PLC)可以從外部啟動(dòng)和停止該狀態(tài)機(jī),也可以設(shè)置或讀取C++狀態(tài)機(jī)的特定狀態(tài)。交互的方式通過(guò)接口來(lái)進(jìn)行。附件:序號(hào)文件名備注1TwinCATCPPInterfaceTest例程歷史版本:免責(zé)聲明:我們已對(duì)本文檔描述的內(nèi)容做測(cè)試。但是差錯(cuò)在所難免,無(wú)法保證絕對(duì)正確并完全滿足您的使用需求。本文檔的內(nèi)容可能隨時(shí)更新,如有改動(dòng),恕不事先通知,也歡迎您提出改進(jìn)建議。參考信息:目錄1. 軟硬件版本 31.1. 控制硬件 31.2. 控制軟件 32. 準(zhǔn)備工作 33. C++TMC編輯器配置操作 34. 修改C++頭文件(.h)以及CPP文件代碼 95. PLC調(diào)用C++中的接口 12

軟硬件版本控制硬件測(cè)試電腦(Windows11專業(yè)版)控制軟件TwinCAT3(版本為4024.47,嵌入在VisualStudio2019中進(jìn)行開發(fā))VisualStudioC++開發(fā)相關(guān)組件準(zhǔn)備工作TwinCAT3安裝在64位操作系統(tǒng)上的時(shí)候,開發(fā)并運(yùn)行PLC沒(méi)什么問(wèn)題,但如果要開發(fā)并運(yùn)行matlab-simulink或者C++則需要安裝測(cè)試證書,具體操作步驟詳見文檔《TwinCAT3C++使用準(zhǔn)備教程V3.11》或者使用應(yīng)用程序“一鍵環(huán)境變量設(shè)置和64位數(shù)字簽名”。C++TMC編輯器配置操作(1)首先新建一個(gè)TwinCATProject:(2)新建一個(gè)C++Project:(3)選擇“TwinCATDriverProject”,輸入項(xiàng)目名稱,并單擊Add:(4)選擇用于此驅(qū)動(dòng)項(xiàng)目的模塊模板,此例程中,選擇“TwinCATModuleClassWithCyclicIO”:(5)創(chuàng)建完模塊之后進(jìn)入TMC編輯器:(6)選中DataType右鍵選擇“Addnewdatatype…”,在跳出的窗口中編輯名稱并選擇接口:(7)在創(chuàng)建的接口中右鍵新建四個(gè)Method,分別是Start、Stop、SetState、GetState:(8)展開SetState下方的Parameters,選擇?創(chuàng)建一個(gè)新的參數(shù):(9)編輯參數(shù)名稱,類型選擇位普通INT類型,描述為普通種類:(10)同理,在GetState方法中新建一個(gè)參數(shù),名字為pState,描述設(shè)置為指針:(11)在底下的模塊中,選擇ImplementedInterfaces,在右側(cè)選擇?:(12)選擇本地新增的接口,并觀察其他系統(tǒng)接口的大?。海?2)觀察到系統(tǒng)接口的大小為4(8),重新回到接口編輯頁(yè)面進(jìn)行大小的修改,確保一致:(13)右鍵C++程序項(xiàng)目,選擇TMCCodeGenerator自動(dòng)生成配置的代碼:修改C++頭文件(.h)以及CPP文件代碼(1)將配置中的變量添加到頭文件StateMachineModule.h:(2)進(jìn)入CPP文件實(shí)現(xiàn)狀態(tài)機(jī)模塊四個(gè)方法的代碼:(3)在CPP文件中,編輯循環(huán)更新的函數(shù),即如果狀態(tài)為1,則遞增計(jì)數(shù)器;狀態(tài)為2,則遞減計(jì)數(shù)器。同時(shí),將生成的計(jì)數(shù)器的值分配給Value:(4)生成(重新生成)解決方案:(5)編譯無(wú)報(bào)錯(cuò)之后右鍵C++項(xiàng)目,選擇AddNewItem:(6)選擇對(duì)應(yīng)的項(xiàng)目實(shí)例,資源管理器中就會(huì)出現(xiàn)對(duì)應(yīng)C++項(xiàng)目的實(shí)例:(7)右鍵System下方的Task,選擇AddNewItem:(8)在C++模塊的實(shí)例處,選擇Context選項(xiàng)卡,然后分配對(duì)應(yīng)的Task(2):(9)檢查實(shí)例的Interfaces選項(xiàng)卡,查看是否存在對(duì)應(yīng)的自定義接口:PLC調(diào)用C++中的接口(1)在System下方的TypeSystem處選擇Interfaces選項(xiàng)卡查看系統(tǒng)接口中是否存在C++中創(chuàng)建的自定義接口IStateMachine:(2)新建一個(gè)PLC項(xiàng)目:(3)在POUS文件夾中創(chuàng)建一個(gè)功能塊FB_StateMachine,在功能塊編輯窗口中勾選Implements,右側(cè)選擇實(shí)現(xiàn)接口IStateMachine:(4)創(chuàng)建完成之后的功能塊會(huì)自動(dòng)生成關(guān)鍵字ImplementIStateMachine,由于功能塊充當(dāng)代理,本身不具體實(shí)現(xiàn)接口的具體方法(而是在C++中),因此,刪除ImplementIStateMachine。同時(shí)功能塊會(huì)自動(dòng)繼承ITcUnknown父類中的方法TcAddRef(計(jì)數(shù)器的顯式方法,與模塊壽命有關(guān))、TcQueryInterface(通過(guò)模塊ID調(diào)用其中的方法)和TcRelease(遞減計(jì)計(jì)數(shù)器并返回值,如果計(jì)數(shù)器為0,則對(duì)象自動(dòng)刪除),但此功能塊本身卻不需要這些方法,因此,全部刪去:(5)分別在功能塊中創(chuàng)建兩個(gè)方法FB_init和FB_exit:(6)修改FB_StateMachine、FB_init和FB_exit中的代碼:首先,修改功能塊的變量聲明區(qū),在中間變量區(qū)域先創(chuàng)建屬性{attribute'TcInitSymbol'},目的是為了能夠在實(shí)例中直接將代理功能塊與對(duì)應(yīng)C++模塊中的接口ID關(guān)聯(lián),如果不編寫此屬性,則無(wú)法進(jìn)入關(guān)聯(lián)的界面。ipStateMachine:IStateMachine;則用于創(chuàng)建代理功能塊的ID。最后需要?jiǎng)?chuàng)建一個(gè)HERSULT類型的函數(shù)返回值,用來(lái)監(jiān)控函數(shù)處理狀態(tài):接著,編輯方法FB_init,該方法創(chuàng)建完會(huì)默認(rèn)新增兩個(gè)輸入變量,分別是bInitRetains以及bInCopyCode,代表TwinCAT軟冷熱啟動(dòng)以及onlinechange狀態(tài)(激活硬件配置啟動(dòng)程序之后默認(rèn)情況下對(duì)應(yīng)的顯式調(diào)用格式為FB_init(bInitRetains:=TRUE,bInCopyCode:=FALSE);)。在FB_init方法中,需要編寫相關(guān)程序,當(dāng)程序不處于在線更改模式下(即剛上電),判斷接口值是否為0,如果是,則調(diào)用FW_ObjMgr_GetObjectInstance,將代理功能塊實(shí)例與對(duì)應(yīng)C++模塊中的接口實(shí)例配對(duì):然后,編輯FB_exit方法,當(dāng)退出onlinechange模式之后,使用函數(shù)FW_SafeRelease引用遞減計(jì)數(shù)器,釋放內(nèi)存資源,并將接口指針置為0:除此之外,編輯功能塊繼承接口中自定義的方法,由于C++中GetState函數(shù)返回的值會(huì)回到調(diào)用者,作為一個(gè)參數(shù)來(lái)傳遞,所以在C++中當(dāng)時(shí)就設(shè)置的是一個(gè)指針pState,同理,在GetState方法中,也要設(shè)置為INT類型的指針,并且在程序區(qū)域判斷接口是否等于0。如果不是,則能夠調(diào)用接口中的方法,因此進(jìn)行調(diào)用,而其中的參數(shù)即為pState:同理,編寫SetState、Start、Stop方法。(這里SetState的State只參與運(yùn)算,不用作為參數(shù)傳遞,因此,可以設(shè)置為普通的INT類型變量)最后,在主程序中調(diào)用功能塊FB_SateMachine,聲明三個(gè)變量nCounter、nCurrentState和功能塊實(shí)例fbStateMachine:PLC計(jì)數(shù)器nCounter計(jì)數(shù)器的循環(huán)遞增如果nCounter=500,則C++狀態(tài)機(jī)以狀態(tài)“1”啟動(dòng),以遞增其內(nèi)部C++計(jì)數(shù)器。然后使用GetState(ADR(nCurrentState))讀取C++的狀態(tài)。如果nCounter=1000,則C++狀態(tài)機(jī)設(shè)置為狀態(tài)“2”,以遞減其內(nèi)部C++計(jì)數(shù)器。然后使用GetState(ADR(nCurrentState))讀取C++的狀態(tài)。如果nCounter=1500,則停止C++狀態(tài)機(jī)。PLCnCounter也設(shè)置為“0”,以便一切從頭開始。(7)編譯之后在PLC實(shí)例的SymbolInitialization中關(guān)聯(lián)接口:(8)激活硬件配置下載程序:可以觀察到PLC中隨著nCounter不斷增加,到500之后,調(diào)用接口中SetState方法,nCurrentState被置為1,并且StateMachine被啟動(dòng)。nCounter到1000之后,再次調(diào)用SetState方法,nCurrentState被置為2.最后,當(dāng)nCounter超過(guò)2000時(shí),StateMachine被停止,nCounter再次歸0,從而開始一輪新的循環(huán)。在C++的TwinCATLiveWatch中,也可以觀察到當(dāng)前的狀態(tài)和輸出計(jì)時(shí)器的值:

上海(中國(guó)區(qū)總部)中國(guó)上海市靜安區(qū)汶水路299弄9號(hào)(市北智匯園)電話 北京分公司北京市西城區(qū)新街口北大街3號(hào)新街高和大廈407室電話 郵箱:beijing@ 廣州分公司廣州市天河區(qū)珠江新城珠江東路32號(hào)利通廣場(chǎng)1303室

溫馨提示

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

評(píng)論

0/150

提交評(píng)論