plc - 通过引用传递的输入变量的语义是什么?
问题描述
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-3REFERENCE TO
功能的人来确认。
解决方案
当您在 VAR_INPUT 中使用 REFERENCE 时,就好像您在使用 VAR_IN_OUT 变量一样。否则,如果您在 VAR 部分声明您的 REFERENCE,则需要在为它分配另一个变量时使用 REF=(或获得异常)。
本质上,REFERENCE(像 VAR_IN_OUT var)是一个更方便和“安全”的指针,因为不需要取消引用运算符 ^ 并且因为在编译时检查类型。
推荐阅读
- javascript - 如何从 HTML 页面调用 node.js 函数?
- android - 如何在 Firestore 中搜索数组并查找用户 ID
- firebase - 显示来自 Firebase 的子集合的问题
- javascript - 如果链接到锚标签,警报框不会弹出?
- pyspark - 根据列的数据类型填充 pyspark 数据框中的空值
- webpack - Webpack/车把
- python - 如何考虑(熊猫)数据透视表中的外键关系?
- anychart - 桑基图的点事件?
- python - 在 OptionMenu Tkinter 中选择选项时如何将按钮状态从禁用更改为活动
- laravel - Laravel 验证规则是否默认为有时?