TO:billhuang1118(劲风飞扬)---关于modbus协议!

fengxue291080 2004-01-07 12:21:55
billhuang1118(劲风飞扬)兄:
你有关于modbus的协议吧!可以给我一些中文的资料吗?
有些例程吗?
关于r232通讯以及远程控制的 !
先谢了!

yl_jun@126.com
...全文
112 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
azmao 2004-01-07
  • 打赏
  • 举报
回复
1 轮询地址和映象地址
在一个多站网络中,变送器模拟一台可编程逻辑控制器与兼容Modbus协议的主控制器进行通讯。每一台变送器都拥有1到247中的一个唯一的轮询地址。主控制器使用轮询地址开始与网络中的一个设备进行通讯或者使用地址0对网络中的所有设备广播一条消息。
同样变送器拥有映象地址来模拟PLC卷、离散输入、输入寄存器和保持寄存器。这样的地址在变送器的微处理机中对应特定的存储区。变送器同样拥有映射到与输入寄存器和保持寄存器同样的存储区的浮点数和字符串寄存器。主控制器通过读写一个或一串存储器来进行通讯。
变送器支持兼容Modbus协议的主控制器所使用的标准数据类型。变送器支持以下数据类型:
² 无符号16位整数,0~65535。寄存器地址为3XXXX或4XXXX。
² 单字节和3字节整数,用来表示设备鉴别码或序列号。寄存器地址为3XXXX或4XXXX。
² 8位ASCII字符串,每个16位寄存器存储两个。寄存器地址为5XXXX。
² 浮点数,四字节IEEE754格式。寄存器地址为2XXXX。
下表给出变送器支持的数据类型:
映射地址 可使用的功能 地址类型 存取方式 描述
0XXXX 01,05,15 卷 读写 每个卷表示单个开关位
1XXXX 02 离散输入 只读 每个卷表示单个开关位
2XXXX 03,04,06,16 浮点寄存器 只读/读写 两个连续16位寄存器表示一个浮点数
3XXXX 04 输入寄存器 只读 每个寄存器表示一个16位无符号整数
4XXXX 03,06,16 保持寄存器 读写 每个寄存器表示一个16位无符号整数
5XXXX 03,04,06,16 ASCII字符 读写 每个寄存器表示两个ASCII字符
azmao 2004-01-07
  • 打赏
  • 举报
回复
2.5 数据栏
在查询帧和广播帧中,数据栏包含需要从机去执行的信息。在响应帧中,数据栏包含从机执行的结果或者异常响应。数据拦可以包含数值、位址基准、限度或异常响应。
如果从机在响应主机命令时出现错误,那么响应帧的功能栏的最高位将被置高,数据栏包含为什么从机不能执行命令的代码。
异常响应代码如下:
异常响应 描述 响应解释
01 无效功能 变送器不允许执行收到的功能
02 无效地址 数据栏中的地址是不允许的
03 无效数据 数据栏中的数据是不允许的
06 忙 收到的消息没错,但从机正在执行一个长的程序命令
2.6 校验栏
校验栏用于检查主机与网络设备之间传送的信息是否有错。
3 数据传送模式
MODBUS允许两种传送模式:ASCII模式和RTU模式。传送模式由主机决定。在ASCII模式,消息由7位ASCII字符组成。在RTU模式,消息由8位二进制字符组成。MODBUS拥有几种不同的错误校验,ASCII模式使用LRC校验,RTU模式使用CRC校验。
下表给出ASCII模式和RTU模式的比较:
ASCII模式(7bits) RTU模式(8bits)
代码系统 十六进制(ASCII字符0-9,A-F) 8位二进制
位个数 起始位 1 1
数据位 7 8
校验位 1 1
停止位 1或2 1或2
错误校验 LRC CRC
3.1 ASCII模式消息帧
在ASCII模式,每个消息帧都包括一个起始符、一个地址栏、一个功能栏、一个数据栏、一个校验栏和一个结束符。
冒号符(:)作为起始符,回车符(CR)和换行符(LF)是结束符。
ASCII模式允许在两个字符之间有最长1秒的时间间隔。
下图举例说明一个ASCII模式消息帧:

3.2 RTU模式消息帧
在RTU模式,每个消息帧都包括一个地址栏、一个功能栏、一个数据栏和一个校验栏。
一帧消息传送完毕后,必须等待可发送3½个字符的时间,这一时间间隔用来同步MODBUS RTU通讯。
下图举例说明一个RTU模式消息帧:

3.3 错误检查
错误检查包括硬件奇偶校验、ASCII模式的LRC校验和RTU模式的CRC校验.
3.3.1 硬件奇偶校验
偶校验
数据位与校验位的和为偶数。
奇校验
数据位与校验位的和为奇数。
3.3.2 ASCII模式的LRC校验
LRC校验数与ASCII模式消息帧的地址栏、功能栏、数据栏的总和为零。
在计算时,不包括起始符冒号(:)和结束符回车(CR)与换行(LF)。
下面给出LRC的计算程序:
static unsigned char LRC(auchMsg, usDataLen)
unsigned char *auchMsg ; /* message to calculate LRC upon */
unsigned short usDataLen ; /* quantity of bytes in message */
{
unsigned char uchLRC = 0 ; /* LRC char initialized */
while (usDataLen––) /* pass through message buffer */
uchLRC += *auchMsg++ ; /* add buffer byte without carry */
return ((unsigned char)(–((char)uchLRC))) ; /* return twos complement */
}
3.3.3 RTU模式的CRC校验
产生CRC校验值的过程
1、 调用一个16位寄存器,写入十六进制数FFFF。我们称这一寄存器为CRC寄存器。
2、 异或消息帧的第一个8位数,结果存在CRC寄存器。
3、 将CRC寄存器右移一位,最高位(MSB)填零,然后检查移出位。
4、 如果移出位为0,则重复第3步(继续右移);
如果移出位为1,CRC寄存器异或十六进制数A0001;
5、 重复步骤3、4直到8次右移结束。
6、 异或消息帧的下一个8位数,结果存在CRC寄存器。
7、 重复步骤3~6直到消息帧的所有数据被处理。
8、 最后得到的2字节数(16位)就是CRC校验值。
下面给出CRC的计算程序:
//***CRC Calculation for MODBUS Protocol for VC++***//
//数组snd为地址等传输字节,num为字节数//
unsigned int mb_crc(BYTE *snd,int num)
{ int i,j;
unsigned int c,crc=0xFFFF
for (i=0;i<num;i++)
{ c=str[i] & 0x00FF;
crc^=c;
for(j=0,j<8,j++)
{ if (crc & 0x0001)
{crc>>=1;crc^=0xA001;}
else crc>>=1
}
}
return(crc);
}
azmao 2004-01-07
  • 打赏
  • 举报
回复
2 MODBUS消息帧
2.1 查询帧和广播帧
主控制器可以发出查询帧和广播帧。查询帧对应一个来自网络设备的响应帧。广播帧通知所有设备,不需要响应。每一帧均有一个地址栏、一个功能栏、一个数据栏和一个校验栏。

地址栏 功能栏 数据栏 校验栏

2.2 广播帧和地址0
任何一个使用从机地址0的查询帧就是广播帧。在广播帧中只有MODBUS功能5, 6, 8, 15,和16才是有效的。
2.3 地址栏
在查询帧中地址栏为变送器的轮询地址。在响应帧中地址栏为响应设备的轮询地址。在广播帧中地址栏为一个0,它告诉网络上的设备不需要回答。
2.4 功能栏
在查询帧或广播帧中,功能栏位含有一个功能码,它表示对在数据拦中映射地址的阅读指令,书写指令或诊断的指令。在一个响应帧中,功能栏位含有功能码用来验证装置对指令的响应。 如果在功能栏位中的最高有效位元被设定,数据拦含有异常响应用来说明在处理命令中遇到的任何错误。
我的变送器使用了MODBUS功能码的一部分。包括读指令、写指令和诊断指令。
**********
² 读指令:包括功能01(读卷状态),02(读输入状态),03(读保持寄存器),04(读输入寄存器),17(读设备识别码)。
² 写指令:包括功能05(写卷),06(写寄存器),15(写多卷),16(写多寄存器)。
² 诊断指令:包括功能07(读异常状态),08(循环诊断)。
下表给出变送器支持的功能。
功能码 类型 描述 功能解释
01 读 读卷状态 读一个或连续卷的开关状态
02 读 读输入状态 读一个或连续离散量的开关状态
03 读 读保持寄存器 读一个或连续保持寄存器的二进制值
04 读 读输入寄存器 读一个或连续输入寄存器的二进制值
05 写 写卷 设置单个卷的开关状态
06 写 写寄存器 写二进制值到保持寄存器
07 诊断 读异常状态 读输入寄存器30125的状态位
08 诊断 循环诊断 发送一条测试消息给变送器用于评估通讯过程
15 写 写多卷 设置连续卷的开关状态
16 写 写多寄存器 写二进制值到连续的保持寄存器
17 读 读设备识别码 返回设备类型和操作状态

6,125

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 硬件设计
社区管理员
  • 硬件设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧