zzgzlp
级别: 略有小成
精华主题: 0
发帖数量: 118 个
工控威望: 275 点
下载积分: 1949 分
在线时间: 99(小时)
注册时间: 2012-12-10
最后登录: 2026-05-17
查看zzgzlp的 主题 / 回贴
楼主  发表于: 8天前
图片:
图片:
图片:
用威纶屏读取珠海志美PD650D仪表毛重32位的数据,给到smart vD9000寄存器的问题,(PLC是空白程序,排除程序冲突),结果VD9000数异常,但VW9000数据跟仪表才正确的。(问题是一个寄存器最大数据是32767,由于数据带两位小数点,最大值是327.67,而我们的量程是1000.00)这不是一个人32位的数据吗,然后又用串口调试软件读取了仪表数据,还是不理解VD9000为什么数据不对,请师傅们帮我分析,多谢
尹梦超
级别: 略有小成
精华主题: 0
发帖数量: 104 个
工控威望: 260 点
下载积分: 7258 分
在线时间: 83(小时)
注册时间: 2012-05-24
最后登录: 2026-05-22
查看尹梦超的 主题 / 回贴
1楼  发表于: 4天前
大小端数据格式的问题
往事如风
科技改变制造
级别: 网络英雄

精华主题: 0
发帖数量: 12347 个
工控威望: 20257 点
下载积分: 15764 分
在线时间: 2884(小时)
注册时间: 2013-01-31
最后登录: 2026-05-24
查看往事如风的 主题 / 回贴
2楼  发表于: 昨天
引用
引用第1楼尹梦超于2026-05-21 11:57发表的  :
大小端数据格式的问题

32位浮点数读取涉及大小端排序,弄不清就是乱数
三人行者必有我师 ,择其善者而从之
z20272026
级别: 正式会员
精华主题: 0
发帖数量: 31 个
工控威望: 68 点
下载积分: 49 分
在线时间: 28(小时)
注册时间: 2026-03-27
最后登录: 2026-05-25
查看z20272026的 主题 / 回贴
3楼  发表于: 昨天
从你贴出的论坛讨论来看,问题核心已经很明确了:这是典型的大小端数据格式不匹配。你观察到的“VD9000 数据异常,但 VW9000 数据正确”是这种问题的关键现象。

我帮你把这个问题的原理和解决方法梳理一下,方便你理解并在程序里修正。

1. 为什么 VD9000 异常,但 VW9000 看起来“正确”?
西门子 S7-200 SMART PLC 存储 32 位数据(如 VD9000)时,遵循 大端模式:高字节存在低地址。

VD9000 由 VW9000(高16位)和 VW9002(低16位)组成。

VW9000 又是 VB9000(高8位)+ VB9001(低8位)。

仪表或威纶屏(HMI)读取的 32 位数据可能是 小端模式:低字节存在低地址。

举例:仪表数据为 0x00002710(十进制=10000,假设小数点后两位即 100.00)。

如果数据以小端顺序传输:PLC 接收到的字节顺序是 10 27 00 00。

PLC 按大端模式组合回 VD9000:

VB9000 = 0x10

VB9001 = 0x27

VB9002 = 0x00

VB9003 = 0x00

最终 VD9000 = 0x10270000 (这是一个巨大且错误的数)

但是你单独看 VW9000 = VB9000 + VB9001 = 0x1027 = 4135(十进制)。如果真实值是 10000,而 4135 看起来和 10000 无关,为什么你觉得“正确”?

更常见的情况是:实际数据是 0x00002710 (10000),小端发送 10 27 00 00 后,PLC 的 VW9000=0x1027=4135,而 VW9002=0x0000=0。

你说“VW9000 数据正确”——通常是因为另一个巧合:当数值较小(<65535)且为整数倍时,小端数据的“低16位”如果恰巧包含主要有效数值,且高16位为零,那么 VW9000 会巧合地等于真实值的低16位。但这只适用小数值,且不通用。你量程1000.00,读327.67以下可能正常,一旦超过就会错乱。这就是“看起来对,但32位不对”的原因。

2. 解决方法(3选1,推荐第1或第2种)
方法一:在 PLC 程序中交换高16位和低16位(最直接)
你收到数据后,用一条指令把 VD9000 的高低字交换,再放到真正的数据寄存器里。

st
// 假设威纶屏已经把32位数据写到了 VD9000
// 执行交换:将 VW9000 与 VW9002 互换
MOVW VW9002, VW1000  // 暂存低字
MOVW VW9000, VW9002  // 高字移到低字位置
MOVW VW1000, VW9000  // 低字移到高字位置
// 现在 VD9000 就是正确的32位数了
或者更简洁(用指针或循环,但 SMART 里最简单还是上面三步)。

方法二:修改威纶屏的读取设置(一劳永逸)
在威纶屏的“元件”或“数据读取”设置中,找到读取该仪表寄存器的配置,将“32位数据格式”从“Word swap”或“Little Endian”改为“Big Endian”。不同型号叫法略有不同,但选项通常是:

32-bit (Word swap) / 32-bit (Byte swap) / None

选择与西门子匹配的 不交换 或 大端模式。

你翻一下威纶屏中该仪表地址的配置界面,勾选或取消“字交换”选项即可。

方法三:在仪表上配置输出格式(如果仪表支持)
查询珠海志美 PD650D 的通信协议手册,看能否通过命令将其 RS485/232 输出的 32 位数据设置为“大端模式”。部分仪表可以配置。

3. 验证与注意事项
验证:修改后,读取一个你知道的固定值(如仪表显示 100.00,对应整数 10000),检查 VD9000 是否等于 10000。

小数点:仪表带两位小数,你在 PLC 里处理时,可以把 VD9000 当作整数,显示或计算时再除以 100。例如 LD 100.00 传给你是整数 10000,你程序里 10000 / 100 = 100.00。

带符号:如果毛重可能为负,注意使用 32位有符号整数(DINT) 来处理 VD 数据,而不是无符号。

总结一句话:数据字节顺序错了,导致 VD 组合出来的值面目全非;修正大小端匹配后,VD9000 就会正确反映仪表数值,同时 VW9000 不再有意义。 from deepseek https://chat.deepseek.com/share/1ktyidi3l63eilnlhb