quote:以下是引用鹅卵石在2011-12-04 09:13:51的发言:
[quote]以下是引用yiutyi在2011-11-30 12:01:51的发言:
如果要编写通用的程序,并且程序的输入或者输出是指针格式(pointer或者any)就需要使用
P##input(pointer /any),我觉得这个应用很能体现指针的强大,就是对指针所在的地址进行指针寻址:
L P##Input //指向存储地址指针Input首地址,并
LAR1 //装载到地址寄存器AR1中。
L W [AR1,P#4.0] //打开DB块
T #BLOCK_NO
OPN DB [#BLOCK_NO] //如果是DB块,打开指定的DB块。
L W [AR1,P#2.0] //判断ANY指针中数据长度
_001:T #DATA_LEN //通常此处做loop循环!!
L D [AR1,P#6.0] //找出需要计算数据区的开始地址
// do quote]
请问大侠,能否将这个例子说的更加具体性(如做一个简单的FC块,并演示如何调用参数的),方便学习。
乱说两句,抛砖引玉,很多工程师都用过sfc20,如果想编写一个自己的更灵活的sfc20,可以使用指针,例如:
FUNCTION FC 1 : VOID
TITLE =
VERSION : 0.1
VAR_INPUT
SRCBLK : ANY ;
END_VAR
VAR_OUTPUT
RETVAL : INT ;
DSTBLK : ANY ;
END_VAR
VAR_TEMP
LOOP : INT ;
BLOCK_NO_DB : WORD ;
BLOCK_NO_DI : WORD ;
SRC_ADD : DWORD ;
DST_ADD : DWORD ;
END_VAR
BEGIN
NETWORK
TITLE =
L P##SRCBLK; //读取输入any的首地址
LAR1 ; //装载到ar1
L P##DSTBLK; //读取输出any的首地址
LAR2 ; //装载到ar2
L W [AR1,P#4.0]; //打开DB块
T #BLOCK_NO_DB;
L W [AR2,P#4.0]; //打开DI块
T #BLOCK_NO_DI;
OPN DB [#BLOCK_NO_DB]; //打开DB块
OPN DI [#BLOCK_NO_DI]; //打开DI块
L D [AR1,P#6.0];
T #SRC_ADD; //读取地址
L D [AR2,P#6.0];
T #DST_ADD; //读取地址
NETWORK
TITLE =
L W [AR1,P#2.0]; //读取循环次数
_001: T #LOOP;
L DBB [#SRC_ADD];
T DIB [#DST_ADD]; //赋值
//地址偏移1个字节
L P#1.0;
L #SRC_ADD;
+D ;
T #SRC_ADD;
L P#1.0;
L #DST_ADD;
+D ;
T #DST_ADD;
//循环
L #LOOP;
LOOP _001;
END_FUNCTION