plc通过modbus协议读取变频器数据,欧姆龙plc的modbus协议与标准的modbus协议稍有区别
标准的读变频器数据格式为
从机地址 功能码 读取的寄存器起始地址高字节 读取的寄存器起始地址低字节 读取的寄存器数量高字节 读取的寄存器数量低字节 CRC低 CRC高
如 01 03 00 6B 00 01 CRC低 CRC高
而欧姆龙plc读变频器的数据格式为
从机地址 功能码 字节数 读取的寄存器起始地址高字节 读取的寄存器起始地址低字节 读取的寄存器数量高字节 读取的寄存器数量低字节 CRC低 CRC高
此处多了一个字节数,但是在实际发送的时候,变频器收到的数据却是标准格式,即字节数在发送的时候去掉了,或者说这是欧姆龙用于发送的一个参数,这个字节数的值是从字节数后面的寄存器开始算,
一个寄存器占2个字节,但CRC不参与计算,举例子:
如欧姆龙PLC发送的数据为:01 03 04 00 6B 00 01 CRC低 CRC高 (此时的字节数为04是因为起始寄存器占2字节,读取的寄存器数量占2字节,即00 6B 00 01)
但变频器收到的真实数据是:01 03 00 6B 00 01 CRC低 CRC高
因此要注意这其中的区别,否则将会导致通信失败。
举个例子,假如使用串口调试助手通过RS485转换器跟变频器通信,读取P0-04的寄存器值,那么发送的数据帧格式就是标准的modbus格式,即
01 03 00 04 00 01 C5 CB (需要手动添加校验码,因为串口调试助手不会自动计算校验码)
若用欧姆龙PLC与变频器通信,则发送的数据帧格式是:
01 03 04 00 04 00 01 CRC低 CRC高
变频器按照标准的modbus协议格式返回数据,数据格式为 从机地址 功能码 字节数 寄存器1值高字节,寄存器1值低字节...寄存器N值高字节,寄存器N值低字节 CRC低,CRC高
字节数是寄存器数量的2倍,即字节数为2N,上述例子中PLC只读取1个寄存器值,因此变频器返回的实际数据为:
01 03 02 08 98 BE 2E (0x0898为十进制的2200)
在这里,有一个重要的点要说明。
欧姆龙PLC CP1H在接收变变频器数据的时候,会将字节数02当成数据,导致接收到的数据为0x0208,0x9800,而实际的数据仅仅是0x0898而已,因此需要对接收的数据进行移位重新组合。
小知识点:
1.欧姆龙PLC CP1H存储接收到的数据是从D32354(假设用的是串口2)开始存储,每个寄存器2字节,16bit。因此变频器返回的数据被存在D32354的是0x0208,存在D32355的是0x9800(低字节补0),假如变频器返回的数据不止这两个字节,那么按照返回
顺序排列,不足两个字节的低字节自动补0。暂时不明白欧姆龙plc为什么这么做,将接收字节数当成数据,会导致真正的数据错位,需要重新组合排列。
2.欧姆龙PLC与变频器进行modbus通信时,plc不需要输入校验码,plc会自动计算并发送,只需要发送校验码之前的数据即可,不熟悉或者刚接触的人可能会将校验码一起发送,从而导致通信失败。