step7中的难点:间接寻址示例,中文详细注释。
推荐欢迎纠错,防止误导。
FUNCTION "DBtoDB" : VOID //该功能块的作用是把一个数据块中的指定的一批数据,复制到另一个块的指定位置。
TITLE = //标题,这里没有指定
AUTHOR : BaiZH //作者 感谢您,BaiZH,通过您的这个例子我基本入明白了间接寻址的用法。不过具体在什么情况下使用我还得继续努力。
FAMILY : IR //分类
NAME : DBtoDB //名称
VERSION : 0.1 //版本
VAR_INPUT //输入型变量声明开始
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 //声明临时变量
DB_LOAD_TEMP : INT ; //存放临时数据块块号
Loop_Val : INT ; //Send Data Loop Value //循环次数
DB_SAVE : INT ; //保存进入此函数前,系统已经打开的数据块号
DI_SAVE : INT ; //同上
AR1_SAVE : DWORD ; //保存进入此函数前,地址寄存器1中的值
AR2_SAVE : DWORD ; //同上
END_VAR
BEGIN //在STEP7的BLOCK中编辑时的程序主要从这里开始
NETWORK
TITLE =Send Data
//Move data from DB to DB
A #Enable; //使能位,ENABLE为1执行以下程序
JCN END; //否则跳转到最后
TAR1 #AR1_SAVE; // Save AR and Opened DB //保存进入此函数前的数据到临时变量中,以备离开时复原
TAR2 #AR2_SAVE;
L DBNO; //同上,保存调用前的现场数据,以备调用完毕复原主程序的现场数据
T #DB_SAVE; //一个DBNO,一个DINO,是因为要同时打开两个数据块,只能一个背景数据块,一个共享数据块。
L DINO;
T #DI_SAVE;
L #SRC_DB; //Open DB //把要打开的数据块块号通过中间变量#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; 开始循环程序,把复制的数据量放入循环变量中
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; //循环变量减1,判断循环条件
LAR1 #AR1_SAVE; //Recover Original AR and DB//这里在执行完功能后,开始恢复调用前的主程序现场数据。
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