文/王先鹏 王开明
(贵州航天凯山石油仪器有限公司 贵州省贵阳市 550009)
井场RTU 是油气井生产物联网系统的控制核心,对整个数据采集系统进行协调和管理,把各智能传感器采集到的数据传输到站、厂,并根据站、厂的要求对各个智能传感器以无线通讯方式发送控制命令,从而实现抽油机井数据采集和控制管理功能。
井场RTU 以ATMEL 公司8 位AVR 单片机ATmega128L 为核心设计的嵌入式系统,移植有μC/OS-II 实时操作系统,预留有丰富的接口,可通过通信接口扩展连接其它测试设备,具备较强的可扩展性。
在油气井生产物联网系统中,遵循一套井场RTU 管理一个丛式井场(长庆油田井场有抽油机井1 至10 几口井数量不等)的设计原则:即每个井场安装井场RTU 一套,单井各安装示功图传感器、电机智能参数传感器一套,还可以扩展注水阀组单元、温度和压力采集传感器等。
井场RTU 与各类传感器在系统设计上遵循“分散采集、集中控制”设计理念,示功图传感器、电机智能参数传感器、无线压力变送器和无线温度变送器等智能数据采集监控设备传感节点为系统设计的“分散采集”部分,采集油水井各种物理参数;井场RTU为系统设计的“集中控制”部分,集中管理各种分散采集部分的传感器节点。
井场RTU 以8 位AVR 单片机为核心设计的最小嵌入式系统,移植有μC/OS-II 实时操作系统,预留了丰富的接口,具备较强的可扩展性。
井场RTU 通过AD 转换器完成模拟量的数据采集,通过IO 接口判断开关量的输入输出。井场RTU 与各类传感器之间通过无线通信模块(或采集接口)实现点对点或一点对多点的无线方式通讯;与服务器通过RJ45 接口,实现数据的交互。在工作过程中,井场RTU 起到桥梁纽带的作用,它实时将各类传感器采集到的数据传输到站控PC 机或服务器端;井场RTU 与各类传感器通讯时,RTU 相当于RS485 总线的主站,各类传感器是RS485 总线的从站,RTU 与各类传感器之间采用主从通信方式,通讯协议采用Modbus RTU 传输协议。
在井场RTU 的嵌入式系统设计过程中硬件的驱动程序使井场RTU 的硬件的发挥了最优的状态,应用程序通过调用驱动程序完成与硬件相关的所有操作。驱动程序的编制与所使用的CPU 类型、外围的硬件相关,在这里不是本论文讨论的重点。
2.1.1 功图测试
定时测试井场中每口油井的示功图。定时向示功图传感器发送功图测试命令,然后与功图传感器通信,获取测试后的实测功图数据保存于RTU 中,同时将测试结果发给服务器。
2.1.2 电参数测试
定时测试井场中每口油井的电机运行参数。定时向电机智能参数传感器发送电参数测试命令,然后与电机智能参数传感器通信,获取测试后的实测电机运行参数数据保存于RTU 中,同时将测试结果发给服务器。
2.1.3 注水井数测试定时测试井场中注水井的注水压力、流量、配注等参数,并将测试结果保存在RTU 中,并同时将结果上传至服务器。
2.1.4 井场汇管压力测试实时采集井场汇管压力参数,并将测试结果保存在RTU 中,并同时将结果上传至服务器。
2.1.5 实时命令功能实时接收上位机发来的采集、控制等命令,进行相应的参数测试及设备控制等功能。
以往的程序编制方式是采用前后台面向过程的编程方式,采用μC/OS-Ⅱ嵌入式实时操作系统后,编程方式变成了基于事件驱动的编程方式。怎样将RTU 复杂的功能一一简化成简单的事件就是井场RTU 仪器软件的设计思想。
何为事件驱动,顾名思义,当一个事件发生了,任务再作相应处理,处理结束后又开始等待下一个事件的发生。如此周而复始的任务处理模型就是“事件驱动的编程模型”。μC/OS-Ⅱ嵌入式应用程序是由任务组成的,任务都必须符合事件驱动的编程模型,即μC/OS-Ⅱ的应用程序都必须是“事件驱动的编程模型”。一个任务首先等待一个事件的发生,事件可以是系统中断发出的,也可以是其它任务发出的,又可以是任务自身等待的时间片结束。事件驱动模型也涵盖了中断驱动模型,μC/OS-Ⅱ事件归根结底来自三个方面:
(1)中断服务函数发送的事件;
(2)系统延时时间到所引起的;
(3)其它任务发送的事件。
其中“中断服务函数发送的事件”就是指每当有硬件中断发生,那么中断服务程序就会以事件的形式告诉任务,而等待该事件的最高优先级任务就会马上得以运行;“系统延时时间到所引起的”事件其实也是硬件中断导致的,那就是系统定时器中断。而“其它任务发送的事件”则是由任务代码自身决定的,这是完全的“软事件”。不管“软事件”还是“硬事件”,引起μC/OS-Ⅱ任务切换的原因就是“事件”,所以编写应用程序的时候一定要体现出“事件驱动的编程模型”。
如果想了解多任务操作系统,首先必须了解任务概念。所谓任务,也称作线程,是一个简单的、无限循环的程序,该程序可以认为CPU 完全只属该程序自己。实时应用程序的设计过程,也就是如何把问题分割成多个任务的过程,每个任务都是整个应用程序的某一部分,每个任务被赋予一定的优先级,有它自己的一套CPU寄存器和自己的栈空间。
任务划分存在这样一对矛盾:如果任务太多,必然增加系统任务切换的开销;如果任务太少,系统的并行度就降低了,实时性就比较差。在任务划分时要遵循H.Gomma 原则:
(1)I/O 原则:不同的外设任务不同。CPU 的操作快于I/O 操作,如果将I/O 操作归为一个任务顺序执行则会很浪费时间。
(2)优先级原则:对于突发事件的优先级等价于事件的时间耗尽线,不同优先级处理不同任务。
(3)大量运算:归为一个任务。
(4)功能耦合:归为一个任务,举例:f(),g(f()),h(g(f()))。
(5)偶然耦合:归为一个任务,举例:f1(),f2(),f3()。即事件之间并没有必然的先后顺序,但由于习惯一直是按这个顺序做的。
井场RTU 在油气井生产物联网系统中所实现的功能,将井场RTU 仪器软件划分成7 个任务,分别详述如下:
(1)命令解析任务(CMD_Explain_Task):负责解析串口0 发送来的数据,将解析出的完整一帧命令放入命令缓冲队列,并向命令执行任务发送命令事件触发信号量COMMAND_COM0_SEM,通知命令执行任务有事件需要处理。
(2)命令执行任务(CMD_Execute_Task):上位机(服务器端软件)通过RJ45 网络接口,发送给RTU 的所有控制命令(手动功图测试命令除外),都是通过此任务来完成的。此任务平时处于挂起态即等待命令事件触发信号量COMMAND_COM0_SEM 事件发生,当得到命令事件触发信号量时命令执行任务处于就绪态准备开始执行。
(3)手动功图测试任务(Manual_GT_Test):功图测试所需要的时间较长而且与抽油机的运行快慢有关,冲次较快的抽油机井测试时间较短,冲次慢的所需时间较长。如果将此功能放入命令执行任务中来完成,会因此功能长时间的占用CPU 的使用权而其它功能得不到实时的执行而影响整个RTU 工作的实时性。将手动功图测试功能独立划分成任务后赋予较低的优先级,这样优先级较高的任务可以剥夺优先级较低的任务对CPU 的使用权,可以立即执行,因此不会由于功图测试时间较长而影响整个系统的实时性。
(4)功图巡检任务(GT_Test_Task):即定时测试功图任务。井场RTU 的时钟节拍中断(OSTickISR)每10ms 产生一次,时钟节拍是特定的周期性中断。这个中断是μC/OS-Ⅱ系统心脏的脉动。功图巡检任务利用时钟节拍的10ms 时间基,根据EEPROM 定时测试时间常数,每隔一定时间产生一次功图测试事件即功图测试信号量(GTTEST_SEM)。功图巡检任务由于得到功图测试事件(功图测试信号量GTTEST_SEM)发生进入就绪态准备开始执行。此任务不同于手动功图测试任务中进行的功图测试,它是针对一个井场所有抽油机井的功图测试,而手动功图测试任务是针对某一口抽油机井的。
(5)电参巡检任务(DC_Test_Task):和功图巡检任务一样电参巡检任务也是利用时钟节拍中断(OSTickISR)产生的10ms时间基,根据EEPROM 定时测试时间常数,每隔一定时间产生一次电参测试事件即电参测试信号量(DCTEST_SEM)来完成一次井场中所有的抽油机井的电参数测试。
图1:井场RTU 仪器软件的工作框图
(6)数据发送任务(SendDataToPC_Task):井场RTU 通过串口转以太网向上位机发送数据,如果有任务需要向上位机发送数据,必须先向数据发送任务申请对串口0 的使用权。数据发送任务(SendDataToPC_Task)负责将系统中各任务打好的数据包发送给上位机。因串口0 为共享资源,且属于外设,与CPU 的处理速度相比串口0 的通讯速度较慢。
(7)主从通讯服务任务(OSTaskModbusServe):该任务负责处理主从通讯方面的主站与从站之间事务处理。主从通讯服务任务(OSTaskModbusServe)是RS485 通讯主站的核心组成部分,它负责Modbus RTU 协议中的ADU 报文帧的调度和Modbus 主从通讯方面的事务处理。该任务主要处理的事件:发送请求帧、等待应答帧、处理应答、处理差错和等待转换延时。该任务通过API 函数ModbusPoll 为μC/OS-Ⅱ系统中各任务的Modubs 请求提供服务。
井场RTU 仪器软件中的7 个任务分别由7 种不同的事件驱动的,如图1 所示。正是由于这些不同的事件组成了事件驱动模型的编程方式。此种编程方式结构清晰、层次分明,非常适合复杂的嵌入式系统开发。
8 位CPU 系统的井场RTU 引入了μC/OS-Ⅱ实时嵌入式操作系统开发嵌入式软件,并在任务划分上采用了事件驱动的编程思想,它以多任务模块化编程,设计出了满足嵌入式实时操作系统性能要求的事件驱动机制。通过对这种机制的分析,让我们可以更深入地理解实时操作系统设计的独到之处。在油气井生产物联网系统中,井场RTU 引入了实时操作系统μC/OS-Ⅱ的设计理念使其嵌入式软件可靠性、稳定性和可扩展性得到了很大的提升,并且在长庆油田的数字化项目应用中得到了较好的验证。