电话/手机:联系客服
优质评论内容
你说的“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 显负数)。
这样做基本就能跟仪表对上“高低字节分开”的需求了。