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

问题描述 投票:0回答:1

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功能进行确认。

plc twincat codesys
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.