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));(*传递指针参数*)

请添加图片描述

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐