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