内容 | 摘要:本文以RS-485总线在分散控制系统(DCS)中的应用为切入点,简要介绍了Modbus RTU协议的通讯模式、通讯规约,以及RS-485总线应用在现场控制站中的软硬件设计,探讨了DCS开放性设计的重要性和紧迫性。
关键词:开放性;分散控制系统;485总线;通讯;组态
1 引言
当前,根据不同需要,各种面向特定行业、特定生产过程的分散控制系统设计成了一种潮流,各种新型的控制系统也应运而生。目前来看,DCS的上位软件组态过程往往局限于固定厂商的固定设备,给系统及其设备的可移植性带来不少困难,这使得开放性显得越来越重要。这就要求分散控制系统软件设计引进各种先进设计思想、应用各种高新技术,特别是现场总线技术,力求实现系统的高开放性。
开放系统是指通讯协议公开、不同厂家的设备之间可进行互联并实现信息交换。这里的开放是指相关标准的一致性、公开性,强调对标准的共识与遵循。一个开放系统,它可以与任何遵循相同标准的其它设备或系统相连。开放系统把系统集成的权力交给了用户。用户可按自身需要和考虑把来自不同供应商的产品组成大小随意的系统,避免因选择了某一品牌的产品而被“框死”设备的选择范围,不会为系统集成中不兼容的协议而一筹莫展,使系统集成过程中的主动权完全掌握在用户手中。
本文以遵循Modbus RTU协议的RS-485工业智能I/O模块设备为例,阐述分散控制系统在组态以及通讯上的开放性设计。
2 RS-485 I/O模块的连接及基本通讯规则
2.1 RS-485 I/O模块在分散控制系统中的连接
分散控制系统以多层计算机网络为依托,实现各部分的信息共享和协调工作,共同完成各种控制、管理及决策功能。图1所示为一个分散控制系统的典型结构,系统中的所有设备分别处于不同的层次,自上而下分别是:管理级、监控级、控制级和现场级。
如图1所示,I/O智能模块通过现场总线与现场控制站相连,现场控制站通过相应的规则,对I/O智能模块进行读写操作,即现场控制站的读卡任务,在控制现场,是由各种智能I/O模块进行数据采集、任务执行,按其通道类型不同分为AI(模拟量输入)、AO(模拟量输出)、DI(数字量输入)、DO(数字量输出)模块,按其PV特性不同分为4~20mA、0~20mA、-5~5V、-10~10V等不同类型模块,这些I/O模块,都会遵循一定的协议连在总线上,比如Modbus TCP协议、Modbus RTU协议等,那么如何获取I/O模块的采集数据,如何使I/O模块进行一定的输出,就需要控制器对I/O模块进行读卡操作,需要按其相应的协议进行数据包的发送、分解、校验。

图1 分散控制系统的典型结构
针对本文所要举例的一类遵循Modbus RTU协议的RS-485智能I/O模块,如图2所示,现场控制站通过RS-485接口与这类模块按照菊花链的形式相连,按照Modbus RTU的协议规约进行通讯。
图2 RS-485设备接线图
2.2 Modbus RTU协议的通讯规则
Modbus RTU协议规定了RS-485设备通讯的基本规则,即:
(1)所有RS485通讯回路都应按照主/从方式,数据可以在一个主站(如PC机)和32个子站之间传递;
(2)主站将初始化和控制在RS485通讯回路上传递的所有信息;
(3)任何一次通讯都不能从子站开始;
(4)在RS485回路上的所有通讯都以“信息帧”方式传递,“信息帧”就是一个由数据帧(每一个字节为一个数据帧)构成的字符串(最多255个字节),是由信息头和发送的编码数据构成标准异步串行数据,该通讯方式也与RTU通讯规约相兼容;
(5)如果主站或子站接收到含有未知命令的信息帧,则不予以响应。
在RS-485通讯回路中,通讯传输为异步方式,并以字节(数据帧)为单位。在主站和子站之间传递的每一个数据帧都是11位的串行数据流,如表1、图3、图4所示。
表1 数据帧格式
在请求包和应答包发送过程中,信息帧格式如表2所示,当通讯命令发送至仪器时,符合相应的地址码的设备接收通讯命令,并除去地址码,读取信息,如果没有出错,则执行相应的任务;然后把执行结果返送给发送者。返送的信息中包括地址码、执行动作后的功能码、执行动作后的数据以及错误校验码(CRC)。如果出错就不发送任何信息。

图3 有奇偶校验的时序图

图4 无奇偶校验的时序图
表2 信息帧格式

3 组态开放性
在标准的ModBus RTU通讯规约中,通信回路以主/从模式运行,主站(如PC机)在向子站(如串口卡)发送数据帧时,需要用户指定模件地址、级联号、功能码等信息,而这些信息在不同的应用场合以及不同的硬接线配置下又有较大的差别。传统的应用方式是针对某张通道数及通道类型已知的具体的串口卡件,组态软件和现场控制站固化相应的软件程序,以某电力监测器的组态为例说明传统的应用方式,如表3。
表3 传统数据库组态表
如前所述,组态软件和现场控制站固化一段针对该电力监测器的软件程序,若增加另外一种串口卡件时,这段固化的软件程序要做修改才能应用。而DCS强调提供完整的系统给用户,软件上是一个整体方案,解决的是一个系统设计中的所有技术问题,这种传统的应用方式显然违背了DCS的开发初衷,势必给DCS的开发人员以及DCS用户的使用带来不便。
所以基于以上考虑,笔者提出一种全新的解决方案,自主开发出DCS组态软件,可以方便的通过填表方式组态,并将组态文件下发给现场控制站,直接无缝集成任何符合标准ModBus RTU通讯规约的第三方系统和设备,而无需更改组态软件和现场控制站的系统程序。仍以上述电力监测器为例,简要介绍上位机组态过程,如表4所示。
表4 数据库组态表
表4中加下划线部分由用户依实际挂接的串口卡件配置,后续工作(读写卡件、判断卡件状态等)交给现场控制站来完成,用户只需关心卡件所涉及数据的类型、地址以及所对应的功能码,集中精力于控制方案的实现而不必拘泥于技术细节。
此解决方案较之传统的应用方式,优势在于:可自由选择串口卡件(符合ModBus RTU标准规约);个别卡件故障或掉电不影响其它卡件的正常工作;支持在线插拔,快速更换卡件,并且更换或重新上电后无需重启现场控制站,并且支持扩展标准接口的平台,真正实现自由配置、按需配置、灵活配置。
RS-485卡件可由用户根据具体应用行业及特殊卡件工作周期受限等条件通过组态设定合适的工作周期,在实际工作过程中,DCS通过标准接口与RS-485卡件连接,这种连接通过网络实现,采用通用的、开放的网络协议和标准的软件接口,充分保证了DCS的开放性。
4 通讯开放性
ModBus通讯规约定义功能码为1~127(01H~7FH)。作为主机请求发送,通过功能码告诉子机执行什么动作。作为子机响应,子机发送的功能码与主机发送来的功能码一样,并表明子机已响应主机进行操作。本文以功能码4(读多路输入寄存器的输入)为例,介绍开放性RS-485串口通讯的过程。
4.1 请求与应答包的构成
主机发送的报文格式为【模件地址】【功能码】【起始寄存器地址高八位】【起始寄存器地址低八位】【读寄存器个数高八位】【读寄存器个数低八位】【CRC码低八位】【CRC码高八位】
从机响应返回的报文格式为:【模件地址】【功能码】【返回的字节数2n】【寄存器1数据高八位】【寄存器1数据低八位】【寄存器2数据高八位】【寄存器2数据低八位】•••【寄存器n数据高八位】【寄存器n数据低八位】【CRC码低八位】【CRC码高八位】
例如:主机要读取从机模件地址为01、起始地址为0116的3个寄存器的数据。假设从机数据寄存器的地址和数据信息如表5所示。
表5 设备寄存器信息
明确了具体设备的寄存器相关信息之后,要组成若干字节的发送请求包,请求包即一个unsigned char类型的数组,各字节的报文格式如表6所示。
表6 主机发送的报文格式
表7 从机响应返回的报文格式
请求包发送到串口的缓冲区后,如发送正确,RS-485设备将返回一定格式的应答包,现场控制站可用一个unsigned char类型的缓冲区接收,要接收的应答包的长度由主机请求的寄存器个数来决定,具体的报文格式如表7所示。
4.2 串口通讯流程
在串口通讯过程中,一般的PC机或其它规格的控制器都带有RS-232接口,可以外接一个RS-232转RS-485接头来实现现场控制站与RS-485模块的通讯。在此,笔者不深入阐述RS-485在物理层上的机理,只讨论串口通讯在应用层这一层面上的实现过程。如图5所示,在串口通讯时首先用标准的ioctl函数来配置串口的波特率、数据位、校验位、停止位等信息,继而是组包、发包、收包、解包的过程。在分散控制系统应用中,控制站收到返回包并检验成功后,应立即将有用数据读到现场控制站的共享内存,并向上位机广播I/O模块的相应状态。
4.3 防止串口阻塞在软件上的实现
在串口通讯过程中,数据量随请求I/O模块通道数的增加而加大。由于串口寄存器的特点,通讯过程会很容易出现串口阻塞而造成程序无法正常运行,在软件上加以优化是非常有必要的。
在串口初始化完成后,用sfd来表示此时串口获取到的文件描述符,可用如下的几行代码来检测文件的句柄和串口的可读性,
FD_ZERO(&fds);
FD_SET(sfd,&fds);
select(sfd+1, NULL, &fds, NULL, &tv);
FD_ISSET(sfd,&fds);
也就是说,在调用select()函数检查此时串口是否可读后,用FD_ISSET()函数来检测fdset中文件sfd有无发生变化。只有当select()函数和FD_ISSET()函数均返回“真”的时候,说明串口已经准备好,可以发送请求包。接下来,用write()函数向串口发送一定字节数的请求包即可。
图5 串口通讯流程图
在接收返回包时,有时由于数据量大或速度较快造成串口缓冲区未能收到I/O模块发出的返回包,因read()函数没有一定的时间限制,在读取串口数据时很有可能串口缓冲区没有收全全部字节的返回包,这可能会使程序始终陷于read()函数中不能跳出,为解决这一问题,笔者采取的方法主要是以字节为单位逐字节地读取串口缓冲区的数据,并在读取每个字节之前用select()函数检查串口此时是否可读,这样可以有效防止串口在读取过程中阻塞的隐患,提高程序可靠性。
5 结语
本文以Modbus RTU协议为例,在组态及通讯等方面,探讨了基于RS-485总线的I/O模块在分散控制系统中的开放性设计。经过一定时间的测试及实际应用,实践表明基于RS-485总线的分散控制系统开放性设计可以有效降低成本、提高程序的可移植性和硬件的兼容性,极大地方便了用户在使用过程中根据需要选择适合的模块。另外,可热插拔、各种错误检测、容错功能等软件设计的优化,最大限度提高了系统软件可靠性和运行效率。今后,开放性的思想可以渗透到分散控制系统的各个环节,使之更好地为社会生产服务。
参考文献:
[1]周强.基于QNX的分散控制系统现场控制站软件设计[D].保定:华北电力大学自动化系,2002.
[ 2 ] 刘鑫. 我国工业控制自动化技术的现状与发展趋势[ J ] . 控制工程,2003,(6):16-24.
[3]王晓刚.集散控制系统的发展[J].贵州化工,2001,26(8):54-56.
[4]陈庆玲.现场总线对自动化领域的影响与发展趋势[J].轻金属,1999,(1):59-62.
[5]曾献辉.新型开放式集散控制系统[J].世界仪表与自动化,1999,3(2),39-40.
赵 斌(1987-)
男,河北保定人,现就读于华北电力大学自动化系,硕士研究生,主要研究方向为现场总线仪表设计与开发。
杜石雷(1988-)
男,河北保定人,现就读于华北电力大学自动化系,在读硕士研究生,主要研究DCS下位软件开发。
高 明(1969-)
男,江苏邳州人,高级工程师,中国大唐集团公司B级专家,主要从事火电厂优化自动控制研究。
孙海蓉(1972-)
女,博士,副教授,硕士生导师。研究方向为智能控制及其在工程中的应用、非线性控制,风力发电机组建模、网络化控制。
摘自《自动化博览》2012年第三期 |