将freemodbus协议栈移植到linux下
FreeModbus解析

FreeModbus解析简介:Freemodbus是一个奥地利人写的modbus协议栈。
是针对通用的Modbus协议栈在嵌入式系统中应用的一个实现。
Modbus协议是一个在工业制造领域中得到广泛应用的一个网络协议。
一个Modbus通信协议栈包括两层:定义了数据结构和功能Modbus应用协议和网络层。
在FreeMODBUS的当前版本中,提供了Modbus Application Protocol v1.1a 的实现并且支持在Modbus over serial line specification 1.0中定义的RTU/ASCII传输模式。
从0.7版本开始,FreeModbus也支持在TCP defined in Modbus Messaging on TCP/IP Implementation Guide v1.0a 中定义的TCP传输。
Freemodbus遵循BSD[1] ,这意味着本协议栈的实现代码可以应用于商业用途。
目前版本的FreeModbus支持如下的功能码:写单个线圈(0x05)写多个线圈(0x0F)读输入状态(0x02)报告从机标识(0x11)本实现基于最新的标准并且与标准完全兼容。
接收和传输Modbus RTU/ASCII数据帧是通过一个由硬件提取层的调用来驱动状态机来实现的。
这就使得该协议非常容易移植到其他的平台之上。
当收到一个完整的数据帧后,该数据帧被传入Modbus应用层,数据帧的内容在该层得到解析。
为例方便增加新的Modbus功能,Freemodbus在应用层通提供了Hooks。
如果用到了Modbus TCP协议,那么当准备处理一个新数据帧的时候,移植层就必须首先向协议栈发送一个事件标志。
然后,协议栈调用一个返回值为接收到的Modbus TCP数据帧的函数,并且开始处理这个数据帧。
如果数据有效,则相应的Modbus反馈帧将提供给移植层生成反馈帧。
最后,该反馈被发送到客户端。
freemodbus定时器移植波特率计算

《freemodbus定时器移植波特率计算》在工业自动化领域,Modbus是一种常见的通信协议,而freemodbus是一个广泛使用的开源Modbus通信协议栈。
在实际应用中,我们经常会遇到需要将freemodbus移植到不同的硬件评台上,并且需要对通信波特率进行计算。
本文将深入探讨freemodbus定时器移植和波特率计算的原理和方法。
1. freemodbus定时器移植在移植freemodbus到不同的硬件评台时,最关键的一步就是定时器的移植。
定时器是用来产生Modbus通信所需的时钟中断,它的频率直接影响到通信的稳定性和效率。
在移植定时器时,我们需要考虑硬件评台的时钟频率、定时器的位宽和中断处理函数等因素,以确保freemodbus能够在目标评台上正常运行。
2. 波特率计算原理波特率是通信中一个非常重要的参数,它表示每秒传输的比特数。
对于Modbus通信而言,波特率的选择直接影响到通信距离、抗干扰能力和通信速率等方面。
在计算波特率时,我们需要考虑传输介质的特性、硬件设备的限制和通信距禿等因素。
在实际应用中,常见的波特率计算公式为:波特率 = 时钟频率/ (n × (1 + BRG))其中,时钟频率表示定时器的时钟频率,n表示波特率发生器的分频系数,BRG表示波特率发生器的配置寄存器的值。
3. freemodbus中的波特率计算在freemodbus协议栈中,通常会提供波特率设置的API或配置接口,开发者可以根据具体的硬件评台和通信需求来设置波特率。
在设置波特率时,需要根据硬件评台的特性和通信需求,调用相应的API或配置寄存器来完成波特率的计算和设置。
4. 个人观点和理解在移植freemodbus和计算波特率时,我们需要深入理解硬件评台的特性和freemodbus协议栈的工作原理。
通过合理的定时器移植和波特率计算,可以有效提高Modbus通信的稳定性和效率,从而更好地满足实际应用的需求。
freemodbus在stm32上的移植

portother.c
//负责一个串口的配置 为了省事我只支持了波特率的修改
xMBPortSerialInit( UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits, eMBParity eParity ) vMBPortSerialEnable( BOOL xRxEnable, BOOL xTxEnable )负责控制串口【收/发】中断的禁止与使能 pxMBFrameCBByteReceived( ); //在串口接收中断内调用 用于通讯侦测 pxMBFrameCBTransmitterEmpty( ); //在串口发送中断内调用 用于告知完成了发送 发送缓冲为空 xMBPortSerialGetByte( CHAR * pucByte ) xMBPortSerialPutByte( CHAR ucByte ) 两个为 串口字节的收发
//
usRegHoldingBuf[iRegIndex] |= *pucRegBuffer++;
//Βιβλιοθήκη iRegIndex++;
usNRegs--;
}
}
}
else
{
eStatus = MB_ENOREG;
}
return eStatus;
}
受到 freeModbus 作者使用“assert()”的影响在这个里我用了__REV16()这个函数
Modbus 中文协议.PDF
STM32移植 FreeModbus 的步骤:
首先去 下载文件 一定要是官方可靠的才行,我起先为了图方便网上随便下载了一个,结果白白 浪费了一下午的时间
不知道是哪里被改动了。目前最新的版本是1.5。
rtthread freemodbus 使用实例

自由Modbus(FreeModbus)是一个用于轻松实现Modbus通信协议的开源软件库,而RT-Thread则是一个基于实时多任务操作系统的开源物联网操作系统。
在本篇文章中,我们将探讨如何在RT-Thread操作系统中使用FreeModbus,并结合实际示例展示其使用方法和优势。
一、RT-Thread操作系统简介RT-Thread是一个基于开放源代码的实时嵌入式操作系统。
其专注于物联网领域,以实时性、可扩展性和易用性为特点。
RT-Thread支持多种芯片架构,并提供丰富的驱动、组件和软件包,方便开发者快速构建嵌入式应用。
二、FreeModbus简介FreeModbus是一个开源的Modbus通信协议栈,实现了Modbus 协议的主要功能,适用于各种嵌入式系统和主机系统。
它包含了Modbus协议的常用功能码,支持串口和以太网的通信方式,并具有良好的移植性和稳定性。
三、RT-Thread中使用FreeModbus的优势在RT-Thread中使用FreeModbus,可以快速、轻松地实现Modbus通信功能,无需从零开始编写Modbus协议栈,节省了开发时间和成本。
FreeModbus的移植性强,适用于各种硬件评台和通信介质,与RT-Thread的可移植性相得益彰。
另外,RT-Thread提供了丰富的网络协议栈,可以很好地支持FreeModbus在以太网上的应用。
四、RT-Thread中使用FreeModbus的实例展示下面我们以一个简单的示例来展示在RT-Thread中使用FreeModbus 的方法。
假设我们需要在RT-Thread的STM32开发板上实现Modbus从机的功能,我们可以按照以下步骤进行:1. 配置硬件环境:连接STM32开发板和Modbus从机设备,配置串口通信参数。
2. 导入FreeModbus库:在RT-Thread的包管理器中导入FreeModbus库,并添加相关驱动和组件。
free_modbus分析

1.FreeMODUS简介FreeMODBUS是一个针对嵌入式应用的一个免费(自由)的通用MODBUS协议的实现(移植)。
官方网站/index.php?lang=cn源码下载地址/projects/freemodbus.berlios/?source=directoryModbus是一个工业制造环境中应用的一个通用协议。
一个Modbus通信协议栈包括两层:Modbus应用层协议,该层定义了数据模式和功能;另外一层是网络层。
在当前版本中,FreeMODBUS 提供了一个针对Modbus 应用层协议V1.1以及支持在Modbus over serial line speifications 1.0 协议中定义的RTU/ASCII 传输模式。
自从0.7版本以后,FreeModbus也支持在Modbus Messaging on TCP/IP Implementation Guide V1.0a中定义的Modbus TCP协议。
FreeModbus是遵循BSD许可证,这意味着用户可以将FreeModbus应用于商业环境中。
目前支持的Modbus功能包括:读输入寄存器(0x04)读保持寄存器(0x03)写单个寄存器(0x06)写多个寄存器(0x10)读/写多个寄存器(0x17)读线圈状态(0x01)写单个线圈(0x05)写多个线圈(0x0F)读离散输入(0x02)报告从结点ID (0x11)Modbus RTU/ASCII帧的接受和发送通过硬件提取层的回调函数驱动的一个状态机实现的。
这就使得该协议很容易移植到新的平台上。
当一个数据帧组合完毕,该数据将自动被传到Modbus应用层,数据帧的内容在该应用层得到解释。
应用层提供Hooks(钩子函数),以方便增加新的Modbus功能。
如果在处理一个新的数据帧时用到了Modbus TCP,移植层必须向协议层发送一个事件标志。
协议层将调用一个返回接收到的Modbus TCP帧的功能函数。
free-modbus详解

free-modbus详解freemodbus之协议模块2007-12-27 10:43:32 作者:来源:freemodbus之Modbus协议配置浏览次数:844 文字大小:【大】【中】【小】简介:Detailed Description详细描述#include "mb.h" This module defines the inter face for the application. It contains the basic functions and types required to use the Modbus protocol stack. A ty ...Detailed Description详细描述 #include "mb.h"This module defines the interface for the application. It contains the basic functions and types required to use the Modbus protocol stack. A typical application will want to call eMBInit() first. If the device is ready to answ er network requests it must then call eMBEnable() to activate the protocol stack. In the main loop the function eMBPoll() must be called periodically. The time interval between pooling depends on the configured Modbus ti meout. If an RTOS is available a separate task should be created and the task should always call the function eMBPoll().这个模块为应用定义了接口。
free_modbus分析
3. demo 程序分析
3.1. LPC214X:不带操作系统的 RTU/ASCII 模式
TCP 发送数据:
xMBTCPPortSendResponse//从网络发送一帧 Modbus TCP 数据
TCP 接收数据:
xMBTCPPortGetRequest//从网络读取一帧 Modbus TCP 数据
5.4. 移植事件操作文件 portevent.c
(2) 不使用操作系统
移植任务就完成了,只需在 main 函数这样调用
作 实现关键 xMBPortTCPPool xMBTCPPortSendResponse
3.4. MCF5235TCP:FreeRTOS 系统下的 TCP 模式
网络协议栈使用 lwip,信息传递使用 mailbox
4. RTU/ASCII 模式移植步骤
4.1. 建立新工程 复制 demo\BARE 另存为 my_target 4.2. 移植平台定义文件 port.h 检查 demo\my_target\port.h 是否适合当前平台, 至少应定义临界保护的两个宏 ENTER_CRITICAL_SECTION EXIT_CRITICAL_SECTION 4.3. 移植定时器操作 porttimer.c modbus 协议栈需要一个定时器检查帧结束。定时器分辩率应达到半个字符时间,例如波特 率 115200,数据位 10bit 时,半个字符时间为(10/115200)/2=43us 这个最小超时时间用于帧间 3.5 字符时间检测。 ModbusRTU 规范中提到: 在通信速率等于或低于 19200 bps 时,这两个定时必须严格遵守; 对于波特率大于 19200 bps 的情形,应该使用 2 个定时的固定值: 建议的字符间超时时间(t1.5)为 750μ s,帧间的超时时间(t3.5) 为 1.750ms。 (FreeMODBUS 只使用 t3.5 作为帧间间隔检测,并没使用 t1.5 帧内间隔检测) 实现如下函数: 定时器初始化 xMBPortTimersInit( USHORT usTim1Timerout50us ) 定时器使能 vMBPortTimersEnable 定时器禁止 vMBPortTimersDisable 定时器中断服务处理 prvvTIMERExpiredISR 并用示波器测量 xMBPortTimersInit 以 50us 的定时是否淮确。 因为 ASCII 模式定时时间很大,xMBPortTimersInit 定时时间到达 MB_ASCII_TIMEOUT_SEC 定时时间也不会超出范围(mbconfig.h 中定义) 4.4. 移植串口操作文件 portserial.c RTU/ASCII 模式是基于串口的,所以要实现串口适配层的相关函数 串口初始化 xMBPortSerialInit 串口收发使能 vMBPortSerialEnable 串口发送一字节 xMBPortSerialPutByte 串口接收一字节 xMBPortSerialGetByte 串口发送中断服务 prvvUARTTxReadyISR
完整版freeModbus代码解读及移植笔记
完整版freeModbus代码解读及移植笔记1. FreeModbus协议分析协议必须首先调用初始化功能eMBinit()函数。
后调用eMBEnable(),最后,在循环体或者单独一个任务中调用eMBPoll()函数。
2. 应用层协议2.1. 系统的启动2.1.1. eMBInit()函数的源码分析以RTU方式为例,首先,检查调用的地址是否合法。
如不合法,返回错误。
如果合法则继续执行,首先,针对RTU方式还是ASCII方式,选择不同的编译模块。
对需要调用的函数指针进行复制。
如果移植需要改变其他用途,则要修改相应的指针,包括如下赋值:pvMBFrameStartCur = eMBRTUStart;pvMBFrameStopCur = eMBRTUStop;peMBFrameSendCur = eMBRTUSend;peMBFrameReceiveCur = eMBRTUReceive;pvMBFrameCloseCur = MB_PORT_HAS_CLOSE ? vMBPortClose :NULL;pxMBFrameCBByteReceived= xMBRTUReceiveFSM;pxMBFrameCBTransmitterEmpty = xMBRTUTransmitFSM;pxMBPortCBTimerExpired = xMBRTUTimerT35Expired;然后调用eStatus =eMBRTUInit( ucMBAddress, ucPort, ulBaudRate, eParity);具体初始化通讯端口。
2.1.2. eMBRTUIniteMBRTUInit这个函数主要干两件事:第一,初始化串口:if( xMBPortSerialInit(ucPort, ulBaudRate, 8, eParity ) != TRUE ) {eStatus = MB_EPORTERR;}这个函数在portserial.c中,需要用户在移植的时候根据自己的处理器编写。
MSP430的FreeModbus移植例程@IAR
理清楚各个文件夹中存放的文件类型之后,接下来就是建立一个 IAR 工程,建立 3 个 Group 分别是 Application、BSP、MODBUS。 Group MODBUS 加载文件前需要搞清楚自己需要使用哪种类型的 modbus。我这个例程 使用的是 RTU,mb.c 负责初始化和调度整个 MODBUS 功能模块;mbcrc.c 实现 CRC 校验; mbfunxxx.c 负责实现各种功能码;murtu.c 属于被 mb.c 调用的,实现 MB RTU 的初始化和调 度;mbutil.c 是 funcation 实现的公共函数。调用层次为 mb.c---->murtu.c---->mbfunxxx.c--->mbutil.c Group BSP 存放硬件定时器、 串口、 DCO 时钟的相关驱动, 在 demo 文件夹找到 MSP430, 打开就有 port 和 system, 打开 port 文件夹将 portevent.c、 portserial.c、 porttimer.c、 portevent.c 加载到 Group BSP,system 中是 DCO 相关驱动,自己要编写 dco-IAR.c Group Application 存放主函数 demo.c,里面有主函数 mian;
volatile USHORT usACLKCnt; /* Stop Watchdog Timer. */ WDTCTL = WDTPW + WDTHOLD; /* Delay for ACLK startup. */ for( usACLKCnt = 0xFFFF; usACLKCnt != 0; usACLKCnt-- ); if( cTISetDCO( TI_DCO_8MHZ ) == TI_DCO_NO_ERROR ) { _EINT( ); /* Initialize Protocol Stack. */ if( ( eStatus = eMBInit( MB_RTU, 0x01, 0, 115200, MB_PAR_EVEN ) ) != MB_ENOERR ) { } /* Enable the Modbus Protocol Stack. */ else if( ( eStatus = eMBEnable( ) ) != MB_ENOERR ) { } else { for( ;; ) { ( void )eMBPoll( ); /* Here we simply count the number of poll cycles. */ usRegInputBuf[0]++; } } } for( ;; ); } 这里是对 modbus 的串口参数以及地址的配置, 这里我配置为 MB_RTU, 0x01, 0, 115200, MB_PAR_EVEN,这时 modbus 工作在 RTU 模式,节点地址为 01,使用的串行端口为 0 也就 是 USART0,波特率 115200,偶校验。 文件:port.h 更改为: #define SMCLK ( 8000000UL ) #define ACLK ( 32768UL ) 这里定义系统时钟频率,我的开发板使用外部 8MHz 晶振,在 dco-IAR.c 中的 cTISetDCO 函数中我将 MCU 初始化为 8MHz,因此 SMCLK = 8000000 ,这个参数非常重要因为串口波 特率和以及定时器的计算均参考 SMCLK 的设置。 三. 功能测试 完成以上两个步骤之后,编译程序,烧录到开发板,连接好硬件开始功能测试。 FreeModbus 是一个从机的协议栈,因此还需要一个主机来完成功能测试,这里我使用 Modbus Poll 软件版本 4.34 来做主机。
【HAL库每天一例】freemodbus移植
【HAL库每天⼀例】freemodbus移植例程下载:资料包括程序、相关说明资料以及软件使⽤截图百度云盘:https:///s/1slN8rIt 密码:u6m1360云盘:https:///OcPiRp3wEcA92u密码 cfb6(硬⽯YS-F1Pro开发板HAL库例程持续更新\6. 软件设计之Modbus(HAL库版本)\YSF1_HAL_freemodbus_001. freemodbus移植)/********************************************************************************* 硬⽯YS-F1Pro开发板例程功能说明** 例程名称: YSF1_HAL_freemodbus_001. freemodbus移植******************************************************************************** 说明:* 本例程配套硬⽯stm32开发板YS-F1Pro使⽤。
** 淘宝:* :硬⽯社区* 版权归硬⽯开发团队所有,请勿商⽤。
*******************************************************************************/【1】例程简介它是⼀个针对嵌⼊式应⽤的⼀个免费(⾃由)的通⽤MODBUS协议的移植。
Modbus是⼀个⼯业制造环境中应⽤的⼀个通⽤协议。
Modbus协议栈包括两层:Modbus应⽤层协议,该层定义了数据模式和功能;另外⼀层是⽹络层。
【2】跳线帽情况******* 为保证例程正常运⾏,必须插⼊以下跳线帽 **********丝印编号 IO端⼝⽬标功能引脚出⼚默认设置JP1 PA10 TXD(CH340G) 已接⼊JP2 PA9 RXD(CH340G) 已接⼊CN6 PB10 TX(SP485E) 未接⼊CN6 PB11 RX(SP485E) 未接⼊【3】操作及现象使⽤两根导线连接两个开发板上的CN7接收端⼦,对应连接“A -- A”和“B -- B”,使⽤开发板配套的MINI USB线连接到开发板标⽰“调试串⼝”字样的MIMI USB接⼝(需要安装驱动),在电脑端打开串⼝调试助⼿⼯具,设置参数为115200 8-N-1。