MODBUS-RTU 通讯协议
MODBUS-RTU 通讯协议采用主从应答方式(半双工),由主机发出指令寻址某一从机,被寻址的从机响应并返回应答信息。 一、通讯格式
1.1 传输格式
信息传输为异步方式,并以字节为单位(LSB 先),在主机和从机之间传递的通讯信息是11位的字格式。 有校验位(奇偶校验)的传输序列:1个起始位、8个数据位、1个校验位、1个停止位。
无校验位的传输序列:1个起始位、8个数据位、2个停止位。
免费软件下载网站入口1.2 帧格式
一个新的通讯信息帧开始之前,通讯总线应存在不小于 3.5字节的间歇时间,通讯开始之后,每两个字节之间应不大于1.5字节的间歇时间。
二、通讯信息帧说明
主机寻址某一从机时,与主机发送的地址码相符的从机接收通讯命令,如果CRC 校验无误,则执行相应的操作,然后把执行结果(数据)回送给主机,否则不返回任何信息。 2.1 地址码
地址码是通讯信息帧的第1个字节,从0到247(0为广播地址)。每个从机应该有总线内唯一的地址码,只有与主机发送的地址码相符的从机才能响应并回送信息。 2.2 功能码
功能码是通讯信息帧的第2个字节。主机寻址某一从机时,通过功能码告诉从机执行什么操作。从机返回的功能码与主机发送的功能码一致表明从机已正确执行了相关操作。从机支持以下功能码:
2.3 数据区
数据区的长度和内容随功能码不同而不同,用于主机和从机以读写寄存器的方式进行数据交换。产品使用说明书中给出了具体的通讯信息表(参见“五、通讯信息表示例”)。 2.4 CRC 校验码
CRC 校验码高字节是通讯信息帧的最后一个字节。
CRC 校验码由主机计算,放置于发送信息帧的尾部。从机再重新计算接收到信息的CRC ,比较计算得到的CRC 与接收到的CRC 是否一致,如果不一致,则表明出错。CRC 计算只用到了8个数据位,计算方法如下:
① 预置1个16位的寄存器为十六进制FFFF (即全为1),称此寄存器为CRC 寄存器;
② 把第一个8位二进制数据(通讯信息帧的第1个字节)与16位CRC 寄存器的低8位相异或,结果放于CRC 寄存器; ③ 把CRC 寄存器的内容右移一位(朝低位)并用0填补最高位,检查右移后的移出位;
start
end
data
parity
起始位
停止位
数据位
校验位
start
end
data
起始位
停止位
数据位
④如果移出位为0:重复第③步(再次右移一位);
如果移出位为1:CRC寄存器与多项式A001(1010 0000 0000 0001)进行异或;
⑤重复步骤③和④,直到右移8次,这样整个8位数据全部进行了处理;
⑥重复步骤②到步骤⑤,进行通讯信息帧下一个字节的处理;
⑦将该通讯信息帧所有字节(不包括CRC校验码高、低字节)按上述步骤计算完成后,CRC寄存器内容即为CRC校验码。
三、功能码说明
3.1 功能码03H:读寄存器数据
如:主机要读取从机地址为01H,起始寄存器地址为0CH的2个寄存器数据。主机发送:01 03 00 0C 00 02 04 08
如果从机寄存器0CH、0DH的数据为0001H、1388H。从机返回:01 03 04 00 01 13 88 A6 A5
3.2功能码10H:写多个寄存器
如:主机要把数据0002H、1388H、000AH保存到从机地址为01H,起始寄存器地址为00H的3个寄存器中。
主机发送:01 10 00 00 00 03 06 00 02 13 88 00 0A 9B E9
如果从机正确执行了相关操作,从机返回:01 10 00 00 00 03 80 08
四、出错处理
当从机检测到了除CRC校验码错误以外的其它错误时,应向主机回送信息。从机返回的功能码最高位为1(即从机返回的功能码是主机发送的功能码+128),表明本次通讯存在错误,从机返回的信息帧格式如下:
错误码说明如下:
例如:从机返回01 90 04 C3 4D说明主机发送的待写入寄存器的数据超出了对应寄存器允许写入的数据范围。
五、通讯信息表示例
***************
QQ:393077109
2009.03.29
基于原始协议的 Modbus RTU 主站库本文阅读基础:了解Modbus 协议(知识一、知识二),了解S7-200 自由口通讯编程。
S7-200 可以通过自由口通讯方式支持Modbus 协议,在Micro 'n Power中也提供了一个适用于S7-200 的免费库。但库太过于S7-200 化了,为了简化在S7-200 上的应用,该库对Modbus 协议进行了过多的包装。比如人为对地址进行分类,通过地址前缀将功能码和寄存器地址合二为一,对于熟知S7-200 且多用于S7-200 之间通讯的开发者来说,使用是很方便的,但对于那些对Modbus 一知半解的人来说,就容易产生迷惑性。
为了达到代码重用的目的,本人写了个基于原始协议的RTU 库。本库将功能码和寄存器分开,使用者需要了解Modbus 协议,知道何种地址使用哪一类功能码。在同多个不同品牌不同类型的从站网络通讯时使用较为方便,不需要进行地址转换,也不需要针对“Modbus 地址进行+1 处理”,只需要直接查具体从站的手册按手册中的地址填写即可。
本库使用方式、要求均与Micor 'n Power 提供的库相同:提供MBUS_CTRL 和MBUS_MSG 两个子程序,需要在每个扫描周期调用。
另外提供一个独立的MBUS_CRC 子程序用于其它地方的CRC 检验码计算。
子程序的用法:
1、MBUS_CTRL
入口参数:
EN :调用使能位,须始终接通
fMode :通讯口模式,0=恢复PPI、1=Modbus,参数类型:位
dBaud :通讯波特率,1200/2400/.../115200等,参数类型:双字
bParity :校验方式,0=无校验,,1=奇校验,2=偶校验,参数类型:字节
nTimeout :超时时间,单位:毫秒,参数类型:字
出口参数:
fDone :完成位状态,0=忙碌中、1=已完成,参数类型:位
bError :返回代码,0=无错,非零为出错(详见POU注释),参数类型:字节
2、MBUS_MSG
入口参数:
EN :调用使能位,须始终接通
fFirst :一个消息帧的开始,须用EN 的上升沿调用,参数类型:位
bSlave :从站地址,参数类型:字节
bFunction :功能码,参数类型:字节
wAddr :寄存器地址,参数类型:字
wCount :读写数据长度(字数),参数类型:字
pDataBuf :数据缓冲区首地址,参数类型:双字
出口参数:
fDone :完成位状态,0=忙碌中、1=已完成,参数类型:位
bError :返回代码,0=无错,非零为出错(详见POU注释),参数类型:字节
3、MBUS_CRC
入口参数:
EN :调用使能位
pBuf :待计算报文的首地址(第一字节指明数据字节数),参数类型:双字
bExchg :是否交换结果的高低字节位,0=不交换、1=交换,参数类型:字节bPutBack :结果是否写入缓冲区,0=不写,1=写入,参数类型:字节
出口参数:
wCrc :计算结果,参数类型:字
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论