王生彬
王生斌
級(jí)別: 論壇先鋒
|
step7中的難點(diǎn):間接尋址示例,中文詳細(xì)注釋。 推薦歡迎糾錯(cuò),防止誤導(dǎo)。 FUNCTION "DBtoDB" : VOID //該功能塊的作用是把一個(gè)數(shù)據(jù)塊中的指定的一批數(shù)據(jù),復(fù)制到另一個(gè)塊的指定位置。 TITLE = //標(biāo)題,這里沒有指定 AUTHOR : BaiZH //作者 感謝您,BaiZH,通過您的這個(gè)例子我基本入明白了間接尋址的用法。不過具體在什么情況下使用我還得繼續(xù)努力。 FAMILY : IR //分類 NAME : DBtoDB //名稱 VERSION : 0.1 //版本 VAR_INPUT //輸入型變量聲明開始 SRC_DB : INT ; //Source DB Block Number //整型值,要復(fù)制的源數(shù)據(jù)塊塊號(hào) SRC_SttAddr : INT ; //Start Address of the Sending Data in SRC_DB //源數(shù)據(jù)塊的要復(fù)制的數(shù)據(jù)起始地址 SendNum : INT ; //Words Number Need Sending //要復(fù)制的數(shù)據(jù)量 DST_DB : INT ; //Destination DB Block Number //目標(biāo)數(shù)據(jù)塊號(hào) DST_SttAddr : INT ; //Start Address of the Receiving Data in DST_DB //目標(biāo)數(shù)據(jù)塊中數(shù)據(jù)起始地址 END_VAR VAR_IN_OUT //輸入輸出變量聲明 Enable : BOOL ; //Enable Bit //使能此功能塊位 END_VAR VAR_TEMP //聲明臨時(shí)變量 DB_LOAD_TEMP : INT ; //存放臨時(shí)數(shù)據(jù)塊塊號(hào) Loop_Val : INT ; //Send Data Loop Value //循環(huán)次數(shù) DB_SAVE : INT ; //保存進(jìn)入此函數(shù)前,系統(tǒng)已經(jīng)打開的數(shù)據(jù)塊號(hào) DI_SAVE : INT ; //同上 AR1_SAVE : DWORD ; //保存進(jìn)入此函數(shù)前,地址寄存器1中的值 AR2_SAVE : DWORD ; //同上 END_VAR BEGIN //在STEP7的BLOCK中編輯時(shí)的程序主要從這里開始 NETWORK TITLE =Send Data //Move data from DB to DB A #Enable; //使能位,ENABLE為1執(zhí)行以下程序 JCN END; //否則跳轉(zhuǎn)到最后 TAR1 #AR1_SAVE; // Save AR and Opened DB //保存進(jìn)入此函數(shù)前的數(shù)據(jù)到臨時(shí)變量中,以備離開時(shí)復(fù)原 TAR2 #AR2_SAVE; L DBNO; //同上,保存調(diào)用前的現(xiàn)場(chǎng)數(shù)據(jù),以備調(diào)用完畢復(fù)原主程序的現(xiàn)場(chǎng)數(shù)據(jù) T #DB_SAVE; //一個(gè)DBNO,一個(gè)DINO,是因?yàn)橐瑫r(shí)打開兩個(gè)數(shù)據(jù)塊,只能一個(gè)背景數(shù)據(jù)塊,一個(gè)共享數(shù)據(jù)塊。 L DINO; T #DI_SAVE; L #SRC_DB; //Open DB //把要打開的數(shù)據(jù)塊塊號(hào)通過中間變量#DB_LOAD_TEMP傳送 T #DB_LOAD_TEMP; OPN DB [#DB_LOAD_TEMP]; L #DST_DB; //Open DB T #DB_LOAD_TEMP; OPN DI [#DB_LOAD_TEMP]; L #SRC_SttAddr; //Load Start Address //要復(fù)制的數(shù)據(jù)起始地址 SLD 3; //左移位,使的地址指針最右邊三位保證為0,確保符合地址格式的要求。詳細(xì): http://bbs.e10000.cn/a/a.asp?B=302&;ID=608300 LAR1 ; L #DST_SttAddr; SLD 3; LAR2 ; L #SendNum; 開始循環(huán)程序,把復(fù)制的數(shù)據(jù)量放入循環(huán)變量中 LP1: T #Loop_Val; //Move Data L DBW [AR1,P#0.0]; T DIW [AR2,P#0.0]; +AR1 P#2.0; //指針移位 +AR2 P#2.0; L #Loop_Val; LOOP LP1; //循環(huán)變量減1,判斷循環(huán)條件 LAR1 #AR1_SAVE; //Recover Original AR and DB//這里在執(zhí)行完功能后,開始恢復(fù)調(diào)用前的主程序現(xiàn)場(chǎng)數(shù)據(jù)。 LAR2 #AR2_SAVE; OPN DB [#DB_SAVE]; OPN DI [#DI_SAVE]; SET ; //系統(tǒng)將RLO置1,代表FB(FC)執(zhí)行完畢,相當(dāng)于功能塊的ENO使能輸出位。再次感謝cvlsam。 R #Enable; END: NOP 0; END_FUNCTION |
---|---|
|