版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第4頁(yè)TCBSD下TCBSD下C++ADSsum-cmd批量讀取變量作者:范小軍職務(wù):風(fēng)電技術(shù)工程師郵箱:x.fan@日期:2023-04-12摘要:在TCBSD下使用ADSsum-cmd通過(guò)變量的名稱(chēng)讀取變量數(shù)值。ADS提供強(qiáng)大而快速的通信來(lái)交換任何類(lèi)型的信息,每個(gè)ADS-API調(diào)用都可以讀取單個(gè)變量或完整的數(shù)組和結(jié)構(gòu)。但是ADS通訊每次通訊請(qǐng)求都會(huì)占用很長(zhǎng)的時(shí)間,一次請(qǐng)求讀寫(xiě)一個(gè)變量和讀寫(xiě)多個(gè)變量的時(shí)間相近,所以在使用sumcmd命令讀寫(xiě)變量的時(shí)候優(yōu)勢(shì)很明顯,可以一次請(qǐng)求完成多個(gè)變量的讀寫(xiě)操作。附件:序號(hào)文件名備注1TCBSDSum-Cmd_PLC.zipPLC2.sum-cmd.cppC++歷史版本:免責(zé)聲明:我們已對(duì)本文檔描述的內(nèi)容做測(cè)試。但是差錯(cuò)在所難免,無(wú)法保證絕對(duì)正確并完全滿足您的使用需求。本文檔的內(nèi)容可能隨時(shí)更新,如有改動(dòng),恕不事先通知,也歡迎您提出改進(jìn)建議。參考信息:目錄1. Sum-cmd介紹 31.1. ADS通訊 31.2. SumCmdADSIndexGroup說(shuō)明 32. TCBSD系統(tǒng)中批量讀程序的解析(以變量名讀取為例) 42.1. 過(guò)程簡(jiǎn)介: 42.2. TCBSD系統(tǒng)中數(shù)據(jù)類(lèi)型的介紹 42.3. 通過(guò)變量名獲取變量的ADSsymbolinformation信息 52.3.1. ADSsymbolinformation 52.3.2. AdsSyncReadWriteReq函數(shù)的說(shuō)明 62.3.3. 用AdsSyncReadWriteReq函數(shù)通過(guò)變量名方式獲取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)連接庫(kù)、運(yùn)行生成的可執(zhí)行文件 123.1. TcAdsAPI.h、TcAdsDef.h和libTcAdsDll.so的文件位置 123.2. 激活PLC程序 133.3. 生成執(zhí)行文件的過(guò)程 144. 附件: 164.1. 常見(jiàn)的報(bào)錯(cuò)信息 164.2. Plc和高級(jí)語(yǔ)言變量對(duì)應(yīng) 174.3. WinSCP軟件的設(shè)置 17
Sum-cmd介紹ADS通訊TCBSD系統(tǒng)和Windows系統(tǒng)一樣支持ADS通訊,Ads通訊不是一個(gè)實(shí)時(shí)的通訊協(xié)議,其通訊過(guò)程受到系統(tǒng)和網(wǎng)絡(luò)狀況的多重影響,無(wú)法保證一個(gè)穩(wěn)定的通訊時(shí)間,ADS通訊每次請(qǐng)求會(huì)占用較多時(shí)間,但是一次請(qǐng)求讀取或?qū)懭胍粋€(gè)變量和一次請(qǐng)求讀取或?qū)懭攵鄠€(gè)變量所花費(fèi)的時(shí)間相近,此時(shí)可以采用SumCmd將所有需要讀取或?qū)懭氲淖兞繉?xiě)入字節(jié)流,可以一次請(qǐng)求讀寫(xiě)多個(gè)變量,以便于多個(gè)數(shù)據(jù)周期性的讀寫(xiě)操作,且所需的延遲會(huì)更少。SumCmdADSIndexGroup說(shuō)明 0xF080:ADSIGRP_SUMUP_READ批量讀取 0xF081:ADSIGRP_SUMUP_WRITE批量寫(xiě)入 0xF082:ADSIGRP_SUMUP_READWRITE批量讀寫(xiě);常見(jiàn)的ADSIndexGroup:Infosys:/english.php?content=../content/1033/tcadscommon/12495372427.html&id=TCBSD系統(tǒng)中批量讀程序的解析(以變量名讀取為例)過(guò)程簡(jiǎn)介:第一步:獲取單個(gè)變量名的ADSsymbolinformation信息;第二步:數(shù)據(jù)的打包及AdsSyncReadWriteReq函數(shù)的參數(shù)設(shè)定第三步:批量讀取。第四步:檢查報(bào)錯(cuò)信息。TCBSD系統(tǒng)中數(shù)據(jù)類(lèi)型的介紹在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。其他類(lèi)型的數(shù)據(jù)如下:typedefchar ads_i8;typedefunsignedchar ads_ui8;typedefunsignedshort ads_ui16;typedefint ads_bool;通過(guò)變量名獲取變量的ADSsymbolinformation信息ADSsymbolinformationADSsymbolinformation是PLC變量的說(shuō)明,其中包含了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;可以通過(guò)iGroup、iOffset、size等信息用ADS讀寫(xiě)函數(shù)訪問(wèn)到對(duì)應(yīng)的變量,在配置中我們可以看到對(duì)應(yīng)變量的ADSinfo的信息。AdsSyncReadWriteReq函數(shù)的說(shuō)明在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í)是通過(guò)變量名獲取到adssymbolinformation信息,其主要信息是給定變量的indexGroup,indexOffset,length等信息,在此示例中使用的是通過(guò)變量名的方式獲取adssymbolinformation信息,并打包進(jìn)行批量的讀操作。當(dāng)然IndexGroup可以是ADSIGRP_SYM_HNDBYNAME,16#F003,以變量名的方式獲取變量的句柄信息。然后通過(guò)句柄批量讀寫(xiě)變量。常見(jiàn)的ADS/SystemServices的indexGroup信息如下:用AdsSyncReadWriteReq函數(shù)通過(guò)變量名方式獲取adssymbol的信息通過(guò)AdsSyncReadWriteReq可以獲取到adssymbolinformation的信息,如下操作:1.定義變量存放PLC變量的名稱(chēng) charszVar7[]={"MAIN.var01"};///PLC中聲明的變量名稱(chēng)var01:INT:=100; charszVar8[]={"MAIN.var02"};///PLC中聲明的變量名稱(chēng)var02:real:=200;注意:在TC3中PLC的變量名稱(chēng)必須加Program的名稱(chēng).變量名,例如: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.聲明通過(guò)AdsSyncReadWriteReq函數(shù)讀取到變量的symbol信息的結(jié)構(gòu)體(這個(gè)結(jié)構(gòu)體能夠讀取到變量的所有adssymbolinformation信息)。AdsSymbolEntry這個(gè)結(jié)構(gòu)體在TcAdsDef.h已經(jīng)定義,只需要定義AdsSymbolEntry類(lèi)型的變量即可,并新建指針指向該變量所在的地址(因?yàn)锳dsSyncReadWriteReq需要的就是指針類(lèi)型的數(shù)據(jù))。如下:AdsSymbolEntry InfoExFloat;//存放用AdsSyncReadWriteReq讀取到的變量的信息 AdsSymbolEntry* pInfoExFloat=&InfoExFloat;//指針指向InfoExFloat的地址4.通過(guò)AdsSyncReadWriteReq函數(shù)讀取symbol信息。 /*調(diào)用AdsSyncReadWriteReq函數(shù),獲取szVar7也就是"MAIN.var01"的變量的信息 (indexGroup,indexOffset,length等信息)存放在pInfoExFloat指針的指向的地址中*/ nErr=AdsSyncReadWriteReq(pAddr, ADSIGRP_SYM_INFOBYNAMEEX,//16#F007通過(guò)變量名獲取symbolinfo 0x0, sizeof(InfoExFloat), pInfoExFloat, sizeof(szVar7), szVar7);通過(guò)以上就可以通過(guò)變量名獲取到對(duì)應(yīng)變量的symbol信息(主要是indexGroup,indexOffset,length);對(duì)于其他的變量也是同樣的操作,當(dāng)然后面可以通過(guò)循環(huán)去獲取。獲取到變量的adssymbolinformation信息以后我們進(jìn)行數(shù)據(jù)得打包,用于批量讀寫(xiě)變量。設(shè)置AdsSyncReadWriteReq函數(shù)的參數(shù)及pWriteData數(shù)據(jù)的打包數(shù)據(jù)的打包其是就是AdsSyncReadWriteReq函數(shù)的pWriteData參數(shù)的設(shè)定參數(shù)的設(shè)定主要是以下的參數(shù):pWriteData:打包好的數(shù)據(jù)的地址cbReadLength:讀取的長(zhǎng)度cbWriteLength:寫(xiě)入的長(zhǎng)度pReadData:讀取到的批量數(shù)據(jù)pWriteData參數(shù)的設(shè)定(數(shù)據(jù)的打包)pWriteData參數(shù)是一個(gè)指針類(lèi)型的參數(shù),寫(xiě)入的數(shù)據(jù)有相應(yīng)的格式要求,因?yàn)槭桥康淖x寫(xiě),所以需要將單個(gè)變量的adssymbolinformation信息進(jìn)行打包處理。1.單個(gè)數(shù)據(jù)的結(jié)構(gòu)如下:包括indexGroup,indexOffset,Length。也就是IG、IO、Len。詳細(xì)解釋如下:內(nèi)容長(zhǎng)度描述首地址4bytes數(shù)據(jù)寫(xiě)入的位置,也表示需要執(zhí)行的命令類(lèi)型偏移量4bytes數(shù)據(jù)寫(xiě)入的位置,也表示需要執(zhí)行的命令參數(shù)長(zhǎng)度4bytes以字節(jié)為單位,表示需要被寫(xiě)入的字節(jié)長(zhǎng)度在C++中定義一個(gè)TDataPar結(jié)構(gòu)體方式實(shí)現(xiàn)單個(gè)數(shù)據(jù),如上3.3介紹用AdsSyncReadWriteReq函數(shù)通過(guò)變量名方式獲取adssymbol的信息2.pWriteData參數(shù)的打包pWriteData參數(shù)根據(jù)變量的個(gè)數(shù)進(jìn)行打包,如下是讀取兩個(gè)變量的打包后的格式。打包步驟如下:1)定義結(jié)構(gòu)體用來(lái)存放獲取的變量名的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;//給寫(xiě)入請(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是寫(xiě)入給ADS設(shè)備的數(shù)據(jù)大小。寫(xiě)入長(zhǎng)度由的計(jì)算:用indexGroup為0xF080寫(xiě)入數(shù)據(jù),也就是寫(xiě)入結(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ǎng)度。讀取長(zhǎng)度由如下兩部分組成:執(zhí)行結(jié)果(錯(cuò)誤標(biāo)識(shí))占用的字節(jié)大小和ADS設(shè)備中讀取到的數(shù)據(jù)占用的字節(jié)大小。執(zhí)行結(jié)果(錯(cuò)誤標(biāo)識(shí))就是返回的數(shù)據(jù)(Result)其數(shù)據(jù)類(lèi)型為ads_ui32,占用4個(gè)字節(jié),如果有n個(gè)讀取的變量,則是4*nADS設(shè)備中讀取到的數(shù)據(jù)占用的字節(jié)大小,根據(jù)讀取變量占用內(nèi)存的大小來(lái)設(shè)置。比如:讀取的數(shù)據(jù)是int類(lèi)型(PLC中定義var01:INT:=100;):在C++中int對(duì)應(yīng)是short類(lèi)型占用2個(gè)字節(jié)。如果PLC中Real對(duì)應(yīng)C++中的float數(shù)據(jù)類(lèi)型占用4字節(jié);在實(shí)例中采用的是兩int的類(lèi)型的變量,那么就是n*2;當(dāng)然在使用AdsSyncReadWriteReq函數(shù)根據(jù)變量名方式獲取到的ADSsymbol信息中的length就是對(duì)應(yīng)的變量的長(zhǎng)度。所以可以使用intreqSize=parReq[0].length+parReq[1].length+parReq[2].length;這種方式獲取變量占用內(nèi)存的大小計(jì)算得到的cbReadLength的長(zhǎng)度為:4*n+reqSize;其中n代表請(qǐng)求的變量個(gè)數(shù)用AdsSyncReadWriteReq批量讀取批量讀設(shè)置indexGroup為0xF080;將上面設(shè)置好的參數(shù)寫(xiě)入AdsSyncReadWriteReq函數(shù)的參數(shù)并執(zhí)行函數(shù)。nErr=AdsSyncReadWriteReq(pAddr,0xf080,//讀取的指令0xf080讀0xf081寫(xiě)0xf082讀寫(xiě)同時(shí)reqNum,///讀取的變量個(gè)數(shù)4*reqNum+reqSize, ////n*4+parReq[0].length+parReq[1].lengthcbReadLength(void*)(mAdsSumBufferRes),//存放讀取回來(lái)的數(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ò)誤信息檢查讀取過(guò)程中的執(zhí)行結(jié)果來(lái)判斷每一個(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有沒(méi)有錯(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)連接庫(kù)、運(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)連接庫(kù)文件在/usr/local/lib/下。TcAdsAPI.h和TcAdsDef.h文件位置:(通過(guò)WinSCP軟件連接到TCBSD系統(tǒng)查看文件的結(jié)構(gòu))libTcAdsDll.so位置:(通過(guò)WinSCP軟件連接到TCBSD系統(tǒng)查看文件的結(jié)構(gòu))激活PLC程序添加TCBSD的路由,需要在TCBSD下關(guān)閉防火墻,通過(guò)doasservicepfstop命令關(guān)閉TCBSD的防火墻。添加路由信息,并激活程序。TCBSD下安裝程序開(kāi)發(fā)包為了能編譯C/C++代碼,需要在TCBSD下安裝os-generic-userland-devtools的開(kāi)發(fā)包,使用命令
doaspkginstallos-generic-userland-devtools。附件:os-generic-userland-devtools.pkg開(kāi)發(fā)包,需要放在TCBSD下安裝。生成執(zhí)行文件的過(guò)程將編輯好的su
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度商業(yè)地產(chǎn)項(xiàng)目地下車(chē)位使用權(quán)轉(zhuǎn)讓合同4篇
- 2025產(chǎn)業(yè)園項(xiàng)目幕墻二次深化設(shè)計(jì)、監(jiān)理及驗(yàn)收服務(wù)合同2篇
- 2024年縫紉設(shè)備及相關(guān)技術(shù)咨詢(xún)合同
- 2025年度新能源汽車(chē)買(mǎi)賣(mài)及售后服務(wù)合同4篇
- 2025年度智能車(chē)庫(kù)門(mén)購(gòu)銷(xiāo)安裝一體化服務(wù)合同4篇
- 2025年度智能安防監(jiān)控系統(tǒng)設(shè)計(jì)與實(shí)施合同4篇
- 2024鐵路信號(hào)設(shè)備更新改造工程合同文本3篇
- 中國(guó)醫(yī)用呼吸機(jī)行業(yè)市場(chǎng)調(diào)查研究及投資戰(zhàn)略咨詢(xún)報(bào)告
- 中國(guó)家居百貨行業(yè)市場(chǎng)調(diào)查研究及投資前景預(yù)測(cè)報(bào)告
- 2025年度個(gè)人房屋抵押貸款合同終止協(xié)議4篇
- C及C++程序設(shè)計(jì)課件
- 帶狀皰疹護(hù)理查房
- 公路路基路面現(xiàn)場(chǎng)測(cè)試隨機(jī)選點(diǎn)記錄
- 平衡計(jì)分卡-化戰(zhàn)略為行動(dòng)
- 國(guó)家自然科學(xué)基金(NSFC)申請(qǐng)書(shū)樣本
- 幼兒教師干預(yù)幼兒同伴沖突的行為研究 論文
- 湖南省省級(jí)溫室氣體排放清單土地利用變化和林業(yè)部分
- 材料設(shè)備驗(yàn)收管理流程圖
- 培訓(xùn)機(jī)構(gòu)消防安全承諾書(shū)范文(通用5篇)
- (完整版)建筑業(yè)10項(xiàng)新技術(shù)(2017年最新版)
- 第8期監(jiān)理月報(bào)(江蘇版)
評(píng)論
0/150
提交評(píng)論