2008-11-06
评论11
楼主 2008/10/20 9:26:55
楼主 2008/10/20 15:20:18
谢谢,正在学习中
楼主 2008/10/22 8:35:18
Modbus是MODICON公司于1979年开发的一种通讯协议。它是一种在工业领域被广为应用的真正开放、标准的网络通讯协议。SCADA和HMI通过Modbus协议可以很容易将带串行通讯口的设备集成在一起。
MODBUS 是MODICON公司最先倡导的一种软的通讯规约,经过大多数公司的实际应用,逐渐被认可,成为一种标准的通讯规约,只要按照这种规约进行数据通讯或传输,不同的系统就可以通讯。目前,在RS232/RS485通讯过程中,更是广泛采用这种规约。
常用的MODBUS 通讯规约有两种,一种是MODBUS ASCII,一种是MODBUS RTU。一般来说,通讯数据量少而且主要是文本的通讯则采用MODBUS ASCII规约,通讯数据数据量大而且是二进制数值时,多采用MODBUS RTU规约。
楼主 2008/10/22 8:36:14
MODBUS是MODICON公司为该公司生产的PLC设计的一种通信协议,从其功能上看,可以认为是一种现场总线。它通过24种总线命令实现PLC与外界的信息交换。具有MODBUS接口的PLC可以很方便的进行组态。 MODBUS传输协议定义了控制器可以识别和使用的信息结构,而不须考虑通信网络的拓扑结构。它定义了各种数据帧格式,描述了控制器访问另一设备的过程,怎样作出应答响应,以及可检查和报告的错误。 MODBUS有两种传送方式,RTU(Remote Terminal Unit)方式和ASCⅡ方式。MODBUS以LSB在先的形式传送数字量,以MSB在先的形式传送模拟量。MODBUS把通信参与者规定为“主站”(MASTER)和“从站”(SLAVE)。主站可向多个从站发送通信请求,最多可达247个从站。每个从站都有自己的地址编号。 MODBUS的RTU方式规定通信字符串的最后两个字节用于传递循环冗余校验数据。其校验方式是将整个字符串(不包括最后两个字节)的所有字节按规定的方式进行位移并进行XOR(异或)计算。接收方在收到该字符串时按同样的方式进行计算,并将结果同收到的循环冗余校验的两个字节进行比较,如果一致则认为通信正确,如果不一致,则认为通信有误,从站将发送CRC错误应答。MODBUS中RTU采用CRC-16的冗余校验方式。 | |
控制器与PLC之间通信的内容包括主站对从站的读取和写入,MODBUS规定,只有主站具有主动权,从站只能被动的响应,包括回答出错信息。数据通信的一般格式如下: 从功能上讲,MODBUS包括24种命令,每一功能都有相应的功能码。最基本的功能主要包括AI/AO、DI/DO的数据传送, PLC如果支持MODBUS,那么都应该包含这些基本命令。PLC将模拟量和数字量存放在不同的寄存器中。模拟量在PLC中是保存在寄存器(Holding Register)中,数字量保存在线圈中(Holding Coils)。 主站:从站地址 功能码 数据起始地址 数据量 CRC校验码 从站:从站地址 功能码 数据量 应答数据 CRC校验码 | |
MODBUS除了定义通信功能码外,同时还定义了出错码,这有助于通信主站发现通信的错误内容和原因,并采取相应措施,从而保证了通信的可靠进行。 MODBUS定义的出错信息为:指定的地址错误、指定的数据量出错、从站自身的错误、无法应答请求或执行要求指令、从站无暇处理主站发送的通信请求指令等。错误信息对应错误代码。主站在接收到错误码后,根据错误的原因采取相应措施。如:改变数据地址、加大发送间隔、重发等 |
楼主 2008/10/22 12:18:35
Modbus通讯协议 |
Modbus协议最初由Modicon公司开发出来,在1979年末该公司成为施耐德自动化(Schneider Automation)部门的一部分,现在Modbus已经是工业领域全球最流行的协议。此协议支持传统的RS-232、RS-422、RS-485和以太网设备。许多工业设备,包括PLC,DCS,智能仪表等都在使用Modbus协议作为他们之间的通讯标准。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。 当在网络上通信时,Modbus协议决定了每个控制器须要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动。如果需要回应,控制器将生成应答并使用Modbus协议发送给询问方。 Modbus协议包括ASCII、RTU、TCP等,并没有规定物理层。此协议定义了控制器能够认识和使用的消息结构,而不管它们是经过何种网络进行通信的。标准的Modicon控制器使用RS232C实现串行的Modbus。Modbus的ASCII、RTU协议规定了消息、数据的结构、命令和就答的方式,数据通讯采用Maser/Slave方式,Master端发出数据请求消息,Slave端接收到正确消息后就可以发送数据到Master端以响应请求;Master端也可以直接发消息修改Slave端的数据,实现双向读写。 Modbus协议需要对数据进行校验,串行协议中除有奇偶校验外,ASCII模式采用LRC校验,RTU模式采用16位CRC校验,但TCP模式没有额外规定校验,因为TCP协议是一个面向连接的可靠协议。另外,Modbus采用主从方式定时收发数据,在实际使用中如果某Slave站点断开后(如故障或关机),Master端可以诊断出来,而当故障修复后,网络又可自动接通。因此,Modbus协议的可靠性较好。 |
楼主 2008/10/23 16:08:18
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
楼主 2008/10/23 16:12:35
代码 | 功能 | 数据类型 |
01 | 读 | 位 |
02 | 读 | 位 |
03 | 读 | 整型、字符型、状态字、浮点型 |
04 | 读 | 整型、状态字、浮点型 |
05 | 写 | 位 |
06 | 写 | 整型、字符型、状态字、浮点型 |
08 | N/A | 重复“回路反馈”信息 |
15 | 写 | 位 |
16 | 写 | 整型、字符型、状态字、浮点型 |
17 | 读 | 字符型 |
特性 | ASCII(7位) | RTU(8位) | |
编码系统 | 十六进制(使用ASCII可打印字符:0~9,A~F) | 二进制 | |
每一个字符的位数 | 开始位 | 1位 | 1位 |
数据位(最低有效位第一位) | 7位 | 8位 | |
奇偶校验(任选) | 1位(此位用于奇偶校验,无校应则无该位) | 1位(此位用于奇偶校验,无校应则无该位) | |
停止位 | 1或2位 | 1或2位 | |
错误校验 | LRC(即纵向冗余校验) | CRC(即循环冗余校验) |
主机请求 | ||||||
地址 | 功能码 | 第一个寄存器的高位地址 | 第一个寄存器的低位地址 | 寄存器的数量的高位 | 寄存器的数量的底位 | 错误校验 |
01 | 03 | 00 | 38 | 00 | 01 | XX |
从机应答 | |||||
地址 | 功能码 | 字节数 | 数据高字节 | 数据低字节 | 错误校验 |
01 | 03 | 2 | 41 | 24 | XX |
十六进制数4124表示的十进制整数为16676,错误校验值要根据传输方式而定。 |
楼主 2008/10/24 8:49:40
楼主 2008/10/24 9:13:28
楼主 2008/10/24 13:04:38
LRC检测
使用ASCII模式,消息包括了一基于LRC方法的错误检测域。LRC域检测了消息域中除开始的冒号及结束的回车换行号外的内容。
LRC域是一个包含一个8位二进制值的字节。LRC值由传输设备来计算并放到消息帧中,接收设备在接收消息的过程中计算LRC,并将它和接收到消息中LRC域中的值比较,如果两值不等,说明有错误。
LRC方法是将消息中的8Bit的字节连续累加,丢弃了进位。
LRC简单函数如下:
static unsigned char LRC(auchMsg,usDataLen)
unsigned char *auchMsg ; /* 要进行计算的消息 */
unsigned short usDataLen ; /* LRC 要处理的字节的数量*/
{ unsigned char uchLRC = 0 ; /* LRC 字节初始化 */
while (usDataLen--) /* 传送消息 */
uchLRC += *auchMsg++ ; /* 累加*/
return ((unsigned char)(-((char_uchLRC))) ;
}