twincat - 连接变量
问题描述
我需要将一个字符串、一个整数和一个字符串连接成一个变量——在这种情况下是一个输入。
输入命名如下:
DI_Section1_Valve AT %I*: BOOL;
DI_Section2_Valve AT %I*: BOOL;
DI_Section3_Valve AT %I*: BOOL;
现在,我想遍历这些(这只是一个简短的示例):
For i:= 1 TO 3 DO
Var[i] := NOT CONCAT(CONCAT('DI_Section', INT_TO_STRING(i)), '_Valve')
END_FOR
但是通过连接字符串,我会得到一个字符串,例如。'DI_Section1_Valve',而不是布尔变量,例如。DI_Section1_Valve。
我如何以变量而不是字符串结束?任何帮助表示赞赏,在此先感谢。/Thoft99
解决方案
该技术称为可变变量。不幸的是,这在 ST 中不可用。解决它的方法很少。据我了解,Twincat 3 基于 Codesys 3.5。这意味着 UNION 可用。还有一个技巧是引用BOOL
不能按预期工作,一个引用占用一个字节。所以你不能把它们按顺序排列,所以你需要知道BYTE
输入模块的地址。
TYPE DI_Bits : STRUCT
DI_Section1_Valve : BIT; (* Bit 1 *)
DI_Section2_Valve : BIT; (* Bit 2 *)
DI_Section3_Valve : BIT; (* Bit 3 *)
DI_Section4_Valve : BIT; (* Bit 4 *)
DI_Section5_Valve : BIT; (* Bit 5 *)
DI_Section6_Valve : BIT; (* Bit 6 *)
DI_Section7_Valve : BIT; (* Bit 7 *)
DI_Section8_Valve : BIT; (* Bit 8 *)
END_STRUCT
END_TYPE
TYPE DI_Sections : UNION
ByName : DI_Bits;
ByID : ARRAY[1..8] OF BOOL; (* Comment *)
ByMask: BYTE;
END_UNION
END_TYPE
PROGRAM PLC_PRG
VAR
DIS AT %IB0.0: DI_Sections; (* Our union *)
xOut : BOOL;
END_VAR
xOut := DIS.ByID[1];
xOut := DIS.ByName.DI_Section1_Valve;
DIS.ByID[5] := TRUE;
// Now DIS.ByName.DI_Section5_Valve also EQ TRUE
END_PROGRAM
推荐阅读
- docker - docker 容器中的应用程序如何访问 Windows 中的数据库?
- php - Ci 在不同的项目中使用相同的会话
- node.js - 如何在 Node.js 中设置变量值以获取请求的正文数据
- javascript - 如何在对象数组上使用javascript reduce
- objective-c - 如何向我的 Xcode 项目添加 GZIP 支持
- android - 无法在动态功能中访问 android.support.v4.view.KeyEventDispatcher.Component
- cordova - cordova InAppBrowser 打开远程页面支持调用本机方法?
- arm - 有人可以让我清楚 mov w0, #0 vs mov x0, #0 之后的实际寄存器值吗?
- python - python opcua BadDeviceFailure(错误0x808B0000)
- android - 从 Google Play 删除我的应用后,我可以使用 FCM 吗?