ANY数据类型及参数传递
ANY是一种用于传递指针的形参数据类型,可视为POINTE R 类型的扩展,较POINTER 类型为复杂,长度为10个字节,增加的4 字节,最高字节 (Byte 0) 固定为B#16#10,第二字节 (Byte 1) 为ANY指针所指向区域的数据类型,而接下来的2 字节 (BYTE 3, 4) 组合为一个INT ,为ANY指针所指定区域的长度,称为重复系数 (Rep etition factor) 。其余6 字节作用与POINTE R 类型相同。
编程举例:
// 冒泡排序程序,算法原理请参考相关资料
// 此例程仅提供存于DB块中的INT 类型数据排序
// 结果为INT 数据由小到大排列,保存于原DB块中
//FC3 块,形参定义如下:
// 输入参数Dat a(A ny 类型);输出参数Error(INT类型)
// 若输出参数Error不为0, 则说明排序未进行,
//Error = 1, D ata(ANY 类型)输入指针无效
//Error = 2, D ata(ANY 类型)输入指针地址非DB地址
//Error = 3, D ata(ANY 类型)输入指针指定区域类型非INT 类型
SET
SAVE
L 0
T #Err or
// 将输入ANY 指针‘Data_ In’复制到LB0~LB9
L D [ AR1,P#0.0]
T LD 0
L D [ AR1,P#4.0]
T LD 4
L W [ AR1,P#8.0]
T LW 8
//ANY 指针 BYTE0 是B#1 6#10
L LB 0
L B#16#10
==I
JCN ERR1
// 输入数据区是否为DB块
L LB 6
L B#16#84
==I
JCN ERR2
// 类型为INT
L LB 1
L B#16#5
==I
JCN ERR3
// 打开输入DB块
OPN DB [LW 4]
// 数据起始地址去掉数据区标识部分
L LD 6
L DW#16#FFFFFF
AD
T LD 10
// 计算最后一个存储单元指针保存至LD10
L LW 2
L 2
*I
T LD 14
L L#2
-D
SLD 3
L LD 10
+D
T LD 10
// 外循环计数LW20 ,循环次数为(数据个数-1)次
L LW 2
L 1
-I
NXT2: T L W 20
L LD 10
LAR1
L LW 20
// 嵌套循环计数LW18 ,循环次数为(LW20)次
NXT1: T L W 18
T A R1
L P#2. 0
-D
LAR1
// 后一单元数据小于前一单元数据?
L DB W [AR1,P#2.0]
L DB W [AR1,P#0.0]
《i 《/i
JCN L1
// 否,交换2 单元数据
L DB W [AR1,P#2.0]
L DB W [AR1,P#0.0]
T DBW [AR1,P#2.0]
POP
T DBW [AR1,P#0.0]
L1: L LW 18
LOOP NXT1
L LW 20
LOOP NXT2
JU EX IT
// 错误码1,ANY指针有错
ERR1: L 1
T #Err or
JU EX IT
// 错误码2,输入数据区不是DB块
ERR2: L 2
T #Err or
JU EX IT
// 错误码3,输入数据类型不是INT
ERR3: L 3
T #Err or
EXIT: SET
SAVE
在OB1程序中调用举例:
A M 0.0
F P M 0.1
JCN EXI T
CALL F C 3 //FC3 为上述排序程序
Data : =P#DB3.DBX 0.0 INT 64 // 参数Data, DB3 中64个INT 排序
Error : =MW2
EXIT: NOP 0
编辑:lyn
全部0条评论
快来发表一下你的评论吧 !