FreeModbus V1.6 主机使用说明(二)

二、移植

对于协议栈的移植主要包括两个方面,硬件及软件。用户需要根据自己的需求进行自行选择。

注:以下所有说明都主要针对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.zipFreeModbusV1.6源码
FreeModbusMasterSlave(Rev1.0.0).zip笔者移植的STM32+FreeRTOS+FreeModbus Master Slave代码
ModbusSlave 7.0和ModbusPoll_7.0软件注册码.zipFreeModbus Master Slave调试工具
FreeModbus V1.6 主机使用说明.mdFreeModbus 主机使用说明文档
FreeModbus 从机流程图.vsdFreeModbus 从机流程图
FreeModbus 主机流程图.vsdFreeModbus 主机流程图
Modbus应用协议.doc笔者整理的 FreeModbus 协议文档
文件结构.png笔者移植的FreeModbus协议工程文件结构图
FreeModbus Datasheet笔者搜集 FreeModbus 协议文档

教程获取,非免介意勿扰
https://download.csdn.net/download/qqshare/90230889

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值