You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Codesys中将四个16位UINT合并为一个64位ULINT?

在CODESYS中将四个16位UINT合并为64位ULINT的方法

核心注意事项

  1. CODESYS中左移操作使用SHL而非C语言的<<,右移使用SHR。
  2. 16位UINT直接移位会因类型宽度限制丢失数据,必须先转换为64位ULINT再执行移位操作。
  3. 不能通过多次赋值覆盖结果,需用位或(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 23:05:20