日期:2014-05-17  浏览次数:21045 次

关于C#请求与解析Ascii格式的ModBus数据问题
各位前辈你们好:
问题背景是这样的,我需要使用ModBus-Ascii的数据,收集下位机的数据,2个小时向下位机发送一次命令,收集数据。然后接受数据,对数据进行解析存入数据库。而且我第一次接触ModBus和工业需求,经过了好几天的资料查询才做出来这么一点,希望前辈们不要嫌弃我,我会努力的。
寄存器点表如下:

变量名称 寄存器地址(字) 寄存器占用数量
供水温度 D2                 2        
回水温度 D4                 2              
供水压力 D12                 2         
回水压力 D14                 2        
室外温度 D0                 2        
累计热量 D806                 2       
瞬时热量 D804                 2         
累计流量 D802                 2        
瞬时流量 D800                 2         
热表供温 D808                 2         
热表回温 D810                 2        
当前水量 D760                 2       
当前总电量 D750                 2        
这些数据都要转成Float型存入数据库。

问题1:寄存器地址这一栏的意思是不是指的值所在的位置,如果是D0,就是响应数据中除头和尾后的数据信息的第0位,然后取2个数(也就是Byte)? 
问题2:寄存器地址都不是连贯的,有的在0、10、800上,我取向下位机发送命令的时候寄存器个数的时候怎么写能一次性读取出来?
问题3:如果真如我第一个问题所猜测的那样,我将数据取两个Byte,如何转成Float型,Float至少用四个Byte啊,是不是这么理解?
问题4:我做测试条件是:设备地址是5,从0位取,取3个寄存器
发送命令发送出去的byte数组是:58 48 53 48 51 48 48 48 48 48 48 48 51 70 53 13 10
接收到的数据byte数组是:58 48 53 56 51 48 50 55 54 13 10
我哪里写错了么?

------解决方案--------------------
其实你并不需要关心底层是如何实现的,你只要通过485或其它方式向硬件发送请求命令,返回接收返回就可以了。

一般来说,只要你发送的数据是正确的,硬件不会返回错误的结果。除了干扰特别强以外。

如果你是使用485的话,我觉得是你没有将接收的数据缓存起来,也就是没有读到完整的数据。也就是处理报文边界的问题