




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第1頁TTwinCAT3PLC通過接口調用C++的函數作者:余洋職務:技術支持工程師郵箱:yang.yu@日期:2023-08-07摘要:TwinCAT3中不同的模塊(如PLC、C++、Matlab等等)可以通過TcCom以不同的方式交互從而完成整個項目對于高精度算法以及實時性的需求。一般交互的方式分為四種:IO變量直接映射、接口調用、IO數據指針以及ADS通訊。本文將在C++中創建一個簡單的狀態機,其他模塊(PLC)可以從外部啟動和停止該狀態機,也可以設置或讀取C++狀態機的特定狀態。交互的方式通過接口來進行。附件:序號文件名備注1TwinCATCPPInterfaceTest例程歷史版本:免責聲明:我們已對本文檔描述的內容做測試。但是差錯在所難免,無法保證絕對正確并完全滿足您的使用需求。本文檔的內容可能隨時更新,如有改動,恕不事先通知,也歡迎您提出改進建議。參考信息:目錄1. 軟硬件版本 31.1. 控制硬件 31.2. 控制軟件 32. 準備工作 33. C++TMC編輯器配置操作 34. 修改C++頭文件(.h)以及CPP文件代碼 95. PLC調用C++中的接口 12
軟硬件版本控制硬件測試電腦(Windows11專業版)控制軟件TwinCAT3(版本為4024.47,嵌入在VisualStudio2019中進行開發)VisualStudioC++開發相關組件準備工作TwinCAT3安裝在64位操作系統上的時候,開發并運行PLC沒什么問題,但如果要開發并運行matlab-simulink或者C++則需要安裝測試證書,具體操作步驟詳見文檔《TwinCAT3C++使用準備教程V3.11》或者使用應用程序“一鍵環境變量設置和64位數字簽名”。C++TMC編輯器配置操作(1)首先新建一個TwinCATProject:(2)新建一個C++Project:(3)選擇“TwinCATDriverProject”,輸入項目名稱,并單擊Add:(4)選擇用于此驅動項目的模塊模板,此例程中,選擇“TwinCATModuleClassWithCyclicIO”:(5)創建完模塊之后進入TMC編輯器:(6)選中DataType右鍵選擇“Addnewdatatype…”,在跳出的窗口中編輯名稱并選擇接口:(7)在創建的接口中右鍵新建四個Method,分別是Start、Stop、SetState、GetState:(8)展開SetState下方的Parameters,選擇?創建一個新的參數:(9)編輯參數名稱,類型選擇位普通INT類型,描述為普通種類:(10)同理,在GetState方法中新建一個參數,名字為pState,描述設置為指針:(11)在底下的模塊中,選擇ImplementedInterfaces,在右側選擇?:(12)選擇本地新增的接口,并觀察其他系統接口的大小:(12)觀察到系統接口的大小為4(8),重新回到接口編輯頁面進行大小的修改,確保一致:(13)右鍵C++程序項目,選擇TMCCodeGenerator自動生成配置的代碼:修改C++頭文件(.h)以及CPP文件代碼(1)將配置中的變量添加到頭文件StateMachineModule.h:(2)進入CPP文件實現狀態機模塊四個方法的代碼:(3)在CPP文件中,編輯循環更新的函數,即如果狀態為1,則遞增計數器;狀態為2,則遞減計數器。同時,將生成的計數器的值分配給Value:(4)生成(重新生成)解決方案:(5)編譯無報錯之后右鍵C++項目,選擇AddNewItem:(6)選擇對應的項目實例,資源管理器中就會出現對應C++項目的實例:(7)右鍵System下方的Task,選擇AddNewItem:(8)在C++模塊的實例處,選擇Context選項卡,然后分配對應的Task(2):(9)檢查實例的Interfaces選項卡,查看是否存在對應的自定義接口:PLC調用C++中的接口(1)在System下方的TypeSystem處選擇Interfaces選項卡查看系統接口中是否存在C++中創建的自定義接口IStateMachine:(2)新建一個PLC項目:(3)在POUS文件夾中創建一個功能塊FB_StateMachine,在功能塊編輯窗口中勾選Implements,右側選擇實現接口IStateMachine:(4)創建完成之后的功能塊會自動生成關鍵字ImplementIStateMachine,由于功能塊充當代理,本身不具體實現接口的具體方法(而是在C++中),因此,刪除ImplementIStateMachine。同時功能塊會自動繼承ITcUnknown父類中的方法TcAddRef(計數器的顯式方法,與模塊壽命有關)、TcQueryInterface(通過模塊ID調用其中的方法)和TcRelease(遞減計計數器并返回值,如果計數器為0,則對象自動刪除),但此功能塊本身卻不需要這些方法,因此,全部刪去:(5)分別在功能塊中創建兩個方法FB_init和FB_exit:(6)修改FB_StateMachine、FB_init和FB_exit中的代碼:首先,修改功能塊的變量聲明區,在中間變量區域先創建屬性{attribute'TcInitSymbol'},目的是為了能夠在實例中直接將代理功能塊與對應C++模塊中的接口ID關聯,如果不編寫此屬性,則無法進入關聯的界面。ipStateMachine:IStateMachine;則用于創建代理功能塊的ID。最后需要創建一個HERSULT類型的函數返回值,用來監控函數處理狀態:接著,編輯方法FB_init,該方法創建完會默認新增兩個輸入變量,分別是bInitRetains以及bInCopyCode,代表TwinCAT軟冷熱啟動以及onlinechange狀態(激活硬件配置啟動程序之后默認情況下對應的顯式調用格式為FB_init(bInitRetains:=TRUE,bInCopyCode:=FALSE);)。在FB_init方法中,需要編寫相關程序,當程序不處于在線更改模式下(即剛上電),判斷接口值是否為0,如果是,則調用FW_ObjMgr_GetObjectInstance,將代理功能塊實例與對應C++模塊中的接口實例配對:然后,編輯FB_exit方法,當退出onlinechange模式之后,使用函數FW_SafeRelease引用遞減計數器,釋放內存資源,并將接口指針置為0:除此之外,編輯功能塊繼承接口中自定義的方法,由于C++中GetState函數返回的值會回到調用者,作為一個參數來傳遞,所以在C++中當時就設置的是一個指針pState,同理,在GetState方法中,也要設置為INT類型的指針,并且在程序區域判斷接口是否等于0。如果不是,則能夠調用接口中的方法,因此進行調用,而其中的參數即為pState:同理,編寫SetState、Start、Stop方法。(這里SetState的State只參與運算,不用作為參數傳遞,因此,可以設置為普通的INT類型變量)最后,在主程序中調用功能塊FB_SateMachine,聲明三個變量nCounter、nCurrentState和功能塊實例fbStateMachine:PLC計數器nCounter計數器的循環遞增如果nCounter=500,則C++狀態機以狀態“1”啟動,以遞增其內部C++計數器。然后使用GetState(ADR(nCurrentState))讀取C++的狀態。如果nCounter=1000,則C++狀態機設置為狀態“2”,以遞減其內部C++計數器。然后使用GetState(ADR(nCurrentState))讀取C++的狀態。如果nCounter=1500,則停止C++狀態機。PLCnCounter也設置為“0”,以便一切從頭開始。(7)編譯之后在PLC實例的SymbolInitialization中關聯接口:(8)激活硬件配置下載程序:可以觀察到PLC中隨著nCounter不斷增加,到500之后,調用接口中SetState方法,nCurrentState被置為1,并且StateMachine被啟動。nCounter到1000之后,再次調用SetState方法,nCurrentState被置為2.最后,當nCounter超過2000時,StateMachine被停止,nCounter再次歸0,從而開始一輪新的循環。在C++的TwinCATLiveWatch中,也可以觀察到當前的狀態和輸出計時器的值:
上海(中國區總部)中國上海市靜安區汶水路299弄9號(市北智匯園)電話 北京分公司北京市西城區新街口北大街3號新街高和大廈407室電話 郵箱:beijing@ 廣州分公司廣州市天河區珠江新城珠江東路32號利通廣場1303室
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 晚清政治史研究五十年
- 2025年中考英語一輪復習知識清單專題10 時態語態綜合練(解析版)
- 2025合同范本電商平臺合作經營合同示例
- 2025合同范本管理協議示例B樣本
- 2024年松原職業技術學院輔導員考試真題
- 2024年棗莊市嶧城區招聘教師真題
- 2024年蘭州市三支一扶真題
- 2025年二手奢侈品鑒定技術標準與市場潛力挖掘策略報告
- 2025年二手交易平臺信用評級與風險預警分析
- BIPV系統儲能企業制定與實施新質生產力項目商業計劃書
- 蘇少版四年級美術全冊知識點歸納
- 程序的循環結構課件高中信息技術必修計算與數據
- 地鐵線反恐安全培訓內容
- 廣東華泰紙業有限公司紗管原紙工藝設備技改項目環境影響報告書
- 紅皮病護理的課件
- SH-T-3503-2017-附錄A-交工技術文件通用表
- 完整CECAGC3-2010建設項目工程結算編審規程完整
- 招標文件技術規范書
- 初中音樂-第五單元環球之旅(二)歐洲與大洋洲教學設計學情分析教材分析課后反思
- 2023年四川省內江市中考數學試卷【含答案】
- 2023-2024學年四川省綿陽市小學語文六年級期末高分通關題附參考答案和詳細解析
評論
0/150
提交評論