FreeModbus学习笔记_外语学习-法语学习.pdf





《FreeModbus学习笔记_外语学习-法语学习.pdf》由会员分享,可在线阅读,更多相关《FreeModbus学习笔记_外语学习-法语学习.pdf(13页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、学习必备 欢迎下载 FreeModbus 学习笔记 一、FreeModbus 简介 FreeMODBUS 一个奥地利人写的 Modbus 协议。它是一个针对嵌入式应用的一个免费(自由)的通用 MODBUS 协议的移植。Modbus 是一个工业制造环境中应用的一个通用协议。Modbus 通信协议栈包括两层:Modbus 应用层协议,该层定义了数据模式和功能;另外一层是网络层。FreeMODBUS 提供了 RTU/ASCII 传输模式及 TCP 协议支持。FreeModbus 遵循 BSD许可证,这意味着用户可以将 FreeModbus 应用于商业环境中。目前版本 FreeModbus-V1.5提
2、供如下的功能支持:表 1 FreeModbus-V1.5 功能支持 代码 描述 是否支持 备注 Master 主机 否 Slave 从机 是 MB_RTU RTU 模式 是 MB_ASCII ASCII 模式 是 MB_TCP TCP 模式 是 0 x01 读线圈 是 0 x02 读离散输入 是 0 x03 读保持寄存器 是 0 x04 读输入寄存器 是 0 x05 写单个线圈 是 0 x06 写单个寄存器 是 0 x07 读异常状态 否 0 x08 诊断 否 0 x0B 获取事件计数器 否 0 x0C 获取事件记录 否 0 x0F 写多个线圈 是 0 x10 写多个寄存器 是 0 x11 报
3、告从机 ID 是 协议与文档不一致 0 x14 读文件记录 否 0 x15 写文件记录 否 0 x16 屏蔽写寄存器 否 0 x17 读/写多个寄存器 是 0 x18 写 FIFO 否 0 x2B 封装接口传输 否 0 x2B/0 x0D CANopen参考请求与应答 否 0 x2B/0 x0E 读设备身份表示 否 二、FreeModbus 对硬件的需求 学习必备 欢迎下载 FreeModbus 协议对硬件的需求非常少基本上任何具有串行接口,并且有一些能够容纳 modbus 数据帧的 RAM 的微控制器都足够了。一个异步串行接口,能够支持接收缓冲区满和发送缓存区空中断。一个能够产生 RTU 传
4、输所需要的 t3.5 字符超时定时器的时钟。对于软件部分,仅仅需要一个简单的事件队列。在使用操作系统的处理器上,可通过单独定义一个任务完成 Modbus 时间的查询。小点的微控制器往往不允许使用操作系统,在那种情况下,可以使用一个全局变量来实现该事件队列(Atmel AVR 移植使用这种方式实现)。实际的存储器需求决定于所使用的 Modbus 模块的多少。下表列出了所支持的功能编译后所需要的存储器。ARM 是使用 GNUARM 编译器 3.4.4 使用-O1选项得到的。AVR 项数值是使用 WinAVR 编译器 3.4.5 使用-Os选项编译得到的。表 2 FreeModbus 对硬件的需求
5、Module ARM Code ARM RAM(static)AVR Code AVR RAM(static)Modbus RTU(Required)1132Byte 272Byte 1456Byte 266Byte Modbus ASCII(Optional)1612Byte 28Byte 1222Byte 16Byte Modbus Functions 1 1180Byte 34Byte 1602Byte 34Byte Modbus Core(Required)924Byte 180Byte 608Byte 75Byte Porting Layer(Required 2)1756Byte
6、16Byte 704Byte 7Byte Totals 7304Byte 530Byte 5592Byte 398Byte 1 实际大小决定于可支持的 Modbus 功能码的多少。功能码可以在头文件 mbconfig.h 中进行配置。2 决定于硬件。三、FreeModbus 的移植 1、物 理层接口文件的修改 在物理层,用户只需完成串行口及超时定时器的配置即可。具体应修改接口文件portserial.c 及 porttimer.c。portserial.c 中函数的修改:1)void vMBPortSerialEnable(BOOL xRxEnable,BOOL xTxEnable)此函数的功
7、能为设置串口状态。有两个参数:xRxEnable 及 xTxEnable。当 xRxEnable为真时,应使能串口接收及接收中断。在 RS485 通讯系统中,还要注意将 RS485 接口芯片设为接收使能状态;当 xTxEnable 为真时,应使能串口发送及发送中断。在 RS485 通讯系统中,还要注意将 RS485 接口芯片设为发送使能状态。2)void vMBPortClose(void)此函数的功能是关闭 Modbus 通讯端口,具体的,应在此函数中关闭通讯端口的发送使能及接收使能。3)BOOL xMBPortSerialInit(UCHAR ucPORT,ULONG ulBaudRate
8、,UCHAR ucDataBits,eMBParity eParity)此函数的功能是初始化串行通讯端口。有四个参数:ucPORT、ulBaudRate、ucDataBits及 eParity。参数 ucPORT 可以忽略;参数 ulBaudRate 是通讯端口的波特率,应根据此数值设置所使用硬件端口的波特率;参数 ucDataBits 为通讯时所使用的数据位宽,注意,若使用RTU 模式,则有 ucDataBits=8,若使用 ASCII 模式,则有 ucDataBits=7,应根据此参数设置所使用硬件端口的数据位宽;eParity 为校验方式,eParity=MB_PAR_NONE 为无校验
9、,此时移植是一个工业制造环境中应用的一个通用协议通信协议栈包括两层应用层协议该层定义了数据模式和功能另外一层是网络层提供了传输模式及协议支持遵循许可证这意味着用户可以将应用于商业环境中目前版本提供如下的功能支 器写单个线圈写单个寄存器读异常状态诊断获取事计数器获取事记录写多个线圈写多个寄存器报告从机读文记录写文记录屏蔽写寄存器读写多个寄存器写封装接口传输参考请求与应答读设备身份表示是否支持否是是是是是是是是是 行接口并且有一些能够容纳数据帧的的微控制器都足够了一个异步串行接口能够支持接收缓冲区满和发送缓存区空中断一个能够产生传输所需要的字符超时定时器的时钟对于软件部分仅仅需要一个简单的事件队列
10、在使用操作系统的学习必备 欢迎下载 硬件端口应设置为无校验方式及两个停止位,eParity=MB_PAR_ODD 为奇校验,此时硬件端口应设置为奇校验方式及一个停止位,eParity=MB_PAR_EVEN 为偶校验,此时硬件端口应设置为偶校验方式及一个停止位。函数返回值务必为 TRUE。4)BOOL xMBPortSerialPutByte(CHAR ucByte)此函数的功能为通讯端口发送一字节数据。参数为:ucByte,待发送的数据。应在此函数中编写发送一字节数据的函数。注意,由于使用的是中断发送,故只需将数据放到发送寄存器即可。函数返回值务必为 TRUE。5)BOOL xMBPortS
11、erialGetByte(CHAR*pucByte)此函数的功能为通讯端口接收一字节数据。参数为:*pucByte,接收到的数据。应在此函数中编写接收的函数。注意,由于使用的是中断接收,故只需将接收寄存器的值放到*pucByte 即可。函数返回值务必为 TRUE。6)void prvvUARTTxReadyISR(void)发送中断函数。此函数无需修改。只需在用户的发送中断函数中调用此函数即可,同时,用户应在调用此函数后,清除发送中断标志位。7)void prvvUARTRxISR(void)发送中断函数。此函数无需修改。只需在用户的接收中断函数中调用此函数即可,同时,用户应在调用此函数后,清
12、除接收中断标志位。portserial.c 中函数的修改:1)BOOL xMBPortTimersInit(USHORT usTim1Timerout50us)此函数的功能为初始化超时定时器。参数为:usTim1Timerout50us,50us 的个数。用户应根据所使用的硬件初始化超时定时器,使之能产生中断时间为 usTim1Timerout50us*50us的中断。函数返回值务必为 TRUE。2)void vMBPortTimersEnable()此函数的功能为使能超时定时器。用户需在此函数中清除中断标志位、清零定时器计数值,并重新使能定时器中断。3)void vMBPortTimersD
13、isable()此函数的功能为关闭超时定时器。用户需在此函数中清零定时器计数值,并关闭定时器中断。4)void TIMERExpiredISR(void)定时器中断函数。此函数无需修改。只需在用户的定时器中断中调用此函数即可,同时,用户应在调用此函数后清除中断标志位。2、应 用层回函数的修改 在应用层,用户需要定义所需要使用的寄存器,并修改对应的回函数。回函数有如下几个:1)eMBErrorCode eMBRegInputCB(UCHAR*pucRegBuffer,USHORT usAddress,USHORT usNRegs)输入寄存器回函数。*pucRegBuffer 为要添加到协议中的数
14、据,usAddress 为输入寄存器地址,usNRegs 为要读取寄存器的个数。用户应根据要访问的寄存器地址 usAddress 将相应输入寄存器的值按顺序添加到 pucRegBuffer 中。2)eMBErrorCode eMBRegHoldingCB(UCHAR*pucRegBuffer,USHORT usAddress,USHORT usNRegs,eMBRegisterMode eMode)保持寄存器回函数。*pucRegBuffer 为要协议中的数据,usAddress 为输入寄存器地址,usNRegs 为访问寄存器的个数,eMode 为访问类型(MB_REG_READ 为读保持寄存
15、器,MB_REG_WRITE 为写保持寄存器)。用户应根据要访问的寄存器地址 usAddress 将相应输入寄存器的值按顺序添加到 pucRegBuffer 中,或将协议中的数据根据要访问的寄存器地址usAddress 放到相应保持寄存器中。3)eMBErrorCode eMBRegCoilsCB(UCHAR*pucRegBuffer,USHORT usAddress,USHORT 移植是一个工业制造环境中应用的一个通用协议通信协议栈包括两层应用层协议该层定义了数据模式和功能另外一层是网络层提供了传输模式及协议支持遵循许可证这意味着用户可以将应用于商业环境中目前版本提供如下的功能支 器写单个线
16、圈写单个寄存器读异常状态诊断获取事计数器获取事记录写多个线圈写多个寄存器报告从机读文记录写文记录屏蔽写寄存器读写多个寄存器写封装接口传输参考请求与应答读设备身份表示是否支持否是是是是是是是是是 行接口并且有一些能够容纳数据帧的的微控制器都足够了一个异步串行接口能够支持接收缓冲区满和发送缓存区空中断一个能够产生传输所需要的字符超时定时器的时钟对于软件部分仅仅需要一个简单的事件队列在使用操作系统的学习必备 欢迎下载 usNCoils,eMBRegisterMode eMode)读写线圈回函数。*pucRegBuffer 为要添加到协议中的数据,usAddress 为线圈地址,usNCoils 为要
17、访问线圈的个数,eMode 为访问类型(MB_REG_READ 为读线圈状态,MB_REG_WRITE 为写线圈)。用户应根据要访问的线圈地址 usAddress 将相应线圈的值按顺序添加到 pucRegBuffer 中,或将协议中的数据根据要访问的线圈地址 usAddress 放到相应线圈中。4)eMBErrorCode eMBRegDiscreteCB(UCHAR*pucRegBuffer,USHORT usAddress,USHORT usNDiscrete)读离散线圈回函数。*pucRegBuffer 为要添加到协议中的数据,usAddress 为线圈地址,usNDiscrete 为要
18、访问线圈的个数。用户应根据要访问的线圈地址 usAddress 将相应线圈的值按顺序添加到 pucRegBuffer 中。3、应 用层初始化及协议访问 用户只需在主函数中调用协议初始化代码,及消息处理函数即可。需用户调用的函数有如下几个:1)eMBErrorCode eMBInit(eMBMode eMode,UCHAR ucSlaveAddress,UCHAR ucPort,ULONG ulBaudRate,eMBParity eParity)协议初始化函数。eMode 为所要使用的模式,用户可选 MB_RTU(RTU 模式)、MB_ASCII(ASCII 模式)或 MB_TCP(TCP 模
19、式);ucSlaveAddress 为从机地址,用户根据需要,取值为 1247(0 为广播地址,248255 协议保留);ulBaudRate 为通信波特率,用户根据需要选用,但务必使主机能支持此波特率;eParity 为校验方式,用户根据需要选用,但务必使主机能支持此校验方式。2)eMBErrorCode eMBSetSlaveID(UCHAR ucSlaveID,BOOL xIsRunning,UCHAR const*pucAdditional,USHORT usAdditionalLen)从机 ID 设置函数。注意,ID 表示的是设备的类型,不同于 ucSlaveAddress(从机地址
20、)。对同一通讯系统中,可以有相同的 ucSlaveID,但不可以有相同的 ucSlaveAddress。ucSlaveID为一字节的设备 ID 号;xIsRunning 为设备的运行状态,0 xFF 为运行,0 x00 为停止;*pucAdditional 为设备的附加描述,根据需要添加;usAdditionalLen 为附加描述的长度(按字节计算)。此函数不是必须调用的。但当一个 Modbus 通讯系统中有不同种设备时,应调用此函数添加对应设备的描述。3)eMBErrorCode eMBPoll(void)轮询事件查询处理函数。用户需在主循环中调用此函数。对于使用操作系统的程序,应单独创建一
21、个任务,使操作系统能周期调用此函数。四、FreeModbus 初始化及运行流程 FreeModbus 是基于消息队列的协议。协议通过检测相应的消息来完成对应功能。协议栈的初始化及运行流程如下:1)首先调用 eMBErrorCode eMBInit(eMBMode eMode,UCHAR ucSlaveAddress,UCHAR ucPort,ULONG ulBaudRate,eMBParity eParity)完成物理层设备的初始化,主要包括:BOOL xMBPortSerialInit(UCHAR ucPORT,ULONG ulBaudRate,UCHAR ucDataBits,eMBPar
22、ity eParity)串 口 初 始 化,设 定 波 特 率、数 据 位 数、校 验 方 式;BOOL xMBPortTimersInit(USHORT usTim1Timerout50us)定时器初始化,设定 T35 定时所需要的定时器常数。2)调 用(此 处 非 必 需)eMBErrorCode eMBSetSlaveID(UCHAR ucSlaveID,BOOL xIsRunning,UCHAR const*pucAdditional,USHORT usAdditionalLen)指定设备 ID。3)调用 eMBErrorCode eMBEnable(void)使能协议栈,主要包括:s
23、tatic pvMBFrameStart pvMBFrameStartCur(函数指针)协议栈开始,将 eRcvState 设为 STATE_RX_INIT 状态,调用 void vMBPortSerialEnable(BOOL xRxEnable,BOOL xTxEnable)使能接收,调用 void vMBPortTimersEnable()使能超时定时器。移植是一个工业制造环境中应用的一个通用协议通信协议栈包括两层应用层协议该层定义了数据模式和功能另外一层是网络层提供了传输模式及协议支持遵循许可证这意味着用户可以将应用于商业环境中目前版本提供如下的功能支 器写单个线圈写单个寄存器读异常状
24、态诊断获取事计数器获取事记录写多个线圈写多个寄存器报告从机读文记录写文记录屏蔽写寄存器读写多个寄存器写封装接口传输参考请求与应答读设备身份表示是否支持否是是是是是是是是是 行接口并且有一些能够容纳数据帧的的微控制器都足够了一个异步串行接口能够支持接收缓冲区满和发送缓存区空中断一个能够产生传输所需要的字符超时定时器的时钟对于软件部分仅仅需要一个简单的事件队列在使用操作系统的学习必备 欢迎下载 4)在 3 中使能了超时定时器,故经过 T35 时间后,发生第一次超时中断,在中断中,向协议栈发送消息 EV_READY(Startup finished),并调用 void vMBPortTimersDi
25、sable()关闭超时定时器,同时将 eRcvState 设为 STATE_RX_IDLE。此时,协议栈可以接收串口数据。注意,此处首先启用一次超时定时器是因为初始化完成时,串口有可能已经有数据,因为无法判断第一个数据是请求的开始,故等待 T35,接收下一帧请求。5)此时,主函数调用 eMBErrorCode eMBPoll(void)检测事件。6)若发生串口接收中断,且 eRcvState 为 STATE_RX_IDLE(4 中已将 eRcvState 设为STATE_RX_IDLE),则向接收缓存中存入接收到的字符,同时将 eRcvState 设为STATE_RX_RCV 状态,并清零超时
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FreeModbus 学习 笔记 外语 法语

限制150内