通过引用传递的输入变量的语义是什么?

时间:2019-10-01 18:48:57

标签: plc twincat codesys

Beckhoff的TwinCat-3以及它所基于的Codesys 3,添加了引用作为对IEC-61131-3语言的扩展。我想知道这种非标准加法的确切语法和语义是什么(这就是它们的问题:没有人像标准一样会费心地记录它们)。

从下面的F_IsNonEmpty测试函数中调用以下F_Test函数是否有效,并且可以做什么?

FUNCTION F_IsNonEmpty : BOOL
  VAR_INPUT
    text : REFERENCE TO STRING;
  END_VAR
  F_IsNonEmpty := LEN(text) > 0;
END_FUNCTION

FUNCTION F_Test1
  VAR
    testMessage : STRING := '123';
  END_VAR
  IF F_IsNonEmpty(text := testMessage) THEN
    {...}
  END_IF
END_FUNCTION

鉴于引用的目标必须使用REF=运算符(vseg C ++,其中引用目标是不可变的)初始化的,所以我期望下面的调用代码将是正确的,但是它不会甚至编译:

FUNCTION F_Test2
  VAR
    testMessage : STRING := '123';
  END_VAR
  IF F_IsNonEmpty(text REF= testMessage) THEN
    {...}
  END_IF
END_FUNCTION

F_Test1似乎正常工作,但我希望有人使用Codesys 3或TwinCat-3 REFERENCE TO功能进行确认。

1 个答案:

答案 0 :(得分:1)

在VAR_INPUT中使用REFERENCE时,就好像您在使用VAR_IN_OUT变量一样。 否则,如果您在VAR部分中声明了REFERENCE,则在为其分配另一个变量(或获取异常)时需要使用REF =。

从本质上讲,REFERENCE(如VAR_IN_OUT var)是更方便和“安全”的指针,因为不需要取消引用运算符^,并且因为类型是在编译时检查的。