1、定义
REFERENCE(引用)是对指针的应用,内部也是指针;指针可以指向各种数据类型(bit除外),结构体,功能块,函数及程序,引用也同样可以。
如果对codesys指针不太了解,可以参考上一篇博客
2、声明
用Reference to 关键字进行声明;
riTest : Reference to INT;
等价于
riTest : pointer to INT;
3、赋值
用 ref 进行地址赋值,访问引用对象的值,不必显式引用(对比使用^)
VAR
riTest : Reference to INT;(*引用类型*)
iTest : INT := 0;
END_VAR
riTest ref= iTest;
riTest := riTest + 1 ;
等价于 指针类型的写法
VAR
riTest : pointer to INT;(*指针类型*)
iTest : INT := 0;
END_VAR
riTest := ADR(iTest);
riTest^ := riTest^ + 1;
4、引用举例之函数使用:做一个不断加1的函数
(1)常规写法实现:
(*返回计算结果INT*)
FUNCTION Common_ADD : INT
VAR_INPUT
ivar : INT ;
END_VAR
Common_ADD := ivar + 1;
(2)引用写法实现
(*无返回结果*)
FUNCTION Reference_ADD
VAR_INPUT
ivar : REFERENCE TO INT ;
END_VAR
ivar := ivar + 1;
(3)指针写法实现
(*无返回结果*)
FUNCTION Pointer_ADD
VAR_INPUT
ivar : POINTER TO INT ;
END_VAR
ivar^ := ivar^ + 1;
(4)进行测试,可以看到运行结果一样,都实现不断加1的功能;
PROGRAM PGR2
VAR
iTest1 : INT:= 0;
iTest2 : INT:= 0; ;
iTest3 : INT:= 0; ;
END_VAR
iTest1 := Common_ADD(iTest1);
Reference_ADD(iTest2);
Pointer_ADD(ADR(iTest3));
5 、优点总结
-
优点1: 类型安全
- 对于引用,编译器在分配引用时会检查两个类型是否一致,例如
PROGRAM PGR3
VAR_INPUT
riTest: REFERENCE TO INT;(*指针*)
piTest: POINTER TO INT; (*引用*)
bTest : BOOL:= FALSE;
END_VAR
piTest := ADR(bTest);(*正常:将BOOL类型地址给INT类型指针*)
riTest REF= bTest;(*报警:将BOOL类型赋值给INT类型引用*)
-
优点2: 传参写法简介
- 如果输入是一个Reference to的参数,则不必显式编写ADR(value),例如
ROGRAM PGR2
VAR
iTest2 : INT:= 0; ;
iTest3 : INT:= 0; ;
END_VAR
Reference_ADD(iTest2);(*引用传参*)
Pointer_ADD(ADR(iTest3));(*传递指针参数*)