Codesys中Union数据传输至梯形图及C0230报错问题咨询
CODESYS提取Word变量Bool位触发C0230报错的解决方法
报错规避:正确使用Union实现位映射
触发C0230报错的核心原因是Union的定义、变量声明或调用不符合CODESYS的IEC61131-3语法规范,按以下步骤写即可规避:
- 先在DUT类型定义区新建自定义Union类型,标准写法如下:
TYPE WORD_BIT_MAP : UNION // 原始字变量映射 wordVal : WORD; // 位段映射 bitField : STRUCT b0 : BOOL; b1 : BOOL; b2 : BOOL; b3 : BOOL; b4 : BOOL; b5 : BOOL; b6 : BOOL; b7 : BOOL; b8 : BOOL; b9 : BOOL; b10 : BOOL; b11 : BOOL; b12 : BOOL; b13 : BOOL; b14 : BOOL; b15 : BOOL; END_STRUCT; END_UNION END_TYPE
- 在程序变量区声明对应类型的实例变量,禁止直接把Union类型名当变量调用:
VAR // 你原本需要解析的Word类型变量 targetWord : WORD; // Union类型实例 wordBitParse : WORD_BIT_MAP; END_VAR
- 逻辑中先给Union的字成员赋值:
wordBitParse.wordVal := targetWord;,后续梯形图里直接调用wordBitParse.bitField.b0~wordBitParse.bitField.b15即可拿到对应位的BOOL值,不会触发报错。
注意:CODESYS采用小端位序,b0对应Word的最低位(2^0位),和通用PLC硬件IO的位定义完全对齐,无需额外转换位序。
更简便的替代实现方案
如果不想自定义DUT类型,可以直接用CODESYS原生支持的两种位提取方式,梯形图和结构化文本都能直接调用:
- 直接位访问语法:CODESYS原生支持
字变量名.位序号的写法,比如要取ctrlWord的第0位,直接写ctrlWord.0即可,取第5位写ctrlWord.5,不需要额外做任何变量定义和赋值,是最轻量化的实现方式。 - 标准库位操作函数:调用系统自带的
BIT_TST函数,写法为BIT_TST(目标字变量, 位序号),返回值即为对应位的BOOL状态,适合需要循环批量处理多个位的场景。
内容的提问来源于stack exchange,提问作者Romain Grimaldi
相关产品推荐
相关产品推荐

