首页 > 编程知识 正文

单片机程序中,Modbus功能码的回调函数如何编写--FreeModbus从站设计(10)

时间:2023-05-04 05:57:53 阅读:179116 作者:91

FreeModbus从站设计(10 )-Modbus功能码回调函数的写法

关键字: FreeModbus CubeMX HAL库串行功能代码

该系列的前几个幸福香菇主要使用HAL库生成keil项目,如何将FreeModbus的代码添加到keil项目中,协议栈初始化,串行端口和计时器接口将FreeModbus协议栈和HAL库函数的调用关系进行了梳理,通过这些工作,Modbus的路径(串口和定时器)所经过的数据处理部分主要是对各功能代码编写回调函数

以常用读写保持寄存器的功能代码(03、06、16 )为例,阐述回调函数的编写方法。

http://www.Sina.com/http://www.Sina.com /

第一个是回调函数被调用的位置,即回调函数在FreeModbus协议栈中的位置使用。

保持寄存器的回调函数返回eMBRegHoldingCB (被调用的位置如图1-图4所示。 从一些照片中可以看到,调用的位置位于mbfuncholding.c文件中。 首先,当移植FreeModbus协议栈时,mbfuncholding.c文件中的代码不需要修改,bldmp (微信道公开号: bldmp )这里为了更清楚地示出函数的调用关系, 我只是在做一件事。调用eMBRegHoldingCB (保持寄存器)地方主要是写入单一的保持寄存器(对应的功能码06 ),多个保持寄存器)写入对应的功能码16 )

图1

图2

图3

图4

其中,FreeModbus协议栈严格遵守Modbus协议标准。 在Modbus协议规范中,关于保持寄存器的定义请参考图5。 一些与读写寄存器相关的功能代码定义在FreeModbus协议栈中。 这也是使用标准协议栈的优点,与您自己创建的协议栈相比,它的功能更全面,而且并不缺少某些功能。

图5

第二个是回调函数被定义的地方。 从图6中可以看出,eMBRegHoldingCB ()函数是一个字。 已在mb.h中声明。 在哪里定义(创建)这个函数? 包括mb.h在内的任何. c文件都可以。

图6

http://www.Sina.com/http://www.Sina.com /

在此bl DMP (微信公众号)示例中,创建了一个新的modbus_app.c文件,并在modbus_app.c中编写了eMBRegHoldingCB )的代码。 如图7所示,是eMBRegHoldingCB () )函数的整体结构,首先,判断需要读出或者写入的寄存器地址是否在定义的范围内,在范围之外的情况下,通过返回MB_ENOREG,从而协议栈能够保存

图7

如图8所示,当读或写的数据在范围内时,对数据进行操作。 在程序内部,保持寄存器的数据时,根据情况独自定义保存在排列usRegHoldingBuf[]中的大小。

图8

图8展示了最基本的读写操作。 在实际的APP演示中,可能需要根据保留寄存器的值执行某些操作,但后续的操作代码也可以写入此函数中。 这样可以保证在第一时间运行。 如图9所示,在接收到对应的命令后,进入上电停止状态,是修正通信参数的例子,后面有特殊的章节。

图9

按照本文的思路,可以编写自己的函数代码回调函数。

幸福香菇在公众号(1.)同时发售,请看更多幸福香菇系列。

分享单片机、ARM、现场总线、PLC、嵌入式软硬件设计经验,秉承“一点一滴斗智”的理念,以实际项目为单位阐述知识点,一起共享

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。