刘林华, 张予祥
(上海船舶运输科学研究所 舰船自动化系统事业部,上海 200135)
随着计算机技术和微电子技术的不断发展,嵌入式系统开发技术得到广泛应用,各种性能优良的微控制器(STM32系列MCU和LPC系列MCU)逐渐出现。此外,随着主机遥控系统的自动化水平和各控制设备的网络化、智能化程度不断提高,传统意义上的单片机已不能满足遥控控制器的性能要求。相对于电子技术的快速发展,主推进装置技术的发展相对缓慢,但不同船舶主推进装置的配置有所不同(主机调速器不同、是否需接/脱排控制等),造成系统开发各不相同,严重影响着主机遥控系统开发的周期和产品的质量。
传统的开发方法是不采用任何操作系统,仅采用主循环和中断模式开发,这类系统一般控制对象比较单一,控制过程比较简单,采用操作系统反而会影响效率。随着MCU硬件资源越来越丰富,程序功能越来越多样,引入FreeRTOS嵌入式实时操作系统不仅能更有效、更合理地利用现有的中央处理器(Central Processing Unit,CPU)资源,而且能简化应用软件的设计,缩短应用的开发周期,保证系统的可靠性和实时性。
基于上述情况,本文采用LW_OOPC面向对象的设计方法,抽象并提炼出控制对象的基本属性和行为,设计出一套基于FreeRTOS+ARM架构的遥控控制器,增强软件代码的复用性,缩短系统开发的周期,提升产品的质量。
船用主机遥控是指在驾驶室或集中控制室内对主推进设备进行远距离操纵,是船舶机舱自动化体系的一个重要组成部分。可靠的船用主机遥控系统可极大地改善轮机员的工作条件,提高主机运行的可靠性和经济性,以及船舶航行的安全性。船用主机遥控系统涉及的控制内容较多,不同的控制等级和主推进设备配置造成不同主机遥控系统的控制功能迥异。
遥控控制器作为主机遥控系统的核心部件,主要负责控制逻辑运算、控制策略实现和控制输出等。表1为主机遥控控制器的基本功能,在具体实现时,根据主推进设备的配置和规范要求的控制等级对这些功能进行删减。
表1 主机遥控控制器的基本功能
本文以某型船为原型设计遥控控制器,基本要求如下:
1) 主推进装置配置为主机、齿轮箱和调距桨;
2) 调速器为电子调速器,具有后备控制功能;
3) 控制位置为驾驶室、集中控制室和机旁;
4) 需实现表1中给出的接/脱排控制以外的所有控制功能。
为实现遥控控制器控制功能,采用ST公司的STM32f107作为主控芯片。STM32f107是STM32互联型系列微控制器中的一款性能较优的产品,采用32位ARM Cotex-M3内核,72 MHz运行频率,具有快速可嵌套中断,同时集成有各种高性能工业标准接口和外设(2个12高速AD、2个12位DA、2个I2C接口、3个SPI接口和8个定时器等),满足遥控控制器实时控制性能要求。遥控控制器由控制核心板、母线板和控制扩展板组成,其中:母线板为控制核心板和控制扩展板提供物理连接;控制扩展板提供扩展IO接口,对外采用D型插头连接,提升控制器的可靠性和环境适应性。遥控控制器核心板硬件原理图见图1,该控制器可提供4路频率信号采集通道、8路模拟量输入信号采集通道、4路4~20 mA电流输出通道、24路开关量采集通道、4路CAN总线通道和2路两线RS485总线通道。
图1 遥控控制器核心板硬件原理图
软件设计主要分为3部分:
1) 在STM32f107上实现FreeRTOS的移植;
2) 分析控制对象的属性和行为,利用LW_OOPC宏技术对各控制对象类进行设计;
3) 在嵌入式实时系统FreeRTOS中对各任务功能进行组织划分设计,实现系统功能。
FreeRTOS作为一款轻量级操作系统,提供有任务管理、时间管理、信号量管理、消息队列和内存管理等功能,具有源码公开、可裁减、可移植和调度策略灵活等特点。该移植主要针对STM32f107系列芯片,采用的编译软件是keil4。移植的主要内容集中在portmacro.h和port.c 2个文件中,其中:portmacro.h文件包含与编译器相关的数据类型的定义、堆栈的增长方向、时钟节拍的定义、相关的宏定义和函数声明;port.c文件包含移植的相关函数和汇编函数,主要包括堆栈的初始化函数、系统心跳管理函数、任务调度器的启动函数、任务切换函数、临界区的进入与退出函数和中断设置函数等。
在面向对象的思维下,软件由一群有智慧、善传递信息的对象组成。遥控控制器的控制对象是主机(含调速器)和调距桨,并与安保控制器进行信息交互,需抽象出以下类,并分析其属性和行为(见表2)。LW_OOPC的本质是运用C语言宏技巧,巧妙地利用函数指针和struct结构实现面向对象的基本技术。利用LW_OOPC宏技术进行系统分析设计,可使UML模型与C程序紧密对应,进而提高C程序的质量。
表2 遥控控制器控制对象
图2 遥控控制器程序任务关系
遥控控制器采用FreeRTOS嵌入式实时操作系统架构设计开发。为保证应用软件多任务处理的实时性和可靠性,需合理地将程序的各功能模块划分为不同任务,同时使用FreeRTOS消息队列和互斥信号量机制设计各任务间的通信接口,实现任务间的通信。遥控控制器程序任务关系和任务分配分别见图2和表3。
表3 遥控控制器程序任务分配
主程序任务作为控制程序的核心,接收输入处理任务处理的操作指令和设备状态参数,经过内部逻辑运算和优化处理,由输出任务输出指令对各设备进行控制。为合理组织主程序任务程序结构,保证主机、调距桨和安保控制器对象有序运行,设计出controller对象对各对象进行协调指挥,以构成层级式控制架构。controller类根据操作人员的指令和设备的运行状态向各对象发出指令信号。
下面对遥控控制器程序中主程序任务的设计与实现进行讨论。通过UML类图设计、接口分析和状态机分析等技术对各类实现功能和接口进行分析实现,并利用cotroller类进行组装运行。输入输出任务和CAN通信任务等仍采用面向过程的结构化程序设计,这里不作展开分析。
赋予对象人性是面向对象的关键步骤。软件由一群有智慧、善传递信息的对象组成,这些对象担负着主动提供服务的责任,支持整个软件系统的功能。一旦开发人员分析出对象的属性和行为并确定类,即可根据类生成软件对象。遥控控制器程序需实现的类见图3。
图3 遥控控制器程序需实现的类
在控制软件运行过程中,各对象会在不同状态之间转移。例如,主机可分为停机、启动过程、运行和停机过程等4个状态(见图4)。采用State模式设计,将每个条件分支放入一个独立的类中(见图5),由此可根据对象自身的情况将对象的状态作为一个对象,且该对象可不依赖其他对象独立变化,提高系统设计的弹性。
图4 主机状态图
图5 主机状态类图
“信息传递”作为对象之间互相沟通的管道,在本质上是通过函数调用实现的,只是函数是被对象封装起来的。当对象A传递信息给对象B时,意味着对象A中的某个函数调用对象B中的某个或多个函数,具体调用对象B中的哪些函数,由对象B根据实现功能内部判定。以controller、engine和governor对象为例分析对象间的“信息传递”见图6。
图6 controller、engine和governor对象间的“信息传递”
主程序任务是控制器软件的核心,实现对各控制对象控制功能的逻辑运算。采用LW_OOPC宏技术对类进行封装,使主程序代码更简洁,逻辑更清晰(见图7)。各类在不同的头文件和C文件中实现,功能的变更仅需通过更改各类的子函数来实现,涉及面小,更易维护。
图7 主程序任务代码
本文采用LW_OOPC面向对象的编程思路,基于FreeRTOS+ARM架构设计出一套船舶主机遥控的遥控控制器。该遥控控制器已在某学校定制的主机遥控系统培训系统中得到实践运用,运行状态稳定。对于后续的系统开发而言,可有针对性地设计实现控制对象类,提高软件的复用性和可靠性。本文在LW_OOPC框架的基础上对实现该遥控控制软件的封装进行了初步探索,下一步将利用面向对象的编程常用的设计方法对控制软件进行深化和改良。