没有合适的资源?快使用搜索试试~ 我知道了~
FreeModbus学习笔记
需积分: 24 25 下载量 199 浏览量
2013-09-29
11:15:06
上传
评论
收藏 240KB DOC 举报
温馨提示
试读
13页
FreeModbus学习笔记,还不错,希望对大家有用
资源推荐
资源详情
资源评论
FreeModbus 学习笔记
一、 FreeModbus 简介
FreeMODBUS
一个奥地利人写的 Modbus 协议。它是一个针对嵌入式应用的一个免费
(自由)的通用 MODBUS 协议的移植。Modbus 是一个工业制造环境中应用的一个通用协
议。Modbus 通信协议栈包括两层:Modbus 应用层协议,该层定义了数据模式和功能;另
外一层是网络层。
FreeMODBUS 提供了 RTU/ASCII 传输模式及 TCP 协议支持。FreeModbus 遵循 BSD 许
可证,这意味着用户可以将 FreeModbus 应用于商业环境中。目前版本 FreeModbus-V1.5 提
供如下的功能支持:
表 1 FreeModbus-V1.5 功能支持
代码 描述 是否支持 备注
Master 主机 否
Slave
从机 是
MB_RTU RTU 模式 是
MB_ASCII
ASCII 模式 是
MB_TCP TCP 模式 是
0x01
读线圈 是
0x02 读离散输入 是
0x03
读保持寄存器 是
0x04 读输入寄存器 是
0x05
写单个线圈 是
0x06 写单个寄存器 是
0x07
读异常状态 否
0x08 诊断 否
0x0B
获取事件计数器 否
0x0C 获取事件记录 否
0x0F
写多个线圈 是
0x10 写多个寄存器 是
0x11
报告从机 ID 是 协议与文档不一致
0x14 读文件记录 否
0x15
写文件记录 否
0x16 屏蔽写寄存器 否
0x17
读/写多个寄存器 是
0x18 写 FIFO 否
0x2B
封装接口传输 否
0x2B/0x0D CANopen 参考请求与应答 否
0x2B/0x0E
读设备身份表示 否
二、 FreeModbus 对硬件的需求
1
FreeModbus 协议对硬件的需求非常少——基本上任何具有串行接口,并且有一些能够
容纳 modbus 数据帧的 RAM 的微控制器都足够了。
一个异步串行接口,能够支持接收缓冲区满和发送缓存区空中断。
一个能够产生 RTU 传输所需要的 t3.5 字符超时定时器的时钟。
对于软件部分,仅仅需要一个简单的事件队列。在使用操作系统的处理器上,可通过
单独定义一个任务完成 Modbus 时间的查询。小点的微控制器往往不允许使用操作系统,
在那种情况下,可以使用一个全局变量来实现该事件队列(Atmel AVR 移植使用这种方式实
现)。
实际的存储器需求决定于所使用的 Modbus 模块的多少。下表列出了所支持的功能编
译后所需要的存储器。ARM 是使用 GNUARM 编译器 3.4.4 使用-O1 选项得到的。AVR 项
数值是使用 WinAVR 编译器 3.4.5 使用-Os 选项编译得到的。
表 2 FreeModbus 对硬件的需求
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 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 )
此函数的功能为设置串口状态。有两个参数:xRxEnable 及 xTxEnable。当 xRxEnable
为真时,应使能串口接收及接收中断。在 RS485 通讯系统中,还要注意将 RS485 接口芯片
设为接收使能状态;当 xTxEnable 为真时,应使能串口发送及发送中断。在 RS485 通讯系
统中,还要注意将 RS485 接口芯片设为发送使能状态。
2) void vMBPortClose( void )
此函数的功能是关闭 Modbus 通讯端口,具体的,应在此函数中关闭通讯端口的发送
使能及接收使能。
3) BOOL xMBPortSerialInit(UCHAR ucPORT, ULONG ulBaudRate, UCHAR ucDataBits,
eMBParity eParity)
此 函 数 的 功 能 是 初 始 化 串 行 通 讯 端 口 。 有 四 个 参 数 :
ucPORT、ulBaudRate、ucDataBits 及 eParity。参数 ucPORT 可以忽略;参数 ulBaudRate 是
通讯端口的波特率,应根据此数值设置所使用硬件端口的波特率;参数 ucDataBits 为通讯
时所使用的数据位宽,注意,若使用 RTU 模式,则有 ucDataBits=8,若使用 ASCII 模式,
则有 ucDataBits=7,应根据此参数设置所使用硬件端口的数据位宽;eParity 为校验方式,
2
eParity=MB_PAR_NONE 为无校验,此时硬件端口应设置为无校验方式及两个停止位 ,
eParity=MB_PAR_ODD 为奇 校验 , 此 时硬 件 端口 应 设置 为 奇校 验 方式 及 一个 停 止 位 ,
eParity= MB_PAR_EVEN 为偶校验,此时硬件端口应设置为偶校验方式及一个停止位。函
数返回值务必为 TRUE。
4) BOOL xMBPortSerialPutByte(CHAR ucByte)
此函数的功能为通讯端口发送一字节数据。参数为:ucByte,待发送的数据。应在此
函数中编写发送一字节数据的函数。注意,由于使用的是中断发送,故只需将数据放到发
送寄存器即可。函数返回值务必为 TRUE。
5) BOOL xMBPortSerialGetByte( CHAR * pucByte )
此函数的功能为通讯端口接收一字节数据。参数为:* pucByte,接收到的数据。应在
此函数中编写接收的函数。注意,由于使用的是中断接收,故只需将接收寄存器的值放到*
pucByte 即可。函数返回值务必为 TRUE。
6) void prvvUARTTxReadyISR(void)
发送中断函数。此函数无需修改。只需在用户的发送中断函数中调用此函数即可,同
时,用户应在调用此函数后,清除发送中断标志位。
7) void prvvUARTRxISR(void)
发送中断函数。此函数无需修改。只需在用户的接收中断函数中调用此函数即可,同
时,用户应在调用此函数后,清除接收中断标志位。
portserial.c 中函数的修改:
1) BOOL xMBPortTimersInit( USHORT usTim1Timerout50us )
此函数的功能为初始化超时定时器。参数为:usTim1Timerout50us,50us 的个数。用
户 应 根 据 所 使 用 的 硬 件 初 始 化 超 时 定 时 器 , 使 之 能 产 生 中 断 时 间 为
usTim1Timerout50us*50us 的中断。函数返回值务必为 TRUE。
2) void vMBPortTimersEnable( )
此函数的功能为使能超时定时器。用户需在此函数中清除中断标志位、清零定时器计
数值,并重新使能定时器中断。
3) void vMBPortTimersDisable( )
此函数的功能为关闭超时定时器。用户需在此函数中清零定时器计数值,并关闭定时
器中断。
4) void TIMERExpiredISR( void )
定时器中断函数。此函数无需修改。只需在用户的定时器中断中调用此函数即可,同
时,用户应在调用此函数后清除中断标志位。
2、应用层回函数的修改
在应用层,用户需要定义所需要使用的寄存器,并修改对应的回函数。回函数有如下
几个:
1) eMBErrorCode eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT
usNRegs )
输入寄存器回函数。* pucRegBuffer 为要添加到协议中的数据,usAddress 为输入寄存
器地址,usNRegs 为要读取寄存器的个数。用户应根据要访问的寄存器地址 usAddress 将相
应输入寄存器的值按顺序添加到 pucRegBuffer 中。
2) eMBErrorCode eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress,
USHORT usNRegs, eMBRegisterMode eMode )
保持寄存器回函数。* pucRegBuffer 为要协议中的数据,usAddress 为输入寄存器地址,
usNRegs 为访问寄存器的个数, eMode 为访问类型(MB_REG_READ 为读保持寄存器,
MB_REG_WRITE 为写保持寄存器)。用户应根据要访问的寄存器地址 usAddress 将相应输
入寄存器的值按顺序添加到 pucRegBuffer 中,或将协议中的数据根据要访问的寄存器地址
usAddress 放到相应保持寄存器中。
3
剩余12页未读,继续阅读
资源评论
zjshjs16
- 粉丝: 0
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功