对于ANY数据类型及参数传递的详细解析

描述

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

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分