关于Modbus通讯协议
引言:
工业控制已从单机控制走向集中监控、集散控制,如今已进入网络时代,工业控制器连网也为网络管理提供了方便。Modbus就是工业控制器的网络协议中的一种。
一、 Modbus 协议简介
Modbus 协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。它已经成为一通用工业标准。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。它描述了一控制器请求访问其它设备的过程,如果回应来自其它设备的请求,以及怎样侦测错误并记录。它制定了消息域格局和内容的公共格式。
当在一Modbus网络上通信时,此协议决定了每个控制器须要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动。如果需要回应,控制器将生成反馈信息并用Modbus协议发出。在其它网络上,包含了Modbus协议的消息转换为在此网络上使用的帧或包结构。这种转换也扩展了根据具体的网络解决节地址、路由路径及错误检测的方法。
1、在Modbus网络上转输
标准的Modbus口是使用一RS-232C兼容串行接口,它定义了连接口的针脚、电缆、信号位、传输波特率、奇偶校验。控制器能直接或经由Modem组网。
控制器通信使用主—从技术,即仅一设备(主设备)能初始化传输(查询)。其它设备(从设备)根据主设备查询提供的数据作出相应反应。典型的主设备:主机和可编程仪表。典型的从设备:可编程控制器。
主设备可单独和从设备通信,也能以广播方式和所有从设备通信。如果单独通信,从设备返回一消息作为回应,如果是以广播方式查询的,则不作任何回应。Modbus协议建立了主设备查询的格式:设备(或广播)地址、功能代码、所有要发送的数据、一错误检测域。
从设备回应消息也由Modbus协议构成,包括确认要行动的域、任何要返回的数据、和一错误检测域。如果在消息接收过程中发生一错误,或从设备不能执行其命令,从设备将建立一错误消息并把它作为回应发送出去。
2、在其它类型网络上转输
在其它网络上,控制器使用对等技术通信,故任何控制都能初始和其它控制器的通信。这样在单独的通信过程中,控制器既可作为主设备也可作为从设备。提供的多个内部通道可允许同时发生的传输进程。
在消息位,Modbus协议仍提供了主—从原则,尽管网络通信方法是“对等”。如果一控制器发送一消息,它只是作为主设备,并期望从从设备得到回应。同样,当控制器接收到一消息,它将建立一从设备回应格式并返回给发送的控制器。
3、查询—回应周期
(1)查询
查询消息中的功能代码告之被选中的从设备要执行何种功能。数据段包含了从设备要执行功能的任何附加信息。例如功能代码03是要求从设备读保持寄存器并返回它们的内容。数据段必须包含要告之从设备的信息:从何寄存器开始读及要读的寄存器数量。错误检测域为从设备提供了一种验证消息内容是否正确的方法。
(2)回应
如果从设备产生一正常的回应,在回应消息中的功能代码是在查询消息中的功能代码的回应。数据段包括了从设备收集的数据:象寄存器值或状态。如果有错误发生,功能代码将被修改以用于指出回应消息是错误的,同时数据段包含了描述此错误信息的代码。错误检测域允许主设备确认消息内容是否可用。
二、两种传输方式
控制器能设置为两种传输模式(ASCII或RTU)中的任何一种在标准的Modbus网络通信。用户选择想要的模式,包括串口通信参数(波特率、校验方式等),在配置每个控制器的时候,在一个Modbus网络上的所有设备都必须选择相同的传输模式和串口参数。
所选的ASCII或RTU方式仅适用于标准的Modbus网络,它定义了在这些网络上连续传输的消息段的每一位,以及决定怎样将信息打包成消息域和如何解码。
在其它网络上(象MAP和Modbus Plus)Modbus消息被转成与串行传输无关的帧。
1、ASCII模式
当控制器设为在Modbus网络上以ASCII(美国标准信息交换代码)模式通信,在消息中的每个8Bit字节都作为两个ASCII字符发送。这种方式的主要优点是字符发送的时间间隔可达到1秒而不产生错误。代码系统
· 十六进制,ASCII字符0...9,A...F
· 消息中的每个ASCII字符都是一个十六进制字符组成
每个字节的位
· 1个起始位
· 7个数据位,最小的有效位先发送
· 1个奇偶校验位,无校验则无
CRC域是两个字节,包含一16位的二进制值。它由传输设备计算后加入到消息中。接收设备重新计算收到消息的CRC,并与接收到的CRC域中的值比较,如果两值不同,则有误。
CRC是先调入一值是全“1”的16位寄存器,然后调用一过程将消息中连续的8位字节各当前寄存器中的值进行处理。仅每个字符中的8Bit数据对CRC有效,起始位和停止位以及奇偶校验位均无效。
CRC产生过程中,每个8位字符都单独和寄存器内容相或(OR),结果向最低有效位方向移动,最高有效位以0填充。LSB被提取出来检测,如果LSB为1,寄存器单独和预置的值或一下,如果LSB为0,则不进行。整个过程要重复8次。在最后一位(第8位)完成后,下一个8位字节又单独和寄存器的当前值相或。最终寄存器中的值,是消息中所有的字节都执行之后的CRC值。
CRC添加到消息中时,低字节先加入,然后高字节。
CRC简单函数如下:
unsigned short CRC16(puchMsg, usDataLen)
unsigned char *puchMsg ; /* 要进行CRC校验的消息 */
unsigned short usDataLen ; /* 消息中字节数 */
{
unsigned char uchCRCHi = 0xFF ; /* 高CRC字节初始化 */
unsigned char uchCRCLo = 0xFF ; /* 低CRC 字节初始化 */
unsigned uIndex ; /* CRC循环中的索引 */
while (usDataLen--) /* 传输消息缓冲区 */
{
uIndex = uchCRCHi ^ *puchMsgg++ ; /* 计算CRC */
uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex} ;
uchCRCLo = auchCRCLo[uIndex] ;
}
return (uchCRCHi << 8 | uchCRCLo) ;
}
/* CRC 高位字节值表 */
static unsigned char auchCRCHi[] = {
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
} ;
/* CRC低位字节值表*/
static char auchCRCLo[] = {
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,
0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,
0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,
0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,
0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,
0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,
0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,
0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,
0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,
0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,
0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,
0x43, 0x83, 0x41, 0x81, 0x80, 0x40
} ;
ModBus网络是一个工业通信系统,由带智能终端的可编程序控制器和计算机通过公用线路或局部专用线路连接而成。其系统结构既包括硬件、亦包括软件。它可应用于各种数据采集和过程监控。下表1是ModBus的功能码定义。
表1 ModBus功能码
01 READ COIL STATUS
02 READ INPUT STATUS
03 READ HOLDING REGISTER
04 READ INPUT REGISTER
05 WRITE SINGLE COIL
06 WRITE SINGLE REGISTER
15 WRITE MULTIPLE COIL
16 WRITE MULTIPLE REGISTER
ModBus网络只是一个主机,所有通信都由他发出。网络可支持247个之多的远程从属控制器,但实际所支持的从机数要由所用通信设备决定。采用这个系统,各PC可以和中心主机交换信息而不影响各PC执行本身的控制任务。
(1)ModBus的传输方式
在ModBus系统中有2种传输模式可选择。这2种传输模式与从机PC通信的能力是同等的。选择时应视所用ModBus主机而定,每个ModBus系统只能使用一种模式,不允许2种模式混用。一种模式是ASCII(美国信息交换码),另一种模式是RTU(远程终端设备)这两种模式的定义见表3
表3 ASCII和RTU传输模式的特性
ASCII可打印字符便于故障检测,而且对于用高级语言(如Fortan)编程的主计算机及主PC很适宜。RTU则适用于机器语言编程的计算机和PC主机。
用RTU模式传输的数据是8位二进制字符。如欲转换为ASCII模式,则每个RTU字符首先应分为高位和低位两部分,这两部分各含4位,然后转换成十六进制等量值。用以构成报文的ASCII字符都是十六进制字符。ASCII模式使用的字符虽是RTU模式的两倍,但ASCII数据的译玛和处理更为容易一些,此外,用RTU模式时报文字符必须以连续数据流的形式传送,用ASCII模式,字符之间可产生长达1s的间隔,以适应速度较快的机器。
(2)ModBus的数据校验方式
CRC-16(循环冗余错误校验)
CRC-16错误校验程序如下:报文(此处只涉及数据位,不指起始位、停止位和任选的奇偶校验位)被看作是一个连续的二进制,其最高有效位(MSB)首选发送。报文先与X↑16相乘(左移16位),然后看X↑16+X↑15+X↑2+1除,X↑16+X↑15+X↑2+1可以表示为二进制数11000000000000101。整数商位忽略不记,16位余数加入该报文(MSB先发送),成为2个CRC校验字节。余数中的1全部初始化,以免所有的零成为一条报文被接收。经上述处理而含有CRC字节的报文,若无错误,到接收设备后再被同一多项式(X↑16+X↑15+X↑2+1)除,会得到一个零余数(接收设备核验这个CRC字节,并将其与被传送的CRC比较)。全部运算以2为模(无进位)。
习惯于成串发送数据的设备会首选送出字符的最右位(LSB-最低有效位)。而在生成CRC情况下,发送首位应是被除数的最高有效位MSB。由于在运算中不用进位,为便于操作起见,计算CRC时设MSB在最右位。生成多项式的位序也必须反过来,以保持一致。多项式的MSB略去不记,因其只对商有影响而不影响余数。
生成CRC-16校验字节的步骤如下:
①装如一个16位寄存器,所有数位均为1。
②该16位寄存器的高位字节与开始8位字节进行“异或”运算。运算结果放入这个16位寄存器。
③把这个16寄存器向右移一位。
④若向右(标记位)移出的数位是1,则生成多项式1010000000000001和这个寄存器进行“异或”运算;若向右移出的数位是0,则返回③。
⑤重复③和④,直至移出8位。
⑥另外8位与该十六位寄存器进行“异或”运算。
⑦重复③~⑥,直至该报文所有字节均与16位寄存器进行“异或”运算,并移位8次。
⑧这个16位寄存器的内容即2字节CRC错误校验,被加到报文的最高有效位。
另外,在某些非ModBus通信协议中也经常使用CRC16作为校验手段,而且产生了一些CRC16的变种,他们是使用CRC16多项式X↑16+X↑15+X↑2+1,单首次装入的16位寄存器为0000;使用CRC16的反序X↑16+X↑14+X↑1+1,首次装入寄存器值为0000或FFFFH。
LRC(纵向冗余错误校验)
LRC错误校验用于ASCII模式。这个错误校验是一个8位二进制数,可作为2个ASCII十六进制字节传送。把十六进制字符转换成二进制,加上无循环进位的二进制字符和二进制补码结果生成LRC错误校验(参见图)。这个LRC在接收设备进行核验,并与被传送的LRC进行比较,冒号(:)、回车符号(CR)、换行字符(LF)和置入的其他任何非ASCII十六进制字符在运算时忽略不计。
2.Modbus协议在涩宁兰SCADA系统中的应用
摘要:
工业控制已进入网络时代,在如今工控技术和工控产品百家争鸣的时代,各种不同设备之间的通讯已成为一个系统的关键所在。Modbus工业网络协议就是解决这一问题的一种利器。本文简单阐述了Modbus协议的基本原理,并结合涩宁兰输气管线SCADA系统中Modbus协议的实际应用,介绍了Modbus应用的一般方法和注意事项。
主题词:
Modbus 帧 ASCII模式 RTU模式 SCADA RS-485
Modbus 协议是Modicon 公司开发的一种数据通讯协议,通过这个协议,各种不同的设备和网络可相互进行通讯,由于其具有高度的可操作性和开放性,Modbus 协议已经成为一种通用性很强的工业控制网络通讯协议。许多不同品牌、不同厂家的设备之间都可通过该协议交换数据。涩宁兰输气管线SCADA系统应用了多种通讯和网络协议,使各种设备有机的结合在一起,成为一个完整的三级集散控制系统,Modbus 协议是其中一种重要的协议。
Modbus 协议简介
一、 Modbus的通讯过程
Modbus协议定义了一种信息结构,这种信息结构可以被所有支持该协议的各种设备在通讯时认可和使用。它描述了控制器向其他设备发出查询的过程以及其他设备如何进行应答,以及错误的检测和报告。
Modbus协议采用master-slave(主-从)的技术。在一个Modbus总线上,只能有一个master,而slave最多可有247个,地址为1——247。进行通讯时,只有master才可以发起一个“查询”,充当slave的设备不断的检测,当检测到有自己地址的“查询”时,就会向master发出一个“回应”,或者根据master的命令采取相应的动作。当master发出的“查询”是一个“广播”(地址码为0)时,所有的slave都执行master的命令,但不向master发出回应信息。
二、 Modbus的帧
在网络通信中,数据都是以“包”(Packet)或 “帧”(Frame)的形式进行传输,“包”和“帧”含义基本相同,均指通信中的一个数据块。对于某种具体通信网络,一般使用术语“帧”。在Modbus协议中,引用了“帧”(Frame)作为通讯过程中的数据单位,Modbus中的“帧”由以下几部分组成:
1、标志位:表示一个“帧”的开始。
2、地址位:表示该“帧”的信息是发给哪一个slave的,或是由哪个slave发出的信息。
3、功能代码:表示指令,在Modbus协议中,有一系列代码表示不同的指令,例如:代码“3”表示读数据。
4、数据位:是对功能代码的进一步补充与说明,说明指令的具体内容。
5、校验位:CRC或LRC校验。
6、停止位:表示该“帧”的结束。
每部分的位数和表示方法依采取的模式不同而略有区别,下文将详细论述。
三、 Modbus的两种通讯模式
在Modbus协议中,依数据在传输的过程中的具体形式不同,分为两种模式:ASCII 和 RTU,采用哪种模式由用户自己根据需要进行选择。在选择时,同一Modbus网络中的所有设备的模式选择必须一致。
1、 ASCII模式
ASCII(American Standard Code for Information Interchange),即美国信息交换标准代码。在这种模式中,每个8比特的字节被转换两个ASCII字符进行传送。这种模式的主要优点是传送的每相邻的两字节之间允许最大的时间间隔是1秒。
表一:ASCII模式的帧格式
在此帧中:
帧是以一个冒号(:)来做为开始的标志;以CRLF(carriage return-line feed即“回车-换行”)为结束标志;
代码系统采用十六进制,ASCII字符0...9,A...F
每个ASCII字符由一个16进制的字符组成;
每个字节中包括:1个开始位;7个数据位(低位先传送);1个奇偶校验位(无奇偶校验时为0位);1个(有奇偶校验时)或2位(无奇偶校验时)停止位;
ASCII模式采用LRC(纵向冗余校验)检错方法。
2、 RTU模式
RTU(Remote Terminal Unit),即远程终端单元,这种模式的特点是信息中每个8比特的字节被转换为两个4比特的十六进制字符来传输。它的优点是更大的数据密度使它在相同的波特率下比ASCII模式有更强的数据吞吐能力。
表二:RTU模式的帧格式
在此帧中:
该帧是以一个相当于至少3.5个字节传输时间的空闲做为开始和结束的标志;整个帧的所有数据必须连续传送,如果中间间隔超过1.5个字符传输时间,接收设备会认为下一个字符为一个新帧的开始,即为一个地址码;
代码系统采用8位二进制,十六进制数0...9,A...F;
信息的每个8比特字符由两个16进制的字符组成;
每个字节中包括:一个开始位;8个数据位(低位先传送);1个奇偶校验位(无奇偶校验时为0);1个(有奇偶校验时)或2位(无奇偶校验时)停止位;
ASCII模式采用CRC(循环冗余校验)检错方法。
四、 Modbus与其他网络的通讯
Modbus网络可以通过设备内置的部件或网络适配器与其他兼容Modbus的网络进行通讯。在其他网络上,Modbus协议的有关信息将被植入该网络的帧或数据包结构中,以完成信息的转换,这种转换还可以解译节点的地址、路径和检错方法等。
在其它网络上,控制器使用对等(peer-to-peer)技术通信,故任何控制器都能发起一个和其它控制器的通信。这样在单独的通信过程中,控制器既可作为主设备(master)也可作为从设备(slave)。多个内部通道可允许多个传输进程同时进行。
在传送消息时,尽管网络通信方法是“对等”的方式,但Modbus协议仍然遵循“主—从”原则。当一个控制器发送一个消息,并期望从其他设备得到回应时,它是做为“主”设备,。同样,当该控制器接收到一消息,它将建立一个“回应”格式的信息返回给发送的控制器。这时,他充当的是“从”设备
Modbus 协议在涩宁兰SCADA系统中的应用
应用原理
在涩宁兰SCADA系统中,Modbus充当的是连接流量计算机和PLC的数据桥梁。流量计算机从现场仪表采集相应的数据,计算出瞬时流量、累计流量等流量参数,再通过Modbus将必要的数据传至PLC中,经PLC进行必要的处理后,显示在上位机上供生产运行之用。流程如下图:
图1:流量参数的数据流向示意图
调试过程
一、 接线
涩宁兰SCADA系统的PLC采用的是A-B公司的contrologix,其远程I/O机架上有一块通讯模板,叫做MCM(Modbus Conmminication Model),即Modbus通讯模板。MCM模板在Modbus和PLC的背板之间充当一个网桥,同时也是Modbus总线的Master。若干台流量计算机与MCM模板按照RS-485接口标准,通过DB9串口连接器连接成一个Modbus网络,接线图如下(以两台流量计算机为例,多台可顺次并联):
图2:MCM模板与流量计算机通讯接线图
注意事项:
1、 MCM模板提供的是RJ45的接口,可利用厂家提供的RJ45-- DB9转接线,也可以直接用RJ45接线,方法为:RJ45玻璃体从前直视,自左向右依次为1-8,与DB9接头1-8端一一对应。本工程采用后者,好处是减少接线次数,提高通讯的稳定性。
2、 通讯介质采用超五类屏蔽双绞线,主要是考虑RJ45接头的连接。我们在实验时曾用过一般导线,对通讯效果并无影响。可见Modbus对通讯介质并无特殊要求。
3、 连线应尽量短,够用即可,不仅看起来整齐,而且对于不同设备间的通讯,尽量短的线总是稳定性要好的多。
4、 导线一定要保证完好无损,接头一定连接紧固,要反复测试确认。因为在调试过程中,任何一点的虚接都可能造成通讯的失败,而且极难查找原因。一个可靠的硬件连接可省去调试过程中很多不必要的故障和故障查找的步骤。
5、 RS-485总线通讯在连线时只需遵循一个原则,那就是收对发,发对收。确认此连接无误,若其他没有问题,一定会成功。
二、 设备组态
在此网络中,MCM模板充当Master,流量计算机为slave。对所用的MCM模板的端口设置如表三,流量计算机相应端口设置如表四:
表三:MCM模板的端口设置
表四:流量计算机的端口设置
其他相关设置项根据实际需要进行设置。
设备设置时一定要注意根据不同设备的不同要求,两端的设置相对应的项一定要相同。
三、 调试中出现的问题及解决方法:
1、 在利用Modbus通讯的过程中,遇到这样一个问题,即浮点数的传输问题。因为一般浮点数都是32位,而Modbus总线中只能传输最多16位的数据。
解决方法:可以利用两个整形数传送一个浮点数(即将一个32位的二进制数分割成两个16位的二进制数),传送完以后,再将两个整形数整合为一个浮点数。
2、 在调试过程中,当数据传输至PLC中后,最初发现数据并不是原来的数值,而是一些莫名其妙的数据,要么大的离谱,要么是负的多位数。
经过反复的尝试,终于发现问题所在,原来,在Modbus总线中,数据传输时是低位字节先传送,传送过来后如果不进行交换,二进制的数值排列是反向的,即原来的低字节在高位,高字节在低位,所以得到的数据和原数据相差甚远。只要将数据的高低位字节进行交换(swap位置1),就可解决此问题。
3、 在调试过程中,总是调不通怎么办?
在数据通讯的调试过程中,如果数据总是不通,我们一般按照这样的顺序进行检查:
1) 各种设备是否正常,
2) 接线是否正确、完好;
3) 各种设备组态是否正确。
一般来说,这些因素极少出现问题,但仔细检查是必要的,这些得到确认后,还要注意以下几点:
1) 用一种测试软件进行测试,这样可以将问题的范围缩小,在我们的调试过程中,我们用了一种叫做“MBUS2”的小测试软件对流量计算机的接线和组态进行测试,一般当利用此软件测试成功后,再整体调试,问题可迎刃而解。象我们用的“MBNUS2“,还有“MODBUS VIEW”等,这种测试软件在网上可以得到。它们简单易用,但却极其有效。
2) 检查没有任何问题但却仍旧不通时,可尝试将所有设备关掉重新启动。这样一个简单的方法,在调试时经常很有用。
结束语:
利用Modbus协议来实现不同设备之间的通讯,操作简便,适用性强,通讯速度快。因此,在各种工控系统中,Modbus是极为常见的一种通讯协议。同时,Modbus也是一种实力较强的现场总线,在工业控制实现真正的网络化过程中,Modbus将发挥更大的作用。