我们先来看接口:
设想直流电源,它的输出端插座接口有三个管脚,分别是正极、负极和接地极。相应地,负载的插头也应当有三个管脚与电源侧一一对应,这样才能正确地获得电能供应。
注意到这里有三个必须满足的条件:
第一是插头和插座管脚的形状、大小和插针直径及长度必须一一对应,否则无法完成接插操作。这一点规定了插头组合的物理结构和管脚定义。
第二是电源的输出电压值必须满足载侧的需求值,否则无法完成电参量的要求。这一点决定了插头组合的电平规范。
第三是电源的输出阻抗与负载的输入阻抗必须匹配,否则不能实现完善的供电。这一点决定了电源的工作性质。
这三点其实就是电源插头组合在物理层面上的规范性协议。
再看通信接口。在有关计算机信息交换的 ISO(国际标准化组织)OSI 模型里,物理层是最底层(第一层),它规定了接口的机械外形、接口管脚定义、接口电平和字节格式。
这里的字节格式,指的是一个字节中有几个数据位,有几个起始位 / 停止位,有几个奇偶校验位。一般地,一个字节有 8 个数据位,1 个起始位(停止位),和 1 个奇偶校验位。注意:起始位和停止位可以合并。
再看通信接口和通信网络的工作制问题。
当我们拿手机挂电话时,我们发现通信双方在通话的同时也可以接听,这叫做全双工(双向工作制);如果说话的时候不能听,而接听的时候不能说,但任何一方都具有说和听的能力,也即对讲机的通话型式,这叫做半双工。
(说明一下:这些图是我在 ABB 所做的有关 MODBUS 通信的 PPT 节录,比较早了,但基本内容是正确的。这些图供参考。)RS422 接口和 RS232 接口是全双工接口,而 RS485 则是半双工接口。
对于半双工接口,显然需要有通信的发起者,所以 RS485 接口和网络一定具有主站和若干从站,并且从站的数量也有规定。一般地,从站的数量是 32 个。
RS485 主站与从站的关系问题,看似只是通信工作制的不同,其本质是通信各方对通信总线控制权的合理分配。
我们再看总线连接问题。
我们还是以电源为例。我们可以从电源引出一条主干线,然后再并联若干个支路并分别送到若干个负载。只要满足电源的功率要求,显然这是可行的。
如果我们用同样的方法来引出 RS485 的通信线,是否可行呢?答案是否定的。我们必须从通信主站先引一条线到第一个通信子站,再从第一子站引第二条线到第二子站,如此循环直到最后一个子站。在通信线的终端,还要配一个终端电阻。在这条通信线路上,任何一点如果发生断路,则后续的通信链路上的通信也就断了。这种接线方法形象地被称为菊花瓣连接方法,或者链形连接方法,而电源的接线方法则被称为星形连接方法。
我们发现,从电气接线来看,链路是并联的。但从通信来看,链路是菊花瓣的,属于一个接一个的有秩序的连接。现在我们可以总结一下了:RS485 的总线网络接线方式必须是链形菊花瓣的接线方式,并且属于半双工的通信方式;RS232 是点到点的接线方式,属于全双工通信。不管是 RS232 接口,还是 RS485 接口,它们必须符合物理层的通信规约。
再看 MODBUS-RTU 通信协议:
有了物理层通信接口,是不是就能通信呢 ? 答案是否定的。物理层通信接口只是使得通信双方具备通信条件而已。但若双方说的话谁都听不懂,或者通信双方的说话方式及语法结构不相符,显然这也无法通信。
在 OSI 模型中,物理层之上是数据链路层。MODBUS-RTU 协议就是数据链路层协议,只要通信双方都采用了 MODBUS-RTU 协议,则能确保通信语言是双方都能听得懂的语句格式。
注意这里的词汇 "语句"。物理层定义的是字节,相当于语言中的字,数据链路层则把字节组织成语句,也即帧。帧规定了通信双方所用语句的语法结构。
MODBUS 也是主从式的。和物理层的总线控制是一样的,这里的主从关系,就是对通信总线的控制权做了规定。主站先下达命令,占用总线;接着把总线空置,交给从站去写回应码;从站完成后,再把总线还给主站。
现在我们来看看 ISO 的 HDLC 规定的帧结构,也即通信语句的语法结构,如下:
在 MODBUS 通信协议下,不同的命令功能码它的帧结构不尽相同。对于读寄存器命令,MODBUS 的主站帧结构是:2 个字节的地址码,1 个字节的功能码,2 个字节的数据地址码,2 个字节的 CRC 校验码;MODBUS 的从站回应帧结构是:2 个字节的功能码,1 个字节的回应区字节总数,N 个字节的回应数据,2 个字节的 CRC 校验码。虽然物理层协议与数据链路层协议不同,但数据链路层协议的执行必须建立在通信双方物理层连接已经符合要求,并且已经可以无障碍地实现信息交互的基础上。
这个规则在 ISO/OSI 模型的七层协议中必须完全彻底地得到执行。在 ISO/OSI 模型中,通信双方的低层次协议必须为上层协议建立透明的无故障的连接和信息交换关系。也就是说,各层次的上下级关系必须是绝对的。
从数据链路层再往上,就是网络层了。它的任务是构成现场总线的信息交换网。
网络层的功能包括:把通信帧打包成数据分组,然后把数据分组发送给对方。
由于通信双方的网络结构可能不同,于是对于同种网就需要用网桥来连接,而异种网则需要用网关来连接。
网络之间的信道可能有多条。数据分组在发送时有多种路径可以选择。负责选择路径的元件称为路由器。路由器不但决定了真实的数据交换网络路径,还可以构建虚拟的网络路径,还要决定数据分组的发送秩序。因此,路由器是网络层中最复杂最关键的装备。
OSI 模型中,把物理层 + 数据链路层 + 网络层合并称为现场总线,其通信接口就是 8 针的 RJ45 水晶头。显见,RJ45 与 RS232/RS485/RA422 完全不是一回事。
网络层的数据分组是数据帧的组合。通俗地说,数据分组是一篇短文,或者是一页待传递的数据组合单元。
网络层在发送数据分组时,其路由问题和接收组合问题见下图:
我们看到网络层在通信时先由路由器确定路由路径,然后把分组发送到对方。对方接收到分组后,把分组按前后秩序组合起来,再解包为实际文档。指的注意的是:由于网络层有了路由器,因此网络层支持星形网络结构。
现在我们来关注一下 ISO/OSI 的 7 层模型,如下:
由于题主并未提及更高层的协议,我们也就给予忽略。但需要明确的是:从网络层再往上,各层之间发送的信息单位已经是完整的报文了。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 的 IEC61131-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 毫秒让从站回应,再接收到从站发还的上行通信帧,总历时为:
如果有 31 个相同的仪表等待主站一一访问,则主站从访问第一个仪表开始,到最后回应完毕,总历时:
这里的 1.12 秒就是在通信速率为 9600bps 下这 31 台仪表的读数据循环周期,且忽略了主站再次发送下行通信帧的等待时间,实际时间会略微再长一些。
相信,看到这里,大家对 MODBUS-RTU 下的通信帧应当有了较为深刻的认识。
提醒大家:一个字有两个字节。一般地,字节只能用来表达 8 个开关量。但对于模拟量,则要用字来表达。例如电流 1250A,16 进制下是 04E2H,要用 2 个字节才能表达完整。也因此,各种电力仪表中,模拟量都是用字来表达的。
以下是 MODBUS 的部分常用功能码,也即命令码:
以下是 PLC 在读取双投开关 ASCO 控制器的数据点表的下行和上行通信帧范例:
几个相关的问题解释一下: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。
7)CRC 校验码是二进制不借位的除法,用以做接收信息是否出错的检验。
注意这里的 f ( x ) 就是除去 CRC 校验码的 MODBUS 通信帧,除数是 CRC16。帧中的 CRC 是运算后的余数。主站在发送帧之前,把帧先做 CRC 计算,再把 CRC 运算的余数附在帧尾发送给从站。从站接收到帧后,先对帧除去 CRC 的部分做 CRC 运算来检验是否正确,若不正确,从站要求主站重发。
同理,当从站发送信息给主站时,主站也根据 CRC 来检查数据的正确性。若发现错误,则要求从站重发。
8)关于 MODBUS-RTU、MODBUS-ASC 和 MODBUS-TCP
如果 MODBUS 中字节表达数据的方式采取 BCD 码,则被称为 MODBUS-RTU;如果 MODBUS 中字节表达数据的方式采取 ASCII 码,则被称为 MODBUS-ASC;如果 MODBUS 运行在网络层上,则被称为 MODBUS-TCP。
ASCII 码的内容如下:
MODBUS 在实际使用中,大多数都采用 BCD 码,因此 MODBUS-RTU 得到广泛应用。BCD 码如下:
值得注意的是:在协议使用中,数据帧中的数值都是用 16 进制数来表达的。例如 100A 电流写成 0X64H,而 380V 电压则写成 0X17CH。9)关于 RS485 网络使用的双绞通信线和接地
我们知道,两条平行的线缆之间会有分布电容,而分布电容会削弱信号的强度。为了消除分布电容,通信线的两条平行线需要按一定长度互相旋转对绞,这种线被称为双绞线。双绞线的对绞长度有规范,它与通信速率密切相关。在实际使用时,要按通信速率来选择合适的双绞线。
双绞线的外层有屏蔽层。屏蔽层必须单点接地,不得在线头线尾同时接地,防止地电流流过引起干扰。在实际布线时,采取各线段独立接地,切忌采用所有线段的屏蔽层前后连接统一接地的做法。
10)关于菊花瓣的通信链路连接方式
(这一段内容出现在评论里,因为比较重要,我把它改进正文中。)
绝对的菊花瓣链形网络是不存在的。事实上,我们用菊花瓣链形接线方法构建的通信网络中,各个节点是接线端子,由接线端子通过双绞线连接到各个子站,这些双绞线就构成了类似的星形结构,我们不妨把这种接线方式称为链形网络下的准星形接线。
在工程实践中证明,准星形接线的长度不得超过 70cm。一旦超过,则可能出现通信不稳定状态。
事实上,70cm 也成为行业中的一条不成文的质检规范。
100 欧终端电阻在通信速率低时可加可不加,但当通信速率较高时(高于 19.2kbps),建议一定要加。例如 PROFIBUS 下的 RS485 网络,终端电阻已经植入终端设备中,只需拨动开关即可加入或者撤离。
终端电阻的用途是吸收反射波。
我们在两棵树间紧紧地绑上一根绳子,接着敲击绳子的某一侧,我们会看到有传导波向另一端传去,并能看到反射波。如果敲击的频率适当,则在绳子中间出现波的不动点,这叫做驻波。
对于通信来说,不管是反射波还是驻波,将严重影响通信质量。终端电阻用于吸收反射波,并且可提升最终子站的电平水平。
=============