系统软件模块

2024-10-18

系统软件模块(通用9篇)

系统软件模块 篇1

1. 引言

本照明监控系统根据宜宾职业技术学院A1区的校区大小及楼宇布局进行设计。该校区教学区所包含的楼宇有:办公楼、教学楼、实训楼、图书馆。将监控中心设置在办公楼中, 其余楼宇离监控中心的监控距离都小于1200m, 因此采用RS-485的总线结构, 即可满足监控系统的要求。

2. 照明监控系统的总体架构

整个监控系统的通信网络由RS-485网络构成。上位机端采用ADAM-4520模块实现RS-232转RS-485接口, ADAM-4017是8路模拟量输入模块。在系统中用于实时的检测每个回路的电压电流值, 并当电压发生异常时可以实时的报警。ADAM-4050是8口的输入输出通道, 在本系统中既要测试各个灯组的开关信息还要能够针对各个灯组的开关控制。系统的控制结构是监控中心与ADAM-4000系列的I/O模块的连接示意图, 如图1所示。

3. 监控中心数据控制

监控中心由照明监控软件、数据库、计算机外设等组成。将监控整个教学区的照明灯组。本系统主要采用RS-485网络完成监控任务。由计算机发出监控命令给下位机读取执行, 再由下位机反馈相关命令给监控中心, 由监控中心监控管理。照明监控中心与控制端模块按应答方式工作, 因为应答式规定允许多台下位机以共线的方式公用一个通道, 有助于节省通道, 提高信道占有率。而且采用变化信息传送策略, 大大压缩了数据块长度, 提高了数据传送速度。

监控系统一旦运行, 立即对串口进行初始化, 并打开RS-485总线的接收端口。此时如有指令发出, 则首先判断该指令是否完整, 如果完整再判断该指令地址是否正确, 否则对指令重新进行判断。地址正确后再通过校验判断该指令是否为正确指令, 如果不正确丢弃该指令, 正确即解析指令内容并存储解析命令, 指令完成后可以清空数据接收区, 并使能RS-485总线发送端口, 按照响应的通信协议发送应答指令, 如果应答指令正确则完成此次操作, 关闭RS-485端口, 如应答指令错误则重新进行相应操作。其流程如图2所示。

4. 通信模块软件设计

4.1 ADAM-4050开关量控制模块软件设计

该模块主要完成的工作是对每个教室中灯组的开关情况进行控制。其开关量控制流程图如图3所示。监控系统一旦运行, 则会定时读端口并对其进行分析, 教室中的灯组是打开或是关闭状态。对监控中心进行开关灯操作, 即判断是否有触发事件, 如无触发事件, 监控中心仍定时读端口并分析其状态, 如有触发事件, 则发送开关灯控制命令, 再判断是否收到应答命令, 或应答命令是否正确。如果收到正确的应答命令则完成开关灯的操作, 如未收到应答命令或应答命令不正确, 则不操作该次触发事件。

4.2 ADAM-4017数据采集模块软件设计

该模块主要完成的工作是对电压传感器采集电压数据, 对电流传感器采集电流数据。是下位机软件的核心部分之一。本系统每2s读取一组电压值和电流值, 因此需要使用定时中断的方式对数据进行采集, 中断通过使用ADAM-4017内嵌实时钟 (RTC) 产生时钟信号, 每2s定时读取一次电压传感器和电流传感器中的数据。每个ADAM4017连接一个电压传感器, 其电压数据读取的流程图如图4左图所示。和电压采集不同, 每个ADAM-4017连接多个电流传感器, 因此其数据采集如图4右图所示。

如图4左图所示为电压值检测的流程图, 监控系统一旦运行, ADAM-4017内嵌实时钟 (RTC) 重置时钟信号, 使定时器时长为2s, 并初始化电压传感器。要读取电压值, 则需要判断是否收到读取指令, 如果收到则发送读取指令, 再判断是否收到响应的应答指令, 如应答指令正确, 则读取电压传感器的数值, 在监控端把读取值转换为实际电压数值并显示出来。

如图4右图所示为电流值检测的流程图, 和电压检测不同在于, 每间教室只有一个电压传感器检测电压, 而每间教室有四个电流传感器来检测不同的回路电流。因此电流值读取的大小是多路闭合回路电流值之和。

4.3 智能电表数据采集模块软件设计

本系统除了电压值电流值的读取外, 还安装了一个智能电表用来读取整个校园的电费和电量值。其数据采集流程图如图5所示。其电量读取过程和电压读取过程相似, 电费是通过电量读取计算而得的。

5. 结束语

本文确定了在该照明监控系统中所要使用的通信I/O模块有:ADAM-4520、ADAM-4017、ADAM-4050, 以及电量/电费采集使用的智能电表。本系统通过ADAM-4000系列完成系统中的通信过程, 本文针对各个通信模块做出其软件设计, 对系统的通信功能的实现做作了相关的研究和分析。

参考文献

[1]余立建, 王茜.网络化测控技术原理及应用[M].西南交通大学出版社.2010.

[2]李景峰, 杨丽娜, 潘恒等.Visual C++串口通信技术详解[M].机械工业出版社

[3]田敏, 郑瑶, 李江全等.Visual C++数据采集与串口通信测控应用实战[M].人民邮电出版社

[4]王震, 廉哲.RS232/RS485串行通信转换电路[J].电子世界:2003 No.1:55-56

[5]胡玮, 魏伟.RS232与RS485串行接口转换电路及其编程实现[J].万方数据库.实验科学与技术[J]:2010No.2:69-71

系统软件模块 篇2

模块负责人通过详细设计完成:细化和确定模块的功能(包括异常处理需求)、识别关键问题和实现策略与流程、以及主要静态类和线程结构设计等。

详细设计完成并通过评审之后,模块负责人根据详细设计指导,进行编码并实现模块。

需要指出的是即使详细设计,但一般只是初步设计了主要的类和线程结构,以及一些比较大方面的异常情况处理。虽然可能不同的人完成的详细设计的细致粒度存在差别,即使是设计比较细致的详细设计一般不能到达可以直接根据详细设计自动生成代码的粒度,当然个人认为类和线程结构等实现方面的设计也没有必要太过细致,要把握好度,不要太过也不要不够。因此即使在编码和实现阶段其实也存在大量的设计工作,此时设计的粒度较为细致,一般是类级别的详细设计和编码实现(包括详细划分和确认类的功能规格说明书,并实现类的功能)。

虽然个人认为在详细设计阶段类和线程结构等实现方面的设计不必要太过细致,但是对模块功能规格(包括异常处理需求)的确认和细化一定要尽可能细致和想全。对关键问题和实现策略也一定要尽可能的细致和想全。对实现方面的类和线程结构设计能够想细还是细的为好,即尽量想细一点为好。所谓“谋定而后动”,只有先设计好了,想好了后面才能少出错。

根据上面论述,我们可以得出不管是详细设计还是编码实现都包括两个阶段工作:首先确认和细化功能规格,然后是实现功能规格。对详细设计而言是确认和细化模块的功能规格,并初步设计如何实现模块功能。对编码实现而言是确认和细化各个类的功能规格,然后实现各个类功能,最终实现模块功能。

而导致模块质量不高的主要原因是整个开发过程,没有明确地区分“确认和细化功能规格”和“实现功能规格”两个阶段,很多开发者的开发过程是两个过程混在一起,整个过程属于没有明确方向和不断变化的状态,恶果是导致很多例外情况没有考虑到并进行妥当处理,最终导致大量BUG的出现。具体表现如下:

详细设计时,模块功能需求确认不够细致,甚至是一直到编码实现阶段都是处于模糊状态,导致很多情况没有想到。例如各个对外提供接口的功能细节,特别是在一些异常情况下的返回值细节或者响应细节都不是很明确。

详细设计时,不仔细考虑会存在哪些异常情况,以及设计相应异常处理措施,导致在设计阶段很多异常根本没有考虑。详细设计时,不识别模块实现中关键问题,导致很多关键实现策略要到编码时才确定,但是由于编码时一般思维焦点是当前类,导致确定实现策略时缺乏全局考虑,同时加上还要考虑如何实现,因此会导致采用不是最优的或者是错误的实现策略。详细设计时,类、类状态变化、线程结构设计等考虑太粗。由于详细设计时能不考虑具体实现,会忽略一些细节,这样更能集中精力从整体和全局来考虑一些关键的实现策略和以及类和线程结构设计。而实现阶段一般更加关注细节,但只关注当前类细节和局部细节,因此详细设计时类、类状态变化、线程结构设计等考虑太粗会导致这些问题遗留到开发阶段,使得整个编码过程混乱,最终很多例外情况想不到。至少要保证详细设计完成后,模块开发者能在自己大脑里面把模块跑起来。

编码实现阶段,还没有制定清楚每个类、类方法的详细功能规格说明(即要处理哪些情况,异常情况下如何处理等)的情况下,就开始编码实现。明确区分两个阶段的好处是每次大脑只需要集中精力考虑一个方面问题,这样大脑考虑问题会比较轻松,使得问题能够容易想全,出现纰漏的概率要小一些。

1详细设计过程明确划分为两个阶段

第一个阶段是明确模块的需求,能够以详细的功能规格说明书的方式,明确模块的功能需求,重点考虑模块要处理哪些例外和异常情况,尽自己最大努力把情况想全。

例如对本模块对外提供的接口要详细写清楚,各种输入参数情况下的行为是什么,以及返回什么值。对本模块要调用的外部接口,要写明白本模块要求的响应是什么,以及调用失败情况下的处理策略等。

此阶段同时要描述清楚本模块运行环境包括:与周围模块交互描述、对内存以及磁盘的要求等对外围环境的需求、模块部署方式(多机并发部署、还是单节点运行)等。注意此时只集中精力考虑需求,不要考虑如何实现。

第二阶段是设计中的实现阶段。此阶段要求必须包括有:关键问题与实现策略、主要静态类图设计和说明(主要类、主要方法说明)、线程结构说明(包含哪几类线程、每类线程个数、每类线程职责、每类线程会访问到的类和对象等,如果比较复杂则要说清楚为什么这些设计,设计目标是解决什么问题)、在线程结构基础上描述互斥策略以及线程间关系等、主要的处理活动图(个人推荐更多使用泳道图,能更直观看到对象之间的职责划分和交互过程)。如果类对象的状态比较多,则建议采用状态机图的方式描述清楚,并通过审查状态机变化来检查是否有情况没有处理。

2编码阶段建议采用三个步骤

先想清楚,并写出类和每个方法详细功能规格说明(可以先把类名和方法名写好,然后以注释的方式把类的职责、关键实现策略、以及每个方法的功能规格说明<重点是例外和异常情况的处理与返回值>)。根据规格说明中列举情况,写出相应测试代码。编写实现代码,并通过测试。编写模块功能规格说明书,重构代码经过编码阶段之后,模块功能已经非常明确了,此时应该细致、清楚地编写模块功能规格说明书。原因如下:

1)模块功能规格说明中描述的功能会比详细设计中更为细致和清楚。另外经过编码阶段,此时模块实现的功能可能与详细设计时考虑的模块功能在细节方面可能会有些变化。项目描述本模块的功能说明,可以方便自己和其他人日后进行系统维护工作。

2)通过编写该功能规格说明可以弥补详细设计万一考虑不细情况下,一些例外和异常情况是否处没有处理或者处理不周到。由于在详细设计阶段,设计出模块的类和对象构成以及运行机制还是有一些模糊,因此很可能存在某些例外、特别分布式情况下某些状态组合没有考虑到的情况发生。但是在编码阶段,由于一般只会关注当前类和当前的方法的实现,因此考虑问题一般比较局部。为此在完成整个模块编码后,所有细节都已经明确(特别是在写代码过程中会发现存在一些新的异常情况需要处理<详细设计时没考虑到>),此时必须再一次从整体来考虑模块运行起来后在处理逻辑是否有缺陷,这样能更早发现以前设计中缺陷,避免上线后才发现缺陷。此时重点考虑是否还有情况没有考虑到或者某些处理不到位。

很多BUG难以发现和定位原因是在不同类和对象之间的发生交互和联系后,组合排列后的情况非常多,从而想不到某些组合。这种BUG只有从整体考虑、考虑不同类和对象之间交互关联后才可能想到。模块详细设计指南与规范

模块详细设计要完成两个方面工作:一是明确模块的功能需求和非功能需求、二是设计如何完成和实现模块的功能需求,包括类结构、线程结构设计等。本节根据后台模块特点,描述了两部分工作需要考虑和设计的关键点。

3.1确定模块的功能规格

1)本模块概述

概述主要描述了本模块所属子系统,以及在子系统中所承当职责的简单描述。2)本模块在系统中与周围模块关系和交互情况 很多模块一般要依赖周围的模块或者数据库,为此建议以图形方式描述本模块与本模块依赖的其他模块或者数据库之间交互情况。交互方式主要包括: 基于接口调用的交互、基于数据流的交互,直接访问数据库。

基于接口交互要描述:接口实现方式(ICE、WCF等)、接口调用目的、以及什么时候调用等。

基于数据流交互要描述:传输数据类型,传输方式等。对数据库或者存储要描述:需要访问的数据库名称、表格名称以及表格存储数据含义、访问数据库中表格的目的等。

3)本模块部署角色以及对基础软硬件要求 描述本模块将要部署的角色、部署模式、对操作系统要求、对基础软件要求、对硬盘要求、对内存要求等。

部署模式主要考虑是分布式多机部署、还是只会单实例部署。操作主要考虑需要对操作系统版本的要求。

基础软件主要包括:jdk版本要求、需要安装其他基础软件以及版本等。对硬盘要求:是否需要临时存储、大概需要多大(尽量能不用存储就不用)。对内存要求:大概需要多大内存等。4)本模块所处理数据的数据格式描述

对数据预处理模块,描述本模块对待处理数据的格式的假定和要求。5)本模块调用接口描述

详细描述清楚需要调用接口:接口名字、参数类型、参数单位、接口功能、接口执行时间要求(超时处理)、分片传输(消息大小限制导致分片传输需求)。接口功能部分重点要描述清楚异常情况下接口返回值和应该执行操作,例如调用的接口是否会返回NULL等。

6)本模块功能性需求描述

以功能点方式详细描述本模块功能。

如果是涉及对外提供接口的,明确描述:接口名字、参数类型、参数单位、各种输入参数下预期行为和返回值、接口应该满足执行时间要求。

7)例外与异常情况下描述与处理要求

详细考虑本模块第2)、3)、4)、5)中所描述本模块依赖的外部环境不满足本模块要求情况下的处理方式。

3.2设计与实现部分

1)关键问题与策略

只要有一点复杂或者难度模块的设计工作都会存在几个有难度或者关键问题去解决,这些关键问题的解决方案好坏决定了整个模块实现质量。一般而言这些关键问题解决方案会有多种,并且有好有坏,且会存在较大争议。相反一般非关键点设计就比较没有异议。关键问题与策略是开展设计评审的重点。模块设计评审就是审查两点:是否存在有些关键问题没考虑到、二是每个关键问题的解决方案是否是最优的。因此要求模块设计人员,在确认了功能规格后,第一件事就是要考虑本模块设计中存在哪些关键问题,然后再思考对应解决方案。在确定了所有影响比较大的关键问题的解决方案之后,剩余的类结构设计和线程设计等就会比较顺利。

此部分要求设计人员要反复问自己:一是否所有值得斟酌的问题都想到了、二目前设计的策略是否是最好的(好的策略一般是简单策略),要敢于否定自己已经设计好的策略。

衡量优秀实现策略的标准是:“用最简单方式满足最重要需求”。后台设计过程中要避免的事情是:不要为了某个不常用、但是听起来很美好的功能点导致设计很复杂。有时候为了模块运行简单和稳定,宁肯不要太完美。特别是很多时候很多需求是矛盾和有冲突的,作为设计人员一定要能识别哪些是主要需求,哪些是次要需求。

例如某全文检索检索模块,第一版本为提高检索性能,设计了检索结果缓存功能。但是实际使用过程中发现缓存命中概率很低,而这个功能导致整个模块设计复杂很多。

2)静态类结构设计 类结构设计,主要设计出本模块主要类以及类之间的关系,并利用类图的方式表达出来。

在静态类结构设计中,除类图外,还需要对各个类的职责分工,以及类中主要的方法要进行描述。另外要仔细考虑哪些类是主动类。

在静态类结构设计好坏,主要取决与设计人员面向对象设计的能力。要求设计人员考虑以下几个方面:

是否可以采用现成的设计模式。

是否违反了面向对象的几个原则:单一职责原则、开放封闭原则、替换原则、依赖倒置原则、接口隔离原则。

为了提高自己此方面设计能力,希望大家多看一些面向对象设计方面的书,以及一些经典优秀开源软件的结构,能真正领会设计模式和面向对象的几个原则的精髓,并能指导自己模块类结构设计。

另外如果感觉自己负责多个模块存在重复部分,例如感觉可能几个模块大的处理步骤基本相同,只是在处理细节上不同,则可以考虑将其中相同部分抽出来设计成一个具备一定通用性的框架或者共用代码,并贡献出来。

3)线程结构与同步互斥策略设计 后台模块一般会涉及多线程的处理,因此线程结构设计是后台组模块设计经常会遇到的问题。

线程结构设计必须描述以下几个部分: 包括那几类线程以及每类线程的职责

每类线程的个数

每类线程的启动和停止时间

线程间的协作关系:消费者-生成者关系、同步互斥、共享变量等。为了清楚描述和思考同步互斥问题,建议采用图的方式划出每类线程与每类线程会访问到公共对象,这样就能很直观识别出需要保护的对象,然后在详细设计和描述同步互斥策略。

线程结构设计基本经验是: 尽量减少线程间的交互。例如有三类线程,本来可能需要每类之间都要交互,则可以考虑以以某类线程作为枢纽,其他两类线程都和该线程交互,而其他两类线程之间不交互。

同步互斥在后台性能不是很重要情况下,可以考虑加锁的粒度粗一点。例如多个线程都要从一个队列取任务,并执行任务,且修改任务状态,则可以每次都锁整个队列,包括修改队列中某个任务的状态也变成队列类中的一个被同步保护的方法,而不是直接调用任务类的修改状态的方法。被同步互斥保护代码禁止有访问数据库、访问文件、调用远程接口等操作,必须都是只访问本地内存的操作,确保不会长期被锁住。被同步互斥保护代码只应该是“控制”代码而不能是“干活”的代码。

4)主要执行流程

描述本模块所需要处理的主要业务事件对应的处理过程。建议多采用泳道图来表示,好处是能直观的看到各类在该业务处理过程中的职责,方便设计人员对类的职责进行调整。

5)模块配置项设计

模块配置项设计主要为提高模块通用性,减少模块修改,让设计人员多考虑将很多参数作为配置而不要写死。

对于配置项考虑:

哪些配置项是全局配置、哪些配置项只是本模块需要读的。哪些配置项和建设方案有关、哪些配置项和建设方案无关。对全局配置项和与建设方案有关的配置项,应该放入到系统配置中去。方便系统部署时,可以实现设备安装与建设方案无关,实现设备安装程序标准化。

3.3与应用运维相关的考虑

为了与即将实现的应用运维系统进行对接。每个模块在设计时要考虑两个方面问题:一是如何从模块外面对模块运行状态进行监控,以及判断模块是否正常运行的标准是什么;二是如果是因为外部环境无法满足本模块要求,则在日志里面表达清楚。代码编程指南与过程规范

强烈建议采用测试驱动的模式来完成代码编程。测试驱动开发中编写测试代码目的是利用测试代码来描述和确认类的功能规格,然后编写实现代码来实现测试代码规定的功能规格并利用测试来验证编写的代码确实是符合事先设计好的功能规格。

根据前面的阐述,在详细设计时是不可能把每个类设计的很细,也就是每个类很细致的功能规格是没有设计好的。此部分工作是留在代码编写阶段来完成的,即在代码编写阶段包括:类功能规格设计和实现。

大部分开发者在编码时其实是在一边在编码实现、一边在确定类和方法的功能规格,并且会不断的调整(有时候会因为突然想到一种以前没考虑到的情况没处理、有时候是为了代码实现简单等等)。此时由于大部分精力是在考虑实现,并且是局部的实现,很容易导致某些需要全局考虑的一些例外或者异常情况没有考虑到,从而出现BUG。通过测试驱动模式可以强制大家把第二部分所讲的两个阶段区分开。

4.1代码编写建议采取以下步骤

写代码前,先站在使用者角度考虑清楚将要实现的类功能规格。类分为高层类和低层类(例如数据库连接池代码,数据库连接池类属于高层类、数据库连接类属于低层类)。一般情况下会出现一个高层类和多个低层类组成一个内聚的包。在这种情况下,可以先写出整个包或者高层类的功能职责,然后逐步下低层的,也可以先写低层再写上层,具体过程看大家自己。因此不管怎么样,都会出现类职责调整的情况发生。编写类名和类中间的方法,但是不实现。

以注释方式,描述类的职责、本类一些关键或者复杂的策略(方便别人能读懂你的代码)、本类需要处理的情况(要求从设计上,每个类职责要单一,否则这里就会写的很复杂)。以注释方式,详细描述public方法功能规格,特别是各种异常和例外情况下的处理方式(此时还没有私有方法,类的职责是通过public方法来体现的)。

根据上述注释,以类为单位编写测试代码。实现各个方法,并通过测试。

4.2对于编写测试代码的建议如下必须先写测试代码

尽可能的去写测试代码

要以类的使用者角度来编写测试代码。

针对类的功能点来写测试代码,而不是针对方法

不要采取为每个Public方法编写一个测试方法的模式来编写测试方法。每个测试方法应该测试的是该类需要处理的某一种情况。因为类的一个功能点可能要涉及多个Public方法。

类似软件测试每个测试用例,都对应一个测试点一样。每个测试方法其实都是测试类的一个功能点。

例如:一个队列类,有pop和push两个public 方法。则不要写两个测试代码:一个是testPop,一个是testPush。

而是要站在使用者角度来考虑队列类的功能规格: 1)如果队列为空,则弹出空对象。2)队列应该保证先进后出。3)如果队列满,则Push失败。

然后针对以上三种情况,分别对应写出三个测试函数。模块功能说明编写规范5.1编写模块功能说明的目的编写完整个模块后,从模块整体思考和检查所实现的模块是否符合设计要求,以及在相应细节处理方面是否存在BUG,或者不合理的情况。方便开发人员和维护人员日后的维护

5.2功能说明内容及规范

编写功能说明时,由开发人员站在使用者角度来描述和重新审查模块

1、模块部署环境和与周围模块交互情况描述

以图方式描述本模块与周围模块的交互情况,以及部署方式。本模块调用的外部接口描述。

本模块对基础环境要求:内存、网络、磁盘等。

2、模块配置说明

配置文件设计理由,那些固定不变的,哪些是应对业务变化。仔细描述各个配置文件的含义

说明如何通过配置来对应业务变化

3、模块功能说明

详细描述本模块的功能点。对每个功能点,一般描述以下几个方面: 功能名

与该功能相关的配置文件中的配置项 处理流程 故障处理

可能存在的问题。

例如: 功能N:按比例删除老数据 相关参数

STORE_POLICY :各数据类型的存储比例

PARTITION_MIN_FREESIZE_GB:每个分区应该保留的剩余空间 DELETE_INTERVAL_MINUTE:老数据覆盖的触发间隔。

处理流程

1)判断是否所有磁盘分区的数据块都被扫描,如果存在退出 2)判断是否获取了所有磁盘分区的总空间TotalSpace,如果存在某个分区因故障无法获取,则退出。

3)针对本小组内每种数据类型执行下列步骤

4)根据块信息计算出本数据类型所有数据块的总大小UsedSpace 5)UsedSpace <(TotalSpace– 磁盘个数* minFreeSpace)* storagePer则退出类型处理

6)计算UsedSpace-(TotalSpace – 磁盘个数* minFreeSpace)* storagePer得到需要删除空间needDelSize。

7)依次删除登记表中本类型最老数据块,直到删除块总大小大于needDelSize,或者删除干净。

故障处理

1.被删除数据块不存在:删除逻辑直接返回删除成功。

2.被删除数据块删除失败(远程代理通讯失败、该分区目前不能访问、被占用无法访问等):将该数据块加入到“删除失败数据块列表”,定期重试。

3.磁盘分区故障: 导致从来没有成功获取过总空间,会导致所属小组会覆盖停止工作,导致没有成功扫过数据块,会导致所属小组覆盖停止工作。

4.MASTER重起,会导致“删除失败数据块列表”被清空,不过MASTER重起会扫描到所有数据块,并重新删除。

可能存在问题

1)实际数据块分布与MASTER记录不一致,导致错误删除老数据。例如有人手工删除了一块比较新数据。

2)有些删除失败数据块,会导致实际剩余空间不够。

4、模块故障诊断说明

模块故障诊断用于当开发人员不在时,维护人员可以根据此部分初步判断出模块工作不正常时的原因。

由于一般模块出问题,开发人员去维护,一般都是先检查是否是本模块依赖的其他模块或者环境不正常,如果本模块所依赖的环境和模块都正常,那么可能是本模块的问题。诊断说明里要描述所有的检查步骤。可以依次写出所有的检查步骤,每个检查步骤包括:

嵌入式测姿系统软件的模块化 篇3

英文引用格式:Tian Anqi,Jin Tian.The modularization of embedded attitude determination system software[J].Application of Electronic Technique,2015,41(7):26-29.

0 引言

随着全球定位系统的发展,姿态测量技术逐渐成为卫星导航应用领域研究的热点。姿态测量一般应用于卫星、航天器、载人机、无人机等高动态的载体上,这些载体要求姿态测量系统具有精度高、实时性强、安装方便等特点。嵌入式系统是一种完全嵌入到受控器件内部,为特定应用而设计的专用计算机系统,具有响应时间短、系统内核小、可扩充、可移植、实时和可靠性较强等优点。ARM处理器体积小,功耗低,成本低,性能高,执行效率高。目前,嵌入式测姿系统软件趋于成熟,但由于功能复杂,程序冗长,可操作性低。

近年来,利用全球导航卫星系统(Global Navigation Satellite System,GNSS)接收机载体进行姿态测量的技术已经逐步成熟,但随着接收机板卡种类、导航系统种类、姿态算法种类的增加,对嵌入式测姿软件的实时性、可用性以及可扩展性提出了更高的要求。2008年,荷兰代尔伏特理工大学实现了GPS单频单历元姿态解算系统[1]。2012年,该大学实现了多天线GNSS测姿系统[2]。2012年,澳大利亚科廷大学进行了多星座测姿试验[3]。2008年,北京理工大学设计了单基线测姿系统,并进行静态和动态试验[4,5,6]。2007年~2009年,上海交通大学完成姿态测量系统样机的研制[7,8,9]。2012年,中国卫星导航定位应用管理中心与54所联合研制了GPS卫星导航系统多频姿态测量系统[10]。

此外,国内外几大GNSS厂商均有相应的测姿产品。美国Trimble公司的BX982利用GPS/GLONASS/BD进行测姿,加拿大Novatel公司、比利时Septentrio公司利用GPS/GLONASS测姿。中国星网宇达研发BDS/GPS定向接收机,东方联星的TOAS100D利用双天线进行测向、PNS200-BGI利用BD/GPS/INS进行定位测姿。

综上所述,国内外针对姿态测量技术已经开展了较为深入的研究,相关姿态测量方法已经在姿态测量样机上开展了静态及动态实验验证,而本文将在之前的研究基础上重点进行嵌入式测姿软件模块化方法介绍并对其可用性进行实验验证。

1 软件模块化

由于程序需实现不同导航系统、不同接收机板卡、不同姿态解算算法的选择,且要求程序具有通用性及可扩展性,因此将其模块化。模块化即根据程序的流程和调用的顺序等将程序以功能为单位划分为一个个单元的形式,模块化后每一部分的功能划分很清晰,模块之间通过接口传递参数和变量,操作简单,可有效提高工作效率和程序的运行效率。

1.1 模块划分

测姿软件模块化后可设计为由1个主程序和7模块组成,主程序声明如何调用各个模块及界面显示;模块分别为:读数模块、解码模块、预处理模块、单点定位模块、RTK定位模块、模块测姿模块、结果处理模块。

1.2 模块功能

主程序的功能为调用各个模块并进行导航系统、接收机板卡、频点的选择以及界面的显示。读取二进制数据流模块可进行二进制文件数据以及二进制串口数据的读取,此模块需使用多线程模式处理多个终端的数据流。解码模块将二进制数据流进行解码,可兼容OEMStar、BDM605、BDM670等型号接收机板卡,且此模块可进行扩展。预处理模块进行各通道数据对齐及参考星的选择。单点定位模块可计算卫星位置以及利用最小二乘法实现单点定位。RTK模块利用实时载波相位差分技术得到载体的精确位置。姿态解算模块实现3种姿态解算算法,分别为GNSS单历元CLAMBDA算法、GNSS递推多历元姿态解算算法以及GNSS卡尔曼滤波算法,此模块可扩展其他算法。结果处理模块将定位定姿的结果进行整合处理,并返回至主程序。

1.3 模块接口

每个模块具有4个接口(Get Default、Init、Process、Un Init),分别完成接口信息查询、初始化、信号处理和退出功能。其中,Get Default函数将返回本模块功能、配置参数接口、配置参数默认数值和配置参数说明等内容;Init函数将完成全局变量指针的传递工作,Process函数具体实现模块信息的处理,Un Init函数实现退出功能。各模块间输入、输出接口如表1所述。

1.4 主程序

主程序读取配置文件,配置文件可对频点、基线长度等进行设置。读取配置文件后根据读取到的参数进行各模块的初始化,再分别进入每个模块的process函数,按照图1所示流程依次完成各部分功能,最后进行界面更新。

主程序对每个模块的功能函数循环调用,每次循环解出一个历元姿态、定位结果。

2 实验性能分析

2.1 RTK定位测试结果

为验证嵌入式测姿软件模块化后系统的RTK定位效果,现将基站架设于北京航空航天大学新主楼F座楼顶,流动站位于北航田径场看台北侧,流动站接收机选用支持的OEMStar L1单频板卡,天线选用NovAtel ANT-35C2GA-TW外置天线。解算结果如图2~图4所示。

为测试系统RTK定位性能,特统计解算的流动站位置坐标的均值与标准差结果,统计结果如表2所示。

由此可见,嵌入式测姿系统模块化后RTK定位结果可以达到毫米级。

2.2 测姿测试结果

为验证嵌入式测姿系统的测姿结果,在北京航空航天大学操场看台上,选用3个全频天线以及北斗星通公司GPSBD双系统接收机进行试验。基线长度均为1 m。使用3种定姿算法,分别为CLAMBDA算法、递推多历元算法、卡尔曼滤波算法,实验结果如图5所示。

3 结论及建议

本文探讨利用嵌入式软件模块化的方法,通过不同GNSS姿态测量算法,解决可操作性、可扩展性等问题,实现对GNSS测姿软件的模块化。实际数据验证表明嵌入式软件模块化后:(1)可移植性强;(2)扩展性强;(3)可用性高;(4)适合在一般载体上使用;(5)资源利用率高。

由于GNSS测姿算法复杂度较高,需进一步探讨其在嵌入式ARM平台上实现时遇到的问题。

参考文献

[1]BUIST P.The baseline constrained LAMBDA method for single epoch,single frequency attitude determination applications[C].Proceedings of the 20th International Technical Meeting of the Satellite Division of the Institute of Navigation.Fort Worth Convention Center,Fort Worth,TX ION GPS,2007:2962-2973.

[2]GIORGI G,TEUNISSEN P J G,VERHAGEN S,et al.Testing a new multivariate GNSS carrier phase attitude determination method for remote sensing platforms[J].Advances in Space Research,2010,46(2):118-129.

[3]NADARAJAH N,TEUNISSEN P J G,BUIST P J,et al.First results of instantaneous GPS/Galileo/COMPASS attitude determination[C].Proceedings of the 6th ESA Workshop on Satellite Navigation User Equipment Technologies(NAVITEC′12),Noordwijk,ESA,2012:22-29.

[4]王博.GPS姿态测量系统中的关键技术研究[D].北京:北京理工大学,2009.

[5]WANG B,MIAO L,WANG S,et al.An integer ambiguity resolution method for the global positioning system(GPS)-based land vehicle attitude determination[J].Meas.Sci.Technol.,2009(20):075108.

[6]WANG B,MIAO L,WANG S,et al.A constrained LAMBDA method for GPS attitude determination[J].GPS Solutions,2009,13(2):97-107.

[7]王永泉.长航时高动态条件下GPS/GLONASS姿态测量研究[D].上海:上海交通大学,2008.

[8]JIN W,ZHAI C,WANG L.Hybrid analytical resolution approach based on ambiguity function for attitude determination[J].Journal of Zhejiang University SCIENCE A,2009,10(7):1038-1048.

[9]靳文瑞.基于GNSS的多传感器融合实时姿态测量技术研究[D].上海:上海交通大学,2009.

财务软件五大基本模块及其应用 篇4

财务软件不仅提高了财务人员账务处理速度,优化了工作质量,同时还满足信息使用者查询、输出等需求,其信息量的扩充也是不可比拟的。财务软件的操作将电脑知识和财务专业知识融合在一起,财务人员必须了解和掌握财务软件,熟悉总账管理、库存管理、往来款管理、报表、固定资产管理等各个模块的具体操作。

1、总账管理

总账管理适应于进行凭证处理、账簿管理、个人往来款管理、部门管理、项目核算和出纳管理等。

(1)在开始使用总账系统前,先进行初始设置,包括会计科目、外币设置、期初余额、凭证类别、结算方式、分类定义、编码档案、自定义等,根据经济业务内容编制录入记账凭证,单位财务主管或指定人员进行审核凭证,月末记账,系统自动完成期间损益结转等业务。

(2)个人往来主要进行个人借款、还款管理工作,通过个人借款明细账及时了解个人借款情况,实施控制与清欠。

(3)部门核算做到会计业务以部门为单位归集,通过各部门费用收支情况,及时控制各部门费用的支出,财务人员应进行部门收支分析,为部门考核提供依据。

(4)项目核算可以反映出现金流量的走势,也是月末生成现金流量表的数据来源。

(5)出纳管理详细核算货币资金账务情况,为出纳人员提供了一个办公环境,完成银行日记账、现金日记账,提供银行对账单的录入、查询等功能。

2、库存管理

库存管理适应于对库存商品、原材料等进行供销存核算与管理。许多企业如商品零售业、制造业存货的数量与品种繁多,对存货实行严谨科学的管理是财务部门和仓库部门的重要工作目标,一方面对实物进行分类管理,另一方面建立完整的供销存管理体系,从账面上进行核算、控制、监督,为实现账实相符提供可信的依据。当发生存货的购入、领出、调拨、报废、赠予等业务时,按原始入库单、出库单等记载的名称、数量、单价等信息录入到库存模块中,该模块也具有强大的计算、查询等功能,提供存货的进销存完整信息。

依实际情况的不同,有的单位对于库存管理不是由财务软件来实现,而是采用符合单位管理需要的其他管理软件、ERP系统来完成,其职能和财务软件是一致的。

3、往来款管理

往来款管理适应于对与本公司有经济活动业务关系的客户和供应商之间的往来款项,主要通过预付账款、应付账款、其他应付款等会计科目来核算。初始设置时,将此类科目设置为客户或供应商往来辅助核算,建立客户及供应商档案,每笔往来业务发生时,录入相应的辅助核算内容,在实际工作中还应定期与往来单位核对账目,及时核实往来款项的最新情况。

4、报表管理

报表管理和上述的总账管理相辅相成,总账系统提供财务数据生成财务报表。月末,完成凭证记账、损益类结转的月末处理后,进入报表管理系统,打开报表表格,进行数据关键字录入,系统经过数据计算整理完毕即生成基本财务报表。注意报表需要在电脑硬盘形成电子表格,打开报表管理系统中查找出对应的路径。

5、固定资产管理

系统软件模块 篇5

1 系统监控软件模块的整体设计框架

嵌入式实时应用系统一般都是采取基于优先级的任务调度方式。鉴于系统监控的特殊地位, 在实际的设计实现中, 实现系统监控功能的任务往往被设置成系统中所有任务的最高优先级, 并通过睡眠→唤醒→运行→睡眠的循环方式运行。

这里面设计的时候最重要需要注意的情况就是实际的睡眠的时间的多少, 别的可以唤醒整个监控目标的时间, 还有那些使用时间长一些的部分需不需要单设进程的处理等, 这就需要结合多方面的情况进行分析, 要做到系统的安全可靠和实际应用的性能稳定这些反面综合的思考。

2 系统监控软件模块各部分功能的具体实现方案

2.1 CPU负荷统计

CPU负荷统计是在某个时间段内所有应用任务运行时间占CPU时间总量的的比例, 其计算方法如下:

2.1.1 首先获得时间基准Standard Time。时间基准的获得, 即编制一段标准代码Standard Code, 运行Standard Code标准代码N次, 所花费的时间就为Standard Time。为计算方便, 基准时间的单位用时钟Tick数来表示。系统每秒的时钟Tick数为Ticks。

2.1.2 生成一个优先级最低的空闲任务, 在空闲任务中循环执行标准代码Standard Code, 并对执行次数计数。假设在给定时间间隔T内Standard Code执行次数为n。

2.1.3 CPU占有率百分比CPUUse Rate计算公式为CPURate=100-100×n×Standard Time/N×T×Ticks

2.1.4 每统计一次后, 空闲任务的计数清零。

2.2 进程死循环与死锁检测

做好整个系统的安全的使用, 就需要对系统死锁和每个程序的死循环做好各个方面的检测, 这也是很多个程序目标设计尤其是操作的整个系统的一个难题, 所以当需要嵌入式应用的时候, 要结合实际的需要, 不要使用相对复杂的计算检测或者解决这样的情况。只能采取一些近似的算法"模糊"地进行, 其检测方法描述如下:

在进程控制块中增加用于死循环、死锁检测的两个域:进程上一段检测时间段内的运行 (调度) 次数和本次检测时间段的运行 (调度) 次数, 当系统监监控任务运行时, 根据这两个域值进行判断, 经过若干次的检测后, 如果二者的值相同, 该任务处于运行状态, 且CPU利用率较高, 可以近似地判断该进程进入了死循环;如果某进程组或所有进程 (空闲进程和监控进程除外) 是处于因临界资源的竞争引起的阻塞状态就可近似地认为该进程组或整个系统处于死锁状态, 这二者均可通过杀死一些较低优先级的进程来解决, 若实在不行, 只得考虑系统重启, 并给出现场信息。

2.3 存储单元利用情况检测

2.3.1 通信应用领域内存管理的实现方法

嵌入式实时操作系统中的内存管理有着重要的作用, 它是保证系统运行安全和实际应用可信性的一个重要的部分, 所以在通信的领域中内存的申请实际上大多数时候是不同的很多种的数据的一种形式结构的多数的申请的状况, 这样更好的加强内存管理的实际的应用性能和安全性。

对于不同的使用程序的模块都是有着自己的使用的内存区的, 而每个程序的模块又把这个内存区分为很多个内存池。其中不同的内存池构成的部分主要是很大的一个内存块, 所以要想更好的更安全的监管内存的实际的需要和使用的状况, 就需要做好下面的工作:

正是因为内存区的这样的复杂的结构特点, 保证了它的内部实际释放的能力也是很大的, 也在一定的情况下很多的减低了内存的碎片的情况, 还可以给出分配和放出的具体的调节的一些相关的信息。内存池不断的监控模块中的统计的信息, 这就需要在内存块不断的分放和释放的时候做好相关的过程的计算, 还要保证每一块的内存区做好信息的统计。

这样, 因为这样的结构的控制的过程, 就能够给出一些详细的内存的监控的数据和信息, 但是因为对于内存实际的应用是在限定的内存区中的, 那么出现内存分放不成功的状况就是不能免除的了, 所以整个的通信的行业的使用情况来看, 内存分配的不成功可能会有很大的不好的影响, 所以必须更好的解决这样的问题, 而实际的解决的办法主要有两种:静态预留和动态自适应调整。

2.3.2 内存池动态调整算法

做好内存池的动态的调整的工作事关重要, 所以更好的科学的做好这个工作很是重要, 那就需要在内存池的具体控制的结构里加上一定的信息域:包括小的内存的数阈值, 这个内存池是不是进来被访问或者没有被访问的各项的标记等。这样的两个的标志, 是更好的使用了内存整个被访问的局部性的理论, 一旦发现内存申请的时候, 对这两个标志会实行回到原来的位置的办法, 当内存块不断的释放的时候, 要对内存池的是否进来没有访问的标志防治位置, 实际的相应的调整情况如下:

(1) 按照顺序找到所有的块尺寸比待扩容尺寸大的那些内存池, 继续到其中一个内存池满足下面的情况:内存池没有进程的申请;实际剩下的空着的块数比很小的内存块的数阈值大;假设有这种的内存池, 要在这个闲着的队伍里拿出一块, 接着都步骤 (4) ;没有的话就要到步骤 (2) 。

(2) 按照顺序找到所有的块尺寸比待扩容尺寸大的那些内存池, 继续到其中一个内存池满足下面的情况:这个内存池没有别的任何的用户访问记录;这块内存池中余下的空闲的数量比内存块一些比的值要大;遇到这样的内存池把它拿出原在的空闲块的行列, 接着到步骤 (4) , 没有遇到就接着到步骤 (3) 。

(3) 按照顺序找到所有的块尺寸比待扩容尺寸大的那些内存池, 继续到其中一个内存池满足下面的情况:该池中剩余空闲块数大于其内存块总数的一定比例值;剩余空闲块数大于最少内存块数阈值若存在这样的内存池, 从该池空闲块队列摘下一块, 转步骤 (4) , 否则调整结束。

(4) 把摘下的空闲内存块块逐级分拆到包括待扩容内存池在内的多个内存池中。之所以采取逐级分拆的方式是因为若找到的内存块远远大于待扩容内存池中的内存块, 全部分配给它对以后的再调整不公平, 则造成整个内存向低端内存池 (内存块尺寸较小的内存池) 聚集现象特别严重, 故除了待扩容内存池外, 对块尺寸大于待扩容内存池而小于空闲块来源内存池块尺寸的内存池都准备给予扩容, 由于不同内存池中的内存块大小往往为2n关系, 实现逐级分拆的算法比较简单。

2.4 异常恢复策略

应该明确的是在具体的使用中, 正是因为各种情况很多, 所以对于系统完善的要求是太牵强的, 所以一旦监控的整个体系有什么问题的时候, 做好相应的应对的方式和办法是必要的, 在整个个通信领域的使用中, 有着比较常用的处理异常情况的一个过程, 这个过程只要是三个部分:初始化部分、异常必要信息处理部分和异常守护处理部分。所以当有什么情况出现的时候就要做好这些任务, 更好的执行更有效的异常恢复策略。

3 结束语

整个的通信领域的各种软件之中系统监控的系统是为了更好的确保整个体系的安全, 稳定和可信性的关键的因素, 所以正确的做好系统的检测环节并找出问题解决问题就是整个任务的关键, 所以做好这些工作是当前的需要, 更是整个系统的需要。保证整个通信领域的使用状况的良好就要做好各项的检测和解决问题工作。

摘要:随着经济和技术不断的发展和相互促进的进程步伐的加快, 各个领域的技术都有着很大的发展, 其中通信领域的各项技术也是更快的受到了人们的认可, 而整个通信领域系统监控软件的设计和实际的应用更是越来越受到关注, 本文就是针对这项技术进行分析和研究, 对这个软件的具体实行的方案和功能给予说明和分析, 以供参考。

系统软件模块 篇6

随着计算机技术的不断发展, 软件开发已朝着大型化、复杂化的趋势发展。应用到电力机车的软件项目也越来越多, 软件设计的质量直接影响着机车的运行的安全、质量和运营的效率, 在电力机车行业的地位也逐渐突出, 成为轨道装备的灵魂, 是构筑轨道交通的关键技术之一。

根据工程车网络控制系统体系结构, 运用模块化设计的思想, 将复杂的工程车网络控制系统分解为相互独立的、可协同工作的软件模块, 并提炼出可重复利用的模块, 以提高网络控制系统的质量和可靠性。将软件模块化研究运用于工程车网络控制系统, 对于网络控制系统的优化有着非常重要的意义。

1 软件模块化设计思想

1.1 软件模块化的定义

软件模块化的概念已推崇几十年, 软件模块化即将软件划分为一个个具有独立功能的模块, 当把几个或所有模块组合到一起时, 通过软件体系结构, 便可获得满足问题需要的一个解。

软件的模块化即将问题“分治”, 一个复杂的问题分割成若干个可管理的小问题后更容易求解了, 模块化正是依据此思想。

1.2 软件模块化的设计原则

模块的独立性是指模块的功能独立性和结构独立性, 是模块化设计的核心。软件模块化设计应遵循以下原则:

1) 划分的模块具有独立性, 同时规模数量应适中;

2) 模块层次划分的深度、宽度应适中;

3) 模块的作用域应保持在该模块控制域内;

4) 模块接口应简单, 采用单入单出形式;

5) 模块设计应有可移植性。

2 工程车网络控制系统模块化研究

2.1 开发模型

网络控制系统开发模块是描述控制系统开发过程中的活动和任务的结构框架。能够清晰、明确地描述开发的全过程, 规定了要完成的任务, 是网络控制系统开发的基础。开发模型如图1所示:

开发模型主要包括方案论证、系统逻辑控制需求提出、编制需求分析说明、程序编制: (I/O配置、字典建立、按模块编码及功能块创建) 、软件系统集成测试及现场调试。根据测试情况和调试情况, 修改程序, 重复集成测试直至调试通过。

2.2 模块化研究及设计

工程车网络控制系统为完成工程车的控制和通讯而设计, 主要有功能控制、故障诊断和事件记录等功能。功能控制主要是对主电路进行配置;执行乘务员给出的指令;对机车运行状态进行监控, 及时做出保护动作。同时, 具有故障诊断功能:通过采集工程车和各子部件的运行状态, 进行故障诊断, 将故障数据通过总线发送给显示屏和事件记录模块;可以在线或本地进行分析。根据目前工程车设计平台化的需求, 将通用的功能设计成标准化的软件模块, 对于研制新工程车控制系统有着非常重要的意义。

基于软件的可重用和可维护的角度考虑, 采用以功能或以部件的方式, 对程序进行模块划分, 进行相对独立的设计, 实现一系列功能独立的软件组;同时将系统中多个模块都涉及的通用功能进行提炼, 形成一个个功能块, 如网络模块生命信号判断。根据各车型的实际需要, 将合适的、必要的模块进行组装, 编译生成相应的网络控制系统, 从而大大缩短软件开发周期, 提高软件开发效率。

工程车网络控制系统主要功能包括以下四个部分:主电路控制、控制电路控制、制动电路控制及其他辅助功能和辅助设备控制。各个功能模块采用并发处理, 即每个程序运行周期内各模块执行一次, 对数据进行判断、处理及输出。工程车网络控制系统主要软件模块见图2。

1) 电压检测模块:根据电压值和供电模式, 判断是否超压或欠压。

2) 接地检测模块:根据I/O反馈的信号, 判断主电路是否接地。

3) 供电模式模块:根据扳键开关位置和司机占用端等条件, 确定供电模式。

4) 机车预备回路模块:当无紧急按钮按下, 主电路配置完成, 无主断接地, 牵引系统无故障等条件满足时, 预备回路接触器动作。

5) 主电路供电模式配置模块:根据供电模式、机车状态等条件, 配置主电路接触器, 完成主电路配置。

6) 11K01、11K02接触器控制模块:根据供电模式、11K02或11K01、预备回路接触器的状态等条件, 对接触器进行控制。

7) 11K03接触器控制模块:根据11K01和11K02状态、牵引蓄电池开关状态控制接触器开合。

8) 受电弓监控模块:在有充足的气压下, 受电弓联锁未隔离、接触器状态、主断状态等条件满足时, 根据乘务员的指令, 对受电弓进行控制和机车的自动保护。

9) 主断监控模块:在控制电源得电, 根据紧急按钮状态、供电模式、司机指令等条件, 根据乘务员的指令, 控制主断接触器的闭合;同时对机车自动保护。

10) 机车占用端控制模块:根据占用端钥匙信号, 判断机车操作端占用情况及主控机车。

11) 转向架隔离监控:根据隔离开关位置, 对某一架电机发出隔离信号。

12) 机车方向及模式监控模块:根据机车占用端状态, 以及机车方向开关和模式开关的位置, 判断机车方向和模式监控。

13) 牵引封锁模块:包括超速牵引封锁、牵引力异常、坡停起步、全局牵引封锁和局部牵引封锁等子模块。

14) 制动控制模块:包括惩罚制动和紧急制动的判断及触发。

15) 压缩机控制模块:包括压缩机的启停、压缩机状态的监控。

16) 其他辅助功能和辅助设备控制:低恒速控制、自动换端、无人警惕、制动电阻风机控制等。

以上模块的划分是比较粗略的, 还可以有不同的划分方法和划分粒度。根据不同车型要求进行配置, 从而完成不同的功能需求。

3 结语

模块化的工程车网络控制系统软件实现方法大大提高了软件的可靠性, 减少了维护成本, 模块化设计提高了后续车型研发时软件开发的效率。对于整个网络控制系统的模块化设计起到重要的作用, 提高了软件的质量和可靠性, 大大节省软件产品的开发费用。

参考文献

[1]齐志昌, 谭庆平, 宁洪.软件工程 (第二版) [M].北京:高等教育出版社, 2001.

系统软件模块 篇7

无人机是一种动力驱动,机上无人驾驶并可以重复使用的航空器,它具有高度的自主导航,自动飞行控制,任务管理的综合系统。无人机飞控系统通常由传感器、飞控计算机及机载软件组成[1]。飞控系统通过飞控计算机将传感器和执行机构联成一个整体,共同构成一个闭环系统,飞控计算机通过飞控软件处理传感器数据,实现控制规律,管理任务设备完成控制任务[2]。同时可以进行程序控制,地面遥控等控制飞行。飞控软件作为控制的核心之一突显重要。它是飞行指挥与航迹控制系统的主体部分之一,对无人机进行指挥和管理,使无人机系统能够协调工作,完成预定的飞行任务。

1 模块化设计

软件的模块化设计就是将主程序、子程序及子程序的框架把软件的主要流程和框架表示出来。定义好输入输出的关系,进而得到功能块为单位的算法描述[1]。软件上采用结构化程序,使各模块独立,这样有利于各模块独立,这样有利于软件的维护与更新。模块化的目的是为了降低程序复杂度,使程序设计、调试和维护等操作简单化。模块化设计,要求相对封闭独立性、可重复性、可修改性[1]

2 飞控软件的设计方框流程图

飞控软件完成的主要任务是:遥控解码、遥测编码、飞行控制参数的计算及飞机状态的控制、设备管理与数据通讯、故障诊断、模拟参数的数据采集等。飞控软件是一种多任务的,具有严格时序要求,实时性很强的系统控制软件。

软件的运行是靠中断来驱动的。中断可以是计算机内部,也可以是外部的。通过对中断的响应,软件得以按一定的时序调用不同的算法模块,实现各种功能,直至完成飞行任务[3]。控软件的主要任务:一方面飞控CPU在定时中断里读取导航控制指令,采集姿态量、高度空速信息,控制律计算,并向舵机输出控制信号,完成对无人机的控制;另一方面,将姿态信息及故障监测量与飞控机进行实时数据通信,从而可以监测飞机的状态。

因此,飞控计算机软件应具有以下几种性能:①实时性好,地面站能实时监控无人机的飞行状态、任务设备的工作状态和伺服装置是否正常的工作。②在程控时的自主飞行中应能够安全可靠的是无人机安预定航线进行飞行。③软件可靠性高,且在飞控系统出现异常的情况下能尽可能保证飞机的安全。④使用模块化的设计思想,因为模块化结构化设计易于维护,继承性好,为各种控制方法的运用提供支持[4]。

使用C语言进行无操作系统的直接软件开发。整个软件系统被装载在8051F040单片机的FLASH ROM中,能实现如下功能:无人机姿态保持、航向保持及高度保持;实时完成飞行控制律计算;根据不同的任务需求,确定不同飞行模态,并进行各模态切换;导航轨迹生成及优化。根据各种测量数据、GPS数据及目标位置自动生成飞行轨迹并优化;实时完成飞行数据采集,串行通信控制信号输出,遥测、遥控信号的定时收发;系统自测试,故障诊断与系统动态重构。在系统运行中,单片机负责输入通道的数据采集、串行通信、飞行控制律计算、控制指令的实时生成,并将模拟输出和开关量输出信号分发到芯片的各个外部端口[3]。其中、串口通信基于中断方式,由此实现实时多任务机制。

3 软件方框流程图

系统软件分为三大模块:一是主模块:主要功能是解算飞机当前参数,并完成相应的控制动作。二是20 ms的定时中断处理模块:为飞控机提够定时时钟,各种周期性的事物处理,例如各种遥测数据的采集等。三是遥控解码和遥测编码块:其中遥控软件模块用来解释地面站发上来的各种指令,根据不同的指令含义,进行相应的功能处理。遥测软件模块的功能是将采集的各种飞机状态及设备参数按遥测帧格式要求编码发送出数据流。

图1是主程序模块。

无人机起飞前对其进行初地面检测,即进行上电自检和飞前自检。上电自检目的是检测飞控设备以及外围传感器是否工作正常,如单片机与任务与GPS的RS232或是与任务设备的RS485通讯接口是否通畅以及信息解码是否准确等。飞前自检的目的是检验单片机的舵机是否正常工作,检测无人机的舵面摆动是否正常。自检完毕后飞控系统还将记录起飞点的GPS信息,防止无人机在失控状态下按原航程返回。这大大增加了无人机的飞行安全性。

无人机在飞行过程中可以是实时控制或是程序控制的。实时控制要求无人机实时把通过GPS或是地面导航系统得到定位信息传到地面控制站,使地面站能实时掌握其位置从而做出判断继而发出控制指令,控制无人机的飞行。这种方式要求实时掌握无人机的动态信息,最后需要人去做出判断,要求人为的因素较高。程序控制是在飞机起飞前把事先预定的航线装入飞机中,在飞行的过程中通过定位信息不断比较修正航线,使得飞行按照事先转入的航程点进行。这种方式要求人为的因素较少,比较适合干扰较大的电磁环境。

图2是20 ms中断程序模块。

20 ms定时中断模块为飞控机处理各种周期性的事务,如与航向计算机通信,各种飞机状态参数的采集等。飞控机在同任务设备连接的时候,飞控机是主动的,可分时同任务设备进行通讯,因而设计了一个通用的接口使任务设备都挂在该接口上。这样可以大大减少飞控机对外的连线,减少了对CPU的工作干扰。

无人机控制系统中,遥控指令以帧格式的形式串行同步输出到飞控机,一帧遥控指令的传输时间约80 ms,包含固定字节数。有关遥控指令传送的四路信号TCF、TCW、TCB和TCD中,TCF为帧同步信号,用以标识一帧遥控数据的结束;TCW为字同步信号,用以标识一个字节数据的结束;TCB为位同步信号,用以标识数据的每一位;TCD为遥控指令信号与其它三路信号不同,它是串行同步遥控指令流,承担着遥控指令的传输,数据一帧一帧地发送。数据格式是:高位在前、低位在后;四者相互配合完成遥控功能。飞行控制管理指令和任务设备开关指令在一帧中处于固定的位置,即对应的控制指令固定一帧中的固定字节的地方。指令的提取采取三取二,充分考虑了在干扰的情况下还能准确无误的提取相应的控制指令。

主流程完成系统初始化各个任务状态切换。定时中断处理模块处理与时间有关的周期性任务,包括检测和任务规划、数据处理、飞行控制律计算等。、串行中断处理模块。遥控遥测模块完成遥控指令解码及遥测数据编码并将其发送的任务。

图3是遥控解码程序框图。

控制部分是飞控系统的核心,也是决定飞控软件优劣的决定性部分。一方面,根据传感器采集来的姿态量信息和高度空速信息进行控制律计算。另一方面,在飞行过程中,手控、程控模态的优先级以及状态切换实现。此外,控制模块还担负着实时故障监测的责任,以保证无人机的飞行安全。它使用片内看门狗电路(Watchdog)电路以防止程序运行时出现“死机”,能通过复位的方法使CPU推出“死循环”。不至于时系统的程序跑飞。当系统由于干扰出现故障的时候,在排除是硬件出现故障,确定是软件故障,由于系统软件的模块化设计,可以进一步确定故障模块程序模块,修改软件并采取相应的软件抗干扰措施,直至问题的解决。这样可以提高故障排除的效率。相对于传统的专用软件设计,模块化的设计提高了机载软件的设计效率、可靠性和通用性。

4 结束语

本文针对基于某型C8051F040的无人机飞控系统软件的开发,提出了一种系统模块化的设计方案。设计开发了模块化飞控系统软件。经过地面静态测试,改模块化软件完全符合某型侦察无人机的飞行品质要求,能够达到飞行控制所要求的控制参数,运行良好抗干扰能力强并且具有良好的继承性和方便的维护性。这种模块儿化、系统化的设计方案对无人机飞控系统软件的研究与设计具有一定的参考价值[5]。采用具有多外设的高性能C8051F040芯片,在一定程度上减少了系统硬件设计的工作量,缩短了开发周期。此外C8051F040提供JTAG接口,具有更先进的开发手段,开发工具可实现在线仿真,不占用户任何资源。飞控计算机的设计成本大大降低,计算速度提高,体积缩小[4]。随着技术的不断发展,SOC单片机将以它特有的优越性将在军事和高科技中得到广泛的应用。

参考文献

[1]周志久.基于DSP的无人机飞控系统软件模块化设计.软件工程技术计算机测量与控制,2009;17(1):

[2]张绮文.ARM嵌入式常用模块与综合系统设计实例精讲.北京:电子工业出版社,2007

[3]基于C语言8051F系列为控制器原理与应用,北京:清华大学出版社,2007

[4]刘歌群.民用无人机飞行控制器软件设计.计算机测量与控制, 2005;13(5):

模块化软件的软件凝聚度度量 篇8

1 软件系统的网络观

从结构上看,任何网络都可以概括成结点和边的集合,不管是构造出的规则网络,随机网络,还是复杂网络。因此,软件系统可以表示为一个二元组G(类/函数集,关系集),模型所反映的层次结构可以用有向非循环的关系依赖图表示。图中每个结点代表一个元素,每条有向弧表示元素间的层次关系,如is-a,has a,part a关系等。当元素和关系数量不断增加时,软件系统则呈现出复杂的网络结构,即扩张性及不断演化的特性。

在工程领域中,软件系统往往表现出无标度网络的特性。如软件内聚程度过高时,若某一个类内部出现异常,在最坏的情况下,会影响到很多与之相关的其它类。这恰恰与无标度网络特有的无标度性和脆弱性所对应;“在当前版本中出错的模块在下一版本中仍可能存在其它错误”[1]这一经验说明易出故障的模块在系统中的比重虽然很小,但是它可能蕴含很多关联错误.这正是对幂律度分布特性——“大量结点有少数连线,少数结点有大量连线”的例证。近年来,已经有人经实验仿真验证软件系统是一个具有幂律分布的无标度网络[2]。

2 模块化软件系统凝聚度

模块化软件系统与汇编语言软件系统相比较而言,有很好可读性和结构性。依据复杂网络理论将模块化软件系统软件系统抽象为一个二元组G(类/函数集,关系集),其中关系集是类/函数集之间的依赖关系。具体地说,包含以下依赖关系:

2.1 类/函数调用中的参数传递依赖

类/函数参数传递依赖在本质上是由调用类/函数(过程)和被调用类/函数(过程)在调用发生时进行通信而引起的。基本的参数传递依赖有两种:值传递依赖和引用传递依赖。在引用传递过程中,被调类/函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存放的地址访问主调类/函数中的实参变量。所以,被调类/函数对形参做的任何操作都影响了主调类/函数中的实参变量,主调类/函数与被调类/函数之间的依赖关系是双向的。另外对于调用关系的依赖又有三种特殊情况:1)被调用类/函数并没有实际使用传入的参数;2)被调类/函数的返回值没有得到调用者的使用;3)指针类型的参数并没有起到双向传递数据的作用,被调用类/函数中虽然包括对指针的定义性操作,但操作的结果并没有返回调用者。

2.2 各类/函数通过共享全局变量形成的全局数据依赖

使用全局变量的优点是:可以减少变量的个数,减少由于实际参数和形式参数的数据传递带来的时间消耗。但是,使用全局变量也有众多缺点,最重要的是全局变量破坏了类/函数的封装性能。类/函数中若使用了全局变量,那么类/函数体内的语句就可以绕过类/函数参数和返回值进行存取,这种情况破坏了类/函数的独立性,使类/函数对全局变量产生严重的依赖关系。同时,也降低了该类/函数的可移植性。而且,全局变量使类/函数的代码可读性降低。因为多个类/函数都可能使用全局变量,类/函数执行时全局变量的值可能随时发生变化,对于程序的查错和调试都极其不利。从复杂网络的角度来说,全局变量是个具有很大度的关键结点,关联结点很多,这种结点一旦被破坏,整个网络的抗毁性则遭受到严重打击。

根据这些特点,本文建立模块化软件系统模型:

定义模块化软件系统的关系依赖图:一个模块化软件系统的关系依赖图G定义为G(V,W)。其中,V是结点集,W是带权的有向边集。

结点集:结点集V={V1,V2,V3,…,Vi,…,Vn},其中0

带权有向边集:带权有向边集W={W11,W12,W13,…,Wij,…,Wnn},其中0

调用关系:在关系依赖图G中,满足以下条件之一者,称为存在调用关系

1)标注为结点Vi的类/函数与标注为结点Vj的被调用类/函数之间存在参数传递且被调用类/函数实际使用了传入的参数。特殊地,标注为结点Vi的类/函数与标注为结点Vj的被调用类/函数之间存在引用传递依赖且引用传递的值在标注为结点Vj的被调用类/函数中得到改变,则称存在调用关系

2)标注为结点Vi的类/函数修改全局变量,且被标注为结点Vj的类/函数读取了同一全局变量。

软件凝聚度:

为模块化软件系统G的凝聚度。其中,n代表软件系统G的结点个数,且n≥1;l代表软件系统G中,每两结点之间的平均路径长度;dij代表结点i和结点j之间的最短距离。当结点i和结点j之间没有路径可达时,dij=∞。当n=1时,软件凝聚度为0,即只有一个结点时,不存在与其它结点的交互。

具体算法如下:

1)找到结点Vi的调用关系。若Vj第一次被调用,则为Vj建立一个新结点。并在Vi结点与Vj结点之间连一条有向边,且设Wij=1;若Vj不是第一次被调用,则在Vj与Vi的连线上赋新权Wij=Wij+1。

2)重复步骤1,直到包含所有模块或函数。

3)将步骤1和2所处理的图记作关系依赖图G(V,W)。

4)对关系依赖图G(V,W)分别求取每个结点到其它结点的最短路径。

5)根据公式计算软件凝聚度。

3 实例分析

本文对程序设计语言JAVA的类库进行分析。其中,JAVA选用的是SUN公司的JDK。对应用程序员来说,最常用的是开发桌面应用程序。因此,本文以JAVA中对话框框架的源码作为研究对象,分别建立各自的结点集V和边权集W。其中,V代表框架中出现的类,W说明框架中存在调用关系,调用关系分以下三种,如表1。

我们用复杂网络分析软件Netdraw画出的网络图如图1所示。

在软件凝聚度度量的各种参数中,使用最广泛是MOOD度量的耦合因子CF(Coupling Factor)。所以我们选取耦合因子CF,并与软件凝聚度比较。比较结果如表2所示。

表2通过对耦合因子CF和软件凝聚度比较,我们发现凝聚度高的软件其耦合度低。所以,我们建议使用JDK开发软件。从理论的角度讲JAVA是基于面向对象的语言,模块在抽象性和封装性上都强于传统的面向过程语言。从业界的角度进行统计也是如此,JDK开发的软件无论在开发还是维护阶段,都比传统的面向过程语言开发和维护要容易。这与我们计算所得到的结论是相似的,凝聚度高的软件其耦合度低。

4 结束语

研究软件凝聚度的度量方法,对“计算型”软件工程有重要意义。借鉴复杂网络思想的软件模型更容易考察软件系统的整体性质,且能动态的反映出这些性质,这为我们掌握软件系统的规律提供无可比拟的优势。但是目前基于复杂网络研究在建模、分析、验证,以及探索合理的内外属性度量对应关系等方面才刚开始,我们软件凝聚度的研究工作也处于探索阶段,软件凝聚度能不能找到一个阈值去度量大多数软件质量,有待于大家的继续研究与探讨。

参考文献

[1]Musa J D.Software Reliability Engineering[M].北京:机械工业出版社,2003:60-151,355-434.

[2]Albert R,Jeong H,Bambasi A L.Error and attack tolerance of complex net-works[J].Nature406,2000:378-382.

[3]韩明畅,李德毅,刘常昱,等.软件中的网络化特征及其对软件质量的贡献[J].计算机工程与应用,2006(20):9.

系统软件模块 篇9

本研究在项目组所在学校办学定位和特色指导下, 以软件学院为例, 对大学英语教学现状进行了分析, 并提出相应的对策, 以期为软件学院英语教学在理论和实践上提供参考。

1 访谈与问卷调查结果分析

(1) 调查对象:抽样选取部分本校软件学院不同专业背景 (会计、冶金、机电、软件开发方向等) 、不同英语水平的学生及其英语任课教师为研究和实践对象。 (2) 调查方式:问卷调查、访谈、听课、广泛听取并深入分析他们对英语课教学的需求、意见与建议。 (3) 调查内容:学习者的英语能力自我评估、学习者的英语学习需求与被满足程度、基础英语与IT英语、行业英语有效衔接的多元教学模式和评价体系的建设与实践情况。 (4) 数据分析:如表1所示。

2 对策与建议

2.1 对软件学院英语教学目标和培养目标的再认识

现代教育反映的是知识经济对人的需求, 其使命是使人获得持续发展的能力。教育方式、教育过程强调按“需”教学。我们现在要做的就是创新教师教学理念, 密切与用人单位的联系, 以社会需求的IT英语人才为培养导向, 以课堂教学和英语职业能力的实践实训为手段, 在英语教学中实施素质教育, 实现语言学习过程与培养职业素养的统一, 促进学生职业能力的发展, 为学生走上工作岗位做好准备, 使其成为积极适应社会的人才。

在多元英语教学体系的实施过程中, 课程体系的灵活性和职业功能性、实效性是特色。职业教育的协同化和终身化是发展方向。课程是载体、学生是核心、师资是关键。以水平立标志, 以标志促建设, 以建设上水平, 加快软件学院英语教学发展步伐。鉴于我校软件学院的英语教学现状, 从学校层面而言, 校企合作质量保障机制的构建、在课程设置中加大行业英语作为选修课的开设力度以尊重学生的自觉选择、积极申报剑桥商务英语中级以上证书 (BEC) 、托业 (TOEIC) 考试、剑桥博思职场英语检测 (BULATS) 等相关测试职场英语能力的考点, 有助于满足学生的多元要求, 唤起学生的深层动力。

2.2 调整并丰富课堂教学与反馈模式, 优化师生互动形式

一线英语教师承担教学任务吸引力不够, 教师精力投入不足以及对学生认识存在滞后期等问题导致学生课堂参与度和满意度不高是软件学院英语教学普遍面临的突出问题。变化的、灵性的、信息化的实效生成课堂要由师生共同营造。英语教师应从师务师, 重视课堂设计和课后反思, 不仅要站在课堂中研究课堂, 还要走出课堂去看课堂, 积极研究范例教学法、问题情景教学法、对话教学法等学生较为喜欢的教学方式, 并将其运用到课堂设计尤其是行业英语教学中, 优化师生互动形式, 从而改善和丰富自己的课堂;及时对学生的学习方法、学习态度和学习策略等方面的特征和表现进行反思, 引导学生进行就各种教学资源进行“批注式”学习、合作学习、发现式学习, 培养学生的思维能力、学习能力和实践能力, 并关注其学习反馈。

2.3 加强教师智库群的建设, 构建课内外教学资源平台

信息不等于知识, 信息的加工处理亦很重要。以培训师生的信息素养能力为着力点, 通过建立软件学院各背景方向学科任课教师、专业英语教师以及英语教学资源组成的智囊团和媒体库, 兼顾利用不同院系教师语言和专业上的优势, 把多元化的英语信息包括各种教学素材、教学课件在内的教学资源进行整理、归类, 将它们整合成知识模块收录进信息数据平台, 实现资源共享与服务, 有助于使教师的指导性与学生的自主性、师生的互动性得到统一;同时, 也增加了学生自主学习的时间和空间, 让不同层次基础的学生更容易融入英语学习锻炼, 并能更有效地根据自己的就业目标选择自己的学习方向及学会如何就自己的目标开展相关学习, 进而拓宽学生知识面, 增强学生学习兴趣, 完善学生的英语知识结构, 促进学生个性发展。

3 结语

随着我国从学历型社会向资格型社会发展, 凝练发展特色、提升办学水平、增强育人能力, 通过“基础英语与IT英语、行业英语”教学有效衔接的多元英语教学体系培养学生职场英语能力从而提升其服务社会的能力是软件学院英语教学改革的必由之路。然而, 明确办学理念之后的运作难度依然不小, 学校需要通过开放办学等形式不断积累英语实践教学的经验和能力, 在探索中扭转长期以来软件学院公共英语教学分类教学与分层教学失衡、教学资源不足、目标错位的现状——偏重基本英语技能、应用性不强、应试倾向严重, 未能充分考虑软件学院不同专业背景学生各自的就业需求和职场资格准入等, 从而加强软件学院学生学习英语的自我效能感, 最终实现学生成为“完整职业人”的教学目标。

基金项目:本研究为江西理工大学教学改革项目 (项目编号:XJG-2011-41) “软件学院‘基础英语+IT英语+行业英语’多元英语教学资源建设研究”阶段性成果

摘要:本研究以所在学校软件学院为例, 从英语教师和英语学习者两个着力点入手, 以学习者的英语能力自我评估、学习者的英语学习需求与被满足程度、基础英语与IT英语、行业英语有效衔接的多元教学模式和评价体系的建设与实践情况为考察指标, 通过访谈、问卷调查和听课观摩等形式, 针对当前软件学院英语教学的现状进行分析, 并就存在的主要问题提出对策。

关键词:软件学院,多元英语教学,对策和建议

参考文献

[1]赵雪爱.国外特定用途英语 (ESP) 的发展与现状[J].西北工业大学学报 (社会科学版) , 1999 (2) .

[2]熊倪.跨越高职行业英语教学困境的模式探索与实践创新[J].继续教育研究, 2011 (2) .

上一篇:大学英语生态教学下一篇:奥运会带给我们什么