TC-BSD下C++ ADS-sum cmd批量讀取變量_第1頁
TC-BSD下C++ ADS-sum cmd批量讀取變量_第2頁
TC-BSD下C++ ADS-sum cmd批量讀取變量_第3頁
TC-BSD下C++ ADS-sum cmd批量讀取變量_第4頁
TC-BSD下C++ ADS-sum cmd批量讀取變量_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第4頁TCBSD下TCBSD下C++ADSsum-cmd批量讀取變量作者:范小軍職務(wù):風(fēng)電技術(shù)工程師郵箱:x.fan@日期:2023-04-12摘要:在TCBSD下使用ADSsum-cmd通過變量的名稱讀取變量數(shù)值。ADS提供強(qiáng)大而快速的通信來交換任何類型的信息,每個(gè)ADS-API調(diào)用都可以讀取單個(gè)變量或完整的數(shù)組和結(jié)構(gòu)。但是ADS通訊每次通訊請(qǐng)求都會(huì)占用很長的時(shí)間,一次請(qǐng)求讀寫一個(gè)變量和讀寫多個(gè)變量的時(shí)間相近,所以在使用sumcmd命令讀寫變量的時(shí)候優(yōu)勢(shì)很明顯,可以一次請(qǐng)求完成多個(gè)變量的讀寫操作。附件:序號(hào)文件名備注1TCBSDSum-Cmd_PLC.zipPLC2.sum-cmd.cppC++歷史版本:免責(zé)聲明:我們已對(duì)本文檔描述的內(nèi)容做測(cè)試。但是差錯(cuò)在所難免,無法保證絕對(duì)正確并完全滿足您的使用需求。本文檔的內(nèi)容可能隨時(shí)更新,如有改動(dòng),恕不事先通知,也歡迎您提出改進(jìn)建議。參考信息:目錄1. Sum-cmd介紹 31.1. ADS通訊 31.2. SumCmdADSIndexGroup說明 32. TCBSD系統(tǒng)中批量讀程序的解析(以變量名讀取為例) 42.1. 過程簡介: 42.2. TCBSD系統(tǒng)中數(shù)據(jù)類型的介紹 42.3. 通過變量名獲取變量的ADSsymbolinformation信息 52.3.1. ADSsymbolinformation 52.3.2. AdsSyncReadWriteReq函數(shù)的說明 62.3.3. 用AdsSyncReadWriteReq函數(shù)通過變量名方式獲取adssymbol的信息 72.4. 設(shè)置AdsSyncReadWriteReq函數(shù)的參數(shù)及pWriteData數(shù)據(jù)的打包 82.4.1. pWriteData參數(shù)的設(shè)定(數(shù)據(jù)的打包) 82.4.2. cbWriteLength參數(shù)的設(shè)定 102.4.3. cbReadLength參數(shù)設(shè)定 102.5. 用AdsSyncReadWriteReq批量讀取 112.6. 檢查執(zhí)行結(jié)果中的錯(cuò)誤信息 113. TCBSD系統(tǒng)中C++文件的編譯、連接動(dòng)態(tài)連接庫、運(yùn)行生成的可執(zhí)行文件 123.1. TcAdsAPI.h、TcAdsDef.h和libTcAdsDll.so的文件位置 123.2. 激活PLC程序 133.3. 生成執(zhí)行文件的過程 144. 附件: 164.1. 常見的報(bào)錯(cuò)信息 164.2. Plc和高級(jí)語言變量對(duì)應(yīng) 174.3. WinSCP軟件的設(shè)置 17

Sum-cmd介紹ADS通訊TCBSD系統(tǒng)和Windows系統(tǒng)一樣支持ADS通訊,Ads通訊不是一個(gè)實(shí)時(shí)的通訊協(xié)議,其通訊過程受到系統(tǒng)和網(wǎng)絡(luò)狀況的多重影響,無法保證一個(gè)穩(wěn)定的通訊時(shí)間,ADS通訊每次請(qǐng)求會(huì)占用較多時(shí)間,但是一次請(qǐng)求讀取或?qū)懭胍粋€(gè)變量和一次請(qǐng)求讀取或?qū)懭攵鄠€(gè)變量所花費(fèi)的時(shí)間相近,此時(shí)可以采用SumCmd將所有需要讀取或?qū)懭氲淖兞繉懭胱止?jié)流,可以一次請(qǐng)求讀寫多個(gè)變量,以便于多個(gè)數(shù)據(jù)周期性的讀寫操作,且所需的延遲會(huì)更少。SumCmdADSIndexGroup說明 0xF080:ADSIGRP_SUMUP_READ批量讀取 0xF081:ADSIGRP_SUMUP_WRITE批量寫入 0xF082:ADSIGRP_SUMUP_READWRITE批量讀寫;常見的ADSIndexGroup:Infosys:/english.php?content=../content/1033/tcadscommon/12495372427.html&id=TCBSD系統(tǒng)中批量讀程序的解析(以變量名讀取為例)過程簡介:第一步:獲取單個(gè)變量名的ADSsymbolinformation信息;第二步:數(shù)據(jù)的打包及AdsSyncReadWriteReq函數(shù)的參數(shù)設(shè)定第三步:批量讀取。第四步:檢查報(bào)錯(cuò)信息。TCBSD系統(tǒng)中數(shù)據(jù)類型的介紹在TcAdsDef.h中如果使用POSIX,那么C++代碼中的數(shù)據(jù)結(jié)構(gòu)也需要做一定的調(diào)整#ifdefPOSIX #include<stdint.h> typedefint64_t ads_i64; typedefint ads_i32; typedefunsignedint ads_ui32;#else typedef__int64 ads_i64; typedeflong ads_i32; typedefunsignedlong ads_ui32;#endif例如:之前在windows下定義的unsignedlong在TCBSD下就用unsignedint,long就需要用int。其他類型的數(shù)據(jù)如下:typedefchar ads_i8;typedefunsignedchar ads_ui8;typedefunsignedshort ads_ui16;typedefint ads_bool;通過變量名獲取變量的ADSsymbolinformation信息ADSsymbolinformationADSsymbolinformation是PLC變量的說明,其中包含了entryLength、iGroup、iOffs、size等信息,后面將會(huì)把獲取的這些信息進(jìn)行打包處理。詳細(xì)解釋如下:例如:PLC程序中定義了一下的兩個(gè)變量, var01:INT:=100; var02:INT:=200;那么這個(gè)變量在ADS系統(tǒng)中有ADS信息,也就是ADSsymbolinformation,在TCBSD體統(tǒng)中提供的ADSsymbol信息如下(在TcAdsDef.h頭文件中定義):typedefstruct{ ads_ui32 entryLength; //lengthofcompletesymbolentry ads_ui32 iGroup; //indexGroupofsymbol:input,outputetc. ads_ui32 iOffs; //indexOffsetofsymbol ads_ui32 size; //sizeofsymbol(inbytes,0=bit) ads_ui32 dataType; //adsDataTypeofsymbol ads_ui32 flags; //seeabove ads_ui16 nameLength; //lengthofsymbolname(excl.\0) ads_ui16 typeLength; //lengthoftypename(excl.\0) ads_ui16 commentLength; //lengthofcomment(excl.\0) //ADS_INT8 name[]; //nameofsymbolwithterminating\0 //ADS_INT8 type[]; //typenameofsymbolwithterminating\0 //ADS_INT8 comment[]; //commentofsymbolwithterminating\0}AdsSymbolEntry,*PAdsSymbolEntry,**PPAdsSymbolEntry;可以通過iGroup、iOffset、size等信息用ADS讀寫函數(shù)訪問到對(duì)應(yīng)的變量,在配置中我們可以看到對(duì)應(yīng)變量的ADSinfo的信息。AdsSyncReadWriteReq函數(shù)的說明在TCBSD下AdsSyncReadWriteReq函數(shù)如下,可以根據(jù)不同的IndexGroup我們可以獲取到不同的信息。TCADSDLL_EXPORTads_i32TCADSDLL_APIAdsSyncReadWriteReq(AmsAddr* pAddr, //AmsaddressofADSserverads_ui32 indexGroup, // indexgroupinADSserverinterfaceads_ui32 indexOffset, //indexoffsetinADSserverinterfaceads_ui32 cbReadLength, //countofbytestoreadvoid* pReadData, //pointertotheclientbufferads_ui32 cbWriteLength, //countofbytestowritevoid* pWriteData //pointertotheclientbuffer); 參數(shù)如下:pAddr [in]StructurewithNetIdandportnumberoftheADSserver.nIndexGroup [in]IndexGroup.nIndexOffset [in]IndexOffset.nReadLength [in]Lengthofthedata,inbytes,returnedbytheADSdevice.pReadData [out]BufferwithdatareturnedbytheADSdevice.nWriteLength [in]Lengthofthedata,inbytes,writtentotheADSdevice.pWriteData [out]BufferwithdatawrittentotheADSdevice.Returnvalue Returnsthefunction'serrorstatus.在此函數(shù)中IndexGroup的數(shù)值不同讀取到的數(shù)據(jù)也不同。例如:

IndexGroups:ADSIGRP_SYM_INFOBYNAME,16#F009,此時(shí)是通過變量名獲取到adssymbolinformation信息,其主要信息是給定變量的indexGroup,indexOffset,length等信息,在此示例中使用的是通過變量名的方式獲取adssymbolinformation信息,并打包進(jìn)行批量的讀操作。當(dāng)然IndexGroup可以是ADSIGRP_SYM_HNDBYNAME,16#F003,以變量名的方式獲取變量的句柄信息。然后通過句柄批量讀寫變量。常見的ADS/SystemServices的indexGroup信息如下:用AdsSyncReadWriteReq函數(shù)通過變量名方式獲取adssymbol的信息通過AdsSyncReadWriteReq可以獲取到adssymbolinformation的信息,如下操作:1.定義變量存放PLC變量的名稱 charszVar7[]={"MAIN.var01"};///PLC中聲明的變量名稱var01:INT:=100; charszVar8[]={"MAIN.var02"};///PLC中聲明的變量名稱var02:real:=200;注意:在TC3中PLC的變量名稱必須加Program的名稱.變量名,例如:PROGRAMMAINVAR var01:INT:=100; var02:INT:=200;END_VAR在MAIN中定義了變量,那么在使用的時(shí)候必須要加MAIN.var01。2.定義結(jié)構(gòu)體存放變量的主要Adssymbolinformation信息 typedefstructdataPar { ads_ui32 indexGroup; //indexgroupinADSserverinterface ads_ui32 indexOffset; //indexoffsetinADSserverinterface ads_ui32 l ength; //countofbytestoread }TDataPar;3.聲明通過AdsSyncReadWriteReq函數(shù)讀取到變量的symbol信息的結(jié)構(gòu)體(這個(gè)結(jié)構(gòu)體能夠讀取到變量的所有adssymbolinformation信息)。AdsSymbolEntry這個(gè)結(jié)構(gòu)體在TcAdsDef.h已經(jīng)定義,只需要定義AdsSymbolEntry類型的變量即可,并新建指針指向該變量所在的地址(因?yàn)锳dsSyncReadWriteReq需要的就是指針類型的數(shù)據(jù))。如下:AdsSymbolEntry InfoExFloat;//存放用AdsSyncReadWriteReq讀取到的變量的信息 AdsSymbolEntry* pInfoExFloat=&InfoExFloat;//指針指向InfoExFloat的地址4.通過AdsSyncReadWriteReq函數(shù)讀取symbol信息。 /*調(diào)用AdsSyncReadWriteReq函數(shù),獲取szVar7也就是"MAIN.var01"的變量的信息 (indexGroup,indexOffset,length等信息)存放在pInfoExFloat指針的指向的地址中*/ nErr=AdsSyncReadWriteReq(pAddr, ADSIGRP_SYM_INFOBYNAMEEX,//16#F007通過變量名獲取symbolinfo 0x0, sizeof(InfoExFloat), pInfoExFloat, sizeof(szVar7), szVar7);通過以上就可以通過變量名獲取到對(duì)應(yīng)變量的symbol信息(主要是indexGroup,indexOffset,length);對(duì)于其他的變量也是同樣的操作,當(dāng)然后面可以通過循環(huán)去獲取。獲取到變量的adssymbolinformation信息以后我們進(jìn)行數(shù)據(jù)得打包,用于批量讀寫變量。設(shè)置AdsSyncReadWriteReq函數(shù)的參數(shù)及pWriteData數(shù)據(jù)的打包數(shù)據(jù)的打包其是就是AdsSyncReadWriteReq函數(shù)的pWriteData參數(shù)的設(shè)定參數(shù)的設(shè)定主要是以下的參數(shù):pWriteData:打包好的數(shù)據(jù)的地址cbReadLength:讀取的長度cbWriteLength:寫入的長度pReadData:讀取到的批量數(shù)據(jù)pWriteData參數(shù)的設(shè)定(數(shù)據(jù)的打包)pWriteData參數(shù)是一個(gè)指針類型的參數(shù),寫入的數(shù)據(jù)有相應(yīng)的格式要求,因?yàn)槭桥康淖x寫,所以需要將單個(gè)變量的adssymbolinformation信息進(jìn)行打包處理。1.單個(gè)數(shù)據(jù)的結(jié)構(gòu)如下:包括indexGroup,indexOffset,Length。也就是IG、IO、Len。詳細(xì)解釋如下:內(nèi)容長度描述首地址4bytes數(shù)據(jù)寫入的位置,也表示需要執(zhí)行的命令類型偏移量4bytes數(shù)據(jù)寫入的位置,也表示需要執(zhí)行的命令參數(shù)長度4bytes以字節(jié)為單位,表示需要被寫入的字節(jié)長度在C++中定義一個(gè)TDataPar結(jié)構(gòu)體方式實(shí)現(xiàn)單個(gè)數(shù)據(jù),如上3.3介紹用AdsSyncReadWriteReq函數(shù)通過變量名方式獲取adssymbol的信息2.pWriteData參數(shù)的打包pWriteData參數(shù)根據(jù)變量的個(gè)數(shù)進(jìn)行打包,如下是讀取兩個(gè)變量的打包后的格式。打包步驟如下:1)定義結(jié)構(gòu)體用來存放獲取的變量名的adssymbolinformation信息。typedefstructdataPar { ads_ui32 indexGroup; //indexgroupinADSserverinterface ads_ui32g indexOffset; //indexoffsetinADSserverinterface ads_ui32 length; //countofbytestoread }TDataPar;2)定義結(jié)構(gòu)體數(shù)組,根據(jù)使用的情況定義大小。 TDataParparReq[2];//定義結(jié)構(gòu)體數(shù)組,存放對(duì)應(yīng)兩個(gè)PLC變量的數(shù)據(jù)。3)獲取到的adssymbol信息放在結(jié)構(gòu)體數(shù)組中 /*buildfirstentryinsiderequestbuffer*/ parReq[0].indexGroup=pAdsSymbolEntry->iGroup;//給寫入請(qǐng)求的結(jié)構(gòu)體賦值,將信息打包 parReq[0].indexOffset=pAdsSymbolEntry->iOffs; parReq[0].length=pAdsSymbolEntry->size; /*buildsecondentryinsiderequestbuffer*/ parReq[1].indexGroup=pAdsSymbolEntry->iGroup;//請(qǐng)求數(shù)據(jù)的打包 parReq[1].indexOffset=pAdsSymbolEntry->iOffs; parReq[1].length=pAdsSymbolEntry->size;cbWriteLength參數(shù)的設(shè)定cbWriteLength是寫入給ADS設(shè)備的數(shù)據(jù)大小。寫入長度由的計(jì)算:用indexGroup為0xF080寫入數(shù)據(jù),也就是寫入結(jié)構(gòu)體的數(shù)據(jù),如下是結(jié)構(gòu)體:typedefstructdataPar { ads_ui32 indexGroup; //indexgroupinADSserverinterface ads_ui32 indexOffset; //indexoffsetinADSserverinterface ads_ui32 length; //countofbytestoread }TDataPar;ads_ui32 占用4個(gè)字節(jié),有indexGroup、indexOffset、length三個(gè)ads_ui32的數(shù)據(jù),所以大小為3*4=12個(gè)字節(jié),同時(shí)如果有n個(gè)變量需要讀取,那么cbWriteLength的計(jì)算方式就是:12*n;其中n代表請(qǐng)求的變量個(gè)數(shù)cbReadLength參數(shù)設(shè)定cbReadLength是從ADS設(shè)備返回的數(shù)據(jù)長度。讀取長度由如下兩部分組成:執(zhí)行結(jié)果(錯(cuò)誤標(biāo)識(shí))占用的字節(jié)大小和ADS設(shè)備中讀取到的數(shù)據(jù)占用的字節(jié)大小。執(zhí)行結(jié)果(錯(cuò)誤標(biāo)識(shí))就是返回的數(shù)據(jù)(Result)其數(shù)據(jù)類型為ads_ui32,占用4個(gè)字節(jié),如果有n個(gè)讀取的變量,則是4*nADS設(shè)備中讀取到的數(shù)據(jù)占用的字節(jié)大小,根據(jù)讀取變量占用內(nèi)存的大小來設(shè)置。比如:讀取的數(shù)據(jù)是int類型(PLC中定義var01:INT:=100;):在C++中int對(duì)應(yīng)是short類型占用2個(gè)字節(jié)。如果PLC中Real對(duì)應(yīng)C++中的float數(shù)據(jù)類型占用4字節(jié);在實(shí)例中采用的是兩int的類型的變量,那么就是n*2;當(dāng)然在使用AdsSyncReadWriteReq函數(shù)根據(jù)變量名方式獲取到的ADSsymbol信息中的length就是對(duì)應(yīng)的變量的長度。所以可以使用intreqSize=parReq[0].length+parReq[1].length+parReq[2].length;這種方式獲取變量占用內(nèi)存的大小計(jì)算得到的cbReadLength的長度為:4*n+reqSize;其中n代表請(qǐng)求的變量個(gè)數(shù)用AdsSyncReadWriteReq批量讀取批量讀設(shè)置indexGroup為0xF080;將上面設(shè)置好的參數(shù)寫入AdsSyncReadWriteReq函數(shù)的參數(shù)并執(zhí)行函數(shù)。nErr=AdsSyncReadWriteReq(pAddr,0xf080,//讀取的指令0xf080讀0xf081寫0xf082讀寫同時(shí)reqNum,///讀取的變量個(gè)數(shù)4*reqNum+reqSize, ////n*4+parReq[0].length+parReq[1].lengthcbReadLength(void*)(mAdsSumBufferRes),//存放讀取回來的數(shù)據(jù)的數(shù)據(jù)的地址12*reqNum, /////n*(4+4+4) cbWriteLength&parReq//打包的所有變量的結(jié)構(gòu)體的數(shù)據(jù));執(zhí)行完函數(shù)以后讀取到的批量數(shù)據(jù)存放在mAdsSumBufferRes數(shù)組中。ads_ui8mAdsSumBufferRes[200];檢查執(zhí)行結(jié)果中的錯(cuò)誤信息檢查讀取過程中的執(zhí)行結(jié)果來判斷每一個(gè)變量是否有錯(cuò)誤。在完成讀取以后需要將讀取到的數(shù)據(jù)地位ADS-err的位置 /*0x0returned!!!*/pObjAdsRes是指向數(shù)據(jù)的地址 ads_ui8*pObjAdsRes=(ads_ui8*)mAdsSumBufferRes+(reqNum*4); //pointtoADS-data pObjAdsErrRes指針就是指向錯(cuò)誤的地址ads_ui8*pObjAdsErrRes=(ads_ui8*)mAdsSumBufferRes; //pointtoADS-err 讀取完成以后判斷返回值pObjAdsErrRes有沒有錯(cuò)誤。 if(nErr==0)// { for(intidx=0;idx<reqNum;idx++) { //wascommunicationforADS-subcommandOK?? intnAdsErr=*(int*)pObjAdsErrRes; if(nAdsErr==0) { //getdataoutofstream } pObjAdsErrRes=pObjAdsErrRes+4;//pointtonextADS-errobject pObjAdsRes=pObjAdsRes+4; } }TCBSD系統(tǒng)中C++文件的編譯、連接動(dòng)態(tài)連接庫、運(yùn)行生成可執(zhí)行文件TcAdsAPI.h、TcAdsDef.h和libTcAdsDll.so的文件位置在TCBSD系統(tǒng)中TcAdsAPI.h和TcAdsDef.h在usr/local/include路徑下,libTcAdsDll.so是動(dòng)態(tài)連接庫文件在/usr/local/lib/下。TcAdsAPI.h和TcAdsDef.h文件位置:(通過WinSCP軟件連接到TCBSD系統(tǒng)查看文件的結(jié)構(gòu))libTcAdsDll.so位置:(通過WinSCP軟件連接到TCBSD系統(tǒng)查看文件的結(jié)構(gòu))激活PLC程序添加TCBSD的路由,需要在TCBSD下關(guān)閉防火墻,通過doasservicepfstop命令關(guān)閉TCBSD的防火墻。添加路由信息,并激活程序。TCBSD下安裝程序開發(fā)包為了能編譯C/C++代碼,需要在TCBSD下安裝os-generic-userland-devtools的開發(fā)包,使用命令

doaspkginstallos-generic-userland-devtools。附件:os-generic-userland-devtools.pkg開發(fā)包,需要放在TCBSD下安裝。生成執(zhí)行文件的過程將編輯好的su

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論