【问题标题】:What are the semantics of input variables passed by reference?通过引用传递的输入变量的语义是什么?
【发布时间】:2019-10-02 17:13:17
【问题描述】:

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

当从下面的F_Test 测试函数调用时,下面的F_IsNonEmpty 函数是否有效并执行预期的操作?

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= 运算符初始化引用的目标(例如 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】:

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

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

    【讨论】:

    • var_in_out 和 var_input 之间存在微妙但重要的区别。您必须在每个周期中编写 var_in_out。如果你不这样做,如果没有先写,变量将为空。使用 var_input,您可以编写一次,并在循环中保持该值。
    • 是的,但如果在调用功能块时未设置 var_in_out 变量,编译器将生成错误,通常您应该在访问它们之前检查引用/指针。
    猜你喜欢
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 2023-02-07
    相关资源
    最近更新 更多