如何在Codesys中将四个16位UINT合并为一个64位ULINT?
在CODESYS中将四个16位UINT合并为64位ULINT的方法
核心注意事项
- CODESYS中左移操作使用
SHL而非C语言的<<,右移使用SHR。 - 16位UINT直接移位会因类型宽度限制丢失数据,必须先转换为64位ULINT再执行移位操作。
- 不能通过多次赋值覆盖结果,需用位或(OR)或加法合并各移位后的值(因各部分位区间不重叠,两种方式效果一致)。
优化实现(直接使用数组元素)
无需额外中间变量,直接通过数组元素完成合并:
VAR UTCdataArray : ARRAY [0..3] OF UINT; // 存储4个16位UINT的数组 UTCval: ULINT := 0; // 最终64位ULINT结果 END_VAR // 合并逻辑:转类型后移位,再通过位或合并 UTCval := (ULINT)UTCdataArray[0] SHL 0 OR (ULINT)UTCdataArray[1] SHL 16 OR (ULINT)UTCdataArray[2] SHL 32 OR (ULINT)UTCdataArray[3] SHL 48;
保留中间变量的实现
如果需要保留你代码中的中间变量(UTCval0~UTCval3),可以这样写:
VAR UTCdataArray : ARRAY [0..3] OF UINT; UTCval0: UINT := 0; UTCval1: UINT := 0; UTCval2: UINT := 0; UTCval3: UINT := 0; UTCval: ULINT := 0; END_VAR // 读取数组值到中间变量 UTCval0 := UTCdataArray[0]; UTCval1 := UTCdataArray[1]; UTCval2 := UTCdataArray[2]; UTCval3 := UTCdataArray[3]; // 合并为ULINT UTCval := (ULINT)UTCval0 SHL 0 OR (ULINT)UTCval1 SHL 16 OR (ULINT)UTCval2 SHL 32 OR (ULINT)UTCval3 SHL 48;
代码说明
(ULINT)强制类型转换:将16位UINT转为64位ULINT,避免移位时因位数不足丢失数据。SHL n:实现数值左移n位,对应C语言的<< n语法。OR:位或操作,将各移位后的独立位段合并到同一个64位变量中(因各段无重叠,也可用+替代OR)。
内容的提问来源于stack exchange,提问作者Andrew180
相关产品推荐
相关产品推荐

