-
一.FreeModbus简介
FreeMODBUS一个奥地利人写的Modbus协议。它是一个针对嵌入式应用的一个免费(自由)的通用MODBUS协议的移植。Modbus是一个工业制造环境中应用的一个通用协议。Modbus通信协议栈包括两层:Modbus应用层协议,该层定义了数据模式和功能;另外一层是网络层。
FreeMODBUS 提供了RTU/ASCII 传输模式及TCP协议支持。FreeModbus遵循BSD许可证,这意味着用户可以将FreeModbus应用于商业环境中。目前版本FreeModbus-V1.5提供如下的功能支持:
注意:freemodbus只能使用从机功能。freemodbus更适合嵌入式系统
-
二.FreeModbus对硬件的需求
FreeModbus协议对硬件的需求非常少——基本上任何具有串行接口,并且有一些能够容纳modbus数据帧的RAM的微控制器都足够了。
-
(1)一个异步串行接口,能够支持接收缓冲区满和发送缓存区空中断。
-
(2)一个能够产生RTU传输所需要的t3.5字符超时定时器的时钟。
-
(3)对于软件部分,仅仅需要一个简单的事件队列。
-
(4)在使用操作系统的处理器上,可通过单独定义一个任务完成Modbus时间的查询。
-
(5)小点的微控制器往往不允许使用操作系统,在那种情况下,可以使用一个全局变量来实现该事件队列(Atmel AVR 移植使用这种方式实现)。
-
(6)实际的存储器需求决定于所使用的Modbus模块的多少。
-
下表列出了所支持的功能编译后所需要的存储器。(ARM是使用GNUARM编译器3.4.4使用-O1选项得到的。AVR项数值是使用WinAVR编译器3.4.5使用-Os选项编译得到的)
-
-
实际大小决定于可支持的Modbus功能码的多少。功能码可以在头文件mbconfig.h中进行配置。
- 决定于硬件
-
三.FreeModbus的移植
-
物理层接口文件的修改
-
在物理层,用户只需完成串行口及超时定时器的配置即可。具体应修改接口文件portserial.c及porttimer.c。
-
portserial.c中函数的修改:
- 1.void vMBPortSerialEnable( BOOL xRxEnable, BOOL xTxEnable )
-
(1) 此函数的功能为设置串口状态。有两个参数:xRxEnable及xTxEnable。当xRxEnable为真时,应使能串口接收及接收中断。
-
-
(2)在RS485通讯系统中,还要注意将RS485接口芯片设为接收使能状态;当xTxEnable为真时,应使能串口发送及发送中断。
-
-
(3)在RS485通讯系统中,还要注意将RS485接口芯片设为发送使能状态。
-
- 2.void vMBPortClose( void )
-
此函数的功能是关闭Modbus通讯端口,具体的,应在此函数中关闭通讯端口的发送使能及接收使能。
-
- 3.BOOL xMBPortSerialInit(UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits, eMBParity eParity)
- 此函数的功能是初始化串行通讯端口。有四个参数:ucPORT、ulBaudRate、ucDataBits及eParity。
- (1) 参数ucPORT可以忽略;
- (2)参数ulBaudRate是通讯端口的波特率,应根据此数值设置所使用硬件端口的波特率;
- (3)参数ucDataBits为通讯时所使用的数据位宽,注意,若使用RTU模式,则有ucDataBits=8,若使用ASCII模式,则有ucDataBits=7,应根据此参数设置所使用硬件端口的数据位宽;
- (4)eParity为校验方式,eParity=MB_PAR_NONE为无校验,此时硬件端口应设置为无校验方式及两个停止位,eParity=MB_PAR_ODD为奇校验,此时硬件端口应设置为奇校验方式及一个停止位,eParity= MB_PAR_EVEN为偶校验,
- 此时硬件端口应设置为偶校验方式及一个停止位。函数返回值务必为TRUE。
- 4.BOOL xMBPortSerialPutByte(CHAR ucByte)
-
此函数的功能为通讯端口发送一字节数据。参数为:ucByte,待发送的数据。应在此函数中编写发送一字节数据的函数。注意,由于使用的是中断发送,故只需将数据放到发送寄存器即可。函数返回值务必为TRUE。
-
-
- 5