1 引言 模拟屏能简单、明了地反映现场的实时数据和状态信息,应用十分广泛。为了使现场信息及时、准确、动态地显示在模拟屏上,要求数据采集设备和模拟屏之间进行通信。 现场信息量比较大,如果每个信号都独立连接到模拟屏,信号线数量多、耗线多,不经济,走线不便,故障率高,采用串行通信可克服以上缺点。 现在通信方式多种多样、速度越来越快,但串行通信在控制范畴一直占据着极其重要的地位。它不仅没有因时代的进步而淘汰,反而在规格上越来越完善、应用越来越广,长久不衰。与并行通信相比,它传输速度慢(并行一次传8位,串行传1位),但并行通信数据电压传输过程中,容易因线路因素使标准电位发生变化(常见的电压衰减、信号间互相串音干扰)。传输距离越远,问题越严重、数据错误越容易发生。相比之下,串行通信处理的数据电压只有一个标准电位,数据不易漏失。 常用的串行通信有两种,一种为rs232,另一种为rs422/485。工业环境常会有噪声干扰传输线路,在用rs232进行数据传输时,经常会受到外界电气干扰而使信号发生错误。rs232串行通信的信号标准电位是参考接地端而来的,干扰信号在原始信号和地线上均会产生影响,原始信号加上干扰信号后,依然传送到接收端,而地线部分的信号则不能传送到接收端。因此,信号便发生了扭曲。rs422/485传输的是差分信号,在发送端分成正负两部分,到达接收端通过相减,还原成原来信号,两条信号线受到的干扰的程度相同,这就防止了噪声干扰。本文以plc和模拟屏通信为例介绍通过rs485实现点对点串行通信。 2 模拟屏的通信规约及设备 (1) 通信规约 rs232c/485串行口:速率9600bps,1位起始位,8位数据位,1位停止位,无奇偶校验位;传输报文内容以字节为单位,在信道中的传送顺序是:低字节先送,高字节后送;字节内低位先送,高位后送;数据格式为16进制数;异步通信。 (2) 设备 开关量处理器;开关量指示灯;模拟量处理器;模拟量显示器;时钟;通信处理器;中央控制器。 3 信息传输途径设备和功能 (1) 途径:数据采集通过plc完成,plc向模拟屏传输数据,控制模拟屏状态。rs485连接图如图1所示:
图1 rs485连接
电缆图 (2) 主要相关设备:中央处理器cpu 314;点到点通信模块cp341-rs422/485。 (3) 功能:—向模拟屏发送模拟量数据;—向模拟屏发送开关量信息;—控制屏状态,包括:全屏亮暗、全屏信号分合、 变位帧闪光;—设定和改变时钟时间。 4 通信实现的方法 4.1 初始化 就串行通信而言,交换数据的双方利用传输在线的电压改变来达到数据交换的目的。如何从不断改变的电压状态中解析出其中的信息,双方必须有一套共同的译码方式,遵守一定的通信规则。这就是通信端口初始化。 通信端口初始化有以下几个项目必须设置或确认: (1) 通信模式 串行通信分同步和异步两种模式。同步传输在通信的两端使用同步信号作为通信的依据,异步传输则使用起始位和停止位作为通信的判断。模拟屏通信模式:异步传输;西门子plc通信模式:异步传输;二者通信模式相同。 (2) 数据的传输速率 异步通信双方并没有一个可参考的同步时钟作为基准。这样双方传送的高低电位代表几个位就不得而知了。要使双方的数据读取正常,就要考虑到传输速率。收发双方通过传输在线的电压改变来交换数据,但发送端发送的电压改变的速率必须和接收端的接受速率保持一致。模拟屏的通信速率:9600bps;西门子plc通信速率:600bps,1200bps,2400bps,4800bps,9600bps,19200bps,38400bps,57600bps,76800bps。初始化,将plc波特率设为:9600bps (3) 起始位及停止位 当发送端准备发送数据时,会在所送出的字符前后分别加上高电位的起始位及低电位的停止位。接收端会因起始位的触发而开始接收数据,并因停止位的通知而确定数据的字符信号已经结束。起始位固定为1位,而停止位则有1,1.5,2等多种选择。模拟屏的停止位: 1位;西门子plc的停止位:1位或2位。初始化,将plc数据停止位设为:1位。 (4) 数据的发送单位 不同的协议会用到不同的发送单位(欧美一般用8位、日本一般用7位组成一字节),使用几位合成一字节,双方必须一致。模拟屏的数据发送单位: 8位为一字节;西门子plc的数据发送单位:7位或8位为一字节。初始化,将plc数据发送单位设为:8位。 (5) 校验位的检查 为了预防错误的产生,使用校验位作为检查的机制。校验位是用来检查所发送数据正确性的一种校对码,它分奇偶校验,也可无校验。模拟屏校验位:none;西门子plc校验位:none,odd,even;初始化,将plc校验位设为:none。 (6) 工作模式 交换数据是通过一定的通信线路来实现的。微机在进行数据的发送和接收时通信线路上的数据流动方式有三种:单工、半双工、全双工。rs232和rs422使用全双工模式,rs485使用半双工模式。模拟屏工作模式:rs232全双工/rs485半双工;西门子plc工作模式:rk512 全双工四线制(rs422);3964r全双工四线制(rs422);ascii全双工四线制(rs422);ascii半双工两线制(rs 485);初始化,将plc工作模式设为:ascii半双工两线制(rs485)。 (7) 数据流控制—握手 传输工作进行时,发送速度若大于接收速度,而接收端的cpu处理速度不够快时,接收缓冲区就会在一定时间后溢满,造成后来发送过来的数据无法进入缓冲区而漏失。采用数据流控制,就是为了保证传输双方能正确地发送和接收数据,而不会漏失。数据流控制一般称为握手,握手分为硬件握手和软件握手。模拟屏数据流控制:none;西门子plc数据流控制:none。要通过用户程序询问和控制。 (8) 错误预防—校验码 在传输的过程中,数据有可能受到干扰而使原来的数据信号发生扭曲。为了监测数据在发送过程中的错误,必须对数据作进一步的确认工作,zui简单的方式就是使用校验码。模拟屏校验码:异或校验和。要在plc上编校验码程序。 4.2 数据发送 (1) 将同步字及测量值db36.dbw21开始的数据送到db42.dbw12开始的数据区去,为向串口发送做准备。程序如下: 遥测*帧(fc36) l w#16#eb90 传送两次同步字eb90,分别给db42.dbw12和db42.dbw14 t db42.dbw12 l w#16#eb90 t db42.dbw14 l b#16#61 //将报文类型字“61”送给db42.dbb16 t db42.dbb16 l w#16#100 //*帧将起始地址“0100”送给db42.dbw17 t db42.dbw17 //第二帧将起始地址“0120”送给db42.dbw17 l w#16#40 //将正文字节数“40”(64字节)送给db42.dbw19 t db42.dbw19 l db36.dbw21 //*帧将db36.dbw21开始的32个字的模拟量 caw 送到db42.dbw21开始的区域 t db42.dbw21 l db36.dbw23 caw t db42.dbw23 ………………… l db36.dbw83 caw t db42.dbw83 opn db42 //遥信校验 l p#17.0 //第二帧与*帧相同 t md100 l dbw[md100] t mw10 l 33 t mw16 l mw16 next: t mw12 l md100 l p#2.0 +d t md100 l dbw[md100] l mw10 xow t mw10 l mw12 loop next l md100 l p#2.0 +d t md100 l mw10 t mw14 l mw14 slw 8 t dbw[md100] l mw10 aw w#16#ff00 t mw10 l mw10 l dbw[md100] xow t dbw[md100] l dbw16 t mw18 l mw18 aw w#16#ff00 t mw18 l mw18 l dbw[md100] xow t dbw[md100] (2) 将db42.dbw12开始,长度为95个字的数据送到串行端口,程序如下: //supply laddr, db_no,dbb_no,len l 256 // laddr t db40.dbw2 l 42 // db_no t db40.dbw4 t db42.dbw4 l 12 // dbb_no t db40.dbw6 t db42.dbw6 l 95 // len t db40.dbw8 t db42.dbw8 //send with instance-db call fb8 , db21 sf :=’s’ req :=db40.dbx0.0 r :=db40.dbx0.1 laddr :=db40.dbw2 db_no :=db40.dbw4 dbb_no :=db40.dbw6 len :=db40.dbw8 r_cpu_no:= r_typ := r_no := r_offset := r_cf_byt := r_cf_bit := done :=db40.dbx0.4 error :=db40.dbx0.5 status :=db40.dbw12 // generate edge p_snd_rk_req an db40.dbx0.0 // p_snd_rk_req s db40.dbx0.0 // set p_snd_rk_req o db40.dbx0.4 // p_snd_rk_done o db40.dbx0.5 // p_snd_rk_error r db40.dbx0.0 // p_snd_rk_req // check “complete without error” an db40.dbx0.4 // check p_snd_rk_done if p_snd_rk_done equals 0, jc cher // jump to cher and check p_snd_rk_error //”complete without error” // p_snd_rk_done=1 l db42.dbw0 //“complete without error” +1 // increment counter t db42.dbw0 nop //further user function nop nop be // check “complete with error” // p_snd_rk_error=1 cher: an db40.dbx0.5 //check p_snd_rk_error bec //if no error occurred, jump to end //“complete with error” l db42.dbw2 //“complete with error” +1 //increment counter t db42.dbw2 l db40.dbw12 t db40.dbw14 //save status nop //error-handling nop nop be (3) 数据刷新,程序如下: an m2.4 l s5t#100ms sd t0 a t0 jnb _007 l w#16#1 l md4 rrd t md4 set save clr _007: a br = l20.0 a l20.0 a( l md4 l l#0 ==d ) jnb _008 l 1 t md4 _008: nop 0 a l20.0 bld 102 = m2.4 a( o m5.0 o m6.4 ) jnb _003 call fc36 _003: nop 0 a( o m4.0 o m5.4 ) jnb _004 call fc38 _004: nop 0