RS232、RS485、RJ45、Modbus协议傻傻分不清楚?看完这篇豁然开朗
设想直流电源,它的输出端插座接口有三个管脚,分别是正极、负极和接地极。相应地,负载的插头也应当有三个管脚与电源侧一一对应,这样才能正确地获得电能供应。
注意到这里有三个必须满足的条件:
第一是插头和插座管脚的形状、大小和插针直径及长度必须一一对应,否则无法完成接插操作。这一点规定了插头组合的物理结构和管脚定义。
第二是电源的输出电压值必须满足载侧的需求值,否则无法完成电参量的要求。这一点决定了插头组合的电平规范。
第三是电源的输出阻抗与负载的输入阻抗必须匹配,否则不能实现完善的供电。这一点决定了电源的工作性质。
这三点其实就是电源插头组合在物理层面上的规范性协议。
再看通信接口。在有关计算机信息交换的ISO/OSI模型里,物理层是最底层(第一层),它规定了接口的机械外形、接口管脚定义、接口电平和字节格式。
这里的字节格式,指的是一个字节中有几个数据位,有几个起始位/停止位,有几个奇偶校验位。一般地,一个字节有8个数据位,1个起始位(停止位),和1个奇偶校验位。注意:起始位和停止位可以合并。
再看通信接口和通信网络的工作制问题。
当我们拿手机挂电话时,我们发现通信双方在通话的同时也可以接听,这叫做全双工(双向工作制);如果说话的时候不能听,而接听的时候不能说,但任何一方都具有说和听的能力,也就是对讲机的通话型式,这叫做半双工。
我们发现,从电气接线来看,链路是并联的。但从通信来看,链路是菊花瓣的,属于一个接一个的有秩序的连接。
现在我们可以总结一下了:
RS485的总线网络接线方式必须是链形菊花瓣的接线方式,并且属于半双工的通信方式;RS232是点到点的接线方式,属于全双工通信。不管是RS232接口,还是RS485接口,它们必须符合物理层的通信规约。
再看MODBUS-RTU通信协议:
有了物理层通信接口,是不是就能通信呢?答案是否定的。物理层通信接口只是使得通信双方具备通信条件而已。但若双方说的话谁都听不懂,或者通信双方的说话方式及语法结构不相符,显然这也无法通信。
在OSI模型中,物理层之上是数据链路层。MODBUS-RTU协议就是数据链路层协议,只要通信双方都采用了MODBUS-RTU协议,则能确保通信语言是双方都能听得懂的语句格式。
注意这里的词汇“语句”。物理层定义的是字节,相当于语言中的字,数据链路层则把字节组织成语句,也即帧。帧规定了通信双方所用语句的语法结构。
MODBUS也是主从式的。和物理层的总线控制是一样的,这里的主从关系,就是对通信总线的控制权做了规定。主站先下达命令,占用总线;接着把总线空置,交给从站去写回应码;从站完成后,再把总线还给主站。
现在我们来看看ISO的HDLC规定的帧结构,也即通信语句的语法结构,如下:
需要明确的是:从网络层再往上,各层之间发送的信息单位已经是完整的报文了。OSI模型也规定了报文的语法结构,限于篇幅给予忽略。
值得注意的是:RS232/RS485/RS422通信接口以及它们的定义,是非常明确的。包括管脚的电平,管脚的功能定义,以及接口在信息发送和接收信息时的数据流时序关系,这些都必须准确和严格,否则就无法执行信息交换。
当PLC与某电力仪表交换信息,并且这些电力仪表符合RS485/MODBUS-RTU通信规范。我们要做什么事呢?
第一,我们按菊花瓣结构的通信链路要求去接线,将PLC的通信接口与N个电力仪表接口连接起来。最后一个电力仪表的末端要配100欧的终端电阻。
第二,我们把这N个电力仪表按地址递增的原则确定各自的地址,例如01H、02H、1FH等等。这里的H表示是16进制,1F表示16 15=31。
第三,我们在PLC编程软件中设定好电力仪表规定的通信速率。
第四,我们在PLC编程软件中按电力仪表的数据区地址码设定好MODBUS通信码,以及各个子站的循环关系。
注意,这里的MODBUS通信码满足PLC的IEC 61131-3编程模块要求,一般的PLC梯形图没有此功能。梯形图满足IEC 61131-1要求,但不满足IEC 61131-3要求。
第五,在PLC的内存中开辟专用数据区,存放从电力仪表读取到并处理后的信息,以便让更高层的总站来读取信息。此数据区有一个名称,叫做数据点表,有时也简称通信协议。
最后,当然就是开机测试了。其中的内容很多,限于篇幅不再介绍。
我们来看一个在RS485网络上用MODBUS-RTU读取数据的例子,如下:
某电力仪表,地址是01H。在电力仪表内存第2000的位置上,放置了三相电流和三相电压等6个数据,每个数据占用两个字节,共12个字节。
此电力仪表的通信速率是9600bps。什么意思呢?bps表示一个0/1,也就是比特,这说明每秒钟这条总线上可以发送9600个比特。我们已经知道一个字节有8个数据位,1个起始位,1个奇偶校验位,刚好10位或者10个比特,所以,如果电力仪表的通信速率是9600bps,那么1秒钟就可以发送:9600/10=960个字节。
我们还知道,主站的读数据的帧结构(下行帧)中,有1个字节的地址,1个字节的功能码,2个字节的内存地址,2个字节的数据数量,2个字节的CRC校验码,总共有8个字节,所以主站发送读数据MODBUS通信帧占用的时间是:8X10/9600=8.33毫秒。
对于本例,我们知道MODBUS-RUT读数据的命令是0X03H,也即03命令。注意这里的写法:0X是字头,中间的03是命令,最后的H表示是16进制。
具体通信帧的是:01 03 07 D0 00 06 C5 45,其中0X01H是地址,0X03H是命令,0X07D0H是内存地址2000,0X0006H表示读取连续6个字,也即内存中的电流和电压参数,0XC545H是01 03 07 D0 00 06的CRC校验码。
那么电力仪表的回应帧(上行帧)的帧结构是:1个字节的地址,1个字节的功能码,1个字节的数据区字节数,12个字节的数据,2个字节的CRC校验码,总共17个字节,占用时间是:17X10/9600=17.7毫秒。
具体的仪表回应通信帧是:01 03 0C 00 64 0064 0064 00 DC 00 DC 00 DC D6 F5,其中0X01H和0X03H的意义同前,0X0CH表示上传数据区有12个字节,0X0064H表示A相电流为100A,后面的两组为B相和C相电流,均为100A,0X00DCH表示A相电压为220V,其后两组为B相和C相电压,均为220V,最后0XD6F5H为CRC校验码。
从主站发起下行通信帧,再等待10毫秒让从站回应,再接收到从站发还的上行通信帧,总历时为:
这里的1.12秒就是在通信速率为9600bps下这31台仪表的读数据循环周期,且忽略了主站再次发送下行通信帧的等待时间,实际时间会略微再长一些。
相信,看到这里,大家对MODBUS-RTU下的通信帧应当有了较为深刻的认识。
提醒大家:一个字有两个字节。一般地,字节只能用来表达8个开关量。但对于模拟量,则要用字来表达。例如电流1250A,16进制下是04E2H,要用2个字节才能表达完整。也因此,各种电力仪表中,模拟量都是用字来表达的。
以下是MODBUS的部分常用功能码,也即命令码:
几个相关的问题解释一下:
1)有些现场总线,用令牌解决了总线的控制权问题。
大家很容易想到,如果从站有紧急事项需要主站来服务,可是MODBUS规定了轮询规则,等到自己的时候,可能会太迟了。于是许多现场总线就发明了一个特殊的东西,叫做令牌。令牌很短,只有一个字节,它可以很快地在总线上传递。令牌在各站点中传递,谁拿到令牌,谁就是主站,就可以发布信息。如果本站没有事情需要发布,就把令牌交给下一个站点,由此解决了总线占用问题。
2)当链路发生断路时,为了避免出现通信中断,可采用双主站措施。双主站(PLC的两个主站RS485接口)之间用握手线连接,平时主用RS485开通,而辅助RS485浮空。浮空的RS485虽然接在总线上,但它处于高阻态等效于完全脱离。当发生断路时,从站确认后立即开通通信,从链路两头进行连接通信。
有时,还采取环状通信措施。限于篇幅,不做介绍。
3)MODBUS可工作在网络层,此时协议变为MODBUS-TCP,但还是符合主从结构。
4)MODBUS协议是美国莫迪康公司发明的,该公司的宗旨是:MODBUS协议为不收费的公开协议。后来莫迪康公司被施耐德公司收购了,施耐德公司继承了莫迪康公司的做法,MODBUS是不收费的公开协议。既然MODBUS已经成为施耐德的协议,施耐德把它延伸到网络层,构建了网络层的MODBUS-TCP协议,以及内部专用的MODBUS-PLUS协议。限于篇幅,对于这两个协议的描述此处从略。
5)关于RS232和RS485的区别
学过模电和数电的人都知道差分电路。差分电路具有共模抑制比,能够消除共模误差。RS485接口就具有此特征。因此RS232接口的传输距离仅为十几米,而RS485/RS422接口的传输距离为1200米。
我们从图中看到,虽然RS232和RS485接口的外形是一致的,但它们的性能和信息交换模式不同,因此抗干扰能力也不同。
6)当距离很长的时候,RS485接口还可以接入光纤,但需要配备1对光纤转换器。之所以要1对,是因为其中一只用于电转光,而第二只则用于光转电。光纤收发器中间的通信介质就是光缆或者光纤。(注意哦,光纤是光缆的芯线,不要以为是两种东西)
光纤分为单模和多模。单模的光纤较细,光在传输过程中反射较少,因而失真小,其传输距离可达15km以上;多模的光纤较粗,光在传输过程中反射较多,因而失真大,其传输距离为1.5km。
MODBUS在实际使用中,大多数都采用BCD码,因此MODBUS-RTU得到广泛应用。
BCD码如下:
值得注意的是:在协议使用中,数据帧中的数值都是用16进制数来表达的。例如100A电流写成0X64H,而380V电压则写成0X17CH。
9)关于RS485网络使用的双绞通信线和接地
我们知道,两条平行的线缆之间会有分布电容,而分布电容会削弱信号的强度。为了消除分布电容,通信线的两条平行线需要按一定长度互相旋转对绞,这种线被称为双绞线。双绞线的对绞长度有规范,它与通信速率密切相关。在实际使用时,要按通信速率来选择合适的双绞线。
双绞线的外层有屏蔽层。屏蔽层必须单点接地,不得在线头线尾同时接地,防止地电流流过引起干扰。在实际布线时,采取各线段独立接地,切忌采用所有线段的屏蔽层前后连接统一接地的做法。
10)关于菊花瓣的通信链路连接方式
绝对的菊花瓣链形网络是不存在的。事实上,我们用菊花瓣链形接线方法构建的通信网络中,各个节点是接线端子,由接线端子通过双绞线连接到各个子站,这些双绞线就构成了类似的星形结构,我们不妨把这种接线方式称为链形网络下的准星形接线。
在工程实践中证明,准星形接线的长度不得超过70cm。一旦超过,则可能出现通信不稳定状态。
事实上,70cm也成为行业中的一条不成文的质检规范。
100欧终端电阻在通信速率低时可加可不加,但当通信速率较高时(高于19.2kbps),建议一定要加。例如PROFIBUS下的RS485网络,终端电阻已经植入终端设备中,只需拨动开关即可加入或者撤离。
终端电阻的用途是吸收反射波。
我们在两棵树间紧紧地绑上一根绳子,接着敲击绳子的某一侧,我们会看到有传导波向另一端传去,并能看到反射波。如果敲击的频率适当,则在绳子中间出现波的不动点,这叫做驻波。
对于通信来说,不管是反射波还是驻波,将严重影响通信质量。终端电阻用于吸收反射波,并且可提升最终子站的电平水平。
RS485和MODBUS这两个概念,都需要通过实践去掌握它们,单单凭着阅读文本,很难理解和掌握。如果这篇小文能给大家的实践活动带来益处,我会感到分外欣慰。
来源:知乎问答,张白帆老师