我们介绍完了芯片的一些术语和定义,就要开始进行下位机的编程。在这里我只概括说明例程的一些框架部分,剩下的大家可以自己去参考程序或者软件文档的说明。
流程和框架我们都描述得很清晰,唯独在些细节可能很多朋友都不是很清楚为什么要使用modbus来作为主要的通讯。其实并不一定非要modbus,因为modbus算是行业的一种标准,但是过多的去校验这些让整个通讯的过程变得很慢,所以很稳定,尤其在读写的过程基本都是在固定的时间内往上发东西。所以我们在做上位机的时候就是先把下面往上发的东西先拿出来进行每个bit的处理。在这里其实很关键,很多人都卡在了这一步,不知道发上来的东西在哪改。所以我要单独的截个图出来(这里只是增加大家的理解,要详细了解的话还得多看看代码和协议),这个图基本涵盖了所有的原理,至于modbus怎么一步步传输的,就要参考下freemodbus了。
读取数据的报文格式如下:
我们可以看到对应的每个bit位都有代表的意义,想要修改往上传送的信息就要修改寄存器的个数和位置,都是一一对应的。
- 主机发送的报文格式(以下均为十六进制)
读取下位机39个寄存器值:0103 0000 0027 05D0
主机发送 |
字节数 |
发送的信息 |
备注 |
从机地址 |
1 |
01 |
发送至地址为01的从机 |
Modbus功能码 |
1 |
03 |
寄存器读取 |
起始地址 |
2 |
0000 |
起始地址为0000 |
寄存器个数 |
2 |
0027 |
读取39个寄存器值 |
CRC码 |
2 |
D5D0 |
由主机计算得到CRC码 |
- 从机响应返回的报文格式(以下均为十六进制)
从机响应 |
字节数 |
返回的信息 |
备注 |
从机地址 |
1 |
01 |
来自从机01 |
Modbus功能码 |
1 |
03 |
寄存器读取 |
返回字节数 |
1 |
4E |
39个寄存器返78个字节 |