最近学习modbus-RTU通讯协议。手头刚好有个步科的步进电机驱动器FM-860采用RS-485通讯,modbus-RTU协议
该驱动器有个寄存器是存取电源电压的。通过查找手册得到如下信息
| Modbus地址 | 单位 | 功能 |
| 0x3F00 | V | 实时母线电压 |
电脑连接端采用485转串口,在设备管理器里可以看到设备使用COM2端口。
这里需要读取寄存器参数。使用功能码0x03
| 设备地址 | 功能码 | modbus地址起始地址高位 | modbus地址起始地址低位 | 读取个数高字节 | 读取个数低字节 | CRC校验(两字节) |
| 0x01 | 0x03 | 0x3F | 0x00 | 00 | 01 | 0x88 0x1E |
CRC校验计算可以通过工具计算得来
因为发送时先发送低位再发送高位,所以0x88 在前0x1E在后
下面就发送给驱动器来获得参数值。
我先开一个串口监视软件来监控串口数据。
点开监控后再打开串口调试工具。设置好参数。发送数据01 03 3F 00 00 01 88 1E
这时驱动器已经返回参数了。再看串口监视器也有数据。两个数据一致。
再来分析得到的数据01 03 02 00 17 F8 4A
根据modbus响应报文格式
01设备地址
03查询功能码
02返回byte数据个数
00 17参数数据
F8 4A校验码CRC
数据0x17转换成十进制为23。所以电压为23V。
我们再通过官方的调试软件看下是否正确。
结果一致。
下面通过逻辑分析仪看看485的时序,是如何传递数据的
下面为截取的时序图,
1.发送
485两线制,差分信号,所以电平是相对称的。
看第一个箭头由高到低表示起始位。
后面红框8个白点表示8位数据,第一个高电平后面都是低电平,值为10000000。由于数据由前向后发送,所以转换成十六进制要倒过来就是0x01。
看第三个箭头处高电平为停止位。
2.接收
同理分析可得 01 03 02 00 17 F8 4A。
最后通过LABVIEW写个简单的上位机监控该参数,采用NI的modbus库。
通过调整电源电压值,可以观测到驱动器电压曲线波动
labview中modbus 地址为10进制,所以0x3F00要转换成16128