OpenVINOTM,给你看得见的未来!>>
电子产品世界 » 论坛首页 » 综合技术 » 工业控制与自动化 » 仪表的现场总线通讯--modbus(zt)

共11条 1/2 1 2 跳转至

仪表的现场总线通讯--modbus(zt)

工程师
2008-06-16 14:27:21    评分
 

现在的仪表已经不是单独的仪表,而是自动化系统网络的一部分。仪表到网络的连接通常使用现场总线(fieldbus)。
仪表行业用的最多的是HART、FF和PROFIBUS。
但受知识产权保护的影响,国内厂家正式成为这几家基金会成员的很少。
而基于RS485总线的MODBUS协议在国内外是广泛使用。
MODBUS是起源于PLC的一种标准通讯协议。
使用这种方式可以这样理解。
物理层采用RS485。数据链路层规定了帧格式。相当于完成主机RAM和从机RAM的对应关系。应用层是需要自己定义的,定义RAM每个单元的对应物理量。例如地址0 0002代表  “开始/停止总累积”。

 




关键词: 仪表     现场     总线     通讯     --modbus    

工程师
2008-06-16 14:28:33    评分
2楼
在一个多站网络中,变送器模拟一台可编程逻辑控制器与兼容Modbus协议的主控制器进行通讯。每一台变送器都拥有1到247中的一个唯一的轮询地址。主控制器使用轮询地址开始与网络中的一个设备进行通讯或者使用地址0对网络中的所有设备广播一条消息。 同样变送器拥有映象地址来模拟PLC卷、离散输入、输入寄存器和保持寄存器。这样的地址在变送器的微处理机中对应特定的存储区。变送器同样拥有映射到与输入寄存器和保持寄存器同样的存储区的浮点数和字符串寄存器。主控制器通过读写一个或一串存储器来进行通讯。 变送器支持兼容Modbus协议的主控制器所使用的标准数据类型。变送器支持以下数据类型: <!--[if !supportLists]-->        <!--[endif]-->无符号16位整数,0~65535。寄存器地址为3XXXX或4XXXX。 <!--[if !supportLists]-->       <!--[endif]-->单字节和3字节整数,用来表示设备鉴别码或序列号。寄存器地址为3XXXX或4XXXX。 <!--[if !supportLists]-->        <!--[endif]-->8位ASCII字符串,每个16位寄存器存储两个。寄存器地址为5XXXX。 <!--[if !supportLists]-->        <!--[endif]-->浮点数,四字节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字符

工程师
2008-06-16 14:29:59    评分
3楼
<!--[if !vml]--> <!--[endif]--><!--[if !mso]--> <!--[endif]-->
<!--[if !vml]-->
<!--[endif]--> <!--[if !mso]-->
<!--[endif]--><!--[if !mso & !vml]--> <!--[endif]--><!--[if !vml]-->
<!--[endif]-->
<!--[if !supportLists]-->1.5    <!--[endif]-->数据栏
在查询帧和广播帧中,数据栏包含需要从机去执行的信息。在响应帧中,数据栏包含从机执行的结果或者异常响应。数据拦可以包含数值、位址基准、限度或异常响应。 如果从机在响应主机命令时出现错误,那么响应帧的功能栏的最高位将被置高,数据栏包含为什么从机不能执行命令的代码。 异常响应代码如下: 异常响应
 描述
 响应解释
 
01
 无效功能
 变送器不允许执行收到的功能
 
02
 无效地址
 数据栏中的地址是不允许的
 
03
 无效数据
 数据栏中的数据是不允许的
 
06
 忙
 收到的消息没错,但从机正在执行一个长的程序命令
 
<!--[if !supportLists]-->1.6    <!--[endif]-->校验栏
校验栏用于检查主机与网络设备之间传送的信息是否有错。

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


<!--[endif]--> <!--[if !mso]-->
<!--[endif]--><!--[if !mso & !vml]--> <!--[endif]--><!--[if !vml]-->
<!--[endif]-->



例如请求读17号从机卷20-56的状态 查询帧
区域名 数值(十六进制)
从机地址 11
功能码 01
起始地址高 00
起始地址低 13
卷个数高 00
卷个数低 25
校验(LRC或CRC)
响应帧
区域名 数值(十六进制)
从机地址 11
功能码 01
字节数 05
数据(卷27-20) CD
数据(卷35-28) 6B
数据(卷43-36) B2
数据(卷51-44) 0E
数据(卷56-52) 1B
校验(LRC或CRC)
       依照惯例,高位在左,低位在右。没有用的位添0。
例如请求读17号从机寄存器40108-40110的状态 查询帧
区域名 数值(十六进制)
从机地址 11
功能码 03
起始地址高 00
起始地址低 6B
卷个数高 00
卷个数低 03
校验(LRC或CRC)
响应帧
区域名 数值(十六进制)
从机地址 11
功能码 03
字节数 06
数据高(寄存器40108) 02
数据低(寄存器40108) 2B
数据高(寄存器40109) 00
数据低(寄存器40109) 00
数据高(寄存器40110) 00
数据低(寄存器40110) 64
校验(LRC或CRC)

<!--[if !vml]-->

<!--[endif]--><!--[if !mso]-->
<!--[endif]--> <!--[if !vml]-->
<!--[endif]-->
<!--[if !mso]-->
<!--[endif]--><!--[if !mso & !vml]--> <!--[endif]--><!--[if !vml]-->
<!--[endif]-->


<!--[if !supportLists]-->1.5    <!--[endif]-->数据栏 在查询帧和广播帧中,数据栏包含需要从机去执行的信息。在响应帧中,数据栏包含从机执行的结果或者异常响应。数据拦可以包含数值、位址基准、限度或异常响应。 如果从机在响应主机命令时出现错误,那么响应帧的功能栏的最高位将被置高,数据栏包含为什么从机不能执行命令的代码。 异常响应代码如下:
异常响应 描述 响应解释
01 无效功能 变送器不允许执行收到的功能
02 无效地址 数据栏中的地址是不允许的
03 无效数据 数据栏中的数据是不允许的
06 收到的消息没错,但从机正在执行一个长的程序命令
<!--[if !supportLists]-->1.6    <!--[endif]-->校验栏 校验栏用于检查主机与网络设备之间传送的信息是否有错。

工程师
2008-06-16 14:32:27    评分
5楼
标签: 无标签 仪表的现场总线通讯--modbus(4)

 

<!--[if !supportLists]-->1       <!--[endif]-->数据传送模式 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
<!--[if !supportLists]-->1.1    <!--[endif]-->ASCII模式消息帧 在ASCII模式,每个消息帧都包括一个起始符、一个地址栏、一个功能栏、一个数据栏、一个校验栏和一个结束符。 冒号符(:)作为起始符,回车符(CR)和换行符(LF)是结束符。 ASCII模式允许在两个字符之间有最长1秒的时间间隔。 下图举例说明一个ASCII模式消息帧:
帧起始 地址栏 功能栏 数据栏 校验栏 帧结束 准备就绪
2字符模式
2字符 2字符 N个4字符 2字符 回车 换行
16位模式
16位 16位 N个16位 16位 回车 换行
<!--[if !supportLists]-->1.2    <!--[endif]-->RTU模式消息帧 在RTU模式,每个消息帧都包括一个地址栏、一个功能栏、一个数据栏和一个校验栏。 一帧消息传送完毕后,必须等待可发送3?个字符的时间,这一时间间隔用来同步MODBUS RTU通讯。 下图举例说明一个RTU模式消息帧:
流逝时间 地址栏 功能栏 数据栏 校验栏 流逝时间
大于发送3?个字符的时间 (8位) 1字符 (8位) 1字符 (8位) 1字符 (8位) 1字符 大于发送3?个字符的时间
           
           
           
           
           
           
           
           
<!--[if !supportLists]-->1.3    <!--[endif]-->错误检查 错误检查包括硬件奇偶校验、ASCII模式的LRC校验和RTU模式的CRC校验. <!--[if !supportLists]-->1.3.1   <!--[endif]-->硬件奇偶校验 偶校验     数据位与校验位的和为偶数。 奇校验 数据位与校验位的和为奇数。 <!--[if !supportLists]-->1.3.2   <!--[endif]-->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 */  } <!--[if !supportLists]-->1.3.3   <!--[endif]-->RTU模式的CRC校验 产生CRC校验值的过程 <!--[if !supportLists]-->1、 <!--[endif]-->调用一个16位寄存器,写入十六进制数FFFF。我们称这一寄存器为CRC寄存器。 <!--[if !supportLists]-->2、 <!--[endif]-->异或消息帧的第一个8位数,结果存在CRC寄存器。 <!--[if !supportLists]-->3、 <!--[endif]-->将CRC寄存器右移一位,最高位(MSB)填零,然后检查移出位。 <!--[if !supportLists]-->4、 <!--[endif]-->如果移出位为0,则重复第3步(继续右移);    如果移出位为1,CRC寄存器异或十六进制数A0001; <!--[if !supportLists]-->5、 <!--[endif]-->重复步骤3、4直到8次右移结束。 <!--[if !supportLists]-->6、 <!--[endif]-->异或消息帧的下一个8位数,结果存在CRC寄存器。 <!--[if !supportLists]-->7、 <!--[endif]-->重复步骤3~6直到消息帧的所有数据被处理。 <!--[if !supportLists]-->8、 <!--[endif]-->最后得到的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
{ c=str[i] & 0x00FF;
crc^=c;
for(j=0,j<8,j++)
{ if (crc & 0x0001)
{crc>>=1;crc^=0xA001;}
else crc>>=1
}
}
return(crc);
}

菜鸟
2012-06-29 14:10:35    评分
6楼
有用

菜鸟
2012-07-27 14:46:59    评分
7楼
能分析一下wireless-m-bus就更好了

菜鸟
2012-07-31 16:36:32    评分
8楼

助工
2012-09-16 21:15:02    评分
9楼
学习应用中有用

菜鸟
2012-11-13 13:08:54    评分
10楼
懂这个的人太牛了,技术也很牛啊!我们公司做电气检测,采购的很多福禄克的产品都能够进行现场总线的连接 ,这样操控起来很方便,数据的统计与处理,故障分析与维护都很方便,已经接近智能化系统了,很厉害,也很容易学习。希望更多的电气检测产品向自动化方向发展。

共11条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]