首页 > 全部分类 > 技术问答 > 帖子内容

请教5000中一个INT数据如何拆分成两个SINT?仪表需要把采集到的INT数据的高低字节分开,网上搜可以使用.H或.L,试了下不行,大家都怎么处理这种情况的?

联系人:15609536173197

电话/手机:联系客服

发布时间:2025-10-14 19:10

浏览:21次

明扬工控技术客服2025-10-14 19:15:12
答复内容:你说的“5000”= Studio/RSLogix 5000(Control/CompactLogix)。把一个 INT(16 位) 拆成两个 SINT(8 位) 有几种常用且可靠的做法——最简单的是用 COP。

方法 1(首选):COP 指令按字节拷贝

建 2 个字节的数组:MyBytes : SINT[2]

执行:

Source = MyInt(类型 INT)

Dest = MyBytes[0](类型 SINT)

Length = 1 ← 注意:长度是“源类型的元素个数”,拷 1 个 INT=2 字节

在 Logix(小端序)里:

MyBytes[0] = 低字节(LOW)

MyBytes[1] = 高字节(HIGH)

想把两个 SINT 合回 INT,也用一条 COP:Source=MyBytes[0]、Dest=MyInt、Length=1(拷 1 个 INT 的字节数)。

提示:如果你看到大于 127 的字节会以负数显示,这是 SINT 有符号显示 的问题;实际发出去的字节是对的。把显示基数改成 HEX 或改用 USINT(若固件支持)。

方法 2:按位运算(屏蔽+移位)
// 拆分
LowByte  : USINT;   // 或 SINT
HighByte : USINT;

LowByte  := USINT(DINT(MyInt) AND 16#00FF);
HighByte := USINT((DINT(MyInt) >> 8) AND 16#00FF);

// 组回
MyInt := INT( (DINT(HighByte) << 8) OR DINT(LowByte) );


先转成 DINT 再移位,避免有符号移位的坑。

用 AND 16#00FF 保证只取 8 位。

方法 3:COP 到更长的字节缓冲

对需要连续处理一批数据的场景,可以把 INT[N] 一次 COP 到 SINT[2*N],再按索引取高/低字节即可。

常见坑

COP.Length 写成 2 以为是 2 字节,其实变成拷 2 个 INT(4 字节)→ 结果错。

目的地址没有对齐或类型错(用 INT/DINT 去接 SINT 字节)。

看值时用十进制导致误判(>127 显负数)。

这样做基本就能跟仪表对上“高低字节分开”的需求了。

对不起,请登录后再发表评论!

触屏端
扫一扫手机也能发信息
明扬工控商城-工控网-工控自动化真品,一站式专业服务!