前置内容
在开始之前我们先准备一些前置知识点,以及硬件。
我们先看硬件吧。
一个直流电源,这个不是必须的,如果你能搞到10-36v dc就可以,很久以前因为其他原因买了这个电源,如果只是为了做个实验,淘宝几十块的直流电源完全够用。
一个普瑞森的模拟量采集模块,淘宝三十多左右,因为这是我手头现有的,且不需要复杂配置,且很便宜的一个支持modbus的设备。
一条宇泰的485转usb转接线(890A),淘宝五十多左右,用于将模块信号传到电脑。
一个温度传感器,淘宝三块钱左右。
一个面包板和一些杜邦线。
硬件已经准备OK了,下面我们准备前置知识点。
首先485是什么。
那些官方的描述可以百度查到,这里我结合我的理解用大白话输出一遍。
485是双方的一种电气约定,规定了是用单端信号还是差分信号,是用那个范围代表逻辑1,那个范围代表逻辑0,以及其他的一些细节,他和通信协议是没有任何关系的,只是一种电气约定,电气规范。
一个设备符合485电气约定就可以在销售时告诉客户我们支持485。
modbus通信协议是什么
其实这正是本文想要弄清楚的问题,这里我们先去掉modbus,解释一下通信协议这四个字是什么意思,依然是我结合我自己的理解,用大白话输出。
任何通信协议到了电气层面都只有逻辑0和逻辑1,我们可以用485电气规范传输遵循modbus协议的比特流,也可以用232,也可以用网线。只有到了协议解析的层面,我们才需要用到协议,也就是上面的模拟量采集模块的单片机内运行的程序,在收到了我通过转接器传输的信号后按modbus协议去解析其中的内容,那么我们就可以说,这个模块支持modbus协议。同样我们的上位机,或者说我们即将用到的modbus poll这个调试软件,也遵循modbus协议发送/接受内容,解析内容,那么这双方就可以通信了,不至于鸡同鸭讲。
好了,前置知识点准备完了,我花一点时间接一下线。
花了点时间,线已经接好了,现在我们看看modbus poll这个软件读到的数据。
我用红笔圈出来的就是一条问询帧,下面我们来分析问询帧。
1.站号,modbus协议是一个询问应答式的协议,即一个网络内挂载的设备是不能主动向主站发送数据的,只能是主站发送,从站应答,理论上讲一个网络内可以挂在256台从站设备,即八位二进制数能表示的最大数字再加1,所以这里就需要一个站号,主站会将问询帧广播出去,从站发现站号和自己的站号相符就做出应答。
2.功能码,modbus协议规定了6个功能码,这里我们用到的是03功能码-读取保持寄存器。
3.起始地址,用16为二进制表示起始寄存器地址上图是00 00即,从地址0开始读取。
4.读取个数,用16位二进制表示读取寄存器的个数,即上图的00 7C,转换为十进制就是124。
5.冗余校验,用16位二进制表示冗余校验,这个可以百度细节,此处不纠结,但这个地方很容易出问题,尤其在不使用调试工具,自己拼接的时候,经常是这里出错,明明发了问询帧,但就是得不到应答,多数是这个地方的问题。