网上收集的资料。
原文参考:
http://blog.sina.com.cn/s/blog_859fc6960102waqb.html
控制策略模型建模规范(总则)
1. 导言
1.1. 目的
本建模规范适用于XXXXX控制策略开发阶段,快速原型模型的开发和维护。
本规范主要用于约束XXXXX部XXXX控制策略建模行为。
1.2. 参考文档
CONTROL ALGORITHM MODELING GUIDELINES USING MATLAB, Simulink, and Stateflow(Ver. 3.0)
CONTROL ALGORITHM MODELING GUIDELINES USING MATLAB, Simulink, and Stateflow(Ver. 4.01)
Modeling Guidelines for MATLAB/Simulink/Stateflow and TargetLink
1.3. 缩写及术语
MAAB: MathWorks Automotive Advisory Board
RCP:Rapid Control Prototyping 快速控制原型
HILS:Hardware-in-the-Loop Simulation 硬件在回路半实物仿真
SF:Stateflow
2. 概述
本规范参考Mathwork的汽车咨询委员会发布的《使用Matlab、Simulink和Stateflow进行控制系统建模指南》中关于模型构建风格的部分内容。预期读者对象为:熟悉被控对象结构,具有较强的Simulink/Stateflow 建模能力,并熟悉XXXX控制思想的相关专业人员。
2.1. 名称约定
模块 | Block(s) / Module(s) | 构成Simulink模型的基本功能单元 |
模型 | Model | 模块的集合(后缀为.mdl或.slx的文件) |
模式 | Mode | Exclusive(OR) 和 Parallel(AND) |
SF模块 | SF 模块/型 | Simulink模型中的Chart |
SF状态机 | SF State-Machine | Simulink模型中所有SF模型的统称 |
SF框图 | SF Diagram | SF模块所包含的内容 |
SF状态图 | State Charts | SF框图中包含State(s)的局部图形 |
SF流程图 | Flow Charts | 不包含任何状态仅由连接节点和转移组成的SF框图 |
2.2. MATLAB版本
本规范在MATLAB 2009b/2010b/2015b/2016a中都应遵循,除非无法实现或遵从。
模型最终将通过RTW自动生成嵌入式代码,应用于RCP测试。
2.3. 目的
通过对建模行为的约束,可提高或改善模型的以下特性:
• 可读性:方便图形化模块构架的理解、功能的分析、防止易犯的错误发生;
• 建模效率:易于修改,维护,较强的重用性,清晰的接口;
• 仿真与测试:易于分析、监控和测试,可追溯性强,测试方便;
• 代码效率:改善RTW代码的时间效率和空间效率,增强鲁棒性。
控制策略模型建模规范(命名原则)
3.1. 命名原则
文件、文件夹、子系统、模块、输入输出模块、参数、信号、总线等命名应遵守以下原则:
1. 使用有意义的名字:确切的表述变量代表的含义;
2. 使用编码信息:采用标准缩写/简写或首字母缩写;
3. 添加数据类型:指定变量的类型;
4. 添加工程或者系统单位:确切指示变量使用的单位;
5. 使用变量所属(作用)域:指示变量的出处和存储类型。
3.2. 命名规范
文件、文件夹、子系统、模块、输入输出模块、参数、信号、总线等通用命名规范:
1. 使用字符(A~Z,a~z)开头,可以用字符、数字(0~9)以及下划线等组合构成变量的名称,并且对字符的大小写敏感,遵循一般C 语言变量的命名原则;
2. 首字符不能为数字和下划线,末尾字符不能为下划线;下划线可用于分割字符,但不允许连续使用2个及以上的下划线来分割字符;
3. 不允许使用中文字符,不允许使用空格;
4. 命名长度:3 to 31 字符/characters长度 (不包含扩展名及.字符);
5. 为增强可读性,使用下划线分割大小写字符,变量名中的下划线原则上不超出四个;
6. (信号和参数名)禁止使用任何MATLAB的关键字/保留字,函数名或者操作符名,比如:'pi','true','false',’break','case','catch','classdef', 'continue','else','elseif','end','for','function','global','if','otherwise','parfor','persistent','return','spmd', 'switch','try','while','eps','Enf','intmax','intmin','NaN','pi','realmax','realmin','true','false','inf'…
7. 禁止使用任何MATLAB自动生成代码中使用的字符,比如:‘const’,’TRUE’,’FALSE’, ‘infinity’,‘nil’,‘double’, ‘single’,‘or’,‘enum’ …
类别 | 特殊要求 |
文件 | 扩展标识符(扩展名)不能含有空格。 |
文件夹/子系统 | 不允许使用回车; |
模块 | 可以使用换行符 |
输入输出模块 | 不允许使用换行符; |
参数/信号/总线 | 不允许使用换行符/ no control characters ; |
控制策略模型建模规范(模型与模块)
本部分对模型和模块的外观特性进行约定
4.1. 背景色约定
模块 | 背景色 | Simulink设置值 |
Atomic Unit/Subsystem | 绿色 | Green |
Inport | 绿色 | Green |
Outport | 红色 | Red |
标定量 | 灰色 | Gray |
监控变量 | 灰色 | Gray |
Constant | 灰色 | Gray |
引用公共函数 | 黄色 | Yellow |
4.2. 模型中允许使用的数据类型
Simulink supports all built-in numeric MATLAB® data types except int64 and uint64.
Name | Description |
Inherit: Inherit from Parent value | Use data type of Settings/Parent value. |
Inherit: Inherit via back propagation | Use data type of the driving block. |
double | Double-precision floating point |
single | Single-precision floating point |
int8 | Signed 8-bit integer |
uint8 | Unsigned 8-bit integer |
int16 | Signed 16-bit integer |
uint16 | Unsigned 16-bit integer |
int32 | Signed 32-bit integer |
uint32 | Unsigned 32-bit integer |
boolean | Boolean (1 = true; 0 = false) |
fixdt(1,16) | fixed point fixdt(1,16). |
fixdt(1,16,0) | fixed point fixdt(1,16,0). |
fixdt(1,16,2^0,0)) | fixed point fixdt(1,16,2^0,0). |
Enum: | enumerated data type |
Bus: | bus object |
4.3. 模型注释
在模型中的关键算法必须进行注释,注释必须写在注释区域,注释文字不影响仿真和代码生成,注释需遵循以下原则:
• 加框
• 加阴影
• 英文
• 字体字号:Arial,常规,10
本地化的语言应该仅用于具有描述、注释性质的区域,如模块的descriptive fields 。
4.4. 模型组织结构
对模型进行层级结构划分有利于提高模型的可读性、可维护性。一般在进行逻辑系统建模时,进行层级结构划分时,会用到下面的一些模块:
• Subsystem
• Atomic Subsystem
• Stateflow
模型中所有的层级应该和控制系统具备的各个功能及其结构保持一一对应的关系,并保证可读性、良好的工作流,可以被测试验证,可以生成代码。
在建模时推荐按照如下方式进行层级划分:
• 顶层
• 触发层(非必须)
• 结构层
• 数据层
顶层是体现模型总体外貌特征最外层,包括模型整体输入和输入输出变量定义和逻辑控制部分。触发层表明了各个子模块的触发时序,如果有必要还要设置其优先级,并用注释方式表达出来。结构层主要显示模型运算逻辑框架,是进一步的功能划分,在其中的各个子系统模块建议设置为原子子系统。数据层由“基本模块”构成,为模型最底层,用于表示数据传递顺序和数据运算过程。
每个模型以library的方式创建,并使用层级管理,便于后续的版本更新管理。一般由三个层级组成:
• 第一层级:集成的模块,命名:xxxx_yyyy (模块缩写名_项目代号缩写)
• 第二层级:功能子系统,命名:xxxx_zzzz(模块缩写名_子系统功能缩写)
• 第三层级:细分子系统,命名:根据子系统特性和功能命名
• 第四层级:根据需要增加该层级
控制策略模型建模规范(SIMULINK)
5.1. 绘图行为
1. 所有的Simulink 窗口都应采用白色背景。
2. 视图的放大率应为100%。如果在100%视图放大率的情况下,模型超出Simulink 窗口,则设置:View->Zoom->Fit to view,即Fit diagram to screen。
3. 模型中的信号流程是从左到右的;前后相继的模块或子系统从左到右安置,并行的模块或子系统由上向下安置;除延时模型以外的其它模型不允许执行旋转和镜像操作。
4. 输入端口应位于图表的左侧,输出端口应位于右侧,为防止信号交叉,端口可适当平移调整位置;禁止在顶层对输入端口做复制操作,在子系统层级也应当尽量避免复制操作。
5. 子系统不能被旋转和镜像。
6. 一个系统中一定不能出现:未连接的子系统, 未连接的基本模块输入、输出端口,未连接的信号线。
7. 反馈闭环子系统中防止“代数环”的延时模块必须放置于子系统外部。
5.2. 信号
1. 未连接的输入信号应与接地模块相连,其它未连接的输出信号应与终端模块相连。
2. 输入输出信号名称必须可见,统一在信号下方显示。
3. 每一个信号在整个模型中必须是唯一的。
4. 每个模块的输入信号的信号线上必须注明信号名称。
5. 信号线尽可能不交叉,转弯处以直角(仅允许以水平和垂直的方式连接)的方式转折或绘制。信号线不能重叠,每个分岔点处不能引出多于两根信号线。
6. 属于继承的信号,其名称标识符应该添加<>修饰符,以指示继承类型,其它信号则不要求。
7. 当信号跨越不同层级传输(父系统和子系统)时,传输链上信号的propagation signal属性应设置为ON状态,(信号名称以“<信号名称>”的形式标识)。总线信号如设置有信号名称也应该遵循该原则。
8. 当信号来自一下模块,即使信号未跨越不同层级传输,信号的propagation signal属性也应该设置为ON:
• from,goto
• Bus Creator ,Bus Selector
• Signal Specification
• Function Call Split
9. 触发信号名称可作为被触发的条件子系统名称的组成部分。
5.3. 模块模型
1. 模块应采用白底黑框,模块不应增加阴影。
2. 常见的逻辑模块,如ADD,可不显示名称,若有特殊变量则建议在模块下方标注。
3. 逻辑操作模块的外形应选择square。
4. Product 模块:第一个输入应为“*”
5. Relational Operator关系运算模块:变量与常量比较时,变量作为模块的第一个输入信号,常量作为第二个输入信号。
6. 查表算法模块的插值算法应该选择终值插入法。
7. 求和模块(ADD)应使用矩形状。
8. Trigger和Enable 模块不能在顶层使用。
9. 模型中的文本元素(模块名称和信号标签)统一字体和字号:Arial/Normal/ 10。
10. 模型应该适当缩放,确保所有的标识、文本都完整、清晰可见,尽量采用同样尺寸。
11. 模型的名字必须可见,并放置于模型下方。
12. 使用Requirements或Summary对模型进行注释说明。
13. from 和goto 模块:from 模块和goto 模块的标签(Tag)应匹配,一个from 模块只能接受一个来自goto 模块的信号。
14. 使用goto和from连接信号时:只能在原子子系统外部使用,goto块只能设置local域。
15. 除用于创建总线、或为了合并模块连接输入信号外,goto和from只能用于对子系统信号的连接。
16. 被连接的两个系统至少要有一条直连的信号线(即不使用goto和from连接)存在。(Using Goto and From blocks to create buses or connect inputs to merge blocks are exceptions to this rule.)
17. 以前向和后向反馈闭环方式连接的子系统在每个方向上至少要有一条直连的信号线存在。
18. 触发子系统,使能子系统和条件子系统:
a. 子系统的类型标识应置于系统最顶部;
b. 触发信号源端模块名称应与触发或使能该子系统的触发信号名称一致。
19. 模型处理过程必须使用适当的模块来实现逻辑和数字运算。
20. 模块输入、输出端口的数据类型必须匹配一致。
21. 输入switch,multiport switch,index vector的各个端口的数据类型必须一致。
22. 模块的使能端口应只接受逻辑运算结果作为输入。
23. Multiport switch 模块:第一个输入(控制输入)值必须大于等于1,且不能超过选择输入值。
24. Switch块使用必须遵循以下原则:
a. 切换条件,即输入2端口的信号必须是布尔类型的。
b. 通过条件必须设置为:u2~=0。
25. 原则上:设计状态判断的使用if-Action模块;设计值选择的使用Switch模块。
5.4. 模块选择与设置
1. 为了保证标定量/常量参数可调,应不含任何表达式、数据转化、行或列的选择。
2. multiport switch的索引值参数,应配置为“0为基值”的方式。
3. 信号滞环(即返回上一周期值)模块,优先选择Unit Delay。
4. 信号集合模块,优先选择Bus 模块;模块输入可以采用Bus 模块集成,简化模型。
5. 时间积分模块:分连续时间积分模块Integrator和离散时间积分模块Discrete-Time Integrator,优先选择离散时间积分模块Discrete-Time Integrator。
6. 乘积模块,优先选择Product模块,而不是Gain模块,且多个量相乘时建议拆分为两两相乘。
7. from/goto 模块建议使用局部变量Local 格式,避免使用全局变量Global格式。
8. 触发式模块建议优先选择Function-Call Subsystem,然后选Enabled Subsystem,最后选择Triggered Subsystem。
9. 构建if-then-else 结构的模型,如果then 和else 的响应为两个常量,可以采用switch模块;但如果是两个较复杂的计算,可以考虑使用If/Else 模块,输出变量采用merge 模块进行过滤输出,这样可以提高仿真及代码生成的效率。
10. 模型中不要使用Fcn 模块,用其他模块代替。
11. Lookup Table 模块:查表方法选择“Interpolation-Use EndValues”。
12. 模型中最好不要采用绝对值模块,RTW 代码生成时会导致值的跳变。
5.5. 表达式、逻辑及仿真
定义主表达式:
一个输入;
一个常量;
一个常量参数;
除0和1以外的包含<,<=,>,>=,~=,==,~符号的带括号的、不包含逻辑运算符号的表达式。
1. 逻辑表达式如果包含两个或更少的主表达式,则应使用if条件模块来实现。
2. 包含三个或以上的主表达式,且仅含有一种逻辑运算符号的逻辑表达式是允许的;
3. 复杂表达式(含多个主表达式或(和)多种逻辑运算符)应分解为若干主表达式、并使用if条件模块去实现。
4. 枚举值、逻辑值仅参与逻辑运算、数字值仅参与数字运算。
5. 布尔值不能参与关系运算。
6. 数字值(0,1,~)或逻辑值(true,false)不能与布尔值进行比较。
控制策略模型建模规范(STATEFLOW)
6.1. 基本行为和状态
1. Stateflow模块中至少有两个状态,且要有默认状态,每个状态不能只有一个子状态。
2. Stateflow状态图嵌套不能多于3层。
3. 单一状态视图内的子状态个数控制在6个以内,最高不超过9个。
4. Stateflow中的逻辑,不使用MATLAB函数、指令、运算符。
5. 逻辑类型的信号禁止执行比较操作。(使用if(logical type signal))
6. 逻辑运算不能用于两个布尔值。([true && false])
7. 布尔类型的信号不能与数字0、1或逻辑值true、false进行比较操作。
8. 不同类型的数据禁止执行比较操作,如果需要必须首先执行显示类型转换的操作。
9. 禁止对两个浮点类型的数值执行严格的==或!=判断操作。
10. 禁止对无符号数执行取负操作[-]。
11. 如果需要翻转逻辑类型的信号,应使用布尔操作NOT。
12. 取反符号:~用于位操作按位取反,!用于逻辑取反操作。
6.2. 事件、变量设置
1. 同一个变量在单个Stateflow范围内不应该有多重定义。
2. 未使用的事件和变量不允许出现在Stateflow图块中。
3. 并行的图块或状态机中不允许出现同名的局部数据。
4. Stateflow中除0用于初始化变量,1用于自增自减操作外外,不允许常量和变量直接使用数值。
5. 事件必须定义在chart或者更低的级别,不允许chart之间进行事件交互。
6. 除触发调用函数调用子系统外,事件不应该用作状态转移的驱动条件。
7. 为了便于可读性,事件en:、du:、ex:每个应单独起一行;每个事件具体内容也应单独起一行。
6.3. 标签
Stateflow的输入输出端口名称应与相应信号名称一致。
6.4. 条件与条件动作
1. 条件表达式只能使用返回值为布尔类型的表达式,不允许使用整形数值。
2. 动作类型(entry(en),during(du),exit(ex),en,du: ,du,ex: ,en,ex: ,en,du,ex:)不能多次重复描述,且合并动作(en,du: ,du,ex: ,en,ex: ,en,du,ex:)的描述只能在动作序列的最顶层或最底层放置。
3. 如果动作序列能在条件动作(condition action)或转移动作(transition action)以及转移目标状态的Entry动作中实现, 就不要使用状态的Exit动作去实现。
4. 最好不要使用转移动作,优先使用条件动作。
5. 用于状态转移判断条件的变量的更新操作不允许放置于during动作中。
6.5. 内部转移和状态转移
1. Stateflow中的转移连接,不允许相互交叉、重叠,禁止穿过任何状态、节点或文本框,可转移到一个内部状态,转移标签连接于相应的转移上。
2. Stateflow的转移应遵循:条件在水平方向上标出,动作在竖直方向上标出。
3. Stateflow默认转移链接应置于状态顶部,默认转移的终止状态在同级状态中应处于最高位置。
4. Stateflow默认转移符号的绘制不应该超出所处状态的边界。
5. Stateflow状态图:不允许在单一状态内使用多个内部转移分支。
6. Stateflow内部转移标签必须从状态内部的左侧边界起始。
6.6. 流程图
SF状态图或流程图应合理避免“回溯”现象。
为便于数据流及代码生成,流程图的返回值只能放置在图表中的某一个位置,不能多次出现。
6.7. 函数块及其它
SF状态图应选用C语言方式构建,及使能C-bit operation
禁止将含有SF状态图的Simulink模型作为更高层级的SF状态机的子系统。
控制策略模型建模规范(其它)
本规范规定之外的建模行为,原则上应遵循最新版本的MAAB建议的规则。
7.1. Simulink与Stateflow的选择原则
选择使用simulink或stateflow来建立控制算法模型,要根据模型所需要表达的属性来决定,避免使用stateflow描述数学表达式,要采用simulink的形式。如果处理过程主要涉及复杂的逻辑运算,或者模型的本次运算与上次运算的结果有相关联,则应采用Stateflow建模;如果模型的主要功能是数学运算,或处理策略主要涉及固定流程式的数字处理,则应采用Simulink建模。
如果主要的程序是逻辑运算,但是有小部分是数学运算,则在stateflow中可以使用stateflow中的语言进行编写。
如果主要的程序是数学运算,但是需要一些简单的逻辑对算法进行支持,可以使用基本的逻辑运算模块。
如果逻辑运算过程中,遇到较复杂的数学运算,应该采用stateflow进行主要逻辑运算,然后使用fuction-call的调用simulink的模块完成数学运算。
7.2. 模型架构
应根据模块特性以及需求,实现的对模块的分频调度
7.3. 脚本文件
M文件应该包含完善的注释,如作者,修改时间,版本;
不允许存在没有使用的脚本代码;
变量声明顺序:
Name = mpt.Signal Name中应加Sig前缀表明是信号
Name = mpt.Parameter Name中应加Param前缀表明是参数
Name = Simulink.NumericType Name中应加Numeric前缀表明是参数
MATLAB 2013以及之后的版本建模应该使用下面的方式声明变量:
Name = simulink.Signal
Name = simulink.Parameter
Name = Simulink.NumericType