可编程计算机控制器( PCC: Programmable Computer Controller) 以其可靠性高、开发周期短、配置灵活、功能强大而在工业控制领域得到越来越广泛的应用。由于其能适应恶劣的工业现场,因此多被作为集散控制系统的下位机使用。但PCC的显示功能较差, 因此将PC与PCC 结合起来构成了总线式的集散控制系统, 充分利用PC机强大的人机接口功能、丰富的系统软件, 用图形化界面实现了对整个系统的实时监控。其中各设备间的通信是系统实现的关键。RS-232 接口是计算机及PCC共同具有的, 利用贝加莱公司的帧驱动器并加入一些辅助电路及相应通信程序即可构造基于RS-232的总线式多机通信网络。实验证明, 该网络具有硬件实现简单、系统可靠、抗干扰能力强的特点。
1 多机实时通信的硬件实现
图1 计算机与多台PCC 组成的集散控制系统
系统采用RS-232 串行通信方式实现了上位机对整个系统的实时监控, 同时为了提高硬件稳定性,优化系统工作性能, 本文采用硬件仲裁电路来实现数据总线的分配, 并合理解决了数据冲突问题, 简化了软件设计, 提高了系统可靠性和抗干扰能力。
1.1 RS-232 多机通信机制
普通的RS-232采用点对点串行数据传输方式, 无法满足多设备之间的实时通信, 因此需要对其连接方式作一些改进。RS-232的点对点通信是将接口的数据发送端(TXD)连接到另一方的数据接收端(RXD) , RXD与另一方的TXD相连,双方的地线端(GND)直接相连。但在计算机与多台PCC相连时则发生了一些变化。如图2所示,计算机的数据发送端直接连接到各PCC的数据接收端, 地端直接与各PCC的地端相连, 但各PCC的数据发送端不能同时连接到计算机的数据接收端, 因为数据发送端在无数据发送时为高电平,而发送的数据为高低电平组成的脉冲序列, 直接将两个或多个数据发送端连接到一起接入计算机, 则会造成其数据接收端电平的不确定, 产生了数据冲突问题。为了解决上述问题设计了专门的硬件仲裁电路, 将各PCC的TXD 以及数据发送请求端(DTR)接入, 再将仲裁电路输出端连接到计算机的数据接收端。
图2 RS-232 多机通信连接示意图
1.2 仲裁电路结构与工作原理
由于上位机(PC)的发送端为一对多广播式发送, 所以上位机发送的数据帧所有的下位机( PCC)均可以接收到, 至于数据帧由哪一台下位机接收则由通信协议中的目的地址ID判定。但对于下位机,其发送端为多对一连接, 如直接将其相连, 则会发生数据冲突。图3 所示的仲裁电路可以确保每次只有一台下位机能够发送数据到上位机的数据接收线上。应注意的是, RS-232 接口使用的高低电平与TTL 中的高、低电平不同, 需进行电平转换。
图3 下位机发送数据仲裁电路
图3 以三路PCC 为例说明。各下位机初始化时均将其DTR 设置为低电平, 因为与门1 、2 、3均有低电平输入, 所以初始化后A、B、C 三点均为低电平, 并且与门4 、5 、6 也一直输出低电平。假设下位机1 是第一台要发送数据的下位机, 发送前先将自己的DTR 端口设置为高电平, 而此时B、C 两点仍为低电平, 经反相器后变为高电平输入与门1 , 所以与门1 的输出A 点电平也为高, 此时数据发送服务程序读取数据发送查询端(DSR) 电平状态(即A 点电平状态) 为“1”, 说明总线未被占用,处于空闲状态。由于下位机1 的DTR 端口已被置高, 且查询得知总线空闲, 则其DTR 端口不变仍然设置为高电平, 这样下位机1 就占用了总线, 可以开始发送数据。数据由TXD 端经过与门4 后输入上位机的RXD 端, 由于此时A 点电平为高, 保证了数据经过与门4 后没有失真直接上传至上位机, 同时A 点电平经反相器后变为低电平输入与门2 、3 , 故B、C 两点电平为低, 与门5 、6 始终输出低电平, 避免了数据冲突。当下位机1 数据发送完毕后将其DTR 端口置低, A 点电平变低, 释放了总线, 又回到初始化后的状态, 可以供给下一个要发送数据的下位机使用。假设下位机1 发送数据的过程中, 下位机2 也要发送数据, 同样先将自己的DTR 端口置高, 但此时A 点电平为高, 经反相器后输入与门2 , 所以与门2 的输出B 点仍为低电平, 程序读取DSR 端口电平(即B 点电平) 为“0”, 说明总线已被占用, 因此将DTR 端口重新置低, 等待下次查询, 这样就避免了两台下位机同时上传数据。下一个查询周期未到时, 程序持续查询是否有更高优先级的任务标志位置位, 有则调用相应的任务服务程序, 没有则重复查询各标志位直至下一个查询周期到来; 下一个查询周期到来后,重复一次置高DTR 端口、读取DSR 端口的过程以判断总线状态, 空闲则DTR 端口保持高电平占用总线并发送数据, 否则置低DTR 端口, 等待下次查询。下位机2 重复上述过程直至查询到总线空闲并占用总线以发送数据。
不同类型的数据发送其优先级也不同, 数据发送任务的优先级越高, 查询周期就越短, 保证了系统通信的实时性。由于各发送方在发送时间上存在差异, 首先查询到总线空闲的下位机得以使用数据总线, 在发送数据前已将其DTR 由低电平转为高电平, 仲裁电路将总线状态转为忙碌, 避免其余下位机同时使用总线造成数据冲突。当数据传输结束则将DTR 转为低电平, 仲裁电路将总线状态转为空闲。由于PC 为一对多发送, 下位机通过仲裁机制锁死总线只是保证同一时刻数据上传总线上只有一台PCC 向PC 发送数据, 并不会影响PC 通过数据下行总线发送数据到各PCC , 从而实现了总线的合理分配, 解决了数据冲突问题。
2 多机实时通信的软件实现
图4 RS-232 数据传输格式
包含一个起始位、8 个数据位以及一个校验位和停止位, 数据位为所发送的对象, 而数据帧则是多个字节按一定格式打包而成的一个字节序列, 以字节流形式发送。
2.2 帧驱动器
帧驱动器是贝加莱公司为实现与第三方设备之间进行通信而设计的软件工具箱, 存放在PCC 应用程序ROM 中, 完全控制了通信的硬件部分而不改变帧的形式。通常数据通信, 对数据进行读写操作, 用户必须对端口的细节了解很清楚, 才能通过编程实现对接口各管脚进行操作。而帧驱动器将这些操作集中起来, 用户只需要了解第三方产品的通信协议细节(包括信息帧格式的组成等) , 并用帧驱动器写出与第三方产品通信协议一样的通信规约,就可方便地实现PCC 与第三方产品之间的通信。同时, 帧驱动器支持RS-232 、RS-422 、RS-485 、CAN 等接口, 因此软件中只要稍微作些改动, 便可支持不同的接口进行数据通信, 具有可扩展性和广泛的应用前景。
2.3 通信协议制定
PC 和PCC 以及PCC 之间能进行通信首先需要制定一个合理的通信协议, 才能进行通信。为此本着充分利用资源、结构简单、可扩充性强的原则定义了数据帧的结构。对于数据帧的格式, 考虑到组网以及适应不同通信接口的需要做了如表1 定义。
表1 数据帧的格式定义
目的ID 和源ID 均分配一个字节, 用于标志数据帧的接收设备和发送设备, 以便接收设备判断接收和发生接收错误时呼叫发送设备重发。命令字给定数据帧的类型(数据或控制字) , 指明随后的DA TA 是数据内容还是控制字。这样系统中的各设备可根据事先制定的通信协议将欲发送的控制指令或数据打包写入DA TA 中, 或者将接受的数据帧按协议解包为控制命令并执行或对接收到的数据进行处理。帧数指明了当前发送的是第几个数据帧, 以便于接收设备判断是否有数据帧丢失以呼叫发送设备重发。最后判断接收的校验位与自行计算校验位结果是否一致, 一致则进行相应操作, 否则丢弃该帧并呼叫发送设备重发。
2.4 系统内各设备间的通信
2.5 基于C语言的PCC数据通信的实现及程序流程图
②上位机编程。使用Visual Basic , 流程中需要发送数据或命令只要按定义好的通信协议进行数据装帧并调用数据发送程序将其通过串行口发送即可。为了实现数据的实时接收, 在VB 工程中导入了PComm Pro (此软件借助Windows API 函数的调用来控制使用串行通信端口) 的通信函数库和控件以实现接受数据的实时触发。事件的触发除了定时器或循环的轮询(Polling) 方式外, 还可以使用回调函数(CallBack Function) 实现。PComm 针对事件的处理就是采用回调函数的方式处理, 欲建立事件, 需给定一个函数的地址, 当事件发生时, 便到该回调函数所在地址去执行该程序代码。因此定义了回调函数作为接受数据的事件触发服务程序, 当接受数据事件发生时便执行该事件触发程序, 保存接受到的数据, 并按协议进行数据帧的解包, 将数据取出并作相应处理显示在监视器上, 以便实时监控, 或执行相应的命令。
多机实时通信测试程序实验结果如图6 所示。
3 结束语
PC/ PCC 总线式集散控制系统的总体结构如图1 所示。
2.1 RS-232 的数据传输格式
RS-232 的数据是以字节的形式发送的, 一次发送一个字节, 其数据传输格式如图4 所示。
为了确保数据接收的可靠性, 使用应答方式进行通信, 接收机接收到数据后返回一个应答帧加以确认, 发送机收到此帧再发送下一帧数据, 如无应答则周期循环发送同一帧, 如超时未应答则向上位机发送数据帧报错, 上位机接收后显示发送与接收设备ID及错误类别并报警以提示监控人员排除错误。
①PC 与PCC 之间的通信。PC 向下位机发送数据帧采用广播式, 但只有符合目标地址ID 的下位机能够接受, 而下位机采用仲裁机制向上位机发送数据。
②PCC 与PCC 之间的通信。PCC 与PCC 之间是通过PC 以数据转发的形式进行数据帧传送的。当监控计算机收到不是以自己为目的地址的数据帧时, 直接将其送入数据传送总线由目的PCC判断接受。
①下位机编程。使用贝加莱公司提供的标准PC。
PCC 发送程序流程如图5 (a) 所示。PC 发送程序流程由于为一对多广播式发送, 省略查询总线过程, 直接发送即可。PC 接收程序流程如图5 (b) 所示。PCC 接收程序流程基本与PC 接收程序流程一致, 但在判断接收数据帧目的ID 与本机ID 不符后, PCC 直接退出事件触发服务程序返回, 而PC则将得到的数据帧发送给各下位机以使目的PCC 接收该数据帧。
本文利用硬件仲裁电路巧妙地实现了数据总线分配, 解决了数据冲突问题, 简化了系统设计, 优化了系统性能。通过PCC 与PC 的有机结合, 构成了基于RS-232 的总线式集散控制系统, 充分利用了PCC 和PC 的优点, 用可视化的图形界面实现对整个系统的实时监控。实验证明, 系统运行良好, 监控准确无误, 还可应用于其它分布式测控系统和类似系统, 具有一定的工程应用价值。