二、移植
对于协议栈的移植主要包括两个方面,硬件及软件。用户需要根据自己的需求进行自行选择。
注:以下所有说明都主要针对Modbus主机模式进行介绍。
2.1、软件
软件方面支持基于裸机及实时操作系统的移植;支持单个主机与单个从机同时独立运行。另外用户也可以修改协议栈的事件回调接口,使主机请求的接口采用阻塞及非阻塞模式;主机资源等待方面,用户也可以设置等待超时时间等等,诸多功能将会一一介绍。
2.1.1、操作系统与裸机
对于操作系统与裸机目前协议栈都是支持的,但个人更加推荐采用实时操作系统,因为这样会使得接口调用及接口移植变得更加简单。目前提供移植完成的操作系统FreeRTOS。
操作系统与裸机移植的过程中涉及的文件为FreeModbus\port\portevent_m.c
该文件主要有以下需要用户移植的接口
接口 | 功能描述 |
---|---|
xMBMasterPortEventInit | 主机事件初始化 |
xMBMasterPortEventPost | 主机发送事件 |
xMBMasterPortEventGet | 主机获取事件 |
vMBMasterOsResInit | 主机操作系统资源初始化 |
xMBMasterRunResTake | 主机资源获取 |
vMBMasterRunResRelease | 主机资源释放 |
vMBMasterErrorCBRespondTimeout | 主机响应超时回调接口 |
vMBMasterErrorCBReceiveData | 主机接收数据出错回调接口 |
vMBMasterErrorCBExecuteFunction | 主机执行Modbus方法出错回调接口 |
vMBMasterCBRequestScuuess | 主机请求执行成功回调接口 |
eMBMasterWaitRequestFinish | 主机等待请求完成处理回调接口 |
在基于操作系统移植时,主要用到操作系统线程同步方面的技术,Modbus协议栈自身需要使用操作系统自带的事件机制来实现事件的发送通知与等待获取,同时用户请求Modbus功能的线程与Modbus协议栈自身线程(Modbus Poll线程)需要通过事件机制实现两个线程的同步;主机协议栈还需要一个主机资源占用的信号量,初始化默认为1,采用信号量保证了多线程同时发送主机请求时,只有一个线程可以使用主机。
在基于裸机移植时,需要通过软件模拟方式实现事件通知机制,事件等待及资源等待都得采用用户自定义延时及标志变量来实现,实现起来比操作系统模式下的线程同步机制要复杂很多。
2.1.2、数据缓冲区
数据缓冲区定义的位置位于FreeModbus\port\mb_app_m.c
文件顶部,共计4种数据类型。
FreeModbus从机默认使用一维数组作为缓存区数据结构,主机可以存储所有网内从机的数据,所以主机采用二位数组对所有从机节点数据进行存储。二维数组的列号代表寄存器、线圈及离散量地址,行号代表从机节点ID,但需要做减一处理,例如usMRegHoldBuf[2][1]
代表从机ID为3,保持寄存器地址为1的从机数据。
2.1.3、Modbus数据处理回调接口
Modbus一共有4种不同的数据类型,所有的Modbus功能都围绕这些数据类型进行操作。由于不同的用户数据缓冲区结构可能有所不同,那么对应的Modbus数据处理方式也就存在差异,所以用户需要把每种数据类型对应的操作,按照自己的数据缓冲区结构进行定制实现。
所有的Modbus数据处理回调接口如下:
接口 | 功能描述 |
---|---|
eMBMasterRegInputCB | 输入寄存器回调接口 |
eMBMasterRegHoldingCB | 保持寄存器回调接口 |
eMBMasterRegCoilsCB | 线圈回调接口 |
eMBMasterRegDiscreteCB | 离散输入回调接口 |
对于数组形式的数据缓冲区结构,源码中已经做好了移植,直接使用即可。 |
2.2、硬件
移植FreeModbus协议栈主机部分时,在硬件方面需要修改串口及定时器配置,文件位于port文件下,用户需要根据自己的CPU进行移植修改。
2.2.1、串口
涉及到串口的移植文件位于FreeModbus\port\portserial_m.c
,在这个文件中用户需要对以下接口方法进行修改
接口 | 功能描述 |
---|---|
vMBMasterPortSerialEnable | 使能和失能串口的发送及接收功能,如使用485总线,需要注意收发模式切换 |
vMBMasterPortClose | 关闭串口 |
xMBMasterPortSerialInit | 串口初始化,如果使用485,收发模式切换引脚也要在此初始化 |
xMBMasterPortSerialPutByte | 串口发送单字节数据 |
xMBMasterPortSerialGetByte | 串口接收单字节数据 |
prvvUARTTxReadyISR | 串口发送完成中断服务程序接口,按照默认方式,直接引用pxMBMasterFrameCBTransmitterEmpty 方法即可 |
prvvUARTRxISR | 串口接收中断服务程序接口,按照默认方式,直接引用pxMBMasterFrameCBByteReceived 方法即可 |
还需要在文件末尾增加CPU的自带的串口服务程序,将上表中的发送及接收中断程序接口,放到对应的中断服务程序中去即可。 |
2.2.2、定时器
涉及到定时器的移植文件位于FreeModbus\port\porttimer_m.c
,在这个文件中用户需要对以下接口方法进行修改
接口 | 功能描述 |
---|---|
xMBMasterPortTimersInit | 定时器初始化,将定时器预分频数及T3.5时间计数值分别备份到usT35TimeOut50us |
vMBMasterPortTimersT35Enable | 设置定时器按照T3.5时间开始计数 |
vMBMasterPortTimersConvertDelayEnable | 设置定时器按照广播帧的转换延时时间开始计数 |
vMBMasterPortTimersRespondTimeoutEnable | 设置定时器按照响应超时时间开始计数 |
vMBMasterPortTimersDisable | 失能定时器,定时器将停止计数 |
prvvTIMERExpiredISR | 定时器中断服务程序接口,按照默认方式,直接引用pxMBMasterPortCBTimerExpired 方法即可 |
注:
1、usT35TimeOut50us
在文件顶部有定义
2、转换延时时间及响应超时时间在FreeModbus\modbus\include\mbconfig.h
,用户可以根据自己系统的特点自行设置。
除上面接口方法外,用户需要在文件末尾增加CPU的自带的定时器中断服务程序,将上表中的定时器中断服务程序接口放进去。
FreeModbus主从机协议栈从入门到精通
FreeModbus协议栈从入门到精通,含STM32+FreeRTOS主站、从站例程DEMO,注释详尽
文件 | 说明 |
---|---|
freemodbus-v1.6.zip | FreeModbusV1.6源码 |
FreeModbusMasterSlave(Rev1.0.0).zip | 笔者移植的STM32+FreeRTOS+FreeModbus Master Slave代码 |
ModbusSlave 7.0和ModbusPoll_7.0软件注册码.zip | FreeModbus Master Slave调试工具 |
FreeModbus V1.6 主机使用说明.md | FreeModbus 主机使用说明文档 |
FreeModbus 从机流程图.vsd | FreeModbus 从机流程图 |
FreeModbus 主机流程图.vsd | FreeModbus 主机流程图 |
Modbus应用协议.doc | 笔者整理的 FreeModbus 协议文档 |
文件结构.png | 笔者移植的FreeModbus协议工程文件结构图 |
FreeModbus Datasheet | 笔者搜集 FreeModbus 协议文档 |
教程获取,非免介意勿扰
https://download.csdn.net/download/qqshare/90230889