传统上,几乎所有的仪表、控制设备都配置有串行接口。在SCADA系统中,串行通信广泛存在于许多现场控制设备与上位机之间。在USB接口产生前,串行接口是最常用的短距离有线通信接口。PLC控制程序的下载调试、单片机的调试、控制器与变频器及仪表通信等基本都通过串行接口。通过对串行通信的学习,可以了解工业通信的基础知识,有助于学习其他通信协议。因此,了解串行通信是十分有必要的。
串行通信中有两个重要的概念,即数据终端设备DTE(Data Terminal Equipment)和数据电路终端设备DCE(Data Circuit-terminating Equipment)。目前常用的有关DTE和DCE之间的接口标准是EIA和ITU-T制定的标准。其中,EIA(Electrical Industrial Association,美国电子工业协会)标准有EIA-232、EIA-442和EIA-449等;ITU-T标准分为V系列和X系列。数据通信接口标准主要用来定义数据通信接口和信号方式,在通信线路的两端都要有DTE和DCE,如图2.2所示。DTE产生数据并传输到DCE,DCE将此信号转换成适当的形式在传输线路上进行传输。在物理层,DTE可以是终端、微机、打印机、传真机等设备,但是一定要有一个转接设备才可以通信。DCE是指可以通过网络传输或接收模拟数据或数字数据的任意设备,最常用的设备是调制解调器。
图2.2 DTE和DCE设备的连接
在串行通信中,交换数据的双方利用传输在线路上的电压变化来达到数据交换的目的,但是如何从不断改变的电压状态中解析出其中的信息,需要双方共同决定才行,即需要说明通信双方是如何发送数据和命令的。因此,双方为了进行通信,必须遵守一定的通信规则,此通信规则就体现在通信端口的初始化参数上。可以利用通信端口的初始化实现对以下4项的设置。
(1)数据的传输速率。
RS-232常用于异步通信,通信双方没有可供参考的同步时钟作为基准,此时双方发送的高低电平到底代表几个位就不得而知了。要使双方的数据读取正常,就要考虑传输速率——波特率(Baud Rate),其代表的意义是每秒所能产生的最大电压状态改变率。由于原始信号经过不同的波特率取样后,所得的结果完全不一样,因此通信双方采用相同的通信速率非常重要,如在仪器仪表中,常选用的传输速率是9.6kbps。
(2)数据的发送单位。
一般串行通信端口所发送的数据是字符型的,这时一般采用ASCII码或JIS(日本工业标准)码。在ASCII码中,8个位形成一个字符,而JIS码以7个位形成一个字符。若用来传输文件,则使用二进制的数据类型。欧美的设备多使用8个位作为一个数据组,而日本的设备使用7个位作为一个数据组。
(3)起始位及停止位。
由于异步串行传输中没有使用同步时钟脉冲作为基准,因此接收端完全不知道发送端何时进行数据发送。为了解决这个问题,就在发送端要开始发送数据时,将传输在线路中的电压由低电平提升至高电平(逻辑0),当发送结束后,再将高电平降至低电平(逻辑1)。接收端会因起始位的触发而开始接收数据,并因停止位的通知而确认数据的字符信号已经接收完毕。起始位固定为1个位,而停止位有1个位、1.5个位及2个位等多种选择。
(4)校验位的检查。
为了预防产生错误,使用了校验位作为检查机制。校验位是用来检查所发送数据的正确性的一种校验码,又分为奇校验(Odd Parity)和偶校验(Even Parity),分别检查字符码中“1”的数目是奇数个还是偶数个。在串行通信中,可根据实际需要选择奇校验、偶校验或无校验。
下面以EIA-232为例,主要介绍RS-232接口标准。该标准是EIA于1973年提出的串行通信接口标准,主要用于模拟信道传输数字信号的场合。RS(Recommended Standard)代表推荐标准,232是标志号,C代表RS-232的最新一次修改,在这之前,有RS-232B、RS-232A。RS-232是用于数据终端设备DTE与数据电路终端设备DCE之间的接口标准。RS-232接口标准所定义的内容属于国际标准化组织ISO所制定的开放式系统互连参考模型中的底层——物理层所定义的内容。RS-232接口标准的内容包括机械特性、电气特性、功能特性和规程特性4个方面。
(1)机械特性。
RS-232接口标准并没有对机械接口进行严格规定。RS-232的机械接口一般有9针、15针和25针3种类型。在仪表和控制器上最常用的是9针类型。
(2)电气特性。
DTE/DCE接口标准的电气特性主要规定了发送端驱动器与接收端驱动器的信号电平、负载容限、传输速率及传输距离。RS-232接口使用负逻辑,即逻辑“1”用负电平(范围为-5~-15V)表示;逻辑“0”用正电平(范围为+5~+15V)表示;-3~+3V为过渡区,逻辑状态不确定(实际上这一区域的电平在应用中是禁止使用的)。RS-232的噪声容限是2V。串行通信电气参数如表2.1所示。
表2.1 串行通信电气参数
(3)功能特性。
RS-232接口连线的功能特性主要是对接口各引脚的功能和连接关系进行定义。RS-232接口规定了21条信号线和25芯的连接器,其中,常用的是引脚号为2~8和20、22这9条信号线。实际上RS-232的25条信号线中有许多是很少使用的,在计算机与终端通信中一般只使用3~9条引线。表2.2展示了RS-232中常用的9条信号线的信号内容。RS-232接口在不同的应用场合所用到的信号线是不同的。例如,在异步传输中,不需要定时信号线;在非交换应用中,不需要某些控制信号;在不使用备用信道操作时,可省略5条反向信号线。
表2.2 串行通信接口电路的名称和方向
续表
(4)规程特性。
规程特性是指数据终端设备与数据通信设备之间控制信号与数据信号的发送时序、应答关系及操作过程。RS-232接口标准规定按照以下规则和时序进行通信,即首先建立物理连接,然后进行数据传输,最后释放物理连接。
RS-232被定义为一种在低速率串行通信中增加通信距离的单端标准。RS-232采取不平衡传输方式,即单端通信。收发两端的数据信号是相对于信号的,如从DTE设备发出的数据在使用DB25连接器时是2脚相对7脚(信号地)的电平。典型的RS-232信号在正负电平之间摆动,在发送数据时,发送端驱动器输出的正电平为+5~+15V,负电平为-5~-15V。当无数据传输时,线上为TTL,从开始传输数据到结束,线上电平从TTL电平到RS-232电平,再返回TTL电平。接收器典型的工作电平为+3~+12V与-3~-12V。由于发送电平与接收电平的差仅为2~3V,因此其共模抑制能力差,再加上双绞线上的分布电容,其传送距离最大约为15m,最高传输速率为20kbps。RS-232是为点对点(只用一对收发设备)通信而设计的,其驱动器负载为3~7kΩ。所以RS-232适合本地设备之间的短距离通信。
RS-422由RS-232发展而来,是一种单机发送、多机接收的单向、平衡传输规范,被命名为TIA/EIA-422-A标准,全称是“平衡电压数字接口电路的电气特性”。RS-422为改进RS-232通信距离短、速率低、驱动能力弱的缺点,定义了一种平衡通信接口,将传输速率提高到10Mbps,将传输距离延长到4000英尺(约1219米),在一条平衡总线上最多允许连接10个接收器。典型的RS-422有四线接口,连同一根信号地线,共5根线。RS-422串行总线上允许有一个主设备/主站(Master),其余为从设备/从站(Salver),从站之间不能通信,所以RS-422支持点对多点的双向通信。由于RS-422四线接口采用单独的发送通道和接收通道,因此不必控制数据方向,各装置之间任何信号交换均可以按软件方式(XON/XOFF握手)或硬件方式(一对单独的双绞线)实现。平衡双绞线的长度与传输速率成反比,在100kbps速率以下,才可能达到最大传输距离。只有在很短的距离下才能获得较高的速率传输。一般在100m长的双绞线上所能获得的最大传输速率仅为1Mbps。
(1)RS-485串行通信的基本知识。
为扩展RS-422串行通信应用范围,EIA又于1983年在RS-422的基础上制定了RS-485标准,增加了多点、双向通信能力,即允许多个发送器连接到同一条总线上,同时增加了发送器的驱动能力和冲突保护特性,扩展了总线共模范围,后命名为TIA/EIA-485-A标准。由于RS-485是从RS-422基础上发展而来的,因此RS-485的许多电气规定与RS-422相似,如都采用平衡传输方式,都需要在传输线上接终端电阻等。RS-485可以采用二线与四线方式,采用二线连接可实现真正的多点双向通信。而当采用四线连接时,与RS-422一样,只能实现点对多的通信,即只能有一个主站,其余为从站。无论是二线方式还是四线方式,RS-485总线上可连接的设备最多都为32个。RS-485与RS-422的不同之处还在于其共模输出电压,RS-485为-7~+12V,而RS-422为-7~+7V。RS-485与RS-422一样,最大传输距离为4000英尺(约1219米),最大传输速率为10Mbps。
为了增加RS-485总线通信距离,可以采用增加中继的方法对信号进行放大,最多可以加8个中继,也就是说,理论上RS-485的最大传输距离可以达到9.6km。如果需要进行更长距离的传输,那么可以采用光纤作为传播介质,在收发两端各加一个光电转换器。多模光纤的传输距离是5~10km,而采用单模光纤可以达到50km的传输距离。
RS-485总线电缆在一般场合采用普通的双绞线就可以,在要求比较高的环境下可以采用带屏蔽层的同轴电缆。RS-485需要2个终端电阻,要求其阻值等于传输电缆的特性阻抗。终端电阻接在传输总线的两端。在实际应用中,一般在300m以下可以不用终端电阻。
RS-232、RS-422与RS-485等接口标准属于物理层,不涉及通信协议,用户可以在此基础上建立自己的高层通信协议。如Profibus-DP现场总线物理层采用了RS-485串行总线(通信介质是双绞线或光缆),但数据链路层和用户层采用的是西门子的通信协议。
(2)RS-485接口电路。
RS-485接口非常简单,图2.3所示为RS-485接口电路原理图。通信模块只需要一个RS-485转换器,通过UART串口就能直接与各类主控芯片(如STM32)连接,并且两者使用相同的串行通信协议。UART称为通用异步收发传输器,采用全双工通信方式,实现了并行通信与串行通信之间的转换。UART串口的数据按位进行发送,使用串行方式实现数据的传输和交换。UART1_RX为接收数据,接收MCU发送的并行数据,并保存在寄存器中。UART1_TX为发送数据,将寄存器中保存的并行数据通过逐位移出的方式转换为串行数据,并输出。
UART是+3.3V的TTL电平的串口,输入和输出引脚直接与STM32主控芯片的引脚相连。RS-485采用差分信号负逻辑,只需要检测两线之间的电平差,“1”代表-2~-6V,“0”代表+2~+6V。因此,UART串口与RS-485信号电路之间需要一个RS-485驱动器来转换电平,否则高电压可能会把芯片烧坏。采用ISL3158S芯片实现TTL电平信号到RS-485信号的转换,它相当于一个RS-485收发器。
RS-485接口电路由RS-485收发器和瞬态保护电路组成。DI为输入引脚,连接UART1_TX,接收STM32主控芯片输出的数据。RO为输出引脚,连接UART1-RX,将上位机发送的命令传送至STM32主控芯片。DE为输入使能引脚, 为输出使能引脚,将这两个引脚短接,由STM32主控芯片的UART_R/D控制。当UART_R/D输出高电平时,仅输入引脚DI有效,输出引脚RO被禁用,ISL3158S芯片将UART1_TX输出的TTL电平信号转换为RS-485信号,并传送至后续电路。当UART_R/D输出低电平时,仅输出引脚RO有效,输入引脚DI被禁用,ISL3158S芯片将RS-485信号转换为TTL电平信号,并通过UART1_RX传送给STM32的UART1串口。因此,形成的是一个半双工的RS-485通信网络,发送数据和接收数据不能同时进行。
图2.3 RS-485接口电路原理图
二线制接线方式对应ISL3158S芯片输出端的A引脚和B引脚。RS-485收发器存在一定的共模电压(-7~+12V),超出这个范围会影响通信网络的稳定性和可靠性,甚至会损坏RS-485接口。RS-485通信应采用屏蔽双绞线作为传输介质,同时A、B信号线在连接时都做了接地处理,且两个信号地使用同一个接地,消除了电平差,增强了抗共模干扰能力。但是,RS-485收发器只能抑制低频共模干扰,高频共模干扰会造成几百伏甚至上千伏的瞬态过电压,极易损坏RS-485接口。瞬态抑制二极管TVS2和二极管D5~D10组成了瞬态保护电路,能够将强大的瞬态能量泄放入大地,有效抑制高频共模干扰,提高RS-485通信的稳定性和可靠性。
目前,虽然控制器类产品的串行接口已不如以往普遍,但是在仪表设备中仍然被广泛使用。各类智能仪表在中小型测控系统中被广泛使用,这类仪表通常支持串行通信,从而便于构成一种低成本的SCADA系统。这里以对实验室化工对象的测控为例介绍串行通信的应用与编程。
在一氧化碳中-低温变换反应中测量和控制的参数有脱氧槽温度、饱和器温度、恒温槽与反应器间管道的温度、中变反应器温度、低变反应器温度、中变和低变反应器中间管道的温度、配气流量、中变后引出分析的气体流量、系统内部与外部差压、中变和低变后的二氧化碳气体含量(进而可对其他组分进行物料衡算)。由于系统需要较多的温度控制,且设备分散,具备分散控制的特点,因此采用两级分布式测控结构,系统硬件结构图如图2.4所示。现场总线选用RS-485总线,直接将智能仪表挂接在RS-485总线上,通过RS-232/485转接器与PC串口连接。系统配置了6台智能仪表(宇电AI-808)及RS-232/485转换器一块,并为每个节点设备分配一个唯一的地址。温度控制由智能仪表完成,而上位机只对下位机实现远程监控功能,一方面接收现场智能仪表传送来的温度等数据,另一方面对现场智能仪表的温度控制设定值和其他参数进行更改。数据的上传下达通过RS-485总线在通信软件的控制下完成。
图2.4 系统硬件结构图
通信主要是指上位机与AI-808系列现场智能仪表的通信,采用主从通信方式,上位机为主节点,其他智能仪表为从节点,从节点的地址是1~6。宇电AI-808仪表采用十六进制数据格式来表示各种指令代码及数据,仪表指令有读指令和写指令,仅用两条指令就能实现对仪表的所有操作。其读/写指令的格式如下。
读指令:仪表地址代码+52H+要读的参数代号+0+0+CRC校验码。
写指令:仪表地址代码+43H+要写的参数代号+写入数据低字节+写入数据高字节+CRC校验码。
仪表地址代码的基数为80H。要读/写的参数种类共有26种,具体包括给定值、上/下限报警、控制方式、小数点位置等,每个参数都有一个代号。无论是读还是写,仪表都返回以下数据:
测量值+给定值+输出值及报警状态+所读/写参数值+CRC校验码
校验码采用16位求和校验方式,其中,读指令的校验码计算方法如下:
要读参数的代号×256+82+ADDR
写指令的校验码分为两步,首先计算:
要写参数的代号×256+67+要写的参数值+ADDR
然后把该采用16位二进制加法计算得到的余数(溢出部分不处理)作为CRC校验码。
其中,ADDR为仪表地址参数值,范围是0~80。
以下为利用C#语言在Visual Studio 2017集成环境下写的一段控制台(Console)程序。为了简化程序,这里以对一台仪表读/写为例。该仪表参数配置为波特率9.6kbps、无奇偶效验、8个数据位、2个停止位。测试中使用了RS-485/USB转换器,配置的串口号是COM3。
程序代码如下:
图2.5所示为执行写设定值返回结果的界面。这里需要注意的是,在返回的数据中,低字节在前,高字节在后。例如,测量值0104(十六进制数)要先变为0401,再转换为十进制数。其他字节也是这样处理。程序中的函数public static int ByteToInt2(Byte[] src)就包含此变换。此外,紧随设定值写指令后返回的设定值还是原先的数值,下个周期返回的数值才是前一个周期写指令写进去的数值。
由于仪表设置了1位小数点,因此,读出的仪表测量值或设定值都要除10,当向仪表写设定值时,也要先乘10。
图2.5 执行写设定值返回结果的界面