您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 通用数字仿真程序设计.
第8章通用数字仿真程序设计8.1概述对于一个简单系统,可以使用前几章讲述的方法,自己编制专用的仿真程序。如果对每个系统都求状态方程、差分方程及编制程序等,对于工程和科研来说是很不方便的,既浪费时间,又容易出错。由于一般控制系统都是用微分方程或框图来描述,可以编制一些通用的仿真程序,只要送入不同的参数即可进行不同系统的仿真。这样,可减少辅助工作量,增加仿真结果的可靠性,大大提高了仿真的工作效率。通用仿真程序一般应该达到以下几点要求:1.使用方便(1)容易操作,输入参数、修改参数方便;(2)对原控制系统的预加工越少越好;(3)输出结果形式直观,并应尽可能减少用户对输出结果的预测(如输出可能的最大值等);(4)通用仿真程序应有操作提示、出错提示,从事专业的使用者不需要经过培训就可以使用;(5)程序中的各种功能可以重复选择等等。要达到上述要求,主要取决于所采用的人机交互技术,即人机会话方式。2.通用性强通用性指的是程序的适应性。一般来说,仿真软件的通用性强,则使用比较麻烦;针对性强,则在规定的领域内,可给用户带来更多方便。因此,在保证用户使用方便的前提下,程序的适用面越广越好。实际上,设计通用仿真程序时,总是有一定的针对性的。根据系统类型设计的通用仿真程序有:连续系统仿真程序、采样系统仿真程序、连续-采样系统仿真程序、离散事件系统仿真程序、偏微分方程描述的系统仿真程序等。也可根据行业特点设计通用仿真程序,例如导弹系统仿真程序、宇航系统仿真程序、热工系统仿真程序等。3.仿真精度高由前面分析已经知道,仿真精度取决于仿真算法及所选用的计算步长。因此,为了保证仿真精度,在通用的仿真程序里要选用具有较高精度的仿真算法,比如,四阶龙格-库塔法、四阶阿达姆斯法等。但这也带来另外一个问题,有些系统仿真时,并不要求精度很高,而要求仿真速度较快,这样所选择的高阶算法就不适用了。为了克服这种缺点,在通用程序里可以设置多种仿真算法,仿真时由用户自己选定。8.2面向微分方程的通用仿真程序在工程实际中,有些系统直接用状态方程或微分方程描述,多入多出线性定常系统都可以描述成形如式(8-1)的状态方程或一阶微分方程组的形式。(8-1)式中:X为n维状态向量;Y为m维输出向量;U为r维输入向量;A为n×n维状态常系数矩阵;B为n×r维输入常系数矩阵;C为m×n维输出常系数矩阵;D为m×r维传递常系数矩阵。对于其他形式描述的线性定常系统(如传递函数或高阶微分方程等),可以采用本书第二章中的方法转换成如式(8-1)的标准形式。为了使这类系统能直接进行仿真,应设计面向微分方程或面向状态方程的通用仿真程序。DUCXYBUAXX8.2.1程序设计思想通用程序结构与专用程序结构形式类似,都是由初始化、输入参数、仿真运行、输出结果这四部分组成。与专用程序不同的是,通用程序不是用来仿真某个特定的系统,而是对在一定范围内各种不同的系统都能进行仿真。这样,程序设计存在下列特殊性:1.通用程序的参数描述通用程序中应该设置可变的内存区,来适应不同系统的描述。包括状态变量和中间变量的向量、系数的矩阵等,都要以程序变量的形式描述。还要定义相应的维数变量,根据这些维数来为状态变量、中间变量以及系数矩阵分配内存区。实际上,在通用程序中,应该尽可能不直接使用常数,而都使用程序变量描述,这样可以让用户通过人机交互界面部分的程序来设置或修改这些程序变量。对内存区的控制应该考虑初始化、赋值、更新、释放等问题。2.人机交互界面部分通用程序中应该有友好的人机交互界面,一方面便于用户可以设置各项参数和维数等;另一方面要能够较好显示仿真结果,以及对仿真结果进行分析。人机交互界面中应该尽可能提供输入或输出的提示信息、用户操作失误的防错措施等。3.程序运行控制通用程序设计应该考虑运行控制问题。首先,从结构上看,程序应该是可以重复使用的,因此一次仿真结束后,用户应该能够选择是终止程序运行,还是返回修改参数再次仿真。其次,在仿真过程中,特别是实时仿真过程中,用户应该能够随时终止仿真过程。此外,在运行过程中需要避免非法的运算,如被零除、超出计算机最大值或陷入死循环等问题。8.2.2程序设计举例这里为了突出程序的通用性设计,我们选择简单的欧拉法作为本例中的仿真算法,程序设计框图如图8.1所示。其他仿真算法的设计与此类似。程序中主要的变量记号与式(8-1)中一致。由于篇幅所限,程序中省略了人机交互部分。8.3面向控制系统方框图的通用仿真程序当控制系统较为复杂、庞大时,求解状态方程形式会变得相当复杂,而且由于系数矩阵是间接计算所得,因此每次系统参数的修改都需要进行大量手工计算,这些都极大地限制了面向微分方程的通用仿真程序的应用。实际上,在控制系统的分析、设计与综合过程中,方框图的描述形式是一种更常用的形式。如果能够把系统看作是由许多典型算法模块构成的,在程序中事先编好这些典型算法模块的程序,用户使用时,根据一定的界面调用这些典型模块,组织成控制系统,并设置参数,则仿真过程就可以大大简化。这样的通用仿真程序称之为面向控制系统方框图的通用仿真程序。8.3.1典型模块的选取通常,在控制系统中比较常见的线性模块有以下几种,可以选择一个或几个作为典型模块:8.3.2模块之间的连接当选择好典型模块后,就可以编制通用仿真程序了。在程序中各模块之间的连接有两种典型方法:1.连接矩阵法下面举一个例子说明这种方法。假定选择积分模块k/s作为典型模块,先将被仿真的系统化成仅用积分和比例模块描述的形式,例如,对于图8.2所描述的系统,必须化成图8.3的形式。在每个积分模块输出处设一状态变量xi(i=1~5),每个积分器的输入为ui(i=1~5),见图8.3。由此,可以写出系统的状态方程为令W=[W0W1],则W称为系统的连接矩阵,它代表了系统的连接情况,其中Wij代表了第j个模块对第i个模块的连接系数(把输入视为第0模块),若无连接关系则为0,例如:2.关联矩阵法用连接矩阵表示系统的连接情况对机器内存是很不经济的。对于上述的5阶系统,有一个输入,就需要有一个6×5的矩阵存储连接系数。如果系统阶次很高时,占用内存空间太多。所以现在的一些通用仿真程序不采用这种形式描述系统的连接情况,而是假想所选择的典型模块有固定的输入个数(实际系统中也正是这样),用一个关联矩阵存储模块输入端所关联的模块序号即可。某系统有50个典型模块,1个输入。如采用连接矩阵的方式,则需要50×51=2550个内存单元存储系统的连接。如果假想每个模块都有3个输入端,采用第二种连接方式,则仅需要3×50=150个内存单元来存储系统的连接。但是,后者也有一个缺点,由于关联矩阵中的元素描述的是与该模块关联着的其他模块的序号,因此与该模块关联的系数就无法表示了,只好把这些系数放在典型模块里。8.4基于结构化方法设计的通用仿真程序虽然现在我们已经有了面向对象的方法,但是在工业控制领域的很多场合所使用的控制器,一般采用特殊的嵌入式实时操作系统,这些操作系统大多数不支持面向对象的方法。有些控制器中甚至没有操作系统。与其对应的仿真系统也往往采用相同的配置条件。这些原因制约了面向对象方法的使用,因此,结构化设计方法依然是广泛使用的设计方法。在实际应用中,常见的设计方法是,在专门用于组态设计的计算机(工程师站)中,基于普通操作系统(如Windows2000等),采用面向对象的方法设计人机交互界面,让用户组态控制系统方框图,形成组态文件。再把组态文件载入另一台专门用于控制运算的计算机(控制站)中,基于特殊的、高性能的嵌入式实时操作系统(如VxWorks、QNX等),采用结构化方法实现实时控制运算或者仿真运算。本节讨论采用结构化方法实现实时控制运算或者仿真运算的方法,而采用面向对象的方法实现仿真运算和人机交互界面的问题在第8.5节和第8.6节中再讨论。8.4.1标准算法模块函数正如第8.3节所述,方框图的描述形式是一种常用的控制系统描述形式。该方法把系统看作由许多典型算法模块构成,这样就需要在程序中事先编好这些典型算法模块,用户使用时,根据一定的界面调用这些典型模块,组织成控制系统,并设置参数。这些典型算法模块可以看作是一个个独立的函数,每个算法模块都具有输入值、输出值、参数值、中间计算值和算法逻辑等要素。由于在一个系统中,可能有多个相同类型的算法模块,因此每个典型算法模块函数都可能被多次使用。这样,典型算法模块函数中就无法保存对应的各个算法模块的输入值、输出值、参数值、中间计算值等每个模块特定的变量。为此,一般在程序中建立下列变量表,用来对系统进行管理,这些变量表并不在标准算法函数内部定义,而是定义在这些函数之外的程序中,比如最简单的做法是定义为全局变量表。1.模块序号在控制系统组态时,每个新加上的算法模块都有一个编号,称为模块序号。在有些系统中,序号是单独编排的,而在另外一些系统中,序号就用该模块第一个输出信号的地址表示。大多数系统中,模块序号还用来决定运算调度时的顺序,这样,在组态时要合理地编排块号,以减少系统中不必要的延迟。如果块号的编排不合理,会产生所谓的“绕圈”(Loop—backs)现象。为了说明这一情况,举例如下。2.模块类型编号在控制运算调度时,依据模块类型编号来调用不同的标准算法模块函数,来完成具体的模块计算。标准算法模块的分类方法参见第8.3.1节和第8.6.3节。该编号不是定义在标准算法模块函数的内部,而是一个具有全局性质的查询表,表中每一个值对应于一个标准算法模块函数。这种查询表一般可以用枚举量构成,或者采用宏定义的方式描述。3.输入变量表每个算法模块都有一些输入变量,没有输入的情况可以看作“0”个输入,以便统一处理。这些输入变量的值来源于其他模块的输出变量,这反映了控制系统图中信号线的连接关系。输入变量表用来记录这些输入变量的来源。在控制运算调度时,依据输入变量表来搜索其他算法模块的输出变量的值,作为本模块本次运算的输入值。4.输出变量表每个算法模块都有一些输出变量,没有输出的情况可以看作“0”个输出,以便统一处理。这些输出变量的值用来记录本模块本次运算的计算结果。在控制运算调度时,输出变量表被用来为其他与之相连的算法模块提供本次运算的输入值。5.参数表每个算法模块都有一些参数,比如PID算法中的比例系数、积分时间和微分时间等参数。在控制运算调度时,查询这个参数表,来获得具体模块的参数值,以便完成运算。6.中间量表也就是状态变量表。凡是具有储时性的算法模块,比如PID、积分、惯性环节等以及定时、延迟等算法,每次计算时都要用到上一次或上几次运算的中间量,这些中间量必须保存在一个临时中间量表中,以便下次计算时查询使用。8.4.2控制运算调度控制运算调度函数实现对整个系统的运算,在开始运算之前,一般要检查系统的连接情况,比如连接数据类型错误、端口悬空等问题。然后还有一个重要步骤,就是初始化各个计算的输入值表、输出值表、中间变量表。初始化成功后开始进入循环运算,直到控制步数满了后退出循环。在循环体内,运算调度程序根据模块序号轮流计算各个算法模块,首先根据模块序号查询该模块相应的模块类型表获得模块类型;然后根据模块类型调用相应的算法函数;同时把该模块所用的输入变量表、参数表、中间量表传递给该算法函数;算法函数完成计算后,把计算结果存入输出变量表。循环体内的程序设计框图如图8.6所示。8.5人-机交互界面人-机交互界面也称计算机用户界面,是指计算机与其使用者之间的对话接口,这种对话接口规定了用户与计算机之间的信息交互的方式,是计算机系统的重要组成部分。用户界面的重要性在于它极大地影响了最终用户的使用,影响了计算机的推广应用,甚至影响了人们的工作和生活。对于用户来说,易于学习,易于记忆,易于使用,以及能够直观、快速、有效地进行与计算机之间的信息交互是非常重要的。尽管人们对人-机交互界面的重要性早已认识到了,但多年来在这方面的进展一直
本文标题:通用数字仿真程序设计.
链接地址:https://www.777doc.com/doc-2007197 .html