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
功能进行确认。
答案 0 :(得分:1)
在VAR_INPUT中使用REFERENCE时,就好像您在使用VAR_IN_OUT变量一样。 否则,如果您在VAR部分中声明了REFERENCE,则在为其分配另一个变量(或获取异常)时需要使用REF =。
从本质上讲,REFERENCE(如VAR_IN_OUT var)是更方便和“安全”的指针,因为不需要取消引用运算符^,并且因为类型是在编译时检查的。