虿 | M | o | d | b | u | s | 通 | 信 | 协 | 议 |
葿一、Modbus协议简介
蒃
袃Modbus协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之
间、控制器经由网络(例如以太网)和其它设备之间可以通信。它已经成为一通用工业标准。
有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。
蒈
袄
芁当在一Modbus网络上通信时,此协议决定了每个控制器须要知道它们的设备地址,
识别按地址发来的消息,决定要产生何种行动。如果需要回应,控制器将生成反馈信息并用
Modbus协议发出。在其它网络上,包含了Modbus协议的消息转换为在此网络上使用的帧
或包结构。这种转换也扩展了根据具体的网络解决节地址、路由路径及错误检测的方法。
薁1、在Modbus 网络上转输
1
虿标准的Modbus口是使用一RS-232C兼容串行接口,它定义了连接口的针脚、电缆、
信号位、传输波特率、奇偶校验。控制器能直接或经由Modem组网。
芅
羃控制器通信使用主—从技术,即仅一设备(主设备)能初始化传输(查询)。其它
设备(从设备)根据主设备查询提供的数据作出相应反应。典型的主设备:主机和可编程仪
表。典型的从设备:可编程控制器。
芀
蚈主设备可单独和从设备通信,也能以广播方式和所有从设备通信。如果单独通信,
从设备返回一消息作为回应,如果是以广播方式查询的,则不作任何回应。Modbus协议建
域。
立了主设备查询的格式:设备(或广播)地址、功能代码、所有要发送的数据、一错误检测
蒁从设备回应消息也由Modbus协议构成,包括确认要行动的域、任何要返回的数据、
和一错误检测域。如果在消息接收过程中发生一错误,或从设备不能执行其命令,从设备将
建立一错误消息并把它作为回应发送出去。
聿2、在其它类型网络上转输
螈在其它网络上,控制器使用对等技术通信,故任何控制都能初始和其它控制器的通
信。这样在单独的通信过程中,控制器既可作为主设备也可作为从设备。提供的多个内部通
道可允许同时发生的传输进程。
2
肇
膃在消息位,Modbus协议仍提供了主—从原则,尽管网络通信方法是“对等”。如果一
控制器发送一消息,它只是作为主设备,并期望从从设备得到回应。同样,当控制器接收到
一消息,它将建立一从设备回应格式并返回给发送的控制器。
肂3、查询—回应周期
袈
膄(1)查询
袅查询消息中的功能代码告之被选中的从设备要执行何种功能。数据段包含了从设备
要执行功能的任何附加信息。例如功能代码03是要求从设备读保持寄存器并返回它们的内 3
容。数据段必须包含要告之从设备的信息:从何寄存器开始读及要读的寄存器数量。错误检
测域为从设备提供了一种验证消息内容是否正确的方法。
袁(2)回应
羈如果从设备产生一正常的回应,在回应消息中的功能代码是在查询消息中的功能代
码的回应。数据段包括了从设备收集的数据:象寄存器值或状态。如果有错误发生,功能代
码将被修改以用于指出回应消息是错误的,同时数据段包含了描述此错误信息的代码。错误
检测域允许主设备确认消息内容是否可用。
薅二、两种传输方式
络通信。用户选择想要的模式,包括串口通信参数(波特率、校验方式等),在配置每个控
制器的时候,在一个Modbus网络上的所有设备都必须选择相同的传输模式和串口参数。
蚀ASCII模式
肈: | 羆地址 | 肄功能代码 | 莈数据数量 | 膈数据1 | 莆... | 薂数据n | 蒁LRC 高字节 | 芈LRC 低字节 | 薃回车 | 芄换行 |
膀RTU 模式 |
|
4
芈地址 | 羄功能代码 | 蚂数据数量 | 罿数据1 | 莇... | 莅数据n | 莄CRC 低字节 | 羂CRC 高字节 |
蒇所选的ASCII或RTU方式仅适用于标准的Modbus网络,它定义了在这些网络上连
续传输的消息段的每一位,以及决定怎样将信息打包成消息域和如何解码。
螆在其它网络上(象MAP和ModbusPlus)Modbus消息被转成与串行传输无关的帧。
袂1、ASCII模式
薇代码系统
?
? 膇十六进制,ASCII字符0...9,A...F
?
? | 薄消息中的每个ASCII 字符都是一个十六进制字符组成 |
|
薀每个字节的位 |
?
5
? 蚇1个起始位
?
? 芄7个数据位,最小的有效位先发送
?
? 肂1个奇偶校验位,无校验则无
?
? 艿1个停止位(有校验时),2个Bit(无校验时)
螇错误检测域
?
?蚅LRC(纵向冗长检测)
莂当控制器设为在Modbus网络上以RTU(远程终端单元)模式通信,在消息中的每个8Bit字节包含两个4Bit的十六进制字符。这种方式的主要优点是:在同样的波特率下,可比ASCII方式传送更多的数据。
袇代码系统
?
? | 肅8 位二进制,十六进制数0...9,A...F |
|
? | 膁消息中的每个8 位域都是一个两个十六进制字符组成 | |
? | ||
| ||
? |
6
? 肀每个字节的位
?
? 袇1个起始位
?
? 蒆8个数据位,最小的有效位先发送
?
? 羃1个奇偶校验位,无校验则无
?
? 衿1个停止位(有校验时),2个Bit(无校验时)
羇错误检测域
? 袇CRC(循环冗长检测) ?
羂两种传输模式中(ASCII或RTU),传输设备以将Modbus消息转为有起点和终点的帧,这就允许接收的设备在消息起始处开始工作,读地址分配信息,判断哪一个设备被选
中(广播方式则传给所有设备),判知何时信息已完成。部分的消息也能侦测到并且错误能
设置为返回结果。
肆1、ASCII帧
7
羄使用ASCII模式,消息以冒号(:)字符(ASCII码3AH)开始,以回车换行符结束(ASCII
码0DH,0AH)。
肃
蚁其它域可以使用的传输字符是十六进制的0...9,A...F。网络上的设备不断侦测“:”字符,
当有一个冒号接收到时,每个设备都解码下个域(地址域)来判断是否发给自己的。
膆
莅消息中字符间发送的时间间隔最长不能超过1秒,否则接收的设备将认为传输错误。
一个典型消息帧如下所示:
|
蒂图2ASCII消息帧
肁2、RTU帧
蒆使用RTU模式,消息发送至少要以3.5个字符时间的停顿间隔开始。在网络波特率
下多样的字符时间,这是最容易实现的(如下图的T1-T2-T3-T4所示)。传输的第一个域是设
备地址。可以使用的传输字符是十六进制的0...9,A...F。网络设备不断侦测网络总线,包括
停顿间隔时间内。当第一个域(地址域)接收到,每个设备都进行解码以判断是否发往自己
8
的。在最后一个传输字符之后,一个至少3.5个字符时间的停顿标定了消息的结束。一个新的消息可在此停顿后开始。
螄
膄整个消息帧必须作为一连续的流转输。如果在帧完成之前有超过1.5个字符时间的停顿时间,接收设备将刷新不完整的消息并假定下一字节是一个新消息的地址域。同样地,如果一个新消息在小于3.5个字符时间内接着前个消息开始,接收的设备将认为它是前一消息的延续。这将导致一个错误,因为在最后的CRC域的值不可能是正确的。一典型的消息帧如下所示:
蝿
袀起始位 | 膅设备地址 | 薂功能代码 | | | 薆结束符 |
莄 | 薁8Bit | 肀8Bit淘 | 羇n 个8Bit豆 | 网螂16Bit | 莀 |
聿图3 RTU 消息帧
肄3、地址域
蒄消息帧的地址域包含两个字符(ASCII)或8Bit(RTU)。可能的从设备地址是0...247(十进制)。单个设备的地址范围是1...247。主设备通过将要联络的从设备的地址放入消息中的地址域来选通从设备。当从设备发送回应消息时,它把自己的地址放入回应的地址域中,
以便主设备知道是哪一个设备作出回应。
腿
9
腿地址0是用作广播地址,以使所有的从设备都能认识。当Modbus协议用于更高水准的网络,广播可能不允许或以其它方式代替。
蒅4、如何处理功能域
羂消息帧中的功能代码域包含了两个字符(ASCII)或8Bits(RTU)。可能的代码范围是十进制的1...255。当然,有些代码是适用于所有控制器,有此是应用于某种控制器,还有些保留以备后用。
膂
艿当消息从主设备发往从设备时,功能代码域将告之从设备需要执行哪些行为。例如
袆
蚄当从设备回应时,它使用功能代码域来指示是正常回应(无误)还是有某种错误发生(称作异议回应)。对正常回应,从设备仅回应相应的功能代码。对异议回应,从设备返回一等同于正常代码的代码,但最重要的位置为逻辑1。
羁例如:一从主设备发往从设备的消息要求读一组保持寄存器,将产生如下功能代码:
荿0 0 0 0 0 0 1 1 (十六进制03H)
10
芇对正常回应,从设备仅回应同样的功能代码。对异议回应,它返回:
膁10 0 0 0 0 1 1 (十六进制83H)
虿除功能代码因异议错误作了修改外,从设备将一独特的代码放到回应消息的数据域中,这能告诉主设备发生了什么错误。
葿
蒃主设备应用程序得到异议的回应后,典型的处理过程是重发消息,或者诊断发给从
设备的消息并报告给操作员。
蒈数据域是由两个十六进制数集合构成的,范围00...FF。根据网络传输模式,这可以是由一对ASCII字符组成或由一RTU字符组成。
蕿
袄从主设备发给从设备消息的数据域包含附加的信息:从设备必须用于进行执行由功能代码所定义的所为。这包括了象不连续的寄存器地址,要处理项的数目,域中实际数据字节数。
芁 |
|
11
薁例如,如果主设备需要从设备读取一组保持寄存器(功能代码03),数据域指定了起始寄存器以及要读的寄存器数量。如果主设备写一组从设备的寄存器(功能代码10十六进制),数据域则指明了要写的起始寄存器以及要写的寄存器数量,数据域的数据字节数,要写入寄存器的数据。
虿
芅如果没有错误发生,从从设备返回的数据域包含请求的数据。如果有错误发生,此域包含一异议代码,主设备应用程序可以用来判断采取下一步行动。
羃
事件记录(功能代码0B十六进制),从设备不需任何附加的信息。
芀在某种消息中数据域可以是不存在的 主设备要求从设备回应通信
蚈6、错误检测域
蚆标准的Modbus网络有两种错误检测方法。错误检测域的内容视所选的检测方法而定。
蒁ASCII
12
聿当选用ASCII模式作字符帧,错误检测域包含两个ASCII字符。这是使用LRC(纵向冗长检测)方法对消息内容计算得出的,不包括开始的冒号符及回车换行符。LRC字符附加在回车换行符前面。
螈RTU
肇当选用RTU模式作字符帧,错误检测域包含一16Bits值(用两个8位的字符来实现)。错误检测域的内容是通过对消息内容进行循环冗长检测方法得出的。CRC域附加在消息的最后,添加时先是低字节然后是高字节。故CRC的高位字节是发送消息的最后一个字节。
膃7、字符的连续传输
到右):
袈最低有效位...最高有效位
羀使用ASCII字符帧时,位的序列是:
蚁 有奇偶校验
13
薇启始位 | 蚄1 | 莁2 | 肈3 | 莆4 | 螄5 | 螂6 | 螀7 | 膄奇偶位 | 袄停止位 |
膂无奇偶校验
芈启始位 | 膇1 | 羄2 | 艿3 | 羀4 | 羆5 | 肄6 | 蚀 | 蒈停止位 | 蚅停止位 |
膃图4.位顺序(ASCII)
肁 使用RTU 字符帧时,位的序列是: |
螈启始位 | 膃1 | 蒂 | 薈3 | 蒇 | 芃5 | 袃 | 芀7 | 芆 | 莃奇偶位 | 羀停止位 |
螇无奇偶校验
肅启始位 | 蒃 | 莀2 | 葿3 | 肇4 | 薃5 | 螁6 | 羇 | 袆 | 蚃停止位 | 膂停止位 |
虿图4. 位顺序(RTU)
14
蚅四、错误检测方法
螃标准的Modbus串行网络采用两种错误检测方法。奇偶校验对每个字符都可用,帧检测(LRC或CRC)应用于整个消息。它们都是在消息发送前由主设备产生的,从设备在接收过程中检测每个字符和整个消息帧。
薃
肇用户要给主设备配置一预先定义的超时时间间隔,这个时间间隔要足够长,以使任
何从设备都能作为正常反应。如果从设备测到一传输错误,消息将不会接收,也不会向主设
备作出回应。这样超时事件将触发主设备来处理错误。发往不存在的从设备的地址也会产生
超时。
螂用户可以配置控制器是奇或偶校验,或无校验。这将决定了每个字符中的奇偶校验位是如何设置的。
螀
衿如果指定了奇或偶校验,“1”的位数将算到每个字符的位数中(ASCII模式7个数据位,RTU中8个数据位)。例如RTU字符帧中包含以下8个数据位:
蒇1 1 0 0 0 1 0 1 |
|
15
袂整个“1”的数目是4个。如果便用了偶校验,帧的奇偶校验位将是0,便得整个“1”的
个数仍是4个。如果便用了奇校验,帧的奇偶校验位将是1,便得整个“1”的个数是5个。
膁
薁如果没有指定奇偶校验位,传输时就没有校验位,也不进行校验检测。代替一附加
的停止位填充至要传输的字符帧中。
膆
羂2、LRC检测
薂
羅
肂LRC域是一个包含一个8位二进制值的字节。LRC值由传输设备来计算并放到消息
帧中,接收设备在接收消息的过程中计算LRC,并将它和接收到消息中LRC域中的值比较,
如果两值不等,说明有错误。
羃
螁LRC方法是将消息中的8Bit的字节连续累加,丢弃了进位。
16
羈LRC简单函数如下:
膂staticunsigned char LRC(auchMsg,usDataLen)
聿unsignedchar *auchMsg ; /* 要进行计算的消息*/
膈unsignedshort usDataLen ; /* LRC 要处理的字节的数量*/
螆{unsigned char uchLRC = 0 ; /* LRC 字节初始化*/
节while(usDataLen--) /* 传送消息*/
蒀uchLRC+= *auchMsg++ ; /* 累加*/
袀return((unsigned char)(-((char_uchLRC))) ;
薅}
袁 使用RTU模式,消息包括了一基于CRC方法的错误检测域。CRC域检测了整个消
息的内容。
莈
薈CRC域是两个字节,包含一16位的二进制值。它由传输设备计算后加入到消息中。
接收设备重新计算收到消息的CRC,并与接收到的CRC域中的值比较,如果两值不同,则
有误。
蚆 |
|
17
节CRC是先调入一值是全“1”的16位寄存器,然后调用一过程将消息中连续的8位字节各当前寄存器中的值进行处理。仅每个字符中的8Bit数据对CRC有效,起始位和停止位以及奇偶校验位均无效。
肀
莇CRC产生过程中,每个8位字符都单独和寄存器内容相或(OR),结果向最低有效位方向移动,最高有效位以0填充。LSB被提取出来检测,如果LSB为1,寄存器单独和预置的值或一下,如果LSB为0,则不进行。整个过程要重复8次。在最后一位(第8位)完成后,下一个8位字节又单独和寄存器的当前值相或。最终寄存器中的值,是消息中所有的字节都执行之后的CRC值。
螅
蚃CRC 添加到消息中时,低字节先加入,然后高字节。
蒈CRC简单函数如下:
肆unsignedshort CRC16(puchMsg, usDataLen)
袅unsignedchar *puchMsg ; /* 要进行CRC校验的消息*/
袀unsignedshort usDataLen ; /* 消息中字节数*/
芀{
袅unsignedchar uchCRCHi = 0xFF ; /* 高CRC字节初始化*/
羅unsignedchar uchCRCLo = 0xFF ; /* 低CRC字节初始化*/
芁unsigned uIndex ; /* CRC 循环中的索引 */
蚈while (usDataLen--) /* 传输消息缓冲区 */
18
袈{
肅uIndex= uchCRCHi ^ *puchMsgg++ ; /* 计算CRC*/
蚂uchCRCHi= uchCRCLo ^ auchCRCHi[uIndex} ;
荿uchCRCLo= auchCRCLo[uIndex] ;
蚇}
肅return(uchCRCHi << 8 | uchCRCLo) ;
肃}
袇/*CRC 高位字节值表*/
蒅static unsigned charauchCRCHi[] = {
蕿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,
19
肆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,
羀0x80, 0x41, 0x00, 0xC1, 0x81,0x40, 0x00, 0xC1, 0x81, 0x40, 薄0x01,0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
蚄0x00, 0xC1, 0x81, 0x40, 0x01,0xC0, 0x80, 0x41, 0x01, 0xC0,
莁0x80,0x41, 0x00, 0xC1, 0x81, 0x40
肈};
莆/*CRC低位字节值表*/
螄staticchar auchCRCLo[] = {
螂0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,
螀0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
20
膄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,
蚀0x22, 0xE2, 0xE3, 0x23, 0xE1,0x21, 0x20, 0xE0, 0xA0, 0x60, 肄0xEC,0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
膃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, 0x, 0x4B, 0x8B,
芃0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
21
袃0x44,0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,
芀0x43,0x83, 0x41, 0x81, 0x80, 0x40
芆};
莃
羀
蒃
莀RS-232、RS-422与RS-485标准及应用
葿一、RS-232、RS-422与RS-485的由来
22
肇RS-232、RS-422与RS-485都是串行数据接口标准,最初都是由电子工业协会(EIA)制订并发布的,RS-232在1962年发布,命名为EIA-232-E,作为工业标准,以保证不同厂家产品之间的兼容。RS-422由RS-232发展而来,它是为弥补RS-232之不足而提出的。为改进RS-232通信距离短、速率低的缺点,RS-422定义了一种平衡通信接口,将传输速率提高到10Mb/s,传输距离延长到4000英尺(速率低于100kb/s时),并允许在一条平衡总线上连接最多10个接收器。RS-422是一种单机发送、多机接收的单向、平衡传输规范,被命名为TIA/EIA-422-A标准。为扩展应用范围,EIA又于1983年在RS-422基础上制定了RS-485标准,增加了多点、双向通信能力,即允许多个发送器连接到同一条总线上,同时增加了发送器的驱动能力和冲突保护特性,扩展了总线共模范围,后命名为
TIA/EIA-485-A标准。由于EIA提出的建议标准都是以“RS”作为前缀,所以在通讯工业领域,仍然习惯将上述标准以RS作前缀称谓。
电缆或协议,在此基础上用户可以建立自己的高层通信协议。因此在视频界的应用,许多厂薃RS-232、RS-422与RS-485 标准只对接口的电气特性做出规定,而不涉及接插件、
协议是公开的,而ProLINK则是基于Profile 上的。
螁二、RS-232串行接口标准
羇目前RS-232是PC机与通信工业中应用最广泛的一种串行接口。RS-232被定义为一种在低速率串行通讯中增加通讯距离的单端标准。RS-232采取不平衡传输方式,即所谓单端通讯
23
袆
蚃图1
膂 收、发端的数据信号是相对于信号地,如从DTE设备发出的数据在使用DB25连接器时是2 脚相对7脚(信号地)的电平,DB25各引脚定义参见图1。典型的RS-232信号在正负电平之间摆动,电平。当无数据传输时,在发送数据时,线上为TTL,发送端驱动器输出正电平在+5~+15V,从开始传送数据到结束,线上电平从TTL电平到RS-232负电平在-5~-15V
传送距离最大为约15米,最高速率为20kb/s。RS-232是为点对点(即只用一对收、发设备)
所以RS-232适合本地设备之间的通信。其有关电通讯而设计的,其驱动器负载为3~7kΩ。
气参数参见表1。
|
24
螅最大传输速率 | 蚁20Kb/S | 螈10Mb/s | 虿10Mb/s | |
蒆最大驱动输出电压 | 螄+/-25V | 袈-0.25V~+6V | 袅-7V~+12V | |
袄驱动器输出信号电平(负载最小值) | 蒂负载 | 羈+/-5V~+/-15V | 芆+/-2.0V | 蚆+/-1.5V |
芁驱动器输出信号电平(空载最大值) | 莂空载 | 蚇+/-25V | 肄+/-6V | 芄+/-6V |
莂驱动器负载阻抗(Ω) | 肈3K~7K | 螆100 | 肃54 | |
蒁摆率(最大值) | | | 袂N/A | |
www.t | 豆aod | 网 | s.c | |
螁接收器输入电阻(Ω) | 莈3K~7K | 膅4K(最小) | 莃≥12K | |
袁驱动器共模电压 | 螈 | 薃-3V~+3V | 膁-1V~+3V | |
羁接收器共模电压 | 袅 | 芅-7V~+7V | 羀-7V~+12V | |
羁表1
25
芆三、RS-422与RS-485串行接口标准
螃1.平衡传输
羃RS-422、RS-485与RS-232不一样,数据信号采用差分传输方式,也称作平衡传输,它使用一对双绞线,将其中一线定义为A,另一线定义为B,如图2。
肀
蒅 通常情况下,发送驱动器A、B之间的正电平在+2~+6V,是一个逻辑状态,负电平
在-2~6V,是另一个逻辑状态。另有一个信号地C,在RS-485中还有一“使能”端,而在RS-422
中这是可用可不用的。“使能”端是用于控制发送驱动器与传输线的切断与连接。当“使能”端
起作用时,发送驱动器处于高阻状态,称作“第三态”,即它是有别于逻辑“1”与“0”的第三态。
螂接收器也作与发送端相对的规定,收、发端通过平衡双绞线将AA与BB对应相连,当在收端AB之间有大于+200mV的电平时,输出正逻辑电平,小于-200mV时,输出负逻辑电平。接收器接收平衡线上的电平范围通常在200mV至6V之间。参见图3。
26
膀
肈图3
羃2.RS-422电气规定
器引脚定义。由于接收器采用高输入阻抗和发送驱动器比RS232更强的驱动能力,故允许
在相同传输线上连接多个接收节点,最多可接10个节点。即一个主设备(Master),其余为从设备(Salve),从设备之间不能通信,所以RS-422支持点对多的双向通信。接收器输入阻抗为4k,故发端最大负载能力是10×4k+100Ω(终接电阻)。RS-422四线接口由于采用单独的发送和接收通道,因此不必控制数据方向,各装置之间任何必须的信号交换均可以按软件方式(XON/XOFF握手)或硬件方式(一对单独的双绞线)。
葿
芀 |
|
27
蚅图4 薄图5
莀RS-422 的最大传输距离为4000英尺(约1219米),最大传输速率为10Mb/s。其平衡双绞线的长度与传输速率成反比,在100kb/s速率以下,才可能达到最大传输距离。只有在很短的距离下才能获得最高速率传输。一般100米长的双绞线上所能获得的最大传输速率
仅为1Mb/s。
可不需终接电阻,即一般在300米以下不需终接电阻。终接电阻接在传输电缆的最远端。
莇RS-422有关电气参数见表1
莃3.RS-485电气规定
蒀 由于RS-485 是从RS-422基础上发展而来的,所以RS-485许多电气规定与RS-422 相仿。如都采用平衡传输方式、都需要在传输线上接终接电阻等。RS-485可以采用二线与四线方式,二线制可实现真正的多点双向通信,参见图6。
28
肇而采用四线连接时,与RS-422一样只能实现点对多的通信,即只能有一个主(Master)设备,其余为从设备,但它比RS-422有改进,无论四线还是二线连接方式总线上可多接到32个设备。参见图7。
袄 肁
薀图6
间,中应用。
袀RS-485有关电气规定参见表1。
薀RS-485与RS-422一样,其最大传输距离约为1219米,最大传输速率为10Mb/s。平衡双绞线的长度与传输速率成反比,在100kb/s速率以下,才可能使用规定最长的电缆长度。
只有在很短的距离下才能获得最高速率传输。一般100米长双绞线最大传输速率仅为1Mb/s。
29
袈RS-485需要2个终接电阻,其阻值要求等于传输电缆的特性阻抗。在矩距离传输时可
不需终接电阻,即一般在300米以下不需终接电阻。终接电阻接在传输总线的两端。
羄四、RS-422与RS-485的网络安装注意要点
袃RS-422可支持10个节点,RS-485支持32个节点,因此多节点构成网络。网络拓扑
一般采用终端匹配的总线型结构,不支持环形或星形网络。在构建网络时,应注意如下几点:
蚀1.采用一条双绞线电缆作总线,将各个节点串接起来,从总线到每个节点的引出线
长度应尽量短,以便使引出线中的反射信号对总线信号的影响最低。图8所示为实际应用中
连接尽管不正确,在短距离、低速率仍可能正常工作,但随着通信距离的延长或通信速率的
常见的一些错误连接方式(a,c,e)和正确的连接方式(b,d,f)。a,c,e这三种网络
羅2.应注意总线特性阻抗的连续性,在阻抗不连续点就会发生信号的反射。下列几种
情况易产生这种不连续性:总线的不同区段采用了不同电缆,或某一段总线上有过多收发器
紧靠在一起安装,再者是过长的分支线引出到总线。
蚆总之,应该提供一条单一、连续的信号通道作为总线。
30
蚂
蝿图8
膄对RS-422与RS-485总线网络一般要使用终接电阻进行匹配。但在短距离与低速率
下可以不用考虑终端匹配。那么在什么情况下不用考虑匹配呢?理论上,在每个接收数据信
号的中点进行采样时,只要反射信号在开始采样时衰减到足够低就可以不考虑匹配。但这在
实际上难以掌握,美国MAXIM公司有篇文章提到一条经验性的原则可以用来判断在什么
样的数据速率和电缆长度时需要进行匹配:当信号的转换时间(上升或下降时间)超过电信
号沿总线单向传输所需时间的3倍以上时就可以不加匹配。例如具有限斜率特性的RS-485
接口MAX483输出信号的上升或下降时间最小为250ns,典型双绞线上的信号传输速率约为
0.2m/ns(24AWGPVC电缆),那么只要数据速率在250kb/s以内、电缆长度不超过16米,
采用MAX483 作为RS-485 接口时就可以不加终端匹配。
31
蒁一般终端匹配采用终接电阻方法,前文已有提及,RS-422在总线电缆的远端并接电阻,RS-485则应在总线电缆的开始和末端都需并接终接电阻。终接电阻一般在RS-422网络中取100Ω,在RS-485网络中取120Ω。相当于电缆特性阻抗的电阻,因为大多数双绞线电缆特性阻抗大约在100~120Ω。这种匹配方法简单有效,但有一个缺点,匹配电阻要消耗较大功率,对于功耗比较严格的系统不太适合。
衿另外一种比较省电的匹配方式是RC匹配,如图9。利用一只电容C隔断直流成分可以节省大部分功率。但电容C的取值是个难点,需要在功耗和匹配质量间进行折衷。
螇还有一种采用二极管的匹配方法,如图10。这种方案虽未实现真正的“匹配”,但它利用二极管的钳位作用能迅速削弱反射信号,达到改善信号质量的目的。节能效果显著。
罿图9 膈图10
莄六、RS-422 与RS-485 的接地问题
32
芃电子系统接地是很重要的,但常常被忽视。接地处理不当往往会导致电子系统不能
稳定工作甚至危及系统安全。RS-422与RS-485传输网络的接地同样也是很重要的,因为接
地系统不合理会影响整个网络的稳定性,尤其是在工作环境比较恶劣和传输距离较远的情况
下,对于接地的要求更为严格。否则接口损坏率较高。很多情况下,连接RS-422、RS-485
通信链路时只是简单地用一对双绞线将各个接口的“A”、“B”端连接起来。而忽略了信号地
的连接,这种连接方法在许多场合是能正常工作的,但却埋下了很大的隐患,这有下面二个
原因:
聿1.共模干扰问题:正如前文已述,RS-422与RS-485接口均采用差分方式传输信号方
式,并不需要相对于某个参照点来检测信号,系统只需检测两线之间的电位差就可以了。但
人们往往忽视了收发器有一定的共模电压范围,如RS-422共模电压范围为-7~+7V,而
RS-485收发器共模电压范围为-7~+12V,只有满足上述条件,整个网络才能正常工作。当
网络线路模电压超出此范围时就会影响通信的稳定可靠,
当发送驱动器A 向接收器B发送数据时,发送驱动器A的输出共模电压为VOS,甚至损坏接口。以图11为例,
由于两个
会有很大幅度(十几伏甚至数十伏),并可能伴有强干扰信号,致使接收器共模输入VCM
超出正常范围,并在传输线路上产生干扰电流,轻则影响正常通信,重则损坏通信接口电路。
蕿
肆图11
33
羂2.(EMI)问题:发送驱动器输出信号中的共模部分需要一个返回通路,如没有一个低阻的返回通道(信号地),就会以辐射的形式返回源端,整个总线就会像一个巨大的天线向外辐射电磁波。
腿由于上述原因,RS-422、RS-485尽管采用差分平衡传输方式,但对整个RS-422或RS-485网络,必须有一条低阻的信号地。一条低阻的信号地将两个接口的工作地连接起来,使共模干扰电压VGPD被短路。这条信号地可以是额外的一条线(非屏蔽双绞线),或者是屏蔽双绞线的屏蔽层。这是最通常的接地方法。
螆值得注意的是,这种做法仅对高阻型共模干扰有效,由于干扰源内阻大,短接后不
会形成很大的接地环路电流,对于通信不会有很大影响。当共模干扰源内阻较低时,会在接
地线上形成较大的环路电流,影响正常通信。笔者认为,可以采取以下三种措施:
接地电阻的增加可能会使共模电压升高,但只要控制在适当的范围内就不会影响正常通信。
螀(2)采用浮地技术,隔断接地环路。这是较常用也是十分有效的一种方法,当共模干扰内阻很小时上述方法已不能奏效,此时可以考虑将引入干扰的节点(例如处于恶劣的工作环境的现场设备)浮置起来(也就是系统的电路地与机壳或大地隔离),这样就隔断了接地环路,不会形成很大的环路电流。
腿(3)采用隔离接口。有些情况下,出于安全或其它方面的考虑,电路地必须与机 壳或大地相连,不能悬浮,这时可以采用隔离接口来隔断接地回路,但是仍然应该有一条地线将隔离侧的公共端与其它接口的工作地相连。参见图12。 34
膆
芅
螃图12
艿七、RS-422与RS-485的网络失效保护
薇RS-422 与RS-485标准都规定了接收器门限为±200mV。这样规定能够提供比较高的
线置于第三态,即总线空闲时没有任何信号驱动总线,使AB之间的电压在-200~+200mV直至趋于0V,这带来了一个问题:接收器输出状态不确定。如果接收机的输出为0V,网络
中从机将把其解释为一个新的启动位,并试图读取后续字节,由于永远不会有停止位,产生
一个帧错误结果,不再有设备请求总线,网络陷于瘫痪状态。除上述所述的总线空闲会造成
两线电压差低于200mV的情况外,开路或短路时也会出现这种情况。故应采取一定的措施
避免接收器处于不确定状态。
35
蚃
1kΩ,具体数值随电缆的电容变化而变化。
羈上述方法是比较经典的方法,但它仍然不能解决总线短路时的问题,有些厂家将接
收门限移到-200mV/-50mV,可解决这个问题。例如Maxim公司的MAX3080系列RS-485
接口,不仅省去了外部偏置电阻,而且解决了总线短路情况下的失效保护问题。
莅八、RS-422与RS-485的瞬态保护
36
莁前文提到的信号接地措施,只对低频率的共模干扰有保护作用,对于频率很高的瞬
态干扰就为力了。由于传输线对高频信号而言就是相当于电感,因此对于高频瞬态干扰,
接地线实际等同于开路。这样的瞬态干扰虽然持续时间短暂,但可能会有成百上千伏的电压。
蒈实际应用环境下还是存在高频瞬态干扰的可能。一般在切换大功率感性负载如电机、
变压器、继电器等或闪电过程中都会产生幅度很高的瞬态干扰,如果不加以适当防护就会损
坏RS-422或RS-485通信接口。对于这种瞬态干扰可以采用隔离或旁路的方法加以防护。
荿1.隔离保护方法。这种方案实际上将瞬态高压转移到隔离接口中的电隔离层上,由
于隔离层的高绝缘电阻,不会产生损害性的浪涌电流,起到保护接口的作用。通常采用高频
变压器、光耦等元件实现接口的电气隔离,已有器件厂商将所有这些元件集成在一片IC中,
使用起来非常简便,如Maxim公司的MAX1480/MAX1490,隔离电压可达2500V。这种方
案的优点是可以承受高电压、持续时间较长的瞬态干扰,实现起来也比较容易,缺点是成本
较高。
袃2.旁路保护方法。这种方案利用瞬态抑制元件(如TVS、MOV、气体放电管等)
将危害性的瞬态能量旁路到大地,优点是成本较低,缺点是保护能力有限,只能保护一定能
量以内的瞬态干扰,持续时间不能很长,而且需要有一条良好的连接大地的通道,实现起来
比较困难。实际应用中是将上述两种方案结合起来灵活加以运用,如图14。在这种方法中,
隔离接口对大幅度瞬态干扰进行隔离,旁路元件则保护隔离接口不被过高的瞬态电压击穿。
莄
37
薈
蒆
薅
膃
蚈MODBUS 通讯协议及编程
RTU 通讯协议,如:CH2000智能电力监测仪、CH2000M电力参数采集模块、巡检表、数
显表、光柱数显表等。下面就ModBusRTU协议简要介绍如下:
芇一、通讯协议
羂(一)、通讯传送方式:
通讯传送分为的信息头,和发送的编码数据。以下的通讯传送方式定义也与
MODBUS RTU 通讯规约相兼容:
| |
38
螅起始位 | 蚁1 位 |
蚆数据位 | 薇8 位 |
芅奇偶校验位 | 薂1 位(偶校验位) |
螆停止位 | 蚄1 位 |
螃错误校检 | 莁CRC(冗余循环码) |
袆初始结构=≥4字节的时间
地址码=1 字节
功能码=1 字节
数据区=N 字节
错误校检=16位CRC码
结束结构 = ≥4 字节的时间
肅
地址码:地址码为通讯传送的第一个字节。这个字节表明由用户设定地址码的从机将接
收由主机发送来的信息。并且每个从机都有具有唯一的地址码,并且响应回送均以各自的地
址码开始。主机发送的地址码表明将发送到的从机地址,而从机发送的地址码表明回送的从
机地址。
蒅 功能码:通讯传送的第二个字节。ModBus通讯规约定义功能号为1到127。本仪表只
利用其中的一部分功能码。作为主机请求发送,通过功能码告诉从机执行什么动作。作为从
机响应,从机发送的功能码与从主机发送来的功能码一样,并表明从机已响应主机进行操作。
如果从机发送的功能码的最高位为1(比如功能码大与此同时127),则表明从机没有响应操
作或发送出错。
39
膀 数据区:数据区是根据不同的功能码而不同。数据区可以是实际数值、设置点、主机发送给从机或从机发送给主机的地址。
膀CRC码:二字节的错误检测码。
蒆(二)、通讯规约:
羂当通讯命令发送至仪器时,符合相应地址码的设备接通讯命令,并除去地址码,读取信息,如果没有出错,则执行相应的任务包括地址码、执行动作的功能码、执行动作后结果的数据以及错误校验码。如果出错就不发然后把执行结果返送给发送者。返送的信息中
送任何信息。
膃1.信息帧结构
芀地址码 | 袇功能码 | 蚄数据区 | 羁错误校验码 |
莀8 位 | 芇8 位 | 肂N × 8 位 | 蚀16 位 |
蒀 地址码:地址码是信息帧的第一字节(8位),从0到255。这个字节表明由用户设置地址的从机将接收由主机发送来的信息。每个从机都必须有唯一的地址码,并且只有符合地址 码的从机才能响应回送。当从机回送信息时,相当的地址码表明该信息来自于何处。
40
蒄功能码:主机发送的功能码告诉从机执行什么任务。表1-1列出的功能码都有具体的含义及操作。
袄代码 | 葿含义 | 薀操作 |
袅03 | 节读取数据 | 蒂读取当前寄存器内一个或多个二进制值 |
蕿06 | 芆重置单一寄存器 | 羄把设置的二进制值写入单一寄存器 |
芁数据区:数据区包含需要从机执行什么动作或由从机采集的返送信息。这些信息可以是数值、参考地址等等。例如,功能码告诉从机读取寄存器的值,则数据区必需包含要读取寄存器的起始地址及读取长度。对于不同的从机,地址和数据信息都不相同。
校验方法。
蚇注:信息帧的格式都基本相同:地址码、功能码、数据区和错误校验码。
蒂2.错误校验
冗余循环码(CRC)包含2个字节,即16位二进制。CRC码由发送设备计算,放置于发送信息的尾部。接收信息的设备再重新计算接收到信息的CRC码,比较计算得到的
CRC 码是否与接收到的相符,如果两者不相符,则表明出错。
41
CRC码的计算方法是,先预置16位寄存器全为1。再逐步把每8位数据信息进行处理。在进行CRC码计算时只用8位数据位,起始位及停止位,如有奇偶校验位的话也包括奇偶校验位,都不参与CRC码计算。
在计算CRC码时,8位数据与寄存器的数据相异或,得到的结果向低位移一字节,用0填补最高位。再检查最低位,如果最低位为1,把寄存器的内容与预置数相异或,如果最低位为0,不进行异或运算。
这个过程一直重复8次。第8次移位后,下一个8位再与现在寄存器的内容相相异或,这个过程与以上一样重复8次。当所有的数据信息处理完后,最后寄存器的内容即为CRC码值。CRC码中的数据发送、接收时低字节在前。
计算CRC码的步骤为:
? 预置16位寄存器为十六进制FFFF(即全为1)。称此寄存器为CRC寄存器;
? ? 把第一个8位数据与16 位CRC寄存器的低位相异或,把结果放于CRC寄存器; 把寄存器的内容右移一位(朝低位),用0填补最高位,检查最低位;
? 重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理; ? 重复步骤2到步骤5,进行下一个8位数据的处理;
? 最后得到的CRC寄存器即为CRC 码。
3.功能码03,读取点和返回值:
仪表采用ModbusRTU通讯规约,利用通讯命令,可以进行读取点(“保持寄存器”)或返回值(“输入寄存器”)的操作。保持和输入寄存器都是16位(2字节)值,并且高位在前。这样用于仪表的读取点和返回值都是2字节。一次最多可读取寄存器数是60。由于一些可编程控制器不用功能码03,所以功能码03被用作读取点和返回值。从机响应的命令格式是从机地址、功能码、数据区及CRC码。数据区中的寄存器数据都是每两个字节高字节在前。
4.功能码06,单点保存 |
|
42
主机利用这条命令把单点数据保存到仪表的存储器。从机也用这个功能码向主机返送信
息。
二、编程举例
下面是一个用VC编写的ModBusRTU通讯的例子
(一)、通讯口设置
DCBdcb;
hCom=CreateFile("COM1",
GENERIC_READ|GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL);
{ MessageBox("createfileerror,error");if(hCom==INVALID_HANDLE_VALUE)
if(!error) }
error=GetCommState(hCom,&dcb);
if(!error)
MessageBox("getcommstate,error");
dcb.BaudRate=2400;
dcb.ByteSize=8;
dcb.Parity=EVENPARITY;//NOPARITY;
dcb.StopBits=ONESTOPBIT;
error=SetCommState(hCom,&dcb);
(二)、CRC校验码计算
UINTcrc
void calccrc(BYTE crcbuf)
{
BYTE i; |
|
43
crc=crc^ crcbuf;
for(i=0;i<8;i++)
{
BYTETT;
TT=crc&1;
crc=crc>>1;
crc=crc&0x7fff;
if(TT==1)
crc=crc^0xa001;
crc=crc&0xffff;
}
}
(三)、数据发送
zxaddr=11;//读取地址为11的巡检表数据
zxnum=10;//读取十个通道的数据
writebuf2[0]=zxaddr;
writebuf2[1]=3;
writebuf2[3]=0; writebuf2[4]=0; writebuf2[2]=0;
crc=0xffff;
calccrc(writebuf2[2]);
calccrc(writebuf2[3]);
calccrc(writebuf2[4]);
calccrc(writebuf2[5]);
writebuf2[6]=crc& 0xff;
writebuf2[7]=crc/0x100;
WriteFile(hCom,writebuf2,8,&comnum,NULL);
(四)、数据读取
ReadFile(hCom,writebuf,5+zxnum*2,&comnum,NULL);//读取zxnum个通道数据可增加错误处理程序,如地址码错误、CRC码错误判断、通讯故障处理等。
44
提高RS-485 总线可靠性的几种方法及常见故障处理
总线在抗干扰、自适应、通信效率等方面仍存在缺陷,一些细节的处理不当常会导致通信失
败甚至系统瘫痪等故障,因此提高RS-485总线的运行可靠性至关重要。
一、RS-485接口电路的硬件设计
1、总线匹配
总线匹配有两种方法,一种是加匹配电阻,如图1a所示。位于总线两端的差分端口VA
与VB之间应跨接120Ω匹配电阻,以减少由于不匹配而引起的反射、吸收噪声,有效地抑
制了噪声干扰。但匹配电阻要消耗较大电流,不适用于功耗严格的系统。
45
另外一种比较省电的匹配方案是RC匹配(图2)利用一只电容C隔断直流成分,可以节省大部分功率,但电容C的取值是个难点,需要在功耗和匹配质量间进行折衷。除上述两种外还有一种采用二极管的匹配方案(图3),这种方案虽未实现真正的匹配,但它利
用二极管的钳位作用,迅速削弱反射信号达到改善信号质量的目的,节能效果显著。
异步通信数据以字节的方式传送,在每一个字节传送之前,先要通过一个低电平起始位
实现握手。为防止干扰信号误触发RO(接收器输出)产生负跳变,使接收端MCU进入接
收状态,建议RO外接10kΩ 上拉电阻。
3、保证系统上电时的RS-485芯片处于接收输入状态
对于收发控制端TC建议采用MCU引脚通过反相器进行控制,不宜采用MCU引脚直接进行控制,以防止MCU上电时对总线的干扰,如图4所示。
46
4、总线隔离
RS-485总线为并接式二线制接口,一旦有一只芯片故障就可能将总线“拉死”,因此对其二线口VA、VB与总线之间应加以隔离。通常在VA、VB与总线之间各串接一只4~10Ω的PTC电阻,同时与地之间各跨接5V的TVS二极管,以消除线路浪涌干扰。如没有PTC电阻和TVS二极管,可用普通电阻和稳压管代替。
5、合理选用芯片
例如,对外置设备为防止强电磁(雷电)冲击,建议选用TI的75LBC184 等防雷击芯
1、网络节点数
网络节点数与所选RS-485芯片驱动能力和接收器的输入阻抗有关,如75LBC184标称最大值为点,SP485R标称最大值为400点。实际使用时,因线缆长度、线径、网络分布、传输速率不同,实际节点数均达不到理论值。例如75LBC184运用在500m分布的RS-485网络上节点数超过50或速率大于9.6kb/s时,工作可靠性明显下降。通常推荐节点数按RS-485芯片最大值的70%选取,传输速率在1200~9600b/s之间选取。通信距离1km以内,从通信效率、节点数、通信距离等综合考虑选用4800b/s最佳。通信距离1km以上时,应考虑通过增加中继模块或降低速率的方法提高数据传输可靠性。
2、节点与主干距离
47
理论上讲,RS-485节点与主干之间距离(T头,也称引出线)越短越好。T头小于10m的节点采用T型,连接对网络匹配并无太大影响,可放心使用,但对于节点间距非常小(小于1m,如LED模块组合屏)应采用星型连接,若采用T型或串珠型连接就不能正常工作。RS-485是一种半双工结构通信总线,大多用于一对多点的通信系统,因此主机(PC)应置于一端,不要置于中间而形成主干的T型分布。
三、提高RS-485通信效率
RS-485通常应用于一对多点的主从应答式通信系统中,相对于RS-232等全双工总线效率低了许多,因此选用合适的通信协议及控制方式非常重要。
1、总线稳态控制(握手信号)
大多数使用者选择在数据发送前1ms将收发控制端TC置成高电平,使总线进入稳定的
发送状态后才发送数据;数据发送完毕再延迟1ms后置TC端成低电平,使可靠发送完毕后
才转入接收状态。据笔者使用TC端的延时有4个机器周期已满足要求;
推荐用户使用MODBUS个数据包长度达20~30字节。在RS-485系统中这样的协议不太简练。
协议,该协议已广泛应用于水利、水文、电力等行业设备及系统的国际标准中。
四、RS-485接口电路的电源、接地
对于由MCU结合RS-485微系统组建的测控网络,应优先采用各微系立供电方案,最好不要采用一台大电源给微系统并联供电,同时电源线(交直流)不能与RS-485信号线共用同一股多芯电缆。RS-485信号线宜选用截面积0.75mm2以上双绞线而不是平直线。对于每个小容量直流电源选用线性电源LM7805比选用开关电源更合适。当然应注意LM7805的保护:
1、LM7805 输入端与地应跨接220~1000μF 电解电容;2、LM7805 输入端与输出端反接1N4007 二极管;
48
3、LM7805输出端与地应跨接470~1000μF电解电容和104pF独石电容并反接 1N4007二极管;
4、输入电压以8~10V为佳,最大允许范围为6.5~24V。可选用TI的PT5100替代 LM7805,以实现9~38V的超宽电压输入。
五、光电隔离
在某些工业控制领域,由于现场情况十分复杂,各个节点之间存在很高的共模电压。虽
然RS-485接口采用的是差分传输方式,具有一定的抗共模干扰的能力,但当共模电压超过
RS-485接收器的极限接收电压,即大于+12V或小于-7V时,接收器就再也无法正常工作
了,严重时甚至会烧毁芯片和仪器设备。
解决此类问题的方法是通过DC-DC将系统电源和RS-485收发器的电源隔离;通过光
耦将信号隔离,彻底消除共模电压的影响。实现此方案的途径可分为:
1、用光耦、带隔离的DC-DC、RS-485芯片构筑电路;
六、RS-485系统的常见故障及处理方法 2、使用二次集成芯片,如PS1480、MAX1480等。
RS-485 的常用方法。
1、若出现系统完全瘫痪,大多因为某节点芯片的VA、VB对电源击穿,使用万用 表测VA、VB间差模电压为零,而对地的共模电压大于3V,此时可通过测共模 电压大小来排查,共模电压越大说明离故障点越近,反之越远;
2、总线连续几个节点不能正常工作。一般是由其中的一个节点故障导致的。一个节 点故障会导致邻近的2~3个节点(一般为后续)无法通信,因此将其逐一与总 线脱离,如某节点脱离后总线能恢复正常,说明该节点故障;
3、集中供电的RS-485系统在上电时常常出现部分节点不正常,但每次又不完全一 样。这是由于对RS-485的收发控制端TC设计不合理,造成微系统上电时节点收
发状态混乱从而导致总线堵塞。改进的方法是将各微系统加装电源开关然后分别
上电;
4、系统基本正常但偶尔会出现通信失败。一般是由于网络施工不合理导致系统可靠
性处于临界状态,最好改变走线或增加中继模块。应急方法之一是将出现失败的
节点更换成性能更优异的芯片;
5、因MCU故障导致TC端处于长发状态而将总线拉死一片。提醒读者不要忘记对TC 端的检查。尽管RS-485规定差模电压大于200mV即能正常工作。但实际测量:
49
一个运行良好的系统其差模电压一般在1.2V左右(因网络分布、速率的差异有
可能使差模电压在0.8~1.5V范围内)。
ModBus通信系统协议
ModBus网络是一个工业通信系统,由带智能终端的可编程序控制器和计算机通过公用线路或局部专用线路连接而成。其系统结构既包括硬件、亦包括软件。
它可应用于各种数据采集和过程监控。下表1是ModBus的功能码定义。
表1ModBus 功能码
|
50
17 | 报告从机标识 | 可使主机判断编址从机的类型及该从机运行指示灯的状态 |
18 | (884 和MICRO 84) | 可使主机模拟编程功能,修改PC 状态逻辑 |
19 | 重置通信链路 | 发生非可修改错误后,是从机复位于已知状态,可重置顺序字节 |
20 | 读取通用参数(584L) | 显示扩展存储器文件中的数据信息 |
21 | 写入通用参数(584L) | 把通用参数写入扩展存储文件,或修改之 |
22~ | 保留作扩展功能备用 | |
65~72 | 保留以备用户功能所用 | 留作用户功能的扩展编码 |
73~119 | 非法功能 | |
120~127 | 保留 | 留作内部作用 |
128~255 | 保留 | 用于异常应答 |
的远程从属控制器, |
(1)ModBus 的传输方式
51
在ModBus系统中有2种传输模式可选择。这2种传输模式与从机PC通信的能力是同等的。选择时应视所用ModBus主机而定,每个ModBus系统只能使用一种模式,不允许2种模式混用。一种模式是ASCII(美国信息交换码),另一种模式是RTU(远程终端设备)这两种模式的定义见表3
表3ASCII 和RTU传输模式的特性
|
模式时报文字符必须以连续数据流的形式传送,用ASCII模式,字符之间可产生长达1s的间隔,以适应速度较快的机器。
表4给出了以RTU方式读取整数据的例子
以RTU方式读取整数据的例子
|
52
十六进制数4124 表示的十进制整数为16676,错误校验值要根据传输方式而定。 |
(2)ModBus的数据校验方式
CRC-16(循环冗余错误校验)
CRC-16错误校验程序如下:报文(此处只涉及数据位,不指起始位、停止位和任选的奇偶校验位)被看作是一个连续的二进制,其最高有效位(MSB)首选发送。报文先与X↑16相乘(左移16位),然后看X↑16+X↑15+X↑2+1除,X↑16+X↑15+X↑2+1可以表示为二进制数01。整数商位忽略不记,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,则生成多项式1和这个寄存器进行“异或”运算;若向右移出的数位是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(纵向冗余错误校验)
53
LRC错误校验用于ASCII模式。这个错误校验是一个8位二进制数,可作为2
个ASCII十六进制字节传送。把十六进制字符转换成二进制,加上无循环进位的
二进制字符和二进制补码结果生成LRC错误校验(参见图)。这个LRC在接收设
备进行核验,并与被传送的LRC进行比较,冒号(:)、回车符号(CR)、换行
字符(LF)和置入的其他任何非ASCII十六进制字符在运算时忽略不计。
表5LRC 生成范例--读取02号从机的前8个线圈
|
54
以下无正文
仅供个人用于学习、研究;不得用于商业用途。
Forpersonal use only in study and research; not for commercial use.
仅供个人用于学习、研究;不得用于商业用途。
Nurfür den pers?nlichen für Studien, Forschung, zu kommerziellenZwecken verwendet werden.
Pourl 'étude et la recherche uniquement à des fins personnelles; pas àdes fins commerciales.
только для людей, которые используются для обучения, исследований и не должны использоваться |
Forpersonal use only in study and
research;not for commercial use
55
Copyright © 2019- uude.cn 版权所有
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务