TwinCAT 3 ADS.NET 使用說明詳解_第1頁
TwinCAT 3 ADS.NET 使用說明詳解_第2頁
TwinCAT 3 ADS.NET 使用說明詳解_第3頁
TwinCAT 3 ADS.NET 使用說明詳解_第4頁
TwinCAT 3 ADS.NET 使用說明詳解_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第1頁TTwinCAT3ADS.NET使用說明詳解作者:余洋職務(wù):技術(shù)支持工程師日期:2023-03-08摘要:TwinCAT可以通過ADS和多種高級語言進(jìn)行通訊。但是例如在高級語言C#于TwinCAT進(jìn)行通訊之前,需要安裝

\t"/content/1033/tc3_/_blank"'Beckhoff.TwinCAT.AdsNuget'

、在VisualStudio中選擇合適的框架以及其他的相關(guān)步驟,本文檔介紹了相關(guān)概念以及如何自行使用C#與TwinCAT3進(jìn)行通訊,并給了四個(gè)通訊例程進(jìn)行實(shí)例演示。附件:序號文件名備注1BeckhoffAdsTester2VS代碼例程12BeckhoffAdsTester3VS代碼例程23BeckhoffAdsTester4VS代碼例程34BeckhoffAdsTester5VS代碼例程45TwinCATAdsTester1PLC例程歷史版本:2020-07-02馮國城TwinCAT3與C#語言ADS通訊.docx免責(zé)聲明:我們已對本文檔描述的內(nèi)容做測試。但是差錯(cuò)在所難免,無法保證絕對正確并完全滿足您的使用需求。本文檔的內(nèi)容可能隨時(shí)更新,如有改動,恕不事先通知,也歡迎您提出改進(jìn)建議。參考信息:目錄TOC\o"1-2"\h\u1.準(zhǔn)備工作 41.1.TwinCAT3版本須知 41.2.開發(fā)框架須知 41.3.庫文件(依賴項(xiàng))須知 42.庫文件的選擇以及安裝步驟 42.1.‘Beckhoff.TwinCAT.AdsNuget'package 42.2.‘Beckhoff.TwinCAT.Ads.Reactive'

package 52.3.安裝步驟 54.安裝添加的NuGet包 53.例程 63.1.關(guān)閉/啟動PLC 63.2.讀寫基本的數(shù)據(jù) 83.3.讀取字符串類型數(shù)據(jù) 93.4.讀寫PLC內(nèi)部的系統(tǒng)數(shù)據(jù)(時(shí)間以及日期) 114.4.X與6.X版本之間的指令區(qū)別 125.結(jié)束語 13

準(zhǔn)備工作TwinCAT3版本須知在系統(tǒng)之間使用ADS進(jìn)行通訊時(shí),需要TwinCAT3擔(dān)任ADS路由器的角色。因此,TwinCAT3的版本需要和ADS.NET的版本適配。具體的版本對應(yīng)如下所示:Version4.X:所有版本皆可適用Version5.X:TwinCAT>=3.1.4024.10Version6.X:TwinCAT>=3.1.4024.10開發(fā)框架須知在使用C#語言開發(fā)上通訊程序之前,需要選擇合適的軟件開發(fā)工具包或者框架。至少需要滿足下方列出的SDKs或者Frameworks其中之一:.NET5.0orlater.NETCore3.1orlater.NETFramework4.61orlater.NETStandard2.0compatibleSDKorlater注:微軟對.NET5的支持于2022年5月8日結(jié)束。因此,建議將Beckhoff.TwinCAT軟件包從版本5更新到版本6。(微軟.NET技術(shù)支持周期查詢:.NETand.NETCoreofficialsupportpolicy())庫文件(依賴項(xiàng))須知在使用C#語言開發(fā)上通訊程序的時(shí)候,需要選擇倍福開發(fā)的ADS專用庫文件(VS中稱之為依賴項(xiàng)),可以選擇下方兩者中的其中之一:The\t"/content/1033/tc3_/_blank"‘Beckhoff.TwinCAT.AdsNuget'package.(推薦項(xiàng))the\t"/content/1033/tc3_/_blank"‘Beckhoff.TwinCAT.Ads.Reactive'

package.(另選項(xiàng))庫文件的選擇以及安裝步驟現(xiàn)在安裝TwinCATads.NETCommunicationAPI的首選方法是使用NuG包管理器。\t"/content/1033/tc3_/_blank"‘Beckhoff.TwinCAT.AdsNuget'package這是實(shí)現(xiàn)ADS客戶端功能的主要庫文件。在建立與本地和遠(yuǎn)程設(shè)備的ADS連接時(shí)是必需的。它包含了.NETCore和.NETFullFramework使用的ADS通信協(xié)議的客戶端實(shí)現(xiàn)。包括開發(fā)自己的.NET應(yīng)用程序(例如HMI,數(shù)據(jù)記錄器)以與TwinCAT設(shè)備(例如PLC,NC或IO設(shè)備)通信的所有內(nèi)容。安裝地址:NuGetGallery|Beckhoff.TwinCAT.Ads6.0.216\t"/content/1033/tc3_/_blank"‘Beckhoff.TwinCAT.Ads.Reactive'

package此庫文件在\t"/content/1033/tc3_/_blank"‘Beckhoff.TwinCAT.AdsNuget'package之上安裝了額外的擴(kuò)展包。安裝地址:NuGetGallery|Beckhoff.TwinCAT.Ads.Reactive6.0.216安裝步驟新建一個(gè)VisualStudio項(xiàng)目(本文當(dāng)以VisualStudio2019為例)選擇工具—Nuget包管理器—程序包管理設(shè)置(下載后要將nuget包放進(jìn)一個(gè)文件夾內(nèi))選擇工具—Nuget包管理器—管理解決方案的NuGet程序包安裝添加的NuGet包安裝完之后,就可以在ViualStudio中使用C#進(jìn)行編程了。例程需要注意的是:TwinCAT與其他高級語言通訊的時(shí)候用到的通訊方式為同步和異步,對這個(gè)概念有不理解的讀者可以去查閱虛擬學(xué)院中的Ads課程專區(qū)。而對變量數(shù)據(jù)進(jìn)行讀取的方法也分為句柄(變量名)以及Ads通訊地址讀寫(首地址Index-Group以及偏移地址Index-Offset)。本文檔演示的通訊方法都為異步,而讀寫方式都為句柄的方式。(注:以下代碼例程僅僅適用于配套的TwinCAT例程,如需和自己的項(xiàng)目進(jìn)行通訊,需要自行修改代碼來實(shí)現(xiàn))關(guān)閉/啟動PLC控制PLC運(yùn)行狀態(tài)的代碼如下:usingSystem;//調(diào)用倍福Ads庫中的內(nèi)容usingTwinCAT.Ads;namespaceBeckhoffAdsTester2{classProgram{staticvoidMain(string[]args){//創(chuàng)建實(shí)例AdsClienttcClient=newAdsClient();try{//連接851端口,AmsNetId這里如果是本地的話可不寫,默認(rèn)為本地,下方有另一種寫法的演示tcClient.Connect(851);//人機(jī)交互信息Console.WriteLine("R為PLC運(yùn)行S為PLC停止");Console.WriteLine("\r\n請選擇R或者S來控制PLC的狀態(tài)");stringsInput=Console.ReadLine().ToLower();//根據(jù)用戶的選擇來執(zhí)行PLC狀態(tài)(如果選擇R,PLC切換至運(yùn)行模式;如果選擇S,PLC停止;如果都不是,重復(fù)人機(jī)交互信息)do{switch(sInput){case"r":tcClient.WriteControl(newStateInfo(AdsState.Run,tcClient.ReadState().DeviceState));break;case"s":tcClient.WriteControl(newStateInfo(AdsState.Stop,tcClient.ReadState().DeviceState));break;default:Console.WriteLine("請選擇R或者S來控制PLC的狀態(tài)");sInput=Console.ReadLine().ToLower();break;}}while(sInput!="r"&&sInput!="s");}//釋放緩存finally{tcClient.Dispose();}}}}首先,在進(jìn)行編程之前,需要用到倍福Ads庫中的相關(guān)函數(shù)或者方法,因此在常規(guī)的usingsystem下方需要添加usingTwinCAT.Ads;。(注:C#是大小寫敏感的編程語言)。接下來,在主程序中將AdsClient類實(shí)例化,之后才可以進(jìn)行調(diào)用。然后通過AmsNetId連接851端口,這里默認(rèn)就是本地,如果有實(shí)際控制器的話需要填寫目標(biāo)控制器的AmsNetId。用到的方法為:AdsClient.Connect(詳情見:/content/1033/tc3_/9407735563.html?id=880100549233664563)。之后,是常規(guī)的人機(jī)交互內(nèi)容,這里就不加贅述了。然后是一個(gè)常規(guī)的判斷執(zhí)行邏輯:根據(jù)用戶的選擇來執(zhí)行PLC狀態(tài)。這里在執(zhí)行中,用到的是一個(gè)函數(shù)AdsClient.WriteControlMethod(StateInfo)。(詳情見:/content/1033/tc3_/9407886091.html?id=6073269950881686912)。最后,所有程序執(zhí)行完成之后,用一個(gè)函數(shù)AdsClient.dispose()釋放緩存作為結(jié)束。(詳情見:/content/1033/tc3_/9407750923.html?id=2767147550989773101)。讀寫基本的數(shù)據(jù)讀寫uint,double,bool類型變量的代碼如下:usingSystem;usingTwinCAT.Ads;namespaceBeckhoffAdsTester3{classProgram{staticvoidMain(string[]args){//創(chuàng)建客戶端實(shí)例類,通過對應(yīng)的AmsNetId連接到851端口,新建變量AdsClientclient=newAdsClient();uintvarHandle1=0;uintvarHandle2=0;uintvarHandle3=0;uintvarHandle4=0;client.Connect(AmsNetId.Local,851);try{//給讀回寫入的變量賦初值uintvalueToRead1=0;doublevalueToRead2=0;boolvalueToRead3;uintvalueToWrite=42;//將想讀的變量給varHandle1varHandle1=client.CreateVariableHandle("MAIN.i_value");varHandle2=client.CreateVariableHandle("MAIN.f_value");varHandle3=client.CreateVariableHandle("MAIN.b_value");varHandle4=client.CreateVariableHandle("MAIN.i_valuewritten");//寫入值//client.WriteAny(varHandle4,valueToWrite);//讀取值valueToRead1=(uint)client.ReadAny(varHandle1,typeof(uint));valueToRead2=(double)client.ReadAny(varHandle2,typeof(double));valueToRead3=(bool)client.ReadAny(varHandle3,typeof(bool));//輸出結(jié)果Console.WriteLine("讀取到的變量值i_value為:{0}",valueToRead1);Console.WriteLine("讀取到的變量值f_value為:{0}",valueToRead2);Console.WriteLine("讀取到的變量值b_value為:{0}",valueToRead3);}finally{//釋放緩存client.DeleteVariableHandle(varHandle1);client.DeleteVariableHandle(varHandle2);client.DeleteVariableHandle(varHandle3);}}}}本例程的作用是讀寫unit類型變量,庫文件依然用的是system和TiwnCAT.Ads。邏輯和上一例程相同,這里就不多加贅述了,如又不懂之處可以查看注釋。這里用到的方法為AdsClient.ReadAny,可以實(shí)現(xiàn)多種變量的讀?。ㄔ斍檎堃姡?content/1033/tc3_/9407764235.html?id=6680771466346705379)以及AdsClient.DeleteVariableHandle(詳情見:/content/1033/tc3_/9407747851.html?id=6310906797627741841)。讀取字符串類型數(shù)據(jù)讀寫字符串的代碼如下:usingSystem;usingTwinCAT.Ads;usingTwinCAT.TypeSystem;namespaceBeckhoffAdsTester4{classProgram{staticvoidMain(string[]args){//創(chuàng)建客戶端實(shí)例類,連接851端口和AmsNetId,再聲明需要讀的變量AdsClientclient=newAdsClient();client.Connect(AmsNetId.Local,851);//通過對應(yīng)的AmsNetId連接到851端口//將變量handle指向想要讀取的變量uinthandle1=client.CreateVariableHandle("MAIN.s_value");uinthandle2=client.CreateVariableHandle("MAIN.s_valuewritten");try{//大小設(shè)置為80字節(jié)(可大不可小),實(shí)例化字節(jié)大小類,實(shí)例化強(qiáng)制轉(zhuǎn)換類并讀取數(shù)據(jù)intbyteSize=80;byte[]buffer=newbyte[byteSize];intreadBytes1=client.Read(handle1,buffer.AsMemory());PrimitiveTypeMarshalerconverter=newPrimitiveTypeMarshaler(StringMarshaler.DefaultEncoding);//聲明一個(gè)新的變量value,強(qiáng)制轉(zhuǎn)換數(shù)據(jù),并輸出結(jié)果stringvalue=null;converter.Unmarshal<string>(buffer.AsSpan(),outvalue);Console.WriteLine("讀取到的字符串為:{0}",value);//實(shí)例化寫入字節(jié)大小類,給予變量新的值,轉(zhuǎn)換并寫入byte[]writeBuffer=newbyte[byteSize];value="HelloTwinCAT";converter.Marshal(value,writeBuffer);client.Write(handle2,writeBuffer);}//捕捉錯(cuò)誤代碼catch(Exceptionerr){Console.WriteLine("{0}",err.Message);}//刪除緩存finally{client.DeleteVariableHandle(handle1);client.DeleteVariableHandle(handle2);}}}}本例程除了需要用到TwinCAT.Ads之外,還需要使用庫文件TwinCAT.TypeSystem。邏輯與之前的例程有些許的不同之處,這是因?yàn)镾tring類型的數(shù)據(jù)比較特殊,需要進(jìn)行轉(zhuǎn)換的操作,因此需要在中間實(shí)例化一個(gè)轉(zhuǎn)換類。在讀取時(shí)使用的方法為AdsClinet.Read(/content/1033/tc3_/9407761163.html?id=5916645842109940604),根據(jù)引腳的格式因此在讀取之前實(shí)例化字節(jié)大小類并給予一個(gè)數(shù)據(jù)大小的值。最后,在讀取之后還需轉(zhuǎn)換。寫入String類型數(shù)據(jù)的方式同理,用到的方法是AdsClient.Write(詳情見:/content/1033/tc3_/9407863563.html?id=3164779019983369961)。最后釋放緩存使用的方法和上方的例程一致,為AdsClient.DeleteVariableHandle。讀寫PLC內(nèi)部的系統(tǒng)數(shù)據(jù)(時(shí)間以及日期)讀寫PLC內(nèi)部系統(tǒng)數(shù)據(jù)的代碼如下:usingSystem;usingTwinCAT.Ads;usingTwinCAT.PlcOpen;usingTwinCAT.TypeSystem;namespaceBeckhoffAdsTester5{classProgram{staticvoidMain(string[]args){//實(shí)例化客戶端類,連接AmsNetId以及851端口,并創(chuàng)建變量AdsClientclient=newAdsClient();client.Connect(AmsNetId.Local,851);uinthandleTime=0;uinthandleDate=0;try{//將創(chuàng)建的變量指向PLC變量handleTime=client.CreateVariableHandle("MAIN.t_value");//TIMEhandleDate=client.CreateVariableHandle("MAIN.d_value");//DATE//給予讀取的數(shù)據(jù)大小,最大的PLCOpen類型的數(shù)據(jù)為8個(gè)字節(jié)大小byte[]readBuffer=newbyte[8];byte[]writeBuffer=newbyte[8];//讀取時(shí)間client.Read(handleTime,readBuffer.AsMemory(0,TIME.MarshalSize));//新建一個(gè)變量plcTime,處理讀取的數(shù)據(jù)并賦值給plcTimeTIMEplcTime=null;PrimitiveTypeMarshaler.Default.Unmarshal(readBuffer.AsSpan(0,TIME.MarshalSize),outplcTime);TimeSpantime=plcTime.Time;Console.WriteLine("讀取到的時(shí)間為:{0}",plcTime.Time);//寫入時(shí)間PrimitiveTypeMarshaler.Default.Marshal(time,writeBuffer.AsSpan());client.Write(handleTime,writeBuffer.AsMemory(0,TIME.MarshalSize));//讀取日期DATEplcDate=null;client.Read(handleDate,readBuffer.AsMemory(0,DATE.MarshalSize));//新建一個(gè)變量dateTime,處理讀取的數(shù)據(jù)并賦值給dateTimePrimitiveTypeMarshaler.Default.Unmarshal(readBuffer.AsSpan(0,DATE.MarshalSize),outplcDate);DateTimeOffsetdateTime=plcDate.Date;Console.WriteLine("日期為:{0}",plcDate);//寫入日期PrimitiveTypeMarshaler.Default.Marshal(plcDate,writeBuffer.AsSpan());client.Write(handleDate,writeBuffer.AsMemory(0,DATE.MarshalSize));}finally{//釋放緩存client.DeleteVariableHandle(handleTime);client.DeleteVariableHandle(handleDate);}}}}所有例程的程序邏輯都是類似的,都是實(shí)例化類,新建變量,讀取數(shù)據(jù),處理以及轉(zhuǎn)換數(shù)據(jù),最后輸出數(shù)據(jù)。本例程將時(shí)間和日期類型的數(shù)據(jù)放在一起演示了,因此看上去會有些許復(fù)雜,但實(shí)際上都是類似的思想。值得一提的是,這里在庫文件中,由于數(shù)據(jù)類型的特殊性,需要再添加一個(gè)庫文件TwinCAT.PlcOpen。程序中使用的讀寫方法為都與之前的例程一致,但需要在使用方法上做一些調(diào)整,具體可以通過查詢官網(wǎng)學(xué)習(xí),這里就不加贅述了。4.X與6.X版本之間的指令區(qū)別新的架構(gòu)是基于.NETCORE之上的(如.NET6.0)。為了支持這些較新的版本的及其新功能,倍福提供了Beckhoff.TwinCAT.Ads的新版本6.X。由于新的平臺功能需要在API中進(jìn)行一些重大更改才能獲得支持,6.X刪除或更改了一些功能。不過,大多數(shù)接口保持穩(wěn)定,只有少數(shù)方法發(fā)生了變化。4.X與6.X的方法指令區(qū)別如下:(1)實(shí)例化ADS客戶端指令Version4.X:TcAdsClientclient=newTcAdsClient()Version6.X:AdsClientclient=newAdsClient()(2)聲明讀寫方法Version4.X:publicintTcAdsClient.Read(uintindexGruop,uintindexOffset,AdsStreamdataStream)Version4.X:publicintTcAdsClient.Write(uintindexGroup,uintindexOffset,AdsStreamdataStream)Version4.X:publicintTcAdsClient.Read(uintindexGroup,uintindexOffset,byte[]bytes,intoffset,length)Version4.X:publicintTcAdsClient.Write(uintindexGroup,uintindexOffset,byte[]bytes,intoffset,length)Version6.X:public

溫馨提示

  • 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

提交評論