二十、通信
传统PLC在通信方面的应用相对比较单一和简单,大多数只是用来编程或者联单一设备而已,这都是不需要用户太多参与的。但现在不行了,HMI、变频器、多PLC组网、GPRS、互联网等,一方面设备智能程度越来越高了,另一方面FCS技术的推广使大家对于分布式控制有了全新的认识,在现实的控制环境中,许多都可以用小型PLC通过组网来实现,用基于网络的小型PLC来实现FCS得到了广大用户的认同,下面我们就通信的基础开始进行一些讲解。
20.1、通信基础:
说到通信这里面包含了许多术语和基础知识,我们假定用户已对通信有了一些基本的了解。我们这里所提到的通信仅限于串行通信,对于串行通信,我们比较常见的是七层通信模型,在工业现场中,通常我们只会使用2~4层协议,当然也有一些现场总线的协议层次比较多,比方说LONWORKS等。其实层次的多少并不代表协议的优劣,只是协议制定方针对协议适应的范围和规模来设计的。
ISO七层模型
数据封装与层次结构
在多数正在使用的现场总线或者工业网络中,比较常见的只有以下4层:
1、物理层:
物理层(physical layer)的主要功能是完成相邻结点之间原始比特流的传输。物理层协议关心的典型问题是
a、 使用什么样的物理信号来表示数据“ 1”和“ 0”;
b、 一位持续的时间多长;(波特率)
c、 数据传输是否可同时在两个方向上进行;
d、 物理接口(插头和插座)有多少针以及各针的用处。
物理层的设计主要涉及物理层接口的机械、电气、功能和过程特性,以及物理层接口连接的传输介质等问题。
我们平常所说的RS232、RS485其实都是物理层,而Modbus、ProfiBus都是建立在RS485这个物理层上的现场总线,串行通信中比较常用的包括全双工和半双工两种。
全双工:在发送数据的同时可以接收数据,也就是发送和接收的数据线是独立的,比方说RS232就是全双工总线;
半双工:发送与接收数据都是分离的,在同一时间只允许发送或者接收,也就是发送和接收的数据线是复用的,比方说RS485、以太网、CAN总线等。
一般全双工只能用于端对端的通信方式,而半双工可以用于多站通信。
2、数据链路层
数据链路层(data link layer)的主要功能是如何在不可靠的物理线路上进行数据的可靠传输。数据链路层完成的是网络中相邻结点之间可靠的数据通信。为了保证数据的可靠传输,发送方把用户数据封装成帧(frame),并按顺序传送各帧。由于物理线路的不可靠,因此发送方发出的数据帧有可能在线路上发生出错或丢失(所谓丢失实际上是数据帧的帧头或帧尾出错),从而导致接收方不能正接收到数据帧。为了保证能让接收方对接收到的数据进行正确性判断,发送方会为每个数据或数据块计算出校验码并加入到帧中,这样接收方就可以通过重新计算校验码来判断数据接收的正确性。一旦接收方发现接收到的数据有错,则可以丢掉这一错误帧或者要求发送方重传这一帧数据。数据链路层必需解决由于帧的损坏、丢失和重复所带来的问题。
数据链路层的主要功能如下:
a、 链路连接的建立,拆除,分离。
b、 帧定界和帧同步,链路层的数据传输单元是帧,协议不同,帧的长短和界面也有差别,但无论如何必须对帧进行定界。
c、 顺序控制,指对帧的收发顺序的控制。
d、 差错检测和恢复,还有链路标识,流量控制等等.差错检测有很多种,比较常见的是字节的奇偶校验和帧数据的累加和校验、循环码CRC校验来检测信道上数据的误码。
对应于现场总线来说这一层次是各层次中最重要的,也是大家最常打交道的,这一层有三个重要部分:
站地址addr:区分各个站点的唯一标志;
功能码fn:定义这一帧的命令功能或者数据的含义;
校验码:校验的方式有很多种,有针对字节的奇偶校验,有针对帧数据的累加和和CRC等。
3、用户接口层:
有一部分现场总线定义了用户接口层,它定义了数据链路层与应用层之间的接口定义,包括数据的含义和偏移地址、长度等。
4、应用层:
应用层明确了具体数据的含义。
20.2、V80通信功能:
标准的V80带有一个RS232和一个RS485,两个口均支持编程、ModBus从站协议,RS485还支持ModBus主站协议和Free自由通信协议。
20.2.1、编程功能:
V80的编程可以通过RS232和RS485的任一口进行,用户只需要注意PLC的波特率与电脑的波特率一致就行了,对于站地址,如果不清楚的,可以直接将站地址设为‘0’广播地址。
如果通过RS485编程,则可以通过在PC的串口后加RS232与RS485的转换器再联接V80来实现。
20.2.2、ModBus通信协议:
ModBus通信协议分为ASCII格式与RTU格式,目前V80支持RTU格式。
ModBus通信协议包含主站协议和从站协议两部分,目前V80的RS232口支持从站协议,RS485支持主从两种协议。(用户如有特殊需要,可以利用V80的特殊功能位09934来切换COM1和COM2的功能,切换完后,软件中的COM1对应于硬件中的COM2,并可以使RS232带有ModBus主功能和Free功能)
用户在使用V80的ModBus主功能和Free功能时需要注意特殊功能位09933的应用,09933是COM2的主站工作模式设置寄存器,默认情况下是Modbus主功能,如需要使用Free功能需要显意的在程序中将09933设为ON。
ModBus是一种主从通信协议,其拓朴结构图如下:(采用RS485的情况下)
整个ModBus是一个总线式的拓朴结构,从物理角度来说,不支持星形结构,分支要越短越好,所有的主从站均并联在同一条总线中,总线的两头各需要一组终端匹配电阻。
注:RS485的终端电阻最好是三电阻结构,V80PLC内已带有终端电阻,需要用户按说明书把通信端子上对应的4个引脚进行联接,如32点和40点的,需要把COM2的1、2短接,3、4短接。如果总线的另一端不是V80,则需要用户自行按RS485标准接入正确的终端电阻(A与5V间为330欧姆电阻,B与GND地之间为330欧姆电阻,A、B之间为220欧姆电阻)。在没有终端电阻的情况下,在良好的环境中仍然可以正常通信,但在现场干扰比较大的情况下,因为没有终端电阻会使通信口上处于高阻的状态,从而使通信的稳定性大大降低。
ModBus每一次的通信均由主站发起,因此主站没有站地址,但每个从站均有一个唯一的站地址,主站正是通过这个站地址来区分下面的从站。
ModBus总线任一时间均只允许一个站发送数据,但允许多个站一起接收数据。
V80作为ModBus从站通信:
V80作为ModBus从站通信不需要做任何的编程,只需要设置好通信属性,包括速率、校验和站地址就可以了。
V80作为ModBus主站通信:
a、在Vladder软件中选择‘PLC设置’,把COM2设置为‘主站’模式、波特率、奇偶校验位都与从站设为一至。
b、下面的程序是编写了一个V80从另一个V80处通过ModBus现场总线读写数据的过程,在VaLadder软件有这个例程。
01000是一个1秒的定时器,保证1秒钟进行一次读写通信。
第二个网络的M_BUS功能块是写操作,它将主站中变量类型为4的,地址偏移为1100的寄存器型变量(41100)写到站地址为’1’的从站中的变量类型为4的,偏移地址为1的寄存器型变量(40001)并且写16个字变量。
第三个网络的M_BUS功能块是读操作,它与从站地址为5的从站进行读操作,变量类型为4的,地址偏移为10的寄存器型变量(40010)读到主站 的变量类型为4的,偏移地址为1000的寄存器型变量(41000)并且读了40个字变量。
注:用户需要注意在实际的系统之中,有一部分厂商的设备地址偏移是从0开始的,而另一部分厂商的设备地址是从1开始的,比方说00001,在一部分设备中这代表第一个输出线圈,在有一部分的设备中这代表第二个输出线圈,用户在通信编程时需要注意这个问题。比方说取某些设备中的变量00010,在通信中的偏移有可能不一定是10,而是9,前面已提到这对于不同厂商对于ModBus协议的理解的支持是不一样的,这在后面的通信协议中还有更加详细的说明。V80为了便于用户使用和为了便于多台V80之间的互操作,将V80的内部变量定义都按ModBus协议定义,但V80在ModBus主站功能块上的操作中偏移量也与变量的定义一至,这样简化了用户的理解,使用户在多台V80这间通信时,不需要考虑类似于像读取变量00010时需要将偏移设为9的问题。
在各种文本屏、触摸屏、HMI、组态软件中,也有这种情况,有一部分屏在选择偏移时,是从0开始的,有一部分屏是从1开始的,用户在使用时需要认真看说明书,或者试一下确定准确的操作方法。