18.3 Modbus多机通信程序

该程序展示了如何使用CRC16计算函数来校验Modbus通信中的数据完整性。通过遍历数据并结合CRC高位和低位字节值表,计算并返回CRC16数值,确保数据在多机通信过程中的正确传输。
摘要由CSDN通过智能技术生成
给从机下发不同的指令,从机去执行不同的操作,这个就是判断一下功能码即可,和我们前边学的实用串口例程是类似的。多机通信,无非就是添加了一个设备地址判断而已,难度也不大。我们找了一个 Modbus 调试精灵,通过设置设备地址,读写寄存器的地址以及数值数量等参数,可以直接替代串口调试助手,比较方便的下发多个字节的数据,如图 18-7 所示。我们先来就图中的设置和数据来对 Modbus 做进一步的分析,图中的数据来自于调试精灵与我们接下来要讲的例程之间的交互。
图 18-7  Modbus 调试精灵
图 18-7  Modbus 调试精灵

如图,我们的 USB 转 RS485 模块虚拟出的是 COM5,波特率 9600,无校验位,数据位是 8 位,1 位停止位,设备地址假设为 1。

写寄存器的时候,如果我们要把 01 写到一个地址是 0000 的寄存器地址里,点一下“写入”,就会出现发送指令:01 06 00 00 00 01 48 0A。我们来分析一下这帧数据,其中 01 是设备地址,06 是功能码,代表写寄存器这个功能,后边跟 00 00 表示的是要写入的寄存器的地址,00 01 就是要写入的数据,48 0A 就是 CRC 校验码,这是软件自动算出来的。而根据 Modbus协议,当写寄存器的时候,从机成功完成该指令的操作后,会把主机发送的指令直接返回,我们的调试精灵会接收到这样一帧数据:01 06 00 00 00 01 48 0A。

假如我们现在要从寄存器地址 0002 开始读取寄存器,并且读取的数量是 2 个。点一下“读出”,就会出现发送指令:01 03 00 02 00 02 65 CB。其中 01 是设备地址,03 是功能码,代表读寄存器这个功能,00 02 就是读寄存器的起始地址,后一个 00 02 就是要读取 2 个寄存器的数值,65 CB 就是 CRC 校验。而接收到的数据是:01 03 04 00 00 00 00 FA 33。其中 01是设备地址,03 是功能码,04 代表的是后边读到的数据字节数是 4 个,00 00 00 00 分别是地址为 00 02 和 00 03 的寄存器内部的数据,而 FA 33 就是 CRC 校验了。

似乎越来越明朗了,所谓的 Modbus 通信协议,无非就是主机下发了不同的指令,从机根据指令的判断来执行不同的操作而已。由于我们的开发板没有 Modbus 功能码那么多相应的功能,我们在程序中定义了一个数组 regGroup[5],相当于 5 个寄存器,此外又定义了第 6个寄存器,控制蜂鸣器,通过下发不同的指令我们改变寄存器组的数据或者改变蜂鸣器的开关状态。在 Modbus 协议里寄存器的地址和数值都是 16 位的,即 2 个字节,我们默认高字节是 0x00,低字节就是数组 regGroup 对应的值。其中地址 0x0000 到 0x0004 对应的就是 regGroup数组中的元素,我们写入的同时把数字又显示到 1602 液晶上,而 0x0005 这个地址,写入 0x00,蜂鸣器就不响,写入任何其它数值,蜂鸣器就报警。我们单片机的主要工作也就是解析串口接收的数据执行不同操作。
/***************************Lcd1602.c 文件程序源代码*****************************/
(此处省略,可参考之前章节的代码)
/****************************RS485.c 文件程序源代码*****************************/
(此处省略,可参考之前章节的代码)
/****************************CRC16.c 文件程序源代码****************************/
   
   
   
  1. /* CRC16 计算函数,ptr-数据指针,len-数据长度,返回值-计算出的 CRC16 数值 */
  2. unsigned int GetCRC16(unsigned char *ptr, unsigned char len){
  3. unsigned int index;
  4. unsigned char crch = 0xFF; //高 CRC 字节
  5. unsigned char crcl = 0xFF; //低 CRC 字节
  6. unsigned char code TabH[] = { //CRC 高位字节值表
  7. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
  8. 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
  9. 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
  10. 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
  11. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
  12. 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
  13. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
  14. 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
  15. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
  16. 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
  17. 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
  18. 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
  19. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
  20. 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
  21. 0x01, 0xC0, 0x80,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值