ANSYSSCADESuite建模基础/ANSYS核心产品系列/万水ANSYS技术丛书 [1 ed.] 9787517068037

107 66 60MB

Chinese Pages 368 [377] Year 2018

Report DMCA / Copyright

DOWNLOAD FILE

ANSYSSCADESuite建模基础/ANSYS核心产品系列/万水ANSYS技术丛书 [1 ed.]
 9787517068037

Table of contents :
封面
书名
版权
前言
目录
第1章 开启SCADE之旅
1.1 背景概念简介
1.1.1 嵌入式系统
1.1.2 安全关键系统
1.1.3 机载软件的适航标准
1.1.4 基于模型的开发与验证
1.2 SCADE介绍
1.2.1 同步语言介绍
1.2.2 SCADE产品的演进
1.2.3 SCADE Suite的特点
1.2.4 SCADE产品未来发展的路线图
1.3 SCADE快速入门
1.3.1 SCADE的适用环境和安装步骤
1.3.2 创建SCADE Suite工程
1.3.3 SCADE Suite操作符和输入输出的创建
1.3.4 飞机滚转角示例
练习题
第2章 SCADE Suite建模基础
2.1 SCADE Suite集成开发环境常见操作
2.2 SCADE数据类型
2.2.1 预定义数据类型
2.2.2 自定义数据类型
2.3 常量
2.3.1 常量的定义
2.3.2 常量的使用
2.4 操作符
2.4.1 预定义操作符
2.4.2 自定义操作符
2.5 条件模块
2.5.1 条件模块的概念
2.5.2 条件模块的创建与编辑
2.5.3 条件模块中变量的隐式赋值
2.6 导入元素
2.6.1 导入常量
2.6.2 外部引用变量(Sensor)
2.6.3 导入操作符
2.6.4 导入静态库
练习题
第3章 SCADE Suite安全状态机
3.1 安全状态机
3.1.1 状态机的组成
3.1.2 状态机的创建
3.2 状态的设置
3.2.1 状态
3.2.2 初始状态和终止状态
3.2.3 状态的编辑
3.3 迁移的设置
3.3.1 迁移
3.3.2 迁移的条件和行为
3.3.3 迁移的触发
3.3.4 迁移和初始状态
3.3.5 迁移的编辑
3.4 状态机中变量的隐式赋值
3.4.1 变量的隐式赋值
3.4.2 定义变量的Last值
3.4.3 定义变量的Default值
3.4.4 同时定义变量的Last值和Default值
3.4.5 同时不定义变量的Last值和Default值
3.5 Signal(信号量)
练习题
第4章 SCADE Suite高级建模设计
4.1 数组操作
4.1.1 数组的创建
4.1.2 数组元素的获取
4.1.3 数组操作
4.2 结构体操作
4.2.1 Data Structure操作符
4.2.2 Make操作符
4.2.3 Flatter操作符
4.2.4 Project操作符
4.3 迭代器建模
4.3.1 迭代器的创建和循环次数设置
4.3.2 map迭代器
4.3.3 fold迭代器
4.3.4 mapfold迭代器
4.3.5 mapi迭代器
4.3.6 foldi迭代器
4.3.7 mapw迭代器
4.3.8 foldw迭代器
4.3.9 mapwi迭代器
4.3.10 foldwi迭代器
4.3.11 mapfoldi迭代器
4.3.12 mapfoldw迭代器
4.3.13 mapfoldwi迭代器
4.4 条件激活操作
4.4.1 条件激活操作符的创建
4.4.2 Boolean Activate操作符
4.4.3 Restart操作符
4.5 多态建模
4.5.1 数组大小的参数化
4.5.2 变量类型的参数化
4.5.3 操作符行为的参数化
4.6 仿真相关的设置
4.6.1 Assume和Guarantee
4.6.2 精度的设置
练习题
第5章 SCADE Suite基于模型的验证
5.1 基于SCADE Suite模型的验证流程
5.1.1 DO-178C的传统验证手段
5.1.2 基于SCADE Suite模型的验证工作
5.2 基础验证活动
5.2.1 SCADE模型检查器
5.2.2 SCADE模型仿真
5.2.3 SCADE覆盖分析
5.3 认证级测试环境QTE
5.3.1 SCADE QTE的工作流
5.3.2 创建测试工程
5.3.3 设计仿真用例和仿真规程
5.3.4 QTE在主机上的功能测试
5.3.5 QTE在主机上的模型覆盖分析
5.3.6 QTE在主机上的代码覆盖分析
5.3.7 QTE在目标机上的测试
5.3.8 QTE下多操作符验证的注意事项
5.3.9 仿真结果的评审
5.4 SCADE的形式化验证
5.4.1 安全属性
5.4.2 形式化验证的工作流
5.4.3 形式化验证工具Design Verifier
5.4.4 形式化验证实例
5.5 SCADE编译器验证套件
5.5.1 编译器的验证
5.5.2 C语言安全子集
5.5.3 CVK的内容与使用方法
5.5.4 使用SCADE CVK的注意事项
练习题
第6章 代码和其他目标的生成
6.1 代码生成
6.1.1 代码生成的配置
6.1.2 单个操作符的代码生成配置
6.1.3 创建并保存自定义配置
6.2 代码集成
6.2.1 代码生成步骤
6.2.2 生成代码的集成
6.2.3 代码集成的其他考虑
6.3 Simulink的S函数生成
6.4 NI VeriStand生成
6.5 FMU生成
6.5.1 Modelica协会与统一建模语言
6.5.2 FMI标准与FMU文件
6.5.3 Suite生成FMU文件
6.6 Adaptor生成
6.7 设计文档生成
练习题
第7章 SCADE Suite模型的优化
7.1 模型优化的目标和基准
7.1.1 安全关键系统的软件规模在增长
7.1.2 MBDV方法的优势
7.1.3 模型优化的目标和准则
7.2 布局格式优化
7.2.1 布局格式的推荐规范
7.2.2 编辑技巧
7.2.3 自定义样式
7.3 模型优化
7.3.1 模型优化的内容和要点
7.3.2 模型优化示例
7.4 最坏运行时间与堆栈分析
7.4.1 TSO介绍
7.4.2 TSO使用方法
7.5 性能优化案例
7.5.1 算法一:基于过程的传统C语言编程的思维
7.5.2 算法二:优化的基于过程的思维
7.5.3 算法三:选择恰当的迭代子
7.5.4 算法四:关注数据的SCADE Suite建模最佳方式
7.5.5 WCET分析结果
7.5.6 堆栈分析结果
练习题
第8章 项目管理
8.1 项目组织
8.1.1 命名规则
8.1.2 工程管理
8.1.3 文件管理
8.2 追踪管理
8.2.1 DO-178C中追踪管理的要求
8.2.2 SCADE RM Gateway
8.2.3 普通文本类型文件的追踪
8.2.4 SCADE文件的追踪
8.2.5 验证相关文档的追踪
8.2.6 生成快照
8.2.7 生成追踪矩阵
8.3 配置管理
8.4 建模规范
练习题
第9章 综合案例
9.1 目标
9.2 中位数计算设计实例
9.2.1 Torben算法求中位数简述
9.2.2 实例创建步骤
附录1 缩略词汇总和常用词定义
附录2 SCADE Suite关于DO-178C/DO-331目标的符合性矩阵
参考文献

Citation preview

ANSYS SCADE Suite 建模基础 荆华沈软坢等编著

邻)”“”“”

-、,...

www.waterpub,com.en

r

丛书特色

]

:

本书特色

]

(

ANSYS 工程行业应用系列—-】

r

ANSYS高级仿真技术系列

>



_





68 0,— 8 s“

3

,l

— 5 一一--

68



1

o, 7 8

7

哇一官方宛巴服务平台

5

定价: 82.00 元

万水 ANSYS 技术丛书

ANSYS SCADE Suite 建 模基础 荆华沈秩焊等编著

迩”“”“社

www.waterpub.com.cn · 北京 .

内容提要 SCADE 产品模块众多,适用千安全关键领域的嵌入式系统和软件的研制,涵盖功能安

全分析、系统架构设计、控制算法设计、人机界面设计、多学科仿真应用等多个方面 。 本书 主要讲解其中的控制算法设计软件 SCADE Suite, 并重点围绕三 个角度进行编写:从初学者 的 角度出发,循序渐进地安排内容结构和知识点分布;从使用者的角度出发,介绍 SCADE 的 基本使用方法和常用操作技巧;从工程人员的角度出发,讲述有代表性的实例、介绍通用 的 行业经验。

本书收录了大量有较强代表性的示例,示例中的模型都力求准确无误,可以在 PC 环境 下仿真运行。

本书可作为理工科高校计算机类研究生、航空宇航类研究生、导航制导与控制类研究生 以 及高年级本科生的教学用书,也可供相关领域的师生、科研和工程技术人员参考 。

本书所有示例和练习题 参考答案可以从万水书苑以及中国水利水电出版社网站下载,网 址为: http://www.wsbookshow.com 和 http://www.waterpub.eom.cn/softdown/ 。

图书在版编目 (C I P) 数据

ANSYS SCADE Suite 建校基础 / 荆华等编著. 京 : 中国水利水电出版社, 2018.8 (万水 ANSYS 技术丛书)

-- 北

ISBN 978-7-5170-6803-7

I . (DA … II. @荆…田.@计算机仿具—系统建校 — 应用软件 IV . (DTP391. 92 中国版本图书馆 CIP 数据核宁 (2018) 第 202138号 策划编辑:杨元涨

封面设计:李佳

贵任编辑:张玉玲

万水 ANSYS 技术丛书



名 I ANSYS SCADE Suite 建模基础





ANSYS SCADE SUITE JIANMO JICHU 出版发行

荆华沈紩坢等编著 中国水利水电出版社 (北京市海淀区玉渊漳南路 1 号 D 座

100038)

网址: www.waterpub.com.cn

E-mail: [email protected] (万水) [email protected] 电话: ( 010) 68367658 (营销中心)、 82562819 (万水) 经



全国各地新华书店和相关出版物销售网点





北京万水电子信息有限公司





三河市鑫金马印装有限公司





I 84mm X 260mm





20 1 8 年 8 月第 1 版

印数

0001 -3000 册

定价

82 . 00 元

16 开本

23.5 印张

582 千字

2018 年 8 月第 1 次印刷

凡购买我社图书,如有缺页、倒页、脱页的,本社营销中心负责调换 版权所有·侵权必究





SCADE 诞生千 20 世纪 80 年代的法国,从欧洲的航空业与核能业的工程应用起步,经过 30 多年的发展,逐渐成为在航空航天、国防军工、轨道交通、核能重工、汽车电子等行业具 有广泛应用的商业产品。 由千 SCADE 专注千流程规范、标准严苛的安全关键行业,行业的特性使得其多应用千研 制具有相当密级的、高难度的重大项目,因此 SCADE 在国内仍处于“养在深闺人未识”的状 况。时至今日,市场上鲜有中文版的 SCADE 书籍可供大家参考学习, SCADE 的推广应用也 就有些“高处不胜寒”了。 在业内众多基千模型的研制工具中,作为唯一在多个安全关键行业中以开发工具形式通 过最高等级鉴定的产品, SCADE 的独特优势逐渐被越来越多的国内企业认可。随着 SCADE 在包括 C9 l 9 大型客机、高铁列控系统、第 三代核电 仪控系统、军工先进战机等重大高端装备 项目中的开展应用,业界亟需 SCADE 的相关培训教程。 “要写怎样的 一本 SCADE 书使 它更适合于初学者呢? ”

这是我们写作本书时反复问自己的一个问题。 SCADE 产品模块众多,适用千安全关键领 域的嵌入式系统和软件的研制,涵盖功能安全分析、系统架构设计、控制算法设计、 人 机界 面设计、多学科仿真应用等多个方面。本书主要介绍控制算法设计软件 SCADE Suite, 并重点 围绕三个角度进行讲解:



从初学者的角度出发,循序渐进地安排内容结构和知识点分布 。



从使用者的角度出发,介绍 SCADE 的基本使用方法和常用操作技巧。



从工程人员的角度出发,讲述有代表性的实例,介绍通用的行业经验。

本书收录了大量有较强代表性的示例,示例中的模型都力求准确无误,可以在 PC 环境下 仿真运行。

作为 ANSYS 公司 SCADE 产品的高校合作计划伙伴之一,我们电子科技大学不揣冒昧 , 在

已经做过三年课堂教学的基础上,结合业内多家 SCADE 用户的经验,编写了这本 SCADE 软件 基础教程。希望借此抛砖引玉,吸引更多的专家学者加入到推广这款优秀产品的队伍中来。

本书可作为理工科高校计算机 类研究生、航空宇航类研究生 、导航制导与控制类研究生 以及高年级本科生的教学用书,也可供相关领域的师生、科研和工程技术人员参考。

本书 章节介绍 读者可以按部就班地顺序阅读全书章节,系统地学习 SCADE Suite 。有使 用经验的读者 ,

也可以根据目录直接到相应章节查询相关内容。 第 1 章主要介绍 SCADE 产品的背景、特点和未来的发展方向。本章包含一个简单的 Getting Start 案例,让读者快速上手。

第 2 章主要介绍 SCADE Suite 的界面布局、基本语法和常用建模操作。学习完本章 内 容 后,可 进行以数据流为基础的建模操作 。

第 3 章主要介绍 SCADE Suite 中的状态机建模操作 。 SCADE 的状态机又称安全状态机

(Safe State Mac血e, SSM ) ,适用于精确描述具有抢占、并发、同步等复杂迁移转换特性的 控制流。 第 4 章主要介 绍 SCADE Suite 的 高级建模操作,主要包括数组建模操作、结构体建模操

作、迭代器建模操作、 条件激活操作、多态建模操作 。 第 5 章主要介绍基千 SCADE Suite 模型的验证,阐述使用 SCADE 模型后对机载软件验证 流程的简化及对应的活动项,内容包括模型仿真、模型覆盖分析、认证级测试环境、形式化 验证和编译器验证。 第 6 章主要介绍 SCADE Suite 代码与其他目标的生成,包括模型生成代码的配置、生成

代码在 PC 平台的 集成、可结合其他第 三 方工具的文件生成与模型对应的详细设计文档的生成 。 第 7 章主要介绍 SCADE Suite 模 型的优化操作,包括模型优化的目标、基准和推荐方法, 并介绍如何使用 Abslnt 工具进行优化结果分析 。 第 8 章主要介绍 SCADE Suite 模型开发中的项目 管 理,包括项目组织、配置管理、追踪

管理和建模规范。 第 9 章综合案例,描述取中位数的算法 。

附录是 SCADE Suite 关千 D0-178C/D0-331 目标的符合性矩阵 。 致谢

任何 一部书的成功出版都离不开多方面的努力 。 感谢参与本书编写的陈小平、张程濒、

邢多庆、邱晓呛、吴丹杨、杨坤、王品、毛伟、王文杰、姜强等人,他们为本书的模型示例 设计、 章节校对等工作耗费了很多业余时间;感谢合作伙伴 ANSYS 公司大中国区系统事业部 的马金梭、董如怡、傅 金泉、杨瑾婿、应中伟、侯东、姜平、许周文、周霄、孙晓呛、王 文 全,在多次的交流讨论中,他们从工程应用角度出发,结合不同行业客户的使用经验与常见 问题,给出了 许多有益的建议 ; 感谢中国水利水电出版社杨元浊编辑的倾力协助,她为本 书 的顺利出版倾注了极 大的 心血; 感谢电子科技大学航空航天学院的刘强、须玵、曾艳、梁伟 等人在本书撰写过程中给予的关怀、鼓励与支持,他们的坚定支持是我们能完成本书的最大 动力。最后,由衷地感谢所有参与过本书撰写和审阅的各位朋友 。 由千写作团队水平有限及时间仓促,书中纸漏错误之处在所难免,望各位读者不吝赐教,以

便再版时我们采纳 读者的宝贵建议修正不足,我们的电子邮箱是 [email protected] 126 . com 。

目录

前言 第 1 章开启 SCADE 之旅. . .`.... ... ..... ............

I. I

背景概念简介 ...... .... ......... .. . . .............

1 I

2.6

70

导入元素................... .. .................. .

2.6.1

导入常量...................................

71

I.I.I

嵌入式系统.........................,....... l

2.6.2

外部引用变量 (Sensor).... · · ·........

72

1.1.2

安全关键系统............................

l

2.6.3

导入操作符.................... .. ..........

73

1.1.3

机载软件的适航标准. ......... . . . ... . ....

2

2.6.4

导入静态库................................

79

1.1.4

基于模型的开发与验证............... 6

练习题..................................................

81

SCADE 介绍. ........ . .嘈··················· · ·····

1.2

1.2.1

同步语言介绍.

8

........ .......... 8

第 3 章

3. 1

SCADE Suite 安全状态机 ········ · ··· ··· · · 82 安全状态机........ .. ............ ..............

82

1.2.2

SCADE 产 品的演进...... ...... ... .......

11

3.1.1

1.2.3

SCADE

Suite 的特 点...............

14

3.1.2

1.2.4

SCADE 产品未来发展的路线图......

17

SCADE 快速入门..................···········

18

3.2. ]

状态... .. ....................................

85

1.3

3.2

状态机的组成.............................

82

状态机的创建.................. . ..........

84

状态的设置....................... ...........

85

1.3.1

SCADE 的适用环境和安装步骤.

I8

3.2.2

初始状态和终止状态....................

85

1.3.2

创建 SCADE Suite 工程 .. ...............

23

3.2.3

状态的编辑.......... . .....................

86

1.3.3

SCADE Suite 操作符和输入输 出

3.3

迁移的设置...................... . .. ......

.... 89

26

3.3.1

迁移........ . ................................

飞机滚转角示例........,............... ··27

3.3.2

迁移的条件和行为...................

89

·.. ·................•... ·....... ·.......... 35

3.3.3

迁移的触发................................

91

Suite 建模基础 .. ... ...令 ··········· 36

3.3.4

迁移和初始状态................... .......

91

2.1

SCADE Suite 集成开发环境常见操作 ..... 36

3.3.5

迁移的编辑.

2.2

SCADE 数据类型.....························

38

2.2.1

预定义数据类型. ... .. ..............··

38

3.4.1

2.2.2

自定义数据类型........................

38

3.4.2

定义变址的 Last 值.... . ....... . ... .. ... 99

常扯..............................................身 46

3.4.3

定义变量的 Default 值..... ... ..... . ... 100

3.4.4

同时定义变量的 Last 值和

的创建......................................

1.3.4

- 练习题.... ....

第 2 章

2.3

SCADE

..... .. .

... 46

2.3.1

常怔的定义..

2.3.2

常址的使用...........................····

2.4

预定义操作符........`..........·········

2.4.2

自定义操作符

2.5

条件模块 ..... .... ....

64

Default 值.. .............. .................

3.4.5

3.5

64

第 4 章

2.5 .2

条件模块的创建与编辑.................

65

4.1

2.5.3

条件模块中变量的隐式赋值.

. 68

Signal

101

102

(信号扯).................... ......... 104

练习题................................. ...............

条件模块的概念..........................

98

同时不定义变址的 Last 值和 Default 值.................................

2.5.1

.

变益的隐式赋值···· · ·· ······· ············

49

................. 63

................. 91

状态机中变批的隐式赋值..... ........... 98

3.4

47

操作符 ········ · ·················· ·· ··············· 48

2.4.1

89

SCADE

· 105

Suite 高级建模设计 .... ........

106

数组操作...... . .. . .............................

106

数组的创建··············· ··········· ·····

106

4.1.1

4.1.2

数组元素的获取.... ................

108

5.2.2

SCADE 模型仿真...............········

157

4. l.3

数组操作 ......,........................···

I 10

5.2.3

SCADE 覆盖分析 .,..................

167

结构体操作..... ...... ... ......................·

112

4.2

4.2.1 Data Structure 操作符··················· 112

认证级测试环境 QTE······················· · 182

5.3

5.3.1

SCADE QTE 的 工作流···•······· · ····· 182

4.2.2

Make 操作符······························

I 13

5.3.2

创建测试工程····························

4.2 .3

Flatter 操作符.............................

113

5.3.3

设计仿真用例和仿真规程

4.2.4

Project 操作符··············.. ············1]4

5.3.4

QTE 在 主机上的功能测试······ · ·····

193

114

5.3.5

QTE 在主机上的模型覆盖分析

197

4.3 .I

迭代器的创建和循环次数设置....... 115

5.3.6

QTE 在主机上的代码覆盖分析. ··201

4.3.2

map 迭代器

.......................... 116

5.3.7

QTE 在目标机上的测试 · ··········· ···203

4.3.3

fold 迭代器.......................·

·· I 17

5.3 .8

QTE 下多操作符验证的注意韦项

4.3.4

mapfold 迭代器..........................

5.3.9

仿真结果的评审 ·························208

4.3

迭代器建模.............................. ......

117

5.4

183

. . . • 184

.

205

4.3.5

mapi 迭代器··········· ···· ·········· · ···

122

4.3.6

foldi 迭 4 飞器 ..............................

124

5.4.1

安全属性................ . .... ...... .......

208

4.3.7

mapw 迭代器...................... . .....

125

5.4.2

形式化验证的工作流··•········ ·· ······

208

4.3 .8

foldw 迭{飞器............................ 126

5.4.3

形式化验证工具 Design

4.3.9

mapwi 迭代器.................. 128

5.4.4

形式化验证实例 ·························210

SCADE 的形式化验证. ....... .... ...... ·208

Verifier······ 209

4.3.10

foldwi 迭{飞器.......................... 130

4.3 .11

mapfoldi 迭代器............... . ...... 131

5.5.1

编译器的验证 ····························218

4.3.12

mapfoldw 迭{罚器......................

133

5.5.2

C 语言安全子集········••·······.. ····

4.3.13

mapfoldwi 迭代器.....................

135

5.5.3

CVK 的内容与使用方法............... 220

条件激活操作....... ..........................

136

5.5.4

使用 SCADECVK 的注意事项.. ···222

4.4

SCADE 编译器验证套件 ····················218

5.5

·219

4.4.l

条件激活操作符的创建... ........ 137

4.4.2

Boolean Activate

操作符.............

137

第 6 章

4.4.3

Restart 操作符......................

140

6.1

多态建模................... ......... ...........

141

6.1]

代码生成的配置............

224

4.5.1

数组大小的参数化.......... .. . ...... 1 4l

6.1.2

单个操作符的代码生成配置..

240

4.5.2

变量类型的参数化.. .......... ......

6.1.3

创建并保存自定义配置 ····· ·· ·········242

4.5

4.5.3 4.6

操作符行为的参数化.... . ... ..... . ... 143

Assume 和 Guarantee·

6.2

f 飞码集成.......... . ....... .. ....... .. ....... ···242

· · · · · · · · · · · · · · · · · · 146

6.2.2

生成代码的集成 ··•··············· · ······243

...... 147

6.2.3

代码集成的其他考虑...................

245 245

Suite 基千模型的验证 .......

基于 SCADE Suite 模型的验证流程

5.1

代码生成.............................. ·········224

精度的设咒.......................

SCADE

224

6.2.l

练习题.................................................

第 5 章

代码和其他目标的生成····· ·· ···· ·· · ·····

146

仿真相关的设置..... ... .................... ..

4.6.l 4.6.2

142

练习题............................................ ·····223

代码生成步骤 ····························242

148

6.3

Simulink 的 S 函数生成... ,.. ......,.........

149

6.4

Nl

149

6.5

FMU 生成............................... ·······249

VeriStand 生成................. .·· · ··

··247

5.1.l

D0-178C 的 传统验证手段............

149

6.5.1

Modelica 协会与统 一建模语言 ·······249

5.l.2 5.2

基于 SCADE Suite 模型的验证工作 l52

6.5.2

FMl 标准与 FMU 文件 ·················249

基础验证活动............ ........ ... ..........

156

6.5.3

Suite 生成 FMU 文件 ········ · ···· ···· ··250

SCADE 模型检查器....................

156

5.2.1

6.6

Adaptor 生成···································

252

6.7

设 i 十文档生成.................................

253

练习题........................... . .....................

258

第 7 章

7.1

SCADE

Suite 模型的优化

....-.. •. 259

模型优化的目标和基准.....................

306

练习题............................. .. ... . ........... . ..

307

第 8 章项目管理. ..... ......... . . ............. . . .....

8.1

项目组织,.................................. ···· 307

259

8. l.l

命名规则

工程管理............

文件管理............... . ........ . ..... ....

311

追踪管理.................. . ....................

312

........ ················ ···307

7.1.l

安全关键系统的软件规栈在增长 •

259

8. 1.2

7.1.2

MBDV 方法的优势. ............. . .....

26 1

8.1.3

7.1.3

模型优化的目标和准则............

261

布局格式优化. ........ , ................... ....

264

8.2. l

D0- I 78C 中追 踪管理 的要求........ · 312

7.2.1

布局格式的推荐规范..................

264

8.2.2

SCADE RM Gateway............ ·.. ··.. 313

7.2.2

编辑技巧..............................

267

8.2.3

普通文本类型文件 的追踪 ........

318

7.2.3

自定义样式..............................

276

8.2.4

SCADE 文件的追踪.......... . ...· · ····

333

模型优化.......................................

280

8.2.5

验证相关文档的追踪 ·············· ·····335

7.3. 1

模型优化的内容和要点.............

280

8.2.6

生成快照.............. . ............ . ......

33g

7.3.2

模型优化示例..............,...,........

281

8.2.7

生成追踪矩阵······.. . ·..... ,..........,.

339

最坏运行时间与堆栈分析.................

290

8.3

配置管理...................................,...

34 1

8.4

建模规范·...

7.2

7.3

7.4

7.4.1

TSO 介绍. ............................

290

7.4.2

TSO 使用方法........... ................

29 1

性能优{七案例................................,

296

7.5

7.5.1

算法一:基千过程的传统 C 语言 编程的思维..............................

296

752

算法二:优化的基千过程的思维

299

7.5.3

算法三:选择恰当的迭代子........

301

7.5.4

算法四:关注数据的 SCADE Suite 建模最佳方式...........................

303

7.5.5

WCET 分析结果 ..................... 3 05

7.5.6

堆栈分析结果..........

305

8.2

· ········· · ··· · 307

·............... · ·........... ·•· ·.. 343

练习题. . .......................... .... . ... ... ..... ·····343

344

第 9 章综合案例.... . .................... . . .... . .....

9.1

目标............... . ........... ..... ...... ... ·· ·· 344

92

中位数 i 卜算设计实例.................... ...

344

9.2.1

Torben 算法求中位数简 述.....

9.2.2

实例创建步骤 ··· ······ ·········· ·········345

附录 1

缩略词汇总和常用词定 义 ................

附录 2

SCADE Suite 关千 D0-178C/D0-331

344

358

目标的符合性矩阵................... . ......

360

参考文献......,...................................... ...,

367

1

开启 SCADE 之旅

1.1

背泉概念简介

1.1.1

嵌人式系统 嵌入式系统,是一种嵌入机械或电气系统内部、具有专一功能和实时计算性 能的计算机

系统。区别于可以执行多重任务的通用型计算机,嵌入式系统是为某些特定任务而设 计的 。有

些嵌入式系统的需求强调尽可能地简单、低成本,有些则要求满足非常高的实时性要 求 。一般 来说,嵌入式系统通常具有内核小、专用性强、系统精简、实时性高等特点。

安令关徙系统

f.1.2

当产生故障或者失效后,能引起下述情况的系统可认为是安全关键的系统,如图 1-1 所示。

图 1-1

安全关键系统



人身的 重大损伤,甚至死亡:例如航空、高铁、地铁 、汽车……



环境的大范围恶化:例如核电、化工、炼油· …..

-

违$



财产的巨额损失:例如通信、电力、重工……



关键任务的耽误和失败:例如航天、军事、指挥……

安全关键软件 (Safety Critical Software) 的定义带有主观性。 IEEE 定义安全关键软件为:

用千一个系统中,可能导致不可接受的风险的软件”l 。为了指导和规范企业开发出安全关键软 件,相关行业提出了专门的软件安全性工程标准,包括机载软件的适航标准 D0-178C 、铁路 领域的 EN 501 28 标准、电子电气领域的 IEC 61508 、 汽车领域的 ISO 26262 等 。 SCADE 的英文全称为 Safety Critical Application Development Env江onrnent, 意思是安全 关

键的应用开发环境,是 一款 可通过多个安全关键行业软件工程标准认证的工具,适用于开发嵌 入式安全关键系统的软件 。 由千机载软件适航标准较为成熟和严苛,是在航空领域普遍认可和 接受的标准。而 SCADE 产品在航空领域的应用也更加知名和广泛,本书将主要遵循机载软件

的适航标准来介绍 SCADE 产品 。

1.1.3

机载软件的适航标 ifl;

I. D0- L78C 概览 机载软件适航标准的第 一 版 D0-178 发布于 1982 年 。历经 30 多年的发展,相继在 1985 年发布了 D0 - 1 78A,

1992 年发布了 DO-l 78B, 2011 年发布了 D0-178C 。

值得一提的是,机载软件的适航标准不是单独存在的,它和 ARP4754A 、 ARP4761 、 ARP

5150 、 D0-254 、 D0-297 等文件 一起 构成了现代机载系统安全性设计与评估的 一组指南 材料[2] , 如图 1 -2 所示。

民用机载系统和设备进行 安全性评估过程的指南和方法

商用服务飞机的安全性评估

(ARP5150/ 5151)

(ARP 4761/ED-135) 统计息 系没亿







能个息 功安亿

功能系统

民用飞机和系统的研制指南

(ARP 4754A/ED-79)

综合模块化航电指南

(D0-297/ED-124)

硬件开发生命周期

软件开发生命周期

(D0-254/ED-80)

(00·178/E0-12B)

开发阶段

图 1-2

使用/操作阶段

现代机载系统安全性设计与评估的一组指南材料

`



开启 SC,ADE 之勹可

第 1 章

ARP 4761 和 ARP 4754 通过对航空器、系统和功能不同层级的安全分析 ,得出危 害 和失 效条件,并以此分配出待研制软硬件的研制保证等级 ( DAL ) ,如表 1-1 所 示。 表 1-1

待研制软硬件的研制保证等级 危害等级

研制保证等级

A-B-C-D-E

灾难性的

危险的 重要的

次要的 无影响的

D0-17 8C 就是机载软件开发生命周期中对不同研制等级软件进行安全开发的指南 ,这些 指南的绝大多数也都适用于其他的安全关键领域。 DO-l 78C 的名称是《机载系统和设备合格 审定的软件考虑》。它是在美国航空无线电技术委员会 ( RTCA ) 和欧洲民用航空设备组织 (EUROCAE) 的发起下,由国际团体形成共识,从而产生的一组建议,千 2011 年 l2 月 13 日发布。 DO-l 78C 有 7 份文件,分别是:

• •

DO-l 78C: 机载系统和设备合格审定中的软件考虑 。 D0-278A: 通信、导航、监视和空中交通管理系统软件完整性保证指南。

• D0-248C: DO-l 78C 和 D0-278A 的支持信息。 • D0-330: 软件工具鉴定考虑 。 • D0-331 : DO-l 78C 和 D0-278A 的基于模型的开发与验证补充 。 • D0-332: D0-178C 和 D0-278A 的面向对象技术与相关技术补充。 • D0-333: D0-178C 和 D0-278A 的形式化方法补充庄 2. D0-178C 的过程简介 D0-1 78C 标准是面向过程和目标的,通过以下 3 种形式指导软件开发者的工作 :



规定航空机载软件生命周期中各个过程的目标。

• •

推荐达到这些目标的活动和工程实现考虑。

规定确认这些目标已经实现的证据记录 [2]

0

DO-l7 8C 中的过程主要分为以下 3 类:



软件计划过程:用千指导软件开发过程和软件综合过程 。 D0-178C 中规定了需要准 备的 5 个计划(软件合格审定计划、软件开发计划、软件验证计划、软 件配置管理计 划和软件质量保证计划)和 3 个标准(软件需求标准、软件设计标准 和软件编码标准) 。



软件开发过程:分为软件需求过程、软件设计过程、软件编码过 程和软件集成过 程 4 个子过程,如图 1-3 所示 。 图中的高层需求 ( HLR) 和低层需求 (LLR) 是

D0-178 系列标准特有的提法,可粗略地将它们类比为传统软件工程中的概要设计 和详细设计 。



软件综合过程:分为软件验证过程、软件配置管理过程、软件质篮保证过程和审定联 络过程 4 个子过程 。

-

分尼列软存的系绢穿皮

杖#$级

软件开发过程

软件需求过程

t

追踪 I

匕-

r

软件设计过程

追踪 !_」软件编阿过程尸飞玛和召伟代码 可戎行代研

集成过程 高店霄戒,底屋;;;块和软伴突构 烦代吗和 g 标 (f 巧 ,

毋证/SCM/SQA 记灵

可拱行代码

杖侔实珑侥娶

追跺

图 1-3

软件开 发 过程

三类过程的关系如图 1-4 所示,它们不是独 立 地进行的,过程之间存在着交互,例如软件

综合过程贯穿千整个软件生命周期的始终,与软件计划过程和软件开发过程都存在 着 交互[2) 。

计材和标淮

软件计划过程

软件开发过程 铨证韦栗

丈、作码 、 追 引 l scM!SQA

计材和标淮

记戎

软件综合过程

lI

l

审定联络过程 软件验证过程 软件质量保证过程 l I 软件配置管理过程 1 图 1-4

D0-178C 中的 三类过程关系 图

3. D0-178C 的目标简介 软件无法作为 一 种唯 一 且独立的产品进行审定,它必须要和安装在航空器、发动机上的 机载系统和设备 一起接受适航审定当局的审定 。 作为审 定工 作的 一 部分,机载系统或设备中的

嵌入式软件应得到审定当局的批准通过 [2] 。 D0-178C 标准以目标来定量刻画机载软件的研制,只要在研发过程中实现了标准中规定 的某 一级 别软件的 全部目标,就可以有理由相信该软件满足了适航审定当局的适航性要求 。 D0-178C 标准中, A 级软件要实现 71 个目标, B 级软件要实现 69 个目标, C 级软件要

实现 62 个目标, D 级软件要实现 26 个目标”] 。 其中,这 些 级别软件的目标中都含有共同的部 分,只是随着软件级别严格程度的提高,目标数和独 立 性的 要 求相应增加,完成的 工 作 量 和难

度也逐渐提高 [2] 。

以最高安全等级的 A 级软件为例, DO-I 78C 结合三类过程提 出了 10 组目标及完成这些目 标推荐进行的指南和活动。这 10 组目标是:



A-1 软件计划过程 (7 个目标)



A-2 软件开发过程 (7 个目标 )



A-3 软件需求过程输出的验证 (7 个目标 )



A-4 软件设计过程输出的验证 (13 个目标)



A-5 软件编码和集成过程输出的验证 (9 个目标)



A-6 集成过程输出的测试 (5 个目标 )



A-7 验证过程结果的验证 (9 个目标)



A-8 软件配置管理过桯 (6 个目标)



A-9 软件质蜇保证过程 (5 个目标)



A-10 合格审查联络过程 (3 个目标)

4. D0-3 30 的简介 D0-1 78C 的目标不可省略,但是完成目标的活动通过工具的介入可以省略或者自动化 地 执行。但这样的工具必须满足 D0-178C 的补充文件 D0-330 软件 工具鉴定考虑 的要求 。 D0-330 中引入了工具鉴定准则和工具鉴定级别的概念。



准则 l: 该工具的输出是结果软件的一部分,因此可能注入一个错误。



准则 2 : 该工具自动化了验证过程,因而可能检测不出某个错误 ,并且其输出的作用 是去除或减少下列过程 :



没有被工具自动化的验证过程

>

可能对机载软件有影响的开发过程

准则 3: 该工具在其意图的使用范围内可能检测不出某个错误。



其中的“准则 1 工具”与 D0-1788 中的开发工具的鉴定过程非常相像。准 则 l 工具 的例 子包括自动代码生成器、配置文件生成器、编译器、链接器等。”准则 3 工具 ”与 D0-178B 中

的验证工具的鉴定过程基本相同。例子包括测试用例生成器、自动化测试工具 、结构覆 盖工具 、 数据耦合分析工具和静态代码分析器。而“准则 2 工具”可视为一种“超级验证工具“ , 是

D0-178C 中专门引入的概念 [I] 。 基千三个准则以及工具支持的软件级别,可为工具分配一个工具鉴定级 别 (Tool

Qua lification Level, TQL) 。 TQL 决定了鉴定过程中要求的严格程度。共有 5 个 TQL, TQL-1 要求最严格, TQL-5 要求最低 [I] ,如表 1-2 所示。 表 1-2 工具类别

工具鉴定过程中要求的严格程度 软件级别

工具鉴定级别

开发工具

A

TQL-1

开发工具

B

TQL-2

开发工具

C

TQL-3

开发工具

D

TQL-4

验证工具

E

TQL-4 或 TQL-5

对于研制不同软件级别的项目,需要选用恰当的工具 。 SCADE 系列产品中的代码生成器、

DF 文件生成器是可通过 TQL-1 鉴定的开发工具:覆盖分析器、认证级测试环境和文档生成器 是可通过 TQL-5 鉴定的验证工具 。

人基于快刚的 Jf友与验证

l.1.4

I. D0-331 的 模型 业内模型设计开 发相关的提法不少,有模型驱动的设计 (Model

Driven Design, MDD ) 、

基于模型的设计 (Model Base Design , MBD ) 、 基千模型的系统工程 (Model Base System Engineering, MBSE ) 等,侧重点各有不同 。 本书主要使用 DO-l 78C 补充文件 D0-331 中基千 模型的开发与验证 (Model Based Development and Verification, MBDV) 的提法 。 模型可以用千架构设计、硬件描述、虚拟仿真等领域,而 D0-178C 中的模型主要是用千 系统和软件开发的, 是软件生命周期数据的 一 种抽象描述方式,用来更好地支持软件开发过程 和软件验证过程。软件生命周期中并非所有数据都适合用模型描述,有两类最适合用模型描述:

@软 件 高层需求 : @软件低层需求和软件架构 。 这两类数据可能全部用模型描述,也可以部分 用模型描述。 D0-331 中引入了规范模型 (Specification Models) 和设计模型 (Design Models) 的概念 。

规范模型描述的是高层需求,是对软件组件的功能、性能或安全特性的抽象表达 。 规范模型不 定义软件设计的细节。设计模型规定了软件组件的内部数据结构、内部数据流和控制流。设计

模型描述了低层需求和软件架构 。 设计模型可用于产生代码 。 并非所有模型都适合描述数据,通常下述情况不认为是模型:



没有严格的语法(图符、字母、文字) 。

• •

没有严格的语义。



没有对软件的开发和验证带来帮助的 。

没有用来描述软件的需求和架构 。

因此,需要引入专门的建模技术和模型标准来衡量模型的好坏 。 通常规定:



模型必须通过某种明确定义的建模符号来完整描述 。



这种建模符号具备精准严格的语法 。

业内通常选用 基于 SysML 、 AADL 等语言的模型来描述规范模型,而本书要介绍的基千 SCADE 语言的工具则广泛应用千设计模型 。 值得一提的是,规范模型和设计模型是互斥的,

一 个模型不可能同时为规 范模型和设计模型 。 用规范模型直接生成代码是需要商榷的。

2. MBDV 的优势 除了具有认证级的代码生成器外, SCADE 是 MBDV 工具也是其另 一 个重要的特点 。

MBDV 有许多潜在好处,收获这些好处的能力依赖千实现细节见

(1) V 生命周期变为 Y 生命周期。使用 MBDV 方式的主要动因就是应用模型自动生成 代码的功能, 省去了工程师的手工编码 。 这使传统的 V 生命周期变为 Y 生命周期 , 带来降低 开发时间、成本,甚至降低人为错误的潜力 。 其中,使用 一 个没有鉴定的代码生成器可以使流

程有 20%的缩短,使用一个得到鉴定的代码生成器可以得到 50%(1] 。 (2) 更聚焦千需求。需求错误发现得越晚,修复的成本就越高 。 当用 一 个模型表示需求

时,它比文 字需求更有能力表达出系统或软件功能的清晰视图 。 当使用自动化来实现模型时,

—一翻

i

-

使得开发团队能够聚焦于需求的图形化表示,而不是实现细节 [I] 。 (3) 更早更有效的验证。当开发流程中确定使用经过鉴定的代码生成器时,开发焦点从

代码转移到了模型 。 模型仿真的使用促进了及早验证,使得需求以及错误检测能更早成熟 [I] 。 更多的基千模型验证方面的内容可以参考第 5 章的内容 。 ( 4) 减少 不必要的冗余和不一致。传统的软件开发使用 3 层需求 :分配给软件的系统

需求、软件高层需求 CHLR) 、软件低层需求 (LLR) 。 传统方法中 ,这 些层次之间可能存在 大量冗余,在进行变更时带来不一致性 。 使用经过鉴定的建模工具有能力降低这些冗余和不 一致性 [I] 。

( 5 ) 纳入形式化方法的支持。建模技术、工具支待和形式化方法之间有一个汇聚,这可 以增强 MBDV 的好处。当一个包含代码生成器的建模工具的正确性得到形式化验证 时,就可

以依赖该工具去执行其预期的功能。形式化方法可以通过验证整个输入和输出空间来提升使 用

“模型到代码”工具包的信心 [I] o 与其他补充文件一样, D0-33 I 使用 DO-l 78C 提纲,并根据需要对 D0-178C 修改、替换

或增 加目标、 活动和指南(I] 。附录 2 列出了使用 SCADE 工具后完成满足 D0-I 78C/D0-33 l 目 标的矩阵表 D

3.

MBDV 与传统方式的区别

表 1-3 和 表 l4 列出了在开发和验证两个层面 MBDV 方式与传统方式的区别。 表 1-3 序号

MBDV 的开发方式与传统开发方式的区别

传统的软件开发

典型的 MBDV 开发

l

高层斋求(文本或图片)

规范模型

2

低层盆求(文本或图片)

设计模型

3

软件架构(文本或图片)

设计模型

4

编写源代码(手工编码)

自动生成代码

5

软件需求I设计标准

软件模型标准

6

追踪关系(条目化)

追踪关系(模型单元)

7

代码库

模型库

表 1-4 序号

MBDV 的验证方式与传统验证方式的区别

传统的软件验证

典型的 MBDV 验证

I

计划和标准的评审与分析

计划和标准的评审与分析

2

高层需求的评审与分析

高层需求的评审与分析、模型仿真

3

低层需求的评审与分析

低层盂求的评审与分析、模型仿真

4

软件架构的评市与分析

软件架构的评审与分析、模型仿贞

5

源代码的评审与分析

源代码的评审与分析

6

集成过程输出的评审与分析

渠成过程输出的评审与分析

7

测试

测试、模型仿真

一 心如 续表

传统的软件验证

序号

典型的 MBDV 的验证

8

测试用例、规程及结果的评审与分析

仿真用例、规程及结果的评审与分析

9

覆盖分析

覆盖分析

IO

需求稷盖分析

盂求覆盖分析

II

结构覆盖分析

结构覆盖分析、模型稷盖分析

SCADE 介绍

1.2

本节介绍 SCADE 产品的起源、发展和现状 。 同步语,、f 介绍

1.2.1

SCADE 模 型背后使用的是 SCADE 语言,它起源千同步语言。而同步语言 (Synchronous Language) 诞 生于 20 世纪 80 年代早期。当时以计算机为基础的系统可分为以下 3 类 :



转换系统 (Transformational Systems ) :根据输入计 算输出,然后结束,如绝大部分的 数值计算软件、 工资管理软件、编译系统。



交互系统 CJnteractive Systems ) : 与外界环境进行不停的交互处理,如操作系统、数 据库、互联网 。



反应系统 (Reactive Systems ) :不停地响应外界环境的激励,它与交互系统的不同之 处是前者纯粹是由输入驱动的, 其典型例子是过程控制系统、信号处理系统。

绝大部分工业领域的实时系统 ( Realtime Systems) 都是反应系统,另外一些则涉及通信

协议或者人机界面等因素 。 同步语言就是以反应系统为应用领域的程序设计语言 (4][5][6] 。 通常反应系统有 3 个要素:输入、计 算、输出,如图 1-5 所示。

实时反应系统

尸嘈蠲… 图 1-5

I.

实时反应系统

同步假设

考虑这样 一 种情况,如果系统处理速 度无限快,即系统在一个可以忽略不计的瞬间响应 输入并产生输出 。这样 ,系统在 一 瞬间响应输入,然后等待下一个输入,……,那么,任何连 续的两次响应之间有间隔,不会前后重叠,如图 1-6 所示。

.一-

矗~.`

/:收到的输入

每周期的输出必须早千下一周期 的输入

o: 产生的输出



0

理想的计算时间 间隔 图 1-6

当然 ,

理 想计算时间下的反应系统

同步假设中理想的计算时间是不现实的 。 而在真实系统运行中 ,只要在每 一次 新

输入发生之前完成了对上次输入的响应,也就满足了同步假设 ,如 图 1-7 所 示。 /:收到的输入

每周期的输出必须早于下一周期的输入

o :产生的输出

lt

LO

O,

Or

贞实的计算时间

0

间隔 图 1-7

真实 计算时间下的反应系统

定义同步假设的内容为:



“输入-计算输出“这个过程在规定的时间内完成 。



“输入-计算输出”的过程中,输入必须不变 。



“输入-计算输出”的过程中,新到达的输入到下 一 周期才发生作用。



“输入-计算-输出“在瞬间完成,可把连续执行的时间离散化: T=O, L 2, 3, …



当 T=O 周期,系统做初始化工作 。



当 T>O 的每一个周期,系统做 一 次“输入 -计 算-输出“。

再定义“输入-计算-输出“过程的 4 个变量 :



输入变量 : 由外部环境给出,记作 l。



输出变量:由系统计算给出,提供给外部环境,记作 O 。



局部变量:由系统计算给出,保存了系统的状态,记作 L 。



并集变量:是输出变量和局部变屈的并集,记作 X, X=OU L 。

则可得到“输入-计算-输出“过程的 3 个解释 :

. • •

输入解释:对输入变量 I 的解释,记作 P 。 前置介绍:在计算前对 X 的解释,记作 S 。

后置解释 : 在计算后对 X 的解释,记作 S 。

显然,根据同步假设: T=0 周期

l

的知

l1

没有输入解释,没有前置解释 。

只有后置解释,它是系统的初始化 。 T>O 周期 输入解释:来自外部环境 。 前置解释:来自 T-1 周期的后置解释 。

后置解释:根据输入解释和前置解释的计符结果 [7] 。 2.

同步系统

所谓同步系统,就是输入解释、前置解释、后置解释 三者之间的关系,记作 中 (S -, P,S 勹 ·

所谓同步系统的 一次运行,就是指这样的一个序列 S。~. ,其中:

VT> O, i ET,中(S口, Pi,S,十)。 如果对千任何的输入解释、前置解释,有且只有 一个后置解释满足关系 中 (S-, P,S勹,那 么这个同步系统就是确定性的,用数学公式表达就是 VS 飞\::/P, 于 S十,如 (S-,P,S 勹。这个关 系也可以写成函数:

S +=中 (S -, P) 。给定一个初始化,给定一个输入解释的序列 ,确定性的

同步系统的运行是唯 一 的 。

同步系统把复杂的反应系统,根据开发实践中积累的经验,进行简化、归纳和抽象,形 成由输入解释、前置解释、后置解释 三者间的关系问题,对这个关系的不同研究方式得 出了不 同的同步语言 [7] 。

20 世纪 80 年代以来,发展出不少同步语言的分支,到目前为止依然比较知名的同步语言 主要有 3 种,如图 1-8 所示。 CNRS 法嚣噩家科半研究院

Lustre Paul Caspi - Nicolas Halbwachs (VERIMAG lab in CNRS)

IN扣A 法驾蟹立计算机及目动化研究院 IRISA 法国Ill冢湟色与自动化研究院 E>

ll



I

程序安装欢迎界面

(2) 单击 Change 按钮选择适当的安装路径或保待默认路径,再单击 Next 按钮。注意,

必须安装在非中文路径中,且安装在非 C 盘写保护的目录中,如图 1-15 所示,

1

_ t5i SCADE Rl6 • Es:terel Techno时,es 贮归 t1onr心 1

D

Ins叫 SC戍 R16 to:

!

_

C:'fr丐户m 曰己住妇e!T”“沁少士农立 R16\

~飞·.j

氐口压 4d

l—也_ 图 1-1 S

JI

Next>

1l

o心

l

程序安装路径选抒界面

( 3) 选 择 完全安装或是定制安装程序,如图 1 - 1 6 所示。 ~SCAOER16 心ImdTChnoio9心 父b,pT”

中如吐$e 切 1吓归 t 比屯炬亿"吐 凶卫竺 丈比da 丈归“W沁

\> I Complete 怂 pr叩四妇缸已 wl 比~心.如已虹~式中k 叩aa.)



Custom

。喊记1 口叩叩忙吐正 youw吓八如如 and`已e 虹y 喊比

nstaled. R己Uf1”巳心过伍动”users.

氏}忒

[ 图 1- 16

<阳太

4ll

如>

IG心

I

安装方式选择界面

(4) 用 户可 以 设置安装条目 , 全部设置完毕后单击 Next 按钮,如图 l-17 所示。 ,一. 表示 本 项及共千项全部安装。

g 表示仅安装本项。

X 表示 不 安装本项目。

,- -.----

J

1.

JJ ~·尸钰'玩rADE之液,

第 了百__~

t)SCADE 尺6· 知elT“hnol09心

05

只 Q它- SCADE 丘心如 压吐

炬 S“如 口。山cuf和山,一口如

__

酝扫~re ,ollRate

切式心Cmd

ooButtonlsP"巧_引

R哺RateC 北ulate

a臣

Roll氏啦W抑叩

RollRatetA必

图 1-43

仿贞示例效果图

RoilRate. ;off

;>

le印Va.ming

少屯tWaming

-> m心e

-.

一l

l

1- -JI - 严.

_

, 开启 S.CA飞 E1 之勹瑁

第 1 章

(6) 生成 KCGC 代码。

I ) 目标:用 KCG configuration 生成 C 代码并且观察生成的代码文件 。 2) 步骤 。

将 工具条 Code Generator 切换为 KCG 选项,如图 1-44 所 示。 了它

MTC 巳 圈 Simulation Timing and Stack 图 1-44

选择生成代码功能的方式

选中操作符 RollRate 后, 单占工具条 Code Generator 的代码生成按钮 。 代码成功 生成完毕后,可以在输出栏查看相关信息,如图 l-45 所 示。 i

匡on,ati 妞

Generat 仑d

r跻如erated files 、

G

Files

kcg_trace. x吐 txt

J J

kc 氐. etrics .

J J J J

RollRate_B.ollR吐e ,

C

RollRate'II 釭立屯RollR吐` . c Roll.Rat 湿ode_RollRate .

c

R皿ateC斗吐ate_RollRlte.

\.. 图 1-45

生成的代码文件

( 7 ) 创建单独可执行文件。 l ) 目标:生成单独的可执行的图形面板 。 2 ) 步骤。

添加设置好案例包中自带的 SCADE Display 工程 , 在 F 仆eView 视图下 右击 RollControl.etp, 在弹出 的快捷 菜单中选择 Insert File 选项,添加目录\rollRateGP.etp 文件,如图 1-46 所示 。 己蓉

凸 豆 ct Check Node RollRate ~ Generate Node Roll氐te ,i屯' 巳

Build

Node RollRate

(~ Run Node RollRate Add a Te 寸

ProJed...

Ins ert F 归 5 ...

图 1-46

插入 Di splay 工程的方式

在 Scade View 视图下右击 RollRate 操作符,在弹出的快捷菜单中选择 Connect to Graphical Panels 选项,如图 l-47 所示 。

按照图 1-48 所示连接 Suite 和 Display 的各个变匮(为了方便和 Suite 端口匹配 ,通常建

立 Display 工程时 1/0 名字尽量相同,连接时两边全部选中然后单击 Connect by Name 按钮即 可,如果名字不一样,则分别选中两边匹配的 1/0, 再单击 Connect 按钮进 行逐 个连接) 。

_ 亡l

令口.一 今口己 0eck

0 •.. 0

`

, 3

1 心虹l ta.

~ Generate Node RollRate

a

Build Node RollRale

-] 11blln.正 Q Run Node RollRat•

心 (.J 11bmalh

卢1 吕沁岱?.I 图 1-47

Connect to Graphical Panels...

连接 Suite 和 Display 的方式

SC凡无沁te[/Os:

Graph,ca1Panels-l店:

勹尸勹

1.::.. r . rollRat&I' 吓fx

# 1346856308

1一, 过 control_panel ,§ ri 吐 t””“1lg p.§ 1eft冒~…吐

,► ■ ode

'`

,§ ro1ll髦te

I

joysli 心C■ d

“on

图 1-48

Suite 和 Display 的端口匹配方法

选择 Project-+Configurations, 单击 KCG and Add 按钮,输入 Standalone Executable, 如图 1-49 所示 。 Add Configuration

Ne叩ome. St-丘cut妇 窃 Irom ` I K店

j

I

OK

I

Cancel

I

_l

IRoOControl 叩寸

Prqeel

图 1-49

单独可执行文件名字设览方式

选择 Standalone Executable, 单击 Settings 按钮,单击 Code[ntegration 选项卡,选择 Target

--- Standalone Executable, 如图 1-50 所示 。 (s,.u1",心

邑Code G•ner龟 lor

二 .. - .T.-rgel

Adaptor



邑产吐 on.如心1.

FMU

“如 1e

Other extenANI

Verist 已

Simplor 盯

口 Ad鲁 S1m吐 Simul•tor 厂7 MT广 Tn

啊 T”eI

Commer.ts

.

!•

一 崎一··--'

::=!:on>•E:1

竹沁d

官中

已句tal 斗 filters 召 float32 竹 floa也

_ _ 图 2-8

数组类型的建立步骤 二

( 4 ) 选择 ,出现图 2-9 所示的界面 。

Defim tIOn

Typ·

Comments

J 啊 Type1

',

.

_null

1

图 2-9

数组类型的建 立 步骤四

_

( 5 ) 单击 ^ I' 设置数组包含元素的个数,按 F2 键,出现图 2-l0 所示的界面,就可以输 入数组大小了,在本例需求中要建立包含 3 个 int l 6 元素的数组,所以输入 3 。

Type

Deflnil10n

曰 召 Typel

,



·3

图 2-11



数组类型的处立步}紧六

Typ·

De£1ru hon

巳 召巴正,

<釭ray>

,

Co剿nmts

•3

C 叩, lll\ls

“`t16

图 2-12

数组类型的建立步 ,j贤七

值得一提的是,建议数组的最高维度为 三 维。不推荐使用比三维数组维度更高的数组结 构,复杂的数据结构会影响模型的可 读性和可维护性。 2.

枚举类型

枚举 (enumeration) 可以提高程序的可 读性,枚举类型是一个集合,集合 中的元素 (枚

举成员)是一些命名的整型常雇,例如 C 语言的颜色枚举类型 colors= enum {blue, green, red} 。

下面给出建立包含 3 个元素的枚 举类型 co lors = enum {blue, green, red} 的步骤。 (l) 在项目框架图内 new project 工程的包 packagel 下新建数据类型 type l ,如图 2-l3 所

-

不。快捷键操作方式为:选中 Packagel 包后按 Ctrl+Shift+T 组合键,弹出类型定义对话框 。

千 'new 巳B

E:., e

project . etp new project Che 心



干一`ru1n1 -~

Cut

巳 tj libline 釭呛l Copy t会



l1 matn I 巳

匕一~

Insert 卫

V 芒匕`

曰 吕酰pm:lthe」付 P『opertles. 曰 al libmathexl



Browse References

Goto

lut pwline 盯

D

Operator

[]Imported Operator



, 奇

Constant



Type

D

Sensor Package

图 2-13

枚举类型的建欢步骤一

(2) 双击项目框架图 Workspace 中的 Typel ,在右侧工作区的编辑窗口选中 Definition 下 的 null, 按 F2 键,出现类型的选择界面,选择 ,如图 2-14 所 示。 (3) 如图 2-15 所 示,新建的枚举类型默认含有-个元素。为添加新的元素,右占 Typel,

在弹出的快捷菜单中选择 Insert一 Definition Element 选项,如图 2-16 所示。快捷键操作方式为: 选中 Typel 后按 Ctrl+Shift+E 组合键,自动生成新元素 。

血_一l. -- 7J`二T

SCADE

|l

D.hmtio1\

T”>.

Suite 建校基谨

第;了

c.....nls

曷还旦

可 Typ•I

<改ray>

4耳口让>

召 bool 刊 char

匀中tal 匀和石 召 float32 召 floa也

- _ 图 2-14

枚举类型的建立步骤二

D.fimtion

T yp•

c0IIII.nts

臼行 Typd

,

vdml

图 2-15

1T”>.

巳 可

枚举类型的建立步骤 三

D.f1mt10n

C”“Ols

',卫 Brows, Rtftrtncu Goto



Insert

I

I

Cut

Dtfinrt.ion Eltmtnt

沁 Copy

图 2-16

枚举类型的建立步骤四

(4) 按照第三步的方法依次建立 3 个元素,如图 2-17 所示。

D•firulion

C.....nls

',

x

int16 float32

Q y

('

cotnments

z

dar

图 2-28

结构体类型的建立 步骤八

(8) 数组类型和枚举类型中元素前后位置的调整方法为:选中其中的某元素,在按住 Alt+Shift 键的 基础上按向上、向下按钮调整该元素的位置 。 4.

别名 类型

别名类型有助千清晰理解设计数据的含义 。 例如, C 语 言 中定义单精度浮点数 float32 的 货币别名类型 currency, 再基千 currency 类型定义欧元别名类型 euro 和美元别名类型 dollar, 则变量使用这些别名类型时数据类型与功能含义都能 一 目 f 然 。

typedef tloat32 currency; typedef currency euro; typedef currency dollar; 大规模多人协同开发的项目中,使用统 一 命名的别名类型作用显著 。 下面给出建立上述别名类型的步骤 。

( l ) 在项目框架图内 new project 工程的包 packagel 下新建类型 type I, 如图 2-29 所示。

快捷键操作方式为:选中 Packagel 包后按 Ctrl+Shift+T 组合键,弹出类型定义对话框。

_ 三 9 仔l

-

五 金雪, r: .Jmct . 毫 tp

巳 e3 n... proJ·cl

Cut

Copy fllte4 lin· 臼 a 1 心”山 Ins.rt 田。 陶皇心 F O vecl 1 上 Brows. Referen(es

m

"the」 宫 Properties. ath•xl

Goto



ID

Operator

[]lmportrd Oprrator



pwline lul

严l1nev

, 护

Con 如 nt

If!

Typt

D

Sensor Pa 心吓

图 2-29

别名类型的建立步骤一

(2) 用步骤 (I) 的方法再建立两个 Type, 如图 2-30 所示 。

Deflni l10n _null null null

T”l. 召 Typo! 可 Typ 立

d 团豆i

_

图 2-30

(3) 将 Type l 重命名为 currency,

ryp·

'iJ

别名类型的建立步骤二

并将其基础数据类型设置为 float32, 如 图 2-3 1 所 示。

Def1mllon

comm.nl 云

肛厅E-

curr oncy

宫 Typ 立

_null _null

百 Typ 心

.

c..... 心 ls

图 2-31

(4) 将 Type2 重命名为 euro,

别名类型的建立步骤三

并将其类型设置为 currency,

Type

召 currency

可 •uro 召 Typ 心

Defini llon flul32 匠闺

如图 2 -32 所示。

Comm•nts

心如ctLre> 日 + lnNalue 1

UESTC

悚源: ANSYS

吵囡园l

➔ Count7

"1

每 孕 貊 萨 蓉 蓉 哱 硒 等

ID lmportedCodes:.Co,

I

Step

Chapter3Three. etp Chapter4Four Chaple『SFive. etp Chapter5FrveVenfyPro1ect1 Chapter6S仄 elp 亡心“'扣佥m"/C…2 八? Chapter7Seven. etp Chapter8E1ghtetp Chapter9Nine.etp Commonlibs

etp

Graph

9 X

etp

>

沁de- I• 图 2-115

Node 类型导入操作符的建立步骤八

由千导入 Node 类型操作符的手工编码形式较为复杂,推荐只使用导入 Function 类型操作 符。另 外,在导入 Function 类型操作符的手 工编码内使用一些全局变量来保存上下文环境, 也可以实现同 Node 类型导入操作符 一 样的功能 。 2詹6.4

寻人挣怂)午

导入的静态库用千导入操作符内容的正确编译和链接,实现在 SCADE 环境下仿真完整应 用的功能。这里给出导入静态库的步骤,实现使用正则表达式来检测字符串时间的格式是否符 合 24 小时制 。该示例用到了开源的 PCRE ( Perl Compatible Regular Expressions) 库。

先用 gee 命令将 PCRE 的开源代码编译为 libgcre.a 库文件,然后切换至项目框架图的

FileView 选项卡,导入并选中编译完毕的 PCRE 库文件,在属性的 Simulation 栏的右侧选择

File type 类型为 Object File, 如图 2-116 所 示。 按照前面的方法设计 Function 类型导入操作符 VerifyRegularStr 及其顶层操作符

Use_VerifyRegularStr, 如图 2-117 所 示。

_严

3 年 0呵'te



,一、

..、

;:

\

bool 0

/

I

女·2

支凛 e2





--------------------------------乡: 图 3-29

强弱连接类型的对比

表 3-1

强弱迁移对比

false

true

Strong

O=false

0=true

0=true

Weak

O=false

O=false

0=true

同步迁移没有具体的触发条件,它只在与其关联的状态结束时触发 。而一个状态 的结束, 是指其嵌套包含的所有并行子状态机均到达终止状态 。终止状态的设置可参考 3.2.2 节。

如图 3-30 所示,状 态机 AB 内 有 A 、 B 两个并行的状态机,它们的初始状态分别为 Wait-A 和 Wait-B, 终止状态分别 为 A -SEEN 和 B-S EEN 。直到并行的 A 、 B 两状态机都跳转到终止状

态时,状态机 AB 的同步迁移才会触发,从状态 AB 跳转到 END 状态,同时完成 O=true 的操 作 。注意,同步迁移也像弱迁移一样,条件满足后,下一周期再跳转到目标状态。 5.

迁移的分叉

迁移的分叉 用千将不同迁移标识的相同部分合并起来,简化条件的编写并增加美观性。

在一个状态有超过 一条迁移与其关联时 ,可以提取迁移的相同条件和行为,将其合并在 共用的分叉支路里,当到达其中一个新的目标状态的条件完全满足时迁移触发,如图 3-3 I 所 示。注意,分叉迁移的中间图标仅仅是符号,不是状态 。

·~-"

习贮一,.,

示题 : 状态机的同步迁移和终止态

作者: UESTC 一...-

曰 工二°

二丁丿



-... ••••••••••••••••••••••••••••••••••••••••••••••••••••••••••• (' ABO

」”

;

涞源 ANSYS

『-

.. ., ' } ',',',',',',',',',' . .

I

,. ,'l, ',',',',

','l'l,'

R

r/ ,',',',','```,',',',','```,

\ `





,','.

i

','

,z

, ','l','

l,

',','·'f

~

,'

·`````,',',',',',',',',',,',',',',',

-.

、、 - - - - - -----------------------·-·-·---------------------------------------------' 图 3-30

状态机的同步迁移和终止状态

:,---勿一一一一一一一一一一一一一一一一一~一一一一一一.想1> "了一一、

,

吐1

= 10:

011它= 9;

h1=3“I/ 础1=IO. tn2 = 4 / / out2=8;

, ,'

;、- - - - - - - - - - - - - - - - - - - - - - - - - - - -



ln2:/ - = 9:

、-妇- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -'

图 3-31

分叉迁移

迁移分叉的使用方法是,选中需要分叉的迁移线,然后单击工具条 Creator~ 匝沁仲的 New Fork Symbol 按钮。 6.

迁移线的形状

迁移线的形状有两种:曲线 (Bezier) 和折线 (Polyline), 一 般默认为曲线。有 3 种方式

可以帮助用户设置曲线的形状。

( l ) 右击选中一条迁移线,在弹出的快捷菜单中选择 Set transition layout as Po l yline, 如

图 3-32 所示。

&

Cut

轮 Copy 皂知



Pact &令 Up

- f名

Show In Wor比四”

Add/Remove Point 一

Se-l transition 幻 ndasweak

......Set transition kind as strono .......,. Srt transition kind as

syn 中 ro

^万 5ettmn如on layout...Po奾ne

仓加p,rt,.....

图 3-32

迁移线条的转换 一

( 2 ) 选中迁移线后,通过工具条 State Machin~三习仲的第四个和第五个按钮 切换。 (3) 选中迁移线后,在属性的 Declaration 栏的右侧勾选或取消勾选 Polyline Mode 复 选 项 , 如图 3 -33 所示。

Prlor, Il K,nd o slromg

Transitions Layout

m,.

s”`Ko

图 3-33

7.

…”

R

I= P吐yl `九.偏od, l

`.止

II

Comm~nt

HlS”ry _~ |。 B.“t...l

迁移线条的转换 二

迁 移 的历 史属性 ( Restart 和 Resume)

存在这样一种情况,状态间的反复跳转中再次回到某状态时,该状态的行为是重新开始

还是接着上次跳转离开之前的情况继续呢?这可以通过设置迁移的历史属性进行切换,默认迁 移的历史属性是 Restart,

即每次跳转回状态后都重新开始运行 。 也可以设置迁移的历史属性

为 Resume , 则再次跳转回状态后,接着上次跳转离开之前的行为继续运行 。 迁移的历史属性设置方法为,选中迁移线,在属性 Declaration 栏的 History 区单击 Restart 或 Resume ,

如图 3-34 所示。

G- i

1吐叩呻

Activation

Transitions Layout

friori I2 Kind O Strong

_

Comment

J ,“上

.. I

|压 ory Rest 釭 t

IO R.m皿·

口三合

i'..., Polylin• 舅 od,

r, Synchro

图 3-34

Restart/Resume 的设置

-==一

S

如5ESui;安全权忍前,

第 5五—/&

注意:慎重选择迁移历史的 Resume 属性,一组嵌套程度较深的扶态组合,顶层状态的迁 移线设置 Resume 属性后会极大地增加生成代码的上下文环境,降低运算的性能。

图 3 -35 至图 3-38 所示的状态机是 关 于 Restart 和 Resume 设置的综合示例 。 在图 3 -35 中,初始状态为 Statel, 当 输入变量 Start 为真时,迁移触发,跳转到状态 State2 。 State2 内部的 Increase 操作符是 Node 类 型,具有自增功能,每周期加 一 ,并赋值给 A 。当 last'A

的值超过 200 时,会跳转到状态 State3 。 同时在执行状态 State2 的过程中,如果 Reset 输入为 true,

由于 Reset 迁移是默认的 Restart 类 型,所以 State2 的自增模块会立即回到 1 , 重新开始

自增。

启飞嚣阜誓史(Rest芦合凶NSYSI -- - -----------------------------·-----------------------------一` - - - - 三- - - `一` `.一.....句·毛.-----一畸-- - • • • • • - • • ·噜...一畸一. 心斗占I>

亡二二] R...t/ Reset输入为true时, State2迅速回到 1 再重新自增。 1 s"立'

/

状态State2内不停地自培,超过200 ,会跦转到 State3 。 1 妇iA 立为

/

5吐 S叩3

三A

3 I

如> s叩妇妇

2 '

图 3-35

包 > 扣哗吓妇

R-, 督监e~urn为真时就从State3跳回 State2 ,再从 1 开始I

迁 移 的 历史 ( Restart ) 一

图 3-36 和图 3-35 的 差 别是, State2 优先级为 2 的迁移线条件由 Reset 变为当自增达到 last'A=60 时跳回到 State2 。 由于迁移 线是默 认 Restart 设置,所以 A 会从 1 开始重新自增 ;由 千 总是加到 60 后又从 1 开始自增,所以 A 永远都不会增加到 200 ,也就无法跳转到状态 State3 。

启懦厚誓史 (R函己心NSYSI _.-- - -- - - - - - - - - - - - - - - . 一一一一一一一一一一一一 . 一一 一 一

· 一一一 一 一一一一一一一· 一一一·一一一一一一一一 ...- - -....一 . - - - - - - - - - - - - · --- - ---------- - - -- 一一一 一一 一 一 心” 一 一 、

三:心 启酰詈贯勹;]置垣:e31 宁”t._ ,

归氓3

已A

3 1

印 >S叩丘妇

即匕m'/ 盾垃了 “/J 六H J ,切\State3跳回 State2 ,再从 1 开始I

图 3-36

迁 移 的历 史 ( Restart ) 二

图 3-37 与图 3-36 的差别是, State2 优先级为 2 的迁移线的历史属性改为 Resume 。由于迁

移 线是 Resume 设置,所以即便迁移条件满足,输出 A 也继续从 60 开始自增;在加到 201 后, State2 的优先级为 1 的迁移触发,跳转到状态 State3 。

i

-

悖点;s嘿5史 (Res芦心SYSI • -...... ` • • •

·呻 . .一.. . ... . 一·.

... . - - • • • • ~

·一唱

二二

• •- -• - --..-.

..-一哺---- -

``' 人 .“

/

状态State叩坏停地自增,超过2OO ,会跳转到 State3.

|

/

~心立

仁n..,



已A 2 ,

心?.

消了 Reset输入 ,当自增到的值时,跳回到 State2, 于迁移线是 Res叩氐交置,所 以继续从的开始自增 .

sm./

I

··-·--- ·-· •• a. -. . -..今 - ---吻会··-·畴今·-·-· · 丰..伞令喧牛伞· - ·伞

心勺 LState21勺勺 rT心口...

3

""""'.

包》--`

图 3-37

I

包 >-..,.

/ 国心e:urn为 直时就从State3和回 state2 ,再从 1 升始I

迁移的历史 ( R心 umc )

-

图 3-38 与图 3-37 的主要 差 别是, State2 的优先级为 l 的迁移条件改为 200=last'A, Statc3

的优先级为 1 的迁移线的历史屈性也设置为 Resume ,则呏处千 State3 状态,且输入变址 Retum 为真时, State3 就跳同到 State2,

山于该迁移线也是 Resume 屈性设置,所以跳回后, State2

从 200 开始继续自增,停滞在 State2 内了 。

昙贞甘骂誓史( Res芦齿SYSI 心'

-- - - -- - - - - -- - -- - - - - - -- - - -- - - -- - - - - - - -- - - - - - - -- - - - - - - -- - - - - - -- - - - - -- -- - - - - -- -- - -

二 -•;• / 伍雷记岂扣已』,品ta品. :



. oS t a t e 2 .

sm,.,

状态 State2 内 才 停地自增,超过200 ,会跳转到 State3 .

S1r1/

立·切“^

soa2

|

/ 虫”吐

三A

e>s- -

3 ,

' ,.^.“回后, State2从 200ff始继续自增,停滞在State2内了.

····································· ················· 图 3-38

嘈............

.

. .

...

.

.

.

...

.

.

..............

迁移的历史 ( Resume ) 二

以上是迁移的历史屈性 Restart/Resume 的示例,恰当地设置才能更好地完成功能 。

3.4

状怂机中变 ht 的阰式赋伯

3.4.l

'必 :Lt的阰式赋伯 状态机也属于可激活块的 一 种,每个状态就是可激活块的 一 个分支 。 同 2.5.3 节,在可激

活块设计中,每个分支内都需要定义所有变量的确定值 。 但可激活块的分支仅在被激活时,其

内容才被执行,而每个分支通常只关注部分特定的输出变址和局部变量的改变 。 SCADE 提供了 Last 和 Default 属性的设置,以隐式赋值的形式简化对可激活块中变量的

曰邸乎料刊il

-

赋值 。 这部分概念是 SCADE 的难点之一,但对简化模型的设计作用巨大。

变量的 Last 属性的含义为,只要变量没有显式地赋值,则取上 一 周期的数值。其中 Last 属性中定义的数值仅在初始时刻可激活块当前分支内无显式赋值时有效。一旦变量显式地赋值 后,其 Last 属性的初值再无作用,变 量的 Last 属性中仅获取上一周期数值的功能继续有效。

变量的 Default 属性的含义为,只要变量没有显式地赋值,就取默认设置的数值。 如果变量的两个属性都设置了, Default 属性的优先级更高。 数据的 default 和 last 值的设置方法为,单击所要设置的变量(局部变量或者输出变量), 切换至 Declaration 栏,在其右侧的 Last 栏或 Default 栏中输入要设定的值,如图 3 -39 所示。

图 3-39

』D

3.4.2

设置默认值

定义变 ;t~:的 Last fl'[

设置输出 Output I 的 Last 属性的初值为 O, 如图 3-40 所示。 i=Use3

Layout Commen1 - 1

Kind :

图 3-40

I ➔ Out`Itt

设置 Last 值

图 3-41 中的状态机中,设置输出 Output! 的 last 值为 o, 初始时刻 Inputl =fal se 。 第一周期:由于 Inputl 是 false, Statel 激活。变量 Outputl 虽没有显式定义,但设置了 Last 属性的初值为 0, 所以 Outputl=O 。

第 X 周期:置 Inputl =true 并 一 直保持, State2 激活,此时 Outputl 有显式的定义,变为 1 。 第 X+l 周期: State3 激活,变量 Outputl 没有显式的定义。由于设置了 Last 属性,因此 取上一周期的值,即 Outputl=l 。

第 X+2 周期: State4 激活,此时 Outputl 有显式的定义,变为- l 。 第 X+3 周期: State I 激活,变量 Output1 没有显式的定义。由千设置了 Last 属性,因此 取上一周期的值,即 Outputl=-1 。

...... 注意:变量 Last 属性的初值仅在 操作符第一周期没有显式的定义时有用。 如果图 3-40 的

第一 周期 Inputl=true, 则笫一周期 State2 直接激活, Outputl=l 。 Outputl 的 Last 属性初值将 没有机会用到。

-

,

J -

-

-”- - - - - - • - - • - - - - - - - -. -

".- -

- •- --

,

,'

(C

-”- - - - - - - - - - - ~ - - • ”-



\' ,, In如1/

:

State1

,

S氐芒

S因e2

三〉 Ou妇1

一. 三> Output1

State3

、----------------------------------------------------------夕 图 3-41

Last 的使用

Outputl 的 波形图如图 3-42 所示。 Graph I P红虹乒 l: :沪ato工 1 1 ”“飞tl :一 1

2

5

p-

图 3-42

定义变坑的 Default f11(

1三 1

3.4.3

Output! 输出波形图 (Last)



i= 三USe

设置输出 Output I 的 Default 值为 o, 如图 3-43 所示。

图 3-43

ul

Default 伯的设笠

如图 3-44 所示,初始时刻 T nput I =false 。

守 ,一 , -------------------------- ------------------------· 下_______-`

--



: ,`

S国e

S也te4

State2

1

->

Ou中ut1

-l 飞> olftput1

叩ut•/

State3

、------------------------------------- ---- -----------------阳 3-44

Default 的使用

第一周期:由于 Input! 是 false, State! 激活。变量 Output] 虽没有显式定义,但设置了 Defau lt 属性为 o, 所以 Outputl=O 。 第 X 周期:置 Input I=true 并一直保持 , State2 激活,此时 Output! 有显式的定义,变为 l 。

第 X+l 周期: State3 激活,变量 Output! 没有显式的定义。由于设置了 Default 属性,因 此 Outputl=O 。

第 X+2 周期: State4 激活,此时 Output! 有显式的定义,变为- 1 。 第 X+3 周期: State] 激活,变量 Output I 没有显式的定义 。由千设置 了 Default 属性,因 此 Outputl =O 。

Outputl 的波形图如图 3-45 所 示。 Graph p"虹 e1 · :心e了“~ir°”m1 仁 0

6

2 __ .一一

图 3-45

3.4.4

Ouqmtl 的波形图 (Default)

同时定义变 :it的 L卧t ([[和 Default 伯 设置输出 Output I 的 Default 值为 0, Last 值为 -7, 如图 3-46 所示。

_ T”lnl16

比吐

图 3-46

➔ 如tp叭

同时设贸 Last 伯和 Defau lt 值

如 图 3-47 所示 , 初始时刻 Input l =fa l se 。

厂 ;

个 . 9•::•~·• 、I /

lnput1 /

; :

Input1/;

一心飞> Out沁1

;

虹”

.1 飞>心四 1

1 飞> 0ulput 1

\\ ,叩山 1 /

! 龟、.争..今.今.- -...一..- -

-...- - - - -.· -

图 3-47

第一周期 :

-.一一一..._

产/-/ __...- - -

-毛.- -..............金会一吻·全_,』 -

同时定义 Last 和 Defau lt 的状态机

由于 lnputl 是 false , State! 激活。变量 Output! 显式地定义为取上一周期值,

由 千是初 始 周期 , 所 以 取 Output! 的 Last 属性的初值,为 -7 。 第 X 周期: 置 Input] =true 并一直保持 , State2 激活,此 时 Output) 有显式的定义,变为 l 。

第 X+ l 周期 : State3 激活 , 变量 Output I 没有显式的定义。虽然同时设置了 Last 属性和 Default 属性 , 但 Default 优先级更高,所以 Outputl =O 。 第 X+2 周期 : State4 激活,此时 Outputl 有显式的定义,变为 -1 。

第 X+3 周期 : State l 激活 , 变量 Output! 显式地定义为取上一周期值,所以 Outputl =-1 。

...... Outputl 的波形图如图 3-48 所示。

3.4.5

1,;J 时不定义变 ht的 Last 伯和 Defaultffi 如 果变量的 Last 值和 Default 值都没有定义,那么在变扯无显式的赋值时 , 保待上一周期

的 值。应当至少在初始状态尽可能地显式赋值。如图 3-49 所示从初始时刻保持 lnputl=true 。

值得一提的是,不推荐变黛这样设置。 • x



图 3-48

Output! 的波形图(同时定义 Default 和 Last)

,-------------------------------------------------------------------- Output1

I--—>Out础

1

_, I - - -

r;

1 叩1·/

图 3-49

S口丘3

2召r和t·/

Last 值和 Default 值均未定义的状态机

初始状态 StateO 没有机会激活,因为迁移条件为 true, 迁移类型又为强迁移。 第一周期 : State2 激活, Output! 显式地定义为 1 。

第二周期 : State3 激活, Output! 没有显式地定义,也没有 Last 值和 Default 值,取上 一 周期的值, Outputl=l 。

第三周期: State4 激活, Outputl 显式地定义为- I 。 第四周期: S tatel 激活, Output] 没有显式地定义,也没有 Last 值和 Default 值,取上 一 周期的值, Outputl =-1 。 第五周期: State2 激活, Output ! 显式地定义为 1 。 ......

Outputl 的波形图如图 3-50 所示。

103

_ Graph Ir'a.c..比ac:e 1 : Opera':or 1 / I:比 n,u-:1 ,. 1



2

l

图 3-50

3.5

Signal

5

`

6

.-.

Outputl 的波形树 ( 同时术 定 义 Default 和 Lasl )

(f,4 •cJ 坎)

Signal (信号量)是 一 种特殊的局部变鼓,类型不可设置 。 (1) 输入和输出在它们所定义的整个操作符中都可见 。

(2) Signal (信号量)和 Locals (局部变见)在它们所定义的范围内可见,可以是操作符,

丁:

也可以是迁移和状态 。

图 3-51 展 示了 Signal 在状态机之间的传输功能,该模块中包含了 3 个并行的状态机 : SM1 、 SM2 和 SM3, 其中 SMl 和 SM2 都 有两个状态 NotError 和 Error, SM3 有两个状态 NotError 和 MsgErr 。在 SMl 中,初始状态为 NotError,

当 Input! 满足大于 10 的条件时,则迁移触发,

同时会执行触发信号量 SigErr 的操作 (e1nit'SigErr) 。 同时在 SM3 中,因为初始状态为 NotError ,

勹/ f

1,'` ,'

;··,'· ',',',','

/ }

', ','.,' . ,',',',

,、

.;·… : :;::: ·

-

J 扫 '.;;;'::! · ,

/

夕少:· : ::…:…,'…

.

`1·: :……·'.

勹 亡 SY S:

迁移条件中等待着的信号 SigErr 变为真,迁移条件满足,即由 NotErr 状态迁移到 MsgErr 状态 。

默认类型为 boo型,不可修改,默认为 fals的i 。 igna 南等待 Presen申触发 emrt两个属性。 !gna 戟发 emit(设定为 true)的同—周期, Signal的 Present值由 false变为 true. 、 一周期 Signal的值自动由 true变为 false. jS1gna 啋持触发 em1 坏变时.则 Present值保持true . emrt触发一停止, :一周期的 Present值恢复为 false.

1ana哎董也可以由昔诵局部变量代替 。

图 3-51

状态机之 间的 信号 传递

血·

_

sCADE

Suite 安全状态机I

第 5`-

而 MsgErr 到 NotErr 的迁移条件恒为 true ,所以在下 一 周期,又会由 MsgErr 跳转至 NotErr

状态 ,继续等待状态机 SMI 和 SM2 的信号量触发 。尽管本 例试图在 Inputl> 10 , 或 Input2> 10, 或者 Inputl 和 Input2 同时大千 10 的情况下,由状态 SM3 都能抓到 SigErr 信号 ,但若 lnputl 和 lnput2 紧跟 着先后分 别大于 10 时, SM3 会无法抓到后 一 个 SigErr 信号。

练习题 1. 用状 态机设计简化的三余度管理。 2. 用状态机设计简化的四余度 管理。

1

4

SCADE Suite 高级建模设计

4.1

数组橾作

4.1.1

数组的创建 l.

定义匿名数组类型的方法

SCADE 中数组类型 有两种定义方式 : 显式定义方式和匿名定义方式 。 匿名数组类型的格 式是 T^n ,其中 T 代表类型, n 代表数组大小, n 必须是整型常量 。例如 boolAn (图 4-1) 、 int32An 、 float64A(p+q) 。推荐尽量使用显式定义的数组类型 。 Propert1e~

II

General Declaration Clock

阮e

I bool飞



Comment

L..t

Note Graphical Pa, KC'.C, Pran 叩 _

II

比 nd

I t-> 丘p叭

'“' 图 4-1

数组类型格式设篮

2. Scalar to Vector 操作符(西) Scalar to Vector 操作 符的功能是将单个标益类型扩展成数组类型,数组的大小由该操作符 的隐含输入确 定。使用方法是在 Structure/Array 栏中单击 Scalar to Vector 预定义操作符,再 单 击模型设计区,然后连接好输入和输出 。模型设计方式如图 4-2 所示 。 SCADE 文本创建方 式

为 ValueOut = Valueln"'5 。 如图 4-3 所 示选 中 Scalar to Vector 操 作符,在属性 Parameters 栏定义数组的大 小 。



厂二- —-

- SCADE

SuIte 高级建栈设计置

第;百

-> Va归

V迦In

图 4-2

Scalar to Vector 使用示例 一

Pr 叩 e 巾 es

Use Parameters '· Layout Comment Note MTC

^: f~ I i

1

_J I 、,

图 4-3

隐 含 输入的设置方式

如图 4-4 所示的仿真结果,将输入 2 扩展成了数组 [2,2,2,2,2] 。

沪aJueOut

Valueln

图 4-4

Scalar to Vector 仿 真 效果 一

如图 4-5 所示,该操作符也支持将 一 维数组扩展为 二 维数组。

-> V迦扣

Valueln

图 4-5

Scalar to Vector 使用 示 例 二

如图 4-6 所示的仿真结果,将 [1,2,3] 扩展为[[ 1,2,3],[ 1,2,3 ],[ 1,2,3],[ 1,2,3] [ 1,2,3 ] ] 。

-> ValueOut

图 4-6

3. Data Array

Scalar to Vector 仿真效果 二

操作符(回)

Scalar to Vector 扩展出的数组都是相同元素,如果需要创建不同元素的数组,就需要使用 Data Array 预定义操作符。使用方法是在 Structure/Array 栏中单击 Data Array 预定义操作符,

再单击模型设计区 。 选中该预定义操作符,如图 4-7 所示,在属性的 Use 栏中修改输入参数的 个数,在右侧的 Input number 中设置输入端口数量,此例中输入端口数量设置为 3 。

1

Use Layout Comment Note MTC 图 4- 7

Operator Input number.

I3

Instance name:

11

11

II

Data Array 操作符输入端口数杜设仅方式

连 接好输入和输出,模型设计方式如图 4- 8 所示 。 SCADE 文本创建方式为沁rayOutput

=

[lnl, ln2, ln3] 。 lnl

->压心如

ln2

1心

图 4-8

Data Array 使用 示例一

如图 4-9 所示的仿真结果,将 3 个标量扩展为数组 [2.2,3 . 0,4.5] 。

ln1

->…心如

h2

,心

图 4-9

4.1.2

Data Array 操作符仿真结果

数组兀素的获取

1. Projection 操作 符( -!fr ) Projection 操作符的功能是从数组中取出元素,其隐含输入即为数组的索引值。如果数组 的 大 小 为 N , 则 索引值取值范围是 [O,N-1] ,索引值必须为常量 。 使用方法是在 Structure/Array 栏中单击 Projection 预定义操作符,再单击模型设计区 。选 中该预定义操作符,在如图 4-10 所示属性栏的 Parameters 栏中修改索引值 。 Use Parameters Layout Comment Note MTC 图 4-10

Projection 操作符的索引值修改方式

模型设计方式如图 4-11 所示 。 SCADE 文本创建方式为 Output I= Input 1[ I] 。

如图 4-12 所示的仿真结果,将输入数组的第 二个元素 l 取出来了 。

_

鹹一 _

SCADESu;1e一高 虹建授设 暹

mt32.5

lllpllll

->Output1

图 4-11

Projection 使用示例 一

lllPUIi次 . 4 , 7 , 31

图 4-12

第五百-

->

New projection

Outputt

操作符仿真结果

2. Dynamic Projection 操作符 (e) Dynamic Projection 操作符 与 Project 操作符的 差别是,隐含输入可 以是变量,以动态获取 数组的某个元素。由千索引值是变量,当索引越界时 ,需要额外指定越界时返回的默认值。使 用方法是在 Structure/Array 栏中单击 Dynamic Projection 预 定义操作符 ,再单击模型设计区。 选中该预定义操作符,在如图 4-13 所 示属性栏的 Parameters 栏中修改索引值变量和越界后返 回的默认值。

胆 4-13

Dynamic Projection

操作符的索引值修改方式

连接好输入和输出,模型设计方式如图 4-14 所示 。 SCADE 文本 创建方式为 Output =

(ln.[lndex] default -1) 。 mt立羲5

In

-> Output

.,t32

In知

图 4- 14

Dynamic Projection

使用示例

如图 4-15 所示的仿真结果 一 : 当索引越界时,返回 Output= -1 。

1J1冷.

4. 7. 9>

->Output

Index' 5

图 4-15

Dynamic Projection

操作符仿直结果 一

如图 4-16 所示的仿真结果 二 :索引值正常未越界,返回 Output[3]

= 7。

3. Slice 操作符(妇) Slice 操作 符的功能是数组切片,取出输入数组的一个子集。两个隐含输 入分别是带取出 数组子集的起始索引值和终止索引值,索引值必须为常量。使用方法是在 Structure/Array 栏中

1

-[“心 单击 Slice 预定义操作符,再单击模型设计区。选中该预定义操作符,在如图 4-17 所示属性栏

的 Parameters 栏中修改索引值 。

IA '冷, ◄ . 7, 5)

,“\

-> Output

3

图 4-16

Dynamic Projection

操作符仿真结果 二

丿



useParLaCONoM am eteent rs y utm mteTC

图 4-17

Slice 操作符的索引值修改栏

连接好输入和输出,模型设计方式如图 4-18 所 示。 SCADE 文本创建方式为 Outputl =

lnputl[2.. . 5] 。

Int321(5~2) + t)

1叩t`

图 4-18

->Output,

Slice 操作符使用 示例

如图 4-19 所示的仿真结果,[ 1,2 ,3,4,5,6,7,8] 切片索引为 [2,5] ,返回 [3,4,5,6] 。

沪>utput1

图 4- 19

4.1.3

Slice 操作符仿真 结果

数组橾作

l. Concatenation 操作符( 包 ) Concatenation 操作符的功能是将多个同维度的输入数组进行拼接。使用方法是在

Structure/ Array 栏中单击 Concatenation 预定义操作符,再单击模型设计区连接好输入和输出 。 模型设计方式如图 4-20 所示 。 SCADE 文本创建方式为 Outputl = Input l@Input2 。

,"邓t

沪…m

l 屯邓2

图 4-20

Concatenation 操作符使用示例 一

如图 4-21 所示的仿真结果,两个 一 维数组拼接为 [2,1,3,9,6] 。

l叩“'

->也阿1

1叩ut2

图 4-21

Concatenation 操作符仿真结果 一

如图 4-22 所示是 二 维数组的拼接 。

l 屯印1 1

-> Output1 IIIJl'.红2

图 4-22

Concatenation 操作符仿真示例 二

如图 4-23 所示的仿真结果,两个 二 维数组拼接为 [[1,1,2], [3,1,4], [5,6,7] ]。

呻帖

1. 4), p , 6, 7

-> Output1

l 叩1112

图 4-23

Concatenation 操作符仿真结果 二

2. Reverse 操作符(翌) Reverse 操作符的功能是将输入数组中的元素反序 。 如果是多维数组,只倒转多维数组的最外 层。 使用方法是在 Structure/Array 栏中单击 Reverse 预定义操作符,再单击模型设计区连接好输入 和输出。模型设计方式如图 4-24 所示 。 SCADE 文本创建方式为 Outputl

= Reverse input2 。

l nput1 严二三严ut` 图 4-24

Reverse 操作符使用示例

如图 4-25 所示的仿真结果,[[ 1,0, 1],[3,2,4] ]反序为 [[3,2,4 ],[ 1,0, 1] ]。

凇吵 ,(3 2, 4))

图 4-25

3.

II (炉 |f), ( 1 0 1))

>硒叫

Reverse 操作符仿真结果

Transpose 操作符(切)

Transpose 操作符的功能是数组转置 。 使用方法是在 Structure/Array 栏中单击 Transpose 预

-巴叨蜀 定义操作符,再单击模型设计区。选中该预定义操作符,在如图 4-26 所示属性栏的 Parameters 栏中修改转置参数。

"

图 4-26



UPa3c 80 ra mutm et en yom et NM t ee 0T

Transpose 操作符的 转置参数修改栏

连接好输入和输出,模型设计方式如图 4-27 所示 。 SCADE 文本创建方式为 Output! =

Transpose(Inputl ;l ;2) 。

->Outprt1

lnprt1

图 4-27

Transpose 操作符使用示例

如 图 4-2 8 所示的仿真结果,[[ 1,3,2],[4,7,6]]转置为[[ 1,4],[3, 7],[2,6]] 。

l必、2).(4 . 7. 句)

图 4-28

4.2

结构体操作

4.2.1

Data Structure 操作符·

沪冷叩

Transpose 操作符仿真结果

Data Structure 操作符(岱)的功能是将输入元素拼装成结构体。该操作符拼接的结构体 类型可以是类型栏内预定义好的,也可以是临时定义的 。在使用该预定义操作符 时,需要如图

_

4-29 所示在属性的 Use 栏的 Input number 内填写结构体元素个数 。

还需要在图 4-30 中设置各元素的名称,选中该操作符,在属性的 Parameters 栏内依次填 写。 Use

Operator Input number: 13 Instance name: 11 图 4-29

Data Structure 操作符的 输入元素个数设置方式

Layout Comment Note MTC

图 4-30

Data Structure

操作符的

输入元素名称设置方式

然后开始建模,如果是类型栏内预定义的结构体类型,则模型设计如图 4-31 所示。

nput1 言 el1 tnput2

labef2

Input)

la沺 13

1:

勹尸->一”它如 一 0

一·

图 4-3 1

1.1

',

labet2 label3

Definition

int32 InO2 bool

Data Structure 使用预定义类型的示例

如果 是临时定义的结构体类型,则模型设计如图 4-32 所 示。

/:}

In 如

In泣

1

0的如 In1321的位 1nB2 1abel3 b0oJ}> Out印t1

lnput3

图 4-32

Data

Structure 使用临时定义类型的示例

本例的 SCADE 文本创建方式为 Outputl = {labell : Inputl , labe12 : lnput2, labe13 : lnput3} 。

Make 橾作符

-l.2.2

Make 操作 符(已)的功能也是将输入元素拼装成结构体 , 但该操作符拼接 的结构体类型

_

通常是类型栏内预定义好的。建模时选中该操作符,在图 4-33 所 示属性 的 Parameters 栏内填 写预 定义好的数据结构类型 。

Use

- Layout

Comment

距 4-33

』 II

Make 操作符的输入数据类型设置方式

模型设计如图 4-34 所示。

Input, 严 lnput2

>-竺

lnput3)--!!立

Ts. 图 4-34

Make 操作符的示例

本例的 SCADE 文本创建方式为 Output!= (make TStruct)(Inputl,Input2,Input3) 。 Make 预定 义操作符除了从工具条 Structure/Array 内选出外,也可在按住 Ctrl 键的情况下,把类型栏内的 结构体类型拖拽到模型设计区,此时自动生成填充好 Parameters 参数 的 Make 操作符 。

4.2.3

Flatter 橾作符

Flatter 操作符(口)的功能是将输入结构体类型的全部内容拆解开 ,输出到各个元素 。该 操作符拼接的结构体类型通常是类型栏内预定义好的。建模时选中该操作符 , 在图 4-35 所 示 属性 的 Parameters 栏内填写预定义好的数据结构类型。

.

-l Use

Layout Comment

图 4-35

Flatter 操作符的输入数据类型设仅方式

模型设计如图 4-36 所示。

图 4-36

Flatter 操作符的示例

本例的 SCADE 文本创建方式为 Outputl,Output2,0utput3=(flatten TStruct)(Inputl) 。 Flatter

预定义操作符除了从工具条 Structure/Array 内选出外,也可以把类型栏内的结构体类型直接拖 拽到模型设计区,此时自动生成填充好 Parameters 参数的 Flatter 操作符。

4.2.4

Project 橾作符

Proj ect 操作符(武)的功能是将数组或者结构输入的某个元素拆解到单个输出,输出到 各个元素。该操作符拼接的结构体类型通常是类型栏内预定义好的。建模时选中该操作符,在

_

图 4-37 所示属性的 P扣.an记ters 栏内填写要拆解的数据结构类型的某个元素,元素前面需要加 符号”.“,类似获取 C 语言的结构体元素。 Use

Layout Comment

图 4-37

I

巨三]

Project 操作符中拆解元素类型的设觅方式

模型设计如图 4-38 所示。

lnput1

图 4-38

Project 操作符拆解结构休类型的示例

本例的 S CADE 文本创建方式为 Output! =Input 1. label2 。

4.3

迭代器建校 通常操作符设计完毕后, SCADE 支待在此基础上添加高阶运算 (Apply Higher Order),

迭代操作就是操作符的高阶运算之一,主要用千设计 SCADE 模型的循环操作。 SCADE 提供 了三类迭代器实现不同种类的循环,即 map 系列迭代器、 fold 系列迭代器和 mapfold 系列迭代

-——-1了,

主邸正[”了

,

器 。 迭代器的输入输出通常要用到数组类型 。

4.3.l

迭代隔的创建和价坏次数设 罚 有 三 种方法进行迭代器的创建 。

_

方法 一 : 选中操作符,在属性窗口 Use 栏的 High Order 下拉列表框中选择特定的迭代器, 如图 4-39 所示 。

mapw

|\厂芯

, UsI!

:-- Size Parameters!; Layout Comment ". Note MTC

foldw foldwi m.pfold m•pfoldi mapfoldw mapfoldw, Eol”

图 4-39

迭代器创建方法 一

方法 二 : 右击选中操作符,在弹出的快捷菜单中选择 Apply Higher Order 选项,再选择特 定 的迭代器,如图 4-40 所示 。

厄 Apply Higher Order



I酌 D,tete from Mod•l Pack

li

Boolean Activate ►

Restart ➔0

Brows, References

,ht

Up

图 4-40

Map Mapi

迭 代器创建方法二

方法 三 :前两种方法都是先有操作符,再在操作符的基础上进行应用迭代器这样的高阶 运 算 。 本方法是先创建迭代器高阶操作符,再将操作符插入其中 。

使用方法是在 Higher Order 栏中单击特定的迭代器,再单击模型设计区,然后连接好输入 和输出,如图 4-41 所示 。 通常任 一 迭代器默认内置加法操作符。

->Qu\put1 图 4-41

创建迭代器方法 三

再将设计完毕的操作符从项目框架图中拖到迭代器上,例如 sum 操作符,该操作符 内 容

会自动替换原来的加法操作符,如图 4-42 所示。

_ ->~` 图 4-42

创建迭代器方法 三 结果展爪

循环次数设置:选好特定的迭代器后需要设置循环次数,方法是选中迭代器,在属性 Use

栏右侧的 Array 内填写适当的迭代参数,如图 4-43 所示 。 Use Layout Comment Note MTC

II ' .

Operator Input number:

0

Instance name:

1

: I(] I

Symn心1f1C

Higher Order map

·

Instance

1

name: 厂 图 4-43

心.2

Accumulators

循环次数设罚力式

map 迭代淄 map 迭代器的使用场景中 I/0 都是同维度的数组,且输入数组单个元素的处理都是独立的,

不依赖千数组上个元素循环的结果。考虑图 4-44 中的数组加法功能,左侧的 map 迭代器的运 算操作也可理解为右侧展开的 Data Array 运算操作 。 其中 sum 是普通的整型加法操作符,应 用 map 迭代器后,能依次将数组 T 和 U 的元素相加并逐个赋值给数组 V 。 飞题: map 应用于数组加法 兀OI

作者: UESTC 涞源: ANSYS

U[OJ -

-> v

·y

n11 U(11

-> v

L 图 4-44

map 迭代器数组加法示例

图 4-45 所示的仿真结果中, T 和 U 数组元素依次相加,赋值给数组 V 得到 [5,6] 。

飞题: map 应用千数组加法

作者: UESTC 悚源: ANSYS

叮OI

U[~)

TI1!

u1,1

团 4-45

map 迭代器数组加法示例仿真结果

fold 迭代淄

4.3.3

在 fold 迭代器的使用场景中,输入数组单个元素的处理不是独立的,需要依赖数组上个 元素循环的结果。在 SCADE 语 法中,这个关键的依赖关系由 Fold 迭代器的第 一 个输入和第 一 个输出实现,通常这两个参数的类型和输入数组中单个元素的类型相同。 本书中将 fold 的第一个输入和第 一 个输出称为输入迭代子和输出迭代子,两者都简称为 迭代子。为不影响 fo ld 的运算结果,输入迭代子需要定义恰当的初始值 。例如 ,对加法输入 迭代子初始值可设为 o, 对乘法输入迭代 子初始值可设为 l 。

如果迭代子的数据类型是数组或者结构体, fold 迭代器在生成代码时,每次循环都会执行

一次 迭代子数据复制,运算开销较大。推荐建模中,迭代子尽可能地仅包含需要参与循环运算 的数据,或者使用后面介绍的多迭代子设计方法。

考虑图 4-46 中的数组加法功能,左侧的 fold 迭代器的运算操作也可理解为右侧展开的两

个 s um 连加的运 算操作。其中 sum 是 普通的整型加法操作符,应用 fold 迭代器后,数组 In 的 每个元素依次与输入迭代子相加 ,以输出迭代子的形式返回,而每次输出迭代子又作为下 一次 循环的输入迭代子,依此类推,遍历完数组后,最后仍以输出迭代子的形式返回结 果。

3

飞题: fold用千数组元素索加

作者: UESTC 悚源: ANSYS 沪U妇

'"

图 4-46

图 4-47 所示的仿真结果中,

=

叫 1)

fold 迭代器数组兀素累加示例

ln 数组元素依次相加,最终求和得到 5 。

沪迈"

图 4-47

4.3.4

->位严

->~

fold 迭代器数组兀素累加仿贞结果

mapfold 迭代淄 mapfold 迭代器是 map 迭代器和 fold 迭代器的结合,同时具有两者的功能。在 SCADE 语

法中, mapfold 的第 一个输入和第一个输出必须是迭代子 ,类型是输入数组单个元素的类型, 最后一个输入和最后一个输出通常是数组。从图 4-48 中可以看出, mapfold 迭代器的第 一 个输 出相当千 fold 迭代器的输出, 最后一个输出相当 f map 迭代器的输出 。

_ _ c

mapfold 。

1 ^5 ·

int int 屯

->一

SumDup

图 4-48

mapfold 迭代器展开的示意图

这里给出三个示例介绍 mapfold 迭代器的功能 。 第一个示例展示的是 mapfold 迭代器的常 规用法;第二个示例展示的是 mapfold 迭代器行为退化为 fold 迭代器的功能,本书称为 mapfold

退化用法;第三个示例展示的是 mapfold 迭代器的多迭代子功能。

I. mapfold 迭代器示例一 考虑图 4-49 所示的操作符,使用 mapfold 迭代器实现 l~100 整数序列生成的功能。 示题: mapfold生成 1~100 的数组

作者: UESTC 涞源: ANSYS



[

\/ g6 tig

>

. 100 图 4-49



1

a

mapfold 迭代器生成 1 ~ 100 数组的示例

其中的 I/0 参数信息如表 4-1 所示。 表 4-1

变噩名称

mapfold 生成 1 ~ 100 数组的 1/0 列表

类型

1

Output!

mt32

Output2

int32" 100

图 4-50 所示为 mapfold 中 CoreAdd 操作符的逻辑设计。

CoreAdd 操作符的 I/0 参数信息如表 4-2 所示 。 在图 4-51 所示的仿真结果中, Outputl 得到累加的结果 100, Output! 输出每次累加的和, 形成 l~100 的数组。

示题 . 求两整型数之和

作者 . UESTC

悚源: ANSYS

A二:

6

图 4-50

:

CorcAdd 操作符的逻辑设计

表 4-2

求两整型数之和 1/0 列表

变量名称

类型

作用

A

输入

int32

B

输入

int32

C

输出

int32

D

输出

int32

飞匮: mapfold生成 1~100 的效组

乍者 : UESTC 悚源: ANSYS

`由二二尸,口 1 图 4-51

->0..皿II -〉扣卢

mapfold 迭代器生成 l ~ lOO 数组的仿具结果

2. mapfold 迭代器示例二 通常 mapfold 迭代器内的操作符有两个输出:第一个输出返回 fold 迭代器的功能,第二个 输出返回 map 迭代器的功能 。当 mapfold 迭代器内的操作符特意设计为 一 个输出时, mapfold

迭代器就退化成了 fo ld 迭代器 。

考虑图 4-52 所示的操作符,使用 mapfold 迭代器实现取出数组中最大元素的功能。值得 注意的是,本例的输入迭代子的初始值是以数组的第 一 个元素 A[O] 传入 。 示题 , mapfold 高级应用 : 车迭代子

乍者 . UESTC

涞海: ANSYS

勹 -fold 1

A

尸> 压

用 mapfold 的单迭代子功能 可数组第一个元素给A ,将效组进行 mapfold 迭代 , 依次比较出数组中的聂大元素.本例其实也可用 fold单独完成,现在使用的是不笱出数组的"退化” 江 mapfold, 后面要逐步扩展,使用多迭代子 .

图 4-52

mapfold 迭代器退化应用

一 总呀困 其中的 I/0 参数信息如表 4-3 所示 。 表 4-3

mapfold 单迭代子的 1/0 列表

变量名称

类型

作用

A

Max

Input

int32" 10

Output

int32

图 4-5 3 所示为 mapfold 迭代器退化应用中 Max 操作符的逻辑设计 。 示题 : 求取两个瑜入中较大的数

乍者 : UESTC

棵源: ANSYS

ln1 lo2

-> 归 ln1 cout

"啦 fine,j

lnput1 严勹———I

1

沪泗田

lnput2

图 4-66

AddElement 操作符的逻辑设计

AddElement 操作符的 VO 参数信息如表 4-12 所示 。 表 4-12

AddElement 操作符的 1/0 列表

变量名 称

作用

类型

lnputl

Input

int32

lnput2

Input

int32

undefined

常量

int32

cout

Output

boo!

Output

Output

mt32

图 4-67 所示的仿真结果中,由千 InputArray 的第 三个元素值与隐含参数值一 样都是 4 。 所以 循环 执 行 3 次后退出,前两次循环的返回值为 lnputArray 的值,第 三次循环 的返回值为 3, 剩 余未参与循环的取默认值 4 。 飞题遍历数组元素是否与隐含参数相等

者: UESTC

涞源: ANSYS In.e

undermed'

图 4-67

4.3.8

4

二:

->

Index

沪冲心可

遍历数组元素是否与隐含参数相等的仿真结果

fold'! 迭代器 foldw 迭代器在 fo ld 迭代器的基础上新增了循环中断功能。名称中的 w 是指停止时间

when 。 foldw 迭代器内操作符的第一个输出必须为布尔型参数,它会记录是否进入下一次循环 。

_ 当该布尔型输出为 true 时,会执行下一次循环;反之, foldw 循环结束。

从高阶运算符 foldw 迭代器角度观察,上层第 一 个输出必须为整型输出,表示实际循环的 次数。 foldw 顶部还有 一个 bool 表达式输入,仅 当该表达式为 true 时, foldw 迭代器内的操作 符参与运算。

考虑图 4-68 所示的操作符,使用 foldw 迭代器遍历数组元素查找某元素,如果找到就退 出循环。最后一个输出表征是否查找到 示题 : 在数疽中查找一个 值 >

fa吐

->1心釭 Find

)

T亟「O•nd

lsF叩

ndex是当前参与过迭代的 次数, IsFind指示有没有找到所带数值 nArr是输入的具有 八个元素的数组, TobeFound是所要查找的数 图 4-68

foldw 迭代器在数组中查找 一 个值的示例

其中的 1/0 参数信息如表 4-13 所示 。 表 4-13

用 foldw 迭代器在数组中查找—个值的 1/0 列表

变昼名称

类型

作用

lnA灯

Input

int32/\8

Tobefound

Input

int32

Index

Output

int32

lsFind

Output

boo!

图 4-69 所示为 foldw 迭代器中 Find 操作符的逻辑设计 。

示题:比较两个数是否相等

乍者 UESTC 涞源: ANSYS 应/\义 ln1

-> Cout ->

Out

In2

图 4-69

Find 操作符的逻辑设计

Find 操作 符的 1/0 参数信息如表 4-14 所 示。输出 Out 表征是否查找到 。

表 4-14

Find 操作符的 1/0 列表

变量名称

类型

作用

Ace

Input

bool

lnl

lnput

int32

ln2

Input

int32

Cout

Output

bool

Out

Output

bool

如图 4-70 所示的仿 真结果,由于 lnArr 的 第五个元素值与待查找参数一样都是 3, 所以循 环执行 5 次后退出;第 二 个输出参数返回 true, 表示找到 。 一题 . 在数组中查找一个值 (TobeFound )

者 UESTC

悚源: ANSYS 订"

f正

·"""

a

.1鱼

fol

Index

->

lsFond

ndex是 当前参与过迭代的次数, IsFInd指示有没有找到所需数值 nArr是笱入的具有 八个元素的数组, TobeFound是所要查找的数 图 4-70

4.3.9

用 foldw 迭代器在数组中查找一个值的仿真结果

mapwi 迭代湘 mapwi 迭代器是 mapw 迭代器和 mapi 迭代器的结合,同时具有两者的功能 。

考虑图 4-71 所示的操作符,使用 mapwi 迭代器实现数组的偶数次循环且索引值 小于 4 时, 布尔型输入取反 。 飞题 . 当迭代 次数小千 n且为偶数时切换轮入的布尔值

者 : UESTC

涞源: ANSYS

-> Index

m

->~'

4 • 10

false

图 4-71

当迭代次数小于 n 且为偶数时切换输入的布尔值的示例

__4于三寻 t从`i ,邸讥炽丸邸t

,“ -一

.

-

其中的 1/0 参数信息如表 4-15 所示 。 表 4-15

当迭代次数小干 n 且为偶数时切换输入的布尔值的 1/0 列表

变量名称

类型

作用

flagin

Input

bool" 10

Index

Output

mt32

Cout

Output

bool" IO

图 4-72 所示为 Evevtra 操作符的逻辑设计。

飞题 : 当 Index 小千 n 且为偶数时切换输入的布尔值

作者 : UESTC

涞源: ANSYS

Index

->归叩I r叩

1了三产勹 归-1

2

牢一干尸〉也t 图 4- 72

Evevtra 操作符的逻辑设计

Evevtra 操作符的 VO 参数信息如表 4-16 所示。 表 4-16

Evevtra 操作符的 1/0 列表

变量名称

作用

类型

Index

Input

mt32

flagin

Tnput

bool

n

[nput

int32

Cout

Output

boo!

flagout

Output

bool

在图 4-73 所示的仿真结果中,由千 flagin 的索引为 o, 2 的输入被取反,共执行 5 次循环 (索引为 4) 。 其余参与循环的由隐含参数 false 填充 。

_ 飞题

当迭代次数小千 n且为偶数时切换输入的布尔值

作者. UESTC

涞源: ANSYS 吐.四巳

芦二勺,二二> mwi Out

查找斐波那契数列中第 n 个数的 示例

其中的 I/0 参数信息如表 4-17 所示 。 表 4-17

变量名称

查找斐波那契数列中第 n 个数的示例的 1/0 列表

作用

1

类型

1

n

Input

int32

Out

Output

int32

图 4-75 所示为 ArrCore 操作符的逻辑设计 。

钢四沁业让,

-

租囚找到斐波那契数列第n个数的应用操作符 作者: UESTC 涞源: ANSYS

---:

三勹~>~

:-----:_--~--------------· !”佐X

;

,

,,

当 lndex2时,执行 else 部分, out=((ln[Q] + In[1]), ln[O] ) 图 4- 75

ArrCore 操作符的逻辑设计

图 4-76 所示为 ArrCore 操作符 If 块的 else 隐藏部分的逻辑设计。 示题 . 找到斐波那契数列第 n个数的

应用操作符中 1f块的else逻辑图 乍者 UESTC

涞源: ANSYS

叫OJ

-> Out

1 可 1)

lr(OI

图 4-76

操作符 ArrCore 中 If 块的 else 部分逻辑设计

AddCore 操作符的 I/0 参数信息如表 4-18 所示。 表 4-18

ArrCo 「e 操作符的 1/0 列表 类型

作用

变量名称

Index

input

int32

In

input

FaboA订

n

input

int32

Cout

output

bool

Out

output

FaboA订

在图 4-77 所示的仿真结果中,返回斐波那契数列的第五个值,共执行 6 次循环。

4.3.11

ma.efoldi 迭代器

mapfol山迭代器在 mapfold 迭代器的基础上新增了自动索引计数功能。名称中的 i 是指索 引 In dex 。 mapfol小迭代器内操作符的第一个输入必须为整型参数,它会记录当前操作符进行 到第几次循环。而从高阶运算符 mapfoldi 迭代器角度观察,上层并不会多一个整型索 引的输

_ 入。这里将基千 mapfo\d 迭代器示例 三 介绍 mapfoldi 的使用方法 。 示题 . 找到斐波那契数列中第 n个数

作者 UESTC

悚源: ANSYS

fol如 MIn

MinMax_when

lntl2-> 归

用 mapfold 的多迭代子功能 内函数添加退出条件功能,当数组数据 在 (0 , 100) 范围内时,退出循环 . 注意退出的索引值Exitlndex和是否循环中途退出标识 ExitCont!

图 4-80

mapfoldw 迭代器双迭代子应用示例

其中的 I/0 参数信息如表 4-21 所示 。 表 4-21

mapfold 迭代器双迭代子应用示例的 1/0 列表

变量名称

类型

作用

A

fnpul

int32" I 0

Min

Output

int32

Max

Output

mt32

Exitlndex

Probe

lat32

ExitCout

Probe

boo!

图 4-81 所示为 mapfold 迭代器双迭代子设计中 MinMax 操作符的逻辑设计 。 示题: mapfold 高级应用内函数(四)双迭代子+退出条件

作者: UESTC

涞源: ANSYS

i.i1n_ln

二二勹/四I >cout

Ma,._ln

胆 4-81

M呻1ax 操作符的逻辑设计

MinMax 操作符的 I/0 参数信息如表 4-22 所示 。 表 4-22

MinMax 操作符的 1/0 列表

变量名称

4.3.13

类型

作用

Min in

Input

int32

Max in

[nput

int32

压Elem

Input

int32

Cout

Output

boo!

Min out

Output

mt32

Max out

Output

int32

mapfoldwi 迭代凇

mapfoldwi 迭代器是 mapfoldi 迭代器和 mapfoldw 迭代器的结合,同时具有两者的功能。

这里将基千 mapfold 迭代器示例三介绍 mapfoldwi 的使用方法。 考虑图 4-82 所示的操作符,使用 mapfold 迭代器的多迭代子技术实现同时获取数组的最 小值和最大值的功能。 示题: mapfold 高 级应用:(五)双迭代子+索引+退出条件

乍者: UESTC

悚源: ANSYS

mapfoldwi 2 «1 O>>

1

Int32y 氐廿 ndl!JC

ExltCout

MinMax_lndexWhen 111 厂 lnt32—> 仙n

尸>Max 用 mapfold 的多迭代子功能 内函数添加 1 索引功能,识别数组奇偶索引 只处理偶数索引位置的数据 退出条件功能,仅当数组数据在(0, 100)范围内 行处理,超出范围退出 注意退出的索引值 Exitlndex和是否循环中途退出标识 Exi tCout 图 4-82

mapfoldw] 迭代器双迭代 子应用示例

其中的 VO 参数信息如表 4-23 所 示。

一 节泌il 表 4-23

mapfold 迭代器双迭代子应用示例的 1/0 列表

变量名称

作用

类型

A

Input

int32" l0

Min

Output

int32

Max

Output

int32

图 4-83 所示为 mapfold 迭代器多迭代子设计中 MinMax 操作符的逻辑设计 。 示题

mapfold 高级飞;}:(五)双迭代子+索引+退出条件

乍者: UESTC

源: ANSYS

• - -千.................一··············-······ Outarr

用 mapfold 迭代器产生 I~N 的序列示例

新建操作符 useArr 调用本操作符,调用图 4-97 中的操作符,在属性栏的 Size Parameter

处实例化参数值即可,如图 4-98 所示。注意,实例化的参数必须是正整数。 如图 4-99 所示的仿真结果,返回 1 ~ 100 的序列 。

1

PJoptrtl 巳

General Declaration Use

B, Guarantee 为 C>O 。 示题: Assume 和 Guarantee

乍者

UESTC

悚源: ANSYS

AB



✓ PreCondr廿 on A > B 飞 PostConC11t1on .

c>o 图 4- 11 3

Assume 和 Guarantee 示例

.,平凇.Bi'

-

启动仿真,可以观察到当 A=lO, B=8 时, Assume 和 Guarantee 都检测到是有效的,如图 4-114 所示 。

:: :;需和Gua芦~

9 蓉 Chapter4Four_etp

R Q

IOCheclc:IOCheck >+ A 10 >+ 88 ➔

C20

、 Pos!Cond如n ✓

ANSYS

IA

Precondition

B

v

飞 Postcondition

图 4-1



PreC0Mlt1on ~, B C,.0

Assume 和 Guarantee 的仿真结果 一

I4

当 A=lO, B=l2 时, Assume 和 Guarantee 都检测到失败了,如图 4-115 所示。

:: :言需和Gua忙丁 ANSYS

曰 惩 Chapter4Four垒etp 1::,

0 IOCheck::IOCheck ~

~ ➔

AlO 812 C20

、 PoslCond巾on ✓ p 『eCondotion

IA B



✓ PreCood1non.o.. 习 8

"\.

貂 4-l!S

4.6.2

PostCond,廿 on

C ►O

Assume 和 Guarantee 的仿真结果 二

米I'il 女(下几艾?i SCADE Suhe 环境中浮点数的默认仿真精度为 5 个有效数字,用户可通过选中项目框架图

中的工程名,在属性窗口 Simulation 栏的 Real significant djgits 内 修改精度值 , 该值 允许范围 为 1~17, 如图 4-116 所示。

Gm,.,d Description 氐um叩

SCAOE Pa9eForm吐

I:--.....山

P叩从m比r

-



匕out T 心谩bility

图 4-116

仿真精度的设置

_ 练习题 ] .用迭代器实现两个 2X2 矩阵的相乘 。

2. 用迭代器实现斐波那契数列, N' 阰部分功能为. D= ( A& &B) 图 5-2

IIc|

(A&&B)IIC 逻辑图

首先需要对模型进行静态分析,这是开展其他验证活动的前提 。

5.2.1

SCADE 悦刚检杏凇 SCADE 模型检查器是静态分析模型语法语义的工具,它通过一组内置 的规则检查 S CADE

模型。检查完毕后生成报告,其中包含检测到的可能的警告或错误 。 SCADE 模型检查器可用 千满足 D0-1 78C/D0-331 中 A-4 表中的部分目标 。其主要作用是检查 : ( I ) 丢失的或多余的定义 ; ( 2 ) 类型 一 致性 。 (3) 时序一致性。

( 4 ) 因果分析 一 致性 。 ( 5 ) 初始化分析 一 致性 。

模型检查的对象为项目框架图中的根目录、包和操作符 。操作方法有 以下两种 : (1) 选中检查对象后在工具条 Code Generator 中单击 Check 按钮I 邑 一…

但P 玉 叶 。

( 2 ) 右键选中检查的对象,在弹出的快捷菜单中选择 Check 选项,如图 5-3 所示 。 模型检查完毕后, SCADE Suite Checker 生成 一个 HTML 摘要报告,如果检查通过会显 示

No error detected , 如图 5 -4 所示 。

泄豆者黏Hi~t一””

-『

己 C妇立

X Cut 姓 Copy

In如

~

.o

EdrtSymbol Add to favontesBrow抚 References

Goto ll5'Proper1 心.一

图 5-3

Check 选项

Result of check for operator BasicFunc::FunctionA/ in model Cha pterS Five | No error detected.|

图 5-4

Check 通过图

如果检查未通过,报告会提 示错误和警告,按照提示可以快速 找到原因 。 再单击报告中 的超链接可直接跳转到模型中错误的位置,进行修改,如图 5 -5 所 示。

Result of check for operator BasicFunc::FunctionA/ in model ChapterSFive 1 error(s) detected - I war"'.,c 伊

,.-· • Type Error

detected

.

iIII·

I ERR_ 100

!Type mismatch at BasicFunc::FunctionA/ L4 廿ns

expresSJon has type (mt, boo!) but should have type (boo!, boo!)

图 5-5

I

Check 未通过 1冬l

操作符通过静态分析后,仅表明语法语义的正确,并不意味着在功能上实 现了需求要求 的功能,可通过模型仿真来验证 。

5.2.2

SCADE 书}科0ii鲁i 模型仿真用于验证模型是否满足高层需求,也可作为 5.3 节的 QTE 做 自动 化测试前的预

仿真,可用千满足 DO- l 78C/D0-33] 中 A-4 表中的部分目标。 SCADE 仿真器是可视化的调试

_ 环境,支持利用断言、断点的设定,测试用例的保存、载入,测试结果的输出 等功能完成模型 仿真。 1.

设置并启动模型仿真

确保设计完毕的操作符通过模型检查后,在 工具栏 Code Generator 上选择 Simulation 选项, 如图 5-6 所示。左侧框内是“设置”按钮 。

回 Simulation

叨己夕凸凸

Q

`KCG MTC

Timin_g_ and Sta吐 图 5 -6

Code Generator

[具栏

单击工具栏 Code Generator 中的"设置”按钮,弹出如图 5-7 所示的 Settings 对话框 。 Selltn 尹

X

~Code Generator

KCG Configuration Debug Expansion Separate I/Os

Optim 归 tions

General Root operator:

~

Code

KCG6.5C

Target directory:

S(Configuralion)

回 Skip 口 Set

Compiler Build Code Int勺ration 二二勹, -

unused model objects

warnings as errors

I 图 5-7





取涓

,

帮助

Settings 对话框

其中需要关注的项是 : ( l ) 需要仿真的根操作符 (Root operator), 表示将仿真用户在项目框 架图中鼠标单击选中的操作符。 ( 2 ) 选择代码生成器的版本 KCG

6.5 C 。

( 3 ) 程序可执行文件输出的目录 。

推荐不做模型级集成测试情况下,保留 General 选项卡中的 Root operator 为 。由千工具条 Code Generator 较为常用,因此对其常用按钮再展开介绍 一下 ,图 5-8 中矩形框内从左到右分别是 :

I~ i

Simulation 图 5-8

中巴 Code Generator [具栏

QI]

C1) Check (检查)按钮:用于语法语义检查 。 (2) Generate (生成)按钮:用于 C 代码生成 。 ( 3 )

Build (增量构建)按钮 : 用千增量编译链接生成可执行目标文件。

C4

Rebuild

)

All (完全构建)按钮:用千完全编译链接生成可执行目标文件。

( 5 ) Run (运行)按钮:用于启动仿真。 模型检查完毕后,选中项目框架图中待仿真的操作符,单击 Rebuild All (完全构建)按钮

编译链接。如果构建正确,则输出窗口如图 5-9 所示。 ••



. //



[ m/

d

,'" 气 令

Insert &叩 t

"灼心

N

l••ID/

GO

LEFT r·

只比 HT

·一...,..~.金.........今·

, R”

二.3

1,

·,....,.·

·丐令

••••••

..

3 1. ,心...

图 5-23

数据流模型

也支待如图 5-24 所 示从仿真模式下项目框架图的 Instance 选项卡中右击控制流元素并选 择 Insert Breakpo int 选项;或选中控制流元素后按快捷键 F9 设置 。

巳 D

Bas,cFunc:StateMach,ne >-> blnfalse >->,lnO ➔ Res

臼 (2) '.=J

SM1 O

INIT t,

己 ,~

。气: ~

图 5-24

Insert Br毡lcpoint :raatpchh Properties...

仿 真模式 下项 目框架 图 的 Instance 选项卡

控制流元素的断点添加不会弹出断点屈性设置对话框,断点添加完毕的元素上有个小红点。 ( 3) 断点的高级设置。

通过菜单 Simulation--+ Breakpoint 或者快捷键 Alt+F9 可弹出断点高级设置对话框,对话框 会 自动定位到 Advanced 选项卡,底下是已经设置完毕的断点信息列表,如图 5-2 5 所 示。 Brealcpoi心

_



EPl

叩低

cy



} slopcle



i 邑



~

BrTel6 iisM

L仅水 e

L—

I

Bre咄乒宣杠

--1 「

• ... Simul/CrweConttol:: Cru比eControl 2/SM1 . 0 什 activated 令 System:: SystemS,mul/Br咄el changed

图 5-25

Bemo-·乙

1

I RemoveAJI I

断 点高 级设置对话框

可以在其中设置断点的名称和 Tel 脚本语言的表达式 。 表达式主要定义断点触发条件 ,通 常 有以下两种情况:



根据数值条件触发:例如 expr {[SSM::get Output!]> 10} 表示 Outputl 数值大千 JO 时 触发 。



根据周期条件触发:例如 expr {[SSM::get_cycle]

=

20} 表示当达到第 2 0 周期时触发。

当单击 Add 按钮时,该高级断点添加到了下面的断点信息列表中 。 (4) 修改断点的设置。

SCADE 支待修改添加的断点属性,通过菜单 Simulation 一 Breakpoint 或者快捷键 Alt+F9

--尸

可弹出断点高级设置对话框,切换到 Data 选项卡进行修改 。

例如,原 changed 变量只要改变就触发断点,如图 5-26 所示 。 B『ealcpoin让

5y斗em

-

-

5y,temSimiJ.!Accell

=

OK

I

I

如心

I

乒以e

l l

I.

Bemove

l

II 气

e On~nges OnY岫兄

l

,

j

_

Bre冰区虹丈

♦ Syslem::SystemSrnul/On/ c厄心ed ♦ 珈em:·SystemSimul/QuickAcceV changed

厅下,

0 ... trot.C『中eControl 2/SM1 :Enabled:SM2:Active: activated ... ruiseControl 2/SM1 : Enabl的 SM2:Active.SM3'0n. activated

• ♦

团 5-26

断点高级设置对话框的 Data 选项卡

现修改为 changed 变量等于 150 时触发,如图 5-27 所示 。 Breakpoints

如anced | System.·Si1stemS1mul1¼ccel/

厂 二. 150

—1

l

I] 三 I I

0k

_~dd _

J

邑硒

l

!,ocate

]

Bre.akpom:

♦ 莎妇.SystemSrrru/On/ 妇,gee!

.

I ~

♦ System..SystemSIITIUI/Qu,:沁ceV changed

0.h忒CIUIseCont,ol2/SM1:EnabledSH2Ac1we.吵ded

I I

Remove 战 1



图 5-27

changed 变址等于 150 时的 Breakpoints 对话框

注意:控制流的断点没有内置 属性可以修改,只有添加和删除两种操作,可在项目框架 图的 Instance 选项卡中通过快捷键 F9 来操作。

(5) 使能/禁用断点 。 设置断点后,断点有使能和禁用两个属性 。禁用不是删除断点 ,只是设置该断点不使能 。

;

,

通过菜单 Si mulation-- Breakpoint 或者快捷键 Alt+F9 可弹出断点高级设置对话框。可通过在底 部的断点信息列表中单击左侧的小圆圈或者小方块来设置断点的使能和禁用属性 ,如图 5-28 所示。 X

Breakpoinu; Control

o血

I

Advanced

OK

I

Cancel

Bree.kpoints

I♦

~S1mul/Resume/ changed

◊System.:SystemS1mu l/Qu1ckAccel/ changed ♦ Syst 可n ::SystemS,mu l/Accel/ ch 巳nged

—-

I

RemoveA)I

0.. ru,seControl 2/SMl -Enabled SM2.Act,ve.SMJ0n fired e trol ·CruiseControl 2/SMl Ene,bled SM2 A础ve fired 0 I Cru,seControl 2/SM1 Enabled SM2.lnterrupt. fired ♦

1seControl

图 5-28

2/SM1 Enabled SM2:Act,ve SM3-0n _L9/ changed

设置断点的使能和禁用屈性的 Breakpoints 对话框

左侧图标的含义如下 :

5.2.3



实心红色菱形:数据流断点使能状态 。



空心红色菱形 : 数据流断点禁用状态 。



实心红色圆圈:控制流断点使能状态 。



空心红色圆圈:控制流断点禁用状态 。 SCADE 覆盖分析

前面介绍了在使用 SCADE 进行 MBDV 开发过程中可以满足 D0-178C 中覆盖分析的目标, 这里详细介绍采用 SCADE 的 MBDV 方式后如何完成模型覆盖分析和代码结构覆盖分 析 。 D0-331 的 MB.6 .7.2 节中指出模型覆盖分析支持检测和解决: (1) 基千需求的仿真用例或仿页规程的缺陷 。 (2) 高层需求的不充分或缺陷,而设计模型是拈千高层需求的。 (3) 先前未确认的派生的低层需求 。

(4) 设计模型中的非激活功能 。

( 5) 设 计模型中的非预期功能 [I] 。 D0-178C 的 6.4.4.3 节中指出代码结构覆盖分析支持检测和解决 : ( l ) 基千需求的仿真用例或仿真规程的缺陷。 (2) 需求的不充分。 (3) 非激活代码 。

(4) 死代码 [I] 。

另外,覆盖分析需要依据不同的软件研制级别选择特定的覆盖准则 。 D0-178C 中定义了以 下几个准则 : (1) 语句覆盖。设计若干测试用例,运行被测程序,使得程序中的每个可执行语句至少

执行一次。语句稷盖被认为是相对较弱的准则,因为它不评价一些控制结构并且不检测某种类 型的逻辑错误。一个 if-else 构造只需要判定为真,就可以达到语句覆盖 。 (2) 判定覆盖。设计若干测试用例,运行被测程序,使得程序中的每个判断取真分支和 取假分支至少执行一次。

(3) 条件变更/判定覆盖。对每 一 个程序模块的入口点和出口点都至少考虑调用一次,且 需求中的每条输入值都至少能独立地影响输出值 一 次 。 仅 A 级软件需要满足此目标 。 ( 4 ) 数据耦合。两个模块彼此间通过数据参数交换信息。 ( 5 ) 控制耦合。模块间传递的不但有数据,还包括控制信息,使得 一 个软件模块影响另

外一个软件模块执行的方式和程度 [I] 。 使用 SCADE 软件进行 MBDV 开发时,仅需设计 一 套基千高层需求的仿真用例和仿真规 程即可同时应用千设计模型的覆盖分析、代码结构的覆盖分析,如图 5-29 所示 。

--------,



模型瞿薹分析

-图 5-29

基于高层需求的仿耳用例和仿真规程

程序插桩 (Instru ment) 是覆盖分析的关键技术之 一 。它是在保证被测程序原有逻辑完

整性的基础上插入一些探针(本质上就是进行信息采集的代码段,可以是赋值语句或采集 覆盖信息的函数调用),通过探针的执行并抛出程序运行的特征数据,通过对这些数据的分 析可以获得程序的控制流和数据流信息,进而得到逻辑覆盖等动态信息,从而实现测试目

的的方法。 S CADE 同样使用插桩技术进行覆盖分析。根据选定的覆盖准则和操作符进行模型插桩后, 生成新的只读的插桩工程,然后在该插桩工程中导入仿真用例和仿真规程进行覆盖分析 。 SCADE MTC 是可通过 D0-330 TQL-5 级别鉴定的验证工具 。

l. S CADE 覆盖测试工作流 SCADE 覆盖测试工作流要分为以下 5 个步骤: ( l ) 模型准备 (Model Preparation) 。

(2) 覆盖采集 (Coverage Acquisition) 。 (3) 覆盖分析 (Coverage Analysis) 。 ( 4) 覆盖解决 (Coverage Resolution ) 。 (5) 覆盖报告 (Coverage Repo1ting) 。

2.

模型准备

模型覆盖分析通常在模型仿真活动完毕之后进行 。 此时,模型设计完毕且通过了评审。 基于高层 需求的仿真用例和仿真规程也设计 完毕 ,通过了评审 。 模型的仿真也运行完毕,获得 了仿真结 果且 差异得到解释。 3.

覆盖采集

覆盖采集前需要设置覆盖分析准则和待覆盖分析的操作符,再设置该操作符的代码生成 选项和插桩操作符,最后将插桩后的工程编译链接为可仿真的程序。 ( l ) 设置稷盖分析准则。

右击空白工具栏,确保打开工具栏 Instrumente寸笆 MTC

.翌 I, 然后单击左侧的“设

置”按钮,在弹出的对话框内设置覆盖准则等内容,如图 5-30 所示 。 ,

Settings 笆匝mm仑呻r

X

MTC

General User Criteria lnstrumenration

Ge心ration

directory:

rS(ProjectName)S(Suffix)几(Configuration)

1···

__ l

~

Suffix: MTC INST l

| 图 5-30



I

~

I

帮助

Settings 对话框

切换到 General 选项卡 。支待在 Predefined coverage 列表中选择 DC 或者 MC/DC 覆盖两种 准则。 支待在 Predefined integration 列 表中选择控制耦合或者控制耦合与数据耦合两种准则。 支持 在 Generation directory 栏定制插桩后的输出目录名称,默认提供两个内置宏定义 :

$(Projec tName) 为当前的工程名称,$(configuration) 为当前的配置名称。支待在 Suffix 栏定制后

缀信 息 。 (2) 设置待覆盖分析的操作符 切换到 Instrumentation 选项卡,如 图 5-31 所 示 ,支待选择待插桩的操作符 。



All: 设置所有操作符都插桩 。



Selected: 设置仅将勾选的操作符插桩。



All except selected: 设置勾选的操作符都不插桩 。

_ x

Settings ~lllll切me 啦r

MTC

General User Criteria lnstrumen 也tion Root

^- -

no selected root operator

-`恤..."

Instrument

O All

@Selected

勹 All except selected

臼 巴 ...JChapte,SF 咋

~巨二I

Bas1R 氐

BasicFunc FuncbonA/C ·> Res

详细覆盖分析结果

(3) MTC Results 选项卡 。 MTC Results 选项卡以操作符、控制流、调用关系等元素的形式保存模型覆盖结 果,如图 5-42 所示。每个元素的覆盖结果以 4 种颜色着色 。



绿色:表示完全覆盖,达到 100% 。



红色 : 表示完全未覆盖,仅 0 。

• •

黄色:表示部分覆盖 。 白色:该项不可进行覆盖分析 。 例如加法算术运算,没有分支项。

1

-



一 心刁 0--MTC_1NST 叩

JoM1ClNST ~

Ol,_,.云I4 ,心II 一',上',上t,“ O SM1 陨 15 勹 D OEi勹比JO5 7心 3 .Off(10000 "q

t 霍十一 0叩止'm (1 0000 ` 己 看}OO 无心 (1 0000 \.)

d

IE fBlockl(10000 %)

`扫 ·) - > (100 00 ".;) , . then (10000 勾 ., 廿l 由 (1OOOO :)

`

霍 m蚧之富. 一·心血:al#l (1 OOOO

...)

雪 O-0叩心虹妇叶心认 10000 .~) 霉沪酝初血心已 (100110 勺

沁oe @入ITCRe”,“

图 5-42

模型稷盖 结 果

通过单击工具条 MT~ 仲的“百分比显示”按钮可以开关模型元素的覆盖统计 显示,如图 5-43 所示。 a 等 Chapter5Five_MTC_INST .etp 曰 l:'j Chapter5Five_MTC_INST 曰 霉 BasicFunc··FunciionA

(6/6)

1::i 等 Chapter5Five_MTC_INST _etp 一, ~ ChapterSFive_MTC_INST _:, 霍 Bas,cfunc:. FuncbonA (100 00 %) .._ A-> Res (100.00 %) "'- B -> Res (100 00 %) "'- C -> Res (100 00 %)

又 A-> Res (砌

\. B -> Res (2/2) \. C -> Res (2/2)

_

图 5-43

覆盖统计显 示结 果

双击模型元素,可在右侧打开对应的详细覆盖分析结果,如图 5-44 所示 。

N.,哎寸气口习 ,

产 I

Co.伽句毗幻们无

二 T”. 三 ,蛐



芒IC-.云 30t如坎m .> Ou黜女冷“'

30 -午句d 坎 mn 芒}坛

- 30"旷t””“:t112

I I

I一

e-

T心

f-

a 心沁…

了具衄

F-

D“必 0.."。已

N e '8

心“山以

T口如

枚, T,暹咖归 , F,心

r...“

Dul 臼

|

o.“

o此句'

阳....们 Te重已

心霾

心 T屯逾归 1 叩

Te鹹o3

9 芒} r.一勺付4`”“3

亡 0-,.,#1 认

'I • .....

心"

no

Noli切l 曦让从 1 日窜i

m



芒}立冷已

口 3 比上心呻勾吵d

己。沪础如1 ·心逞__

Stoll 丘.SMl>dMtSt.O'Or\

--..i

一-

图 5-44

-一·

详细覆 盖 分析 结 果

i _一J

I

- -—-

当需要观察某个未覆盖元素在原模型设计图中的内容时,可以右击该元素,在弹出的快 捷菜单中选择 View Use 选项,如图 5-45 所示 。

SCADE 会自动跳转到模型设计图并高亮显示待覆盖的分支路径,如图 5-46 所示。 ( 4 ) 覆盖分析结果的其他观察窗口 。

SCADE 支待不同窗口供用户观察覆盖分析的结果 。 单击工具条 MTC~吨已令..扣 叶 中的 覆盖窗口可弹出覆盖统计柱状图窗口,如图 5-47 所示 。

叩心四1 曰 蓉 Chap比r5Five_MTC_INST叩

`

- 七 Chap阳5F,ve_MTC_INST

Name 匝asieFunc::Fun吐onA

白D Bas1cFunc-·FunctionA(3/6)

\, A-> Res(l

` r:'宦片霖

Name AC Bas,cFunc::FuncbonA

- D

",:. C->Res 如

3 芒 Res ”

岱 View

已$o 讲 1

口 芍$ and/11

Use

芒 A



Detai l的 Coverage

己 B 扫 C

note B True False A True Fa庙 notAA T 巾 e False

Insert

_ ` ~

l

Properties...

图 5-45

已 蓉 Chapter5Five_MTC_INST.e中 凸之i Chapter5Five_MTC_INST

View Use

选项

启 m:大学 悚源 ANSYS|

白 已 Bas,cFunc .FuncbonA(3/6)

尸产三长]

\, A ·> Res (1{2)

3>Res(0/2) \. C·> Res (加

助自趴

(AI|B ) && C1

__ 图 5-46

模型设计图

RcodG补n

100500

· /

切/.

SOX



l

77z

图 5-47

8立

l

1

77Z

覆盖统计柱状图窗 LI

柱状图 三 列的含义分别是:



Application:

当前工程中所有记录的总覆盖分析结果。



Record:



Gain :以上 一次 统计的 Application 覆盖结果为基准计算当前 Record 的覆盖结果增量。

当前记录的覆盖分析结果 。

在项目框架图的 MTC Results 选项 卡中选中某元素,可以在输出栏的 MTC 选项卡中观察 覆盖结果,如图 5 -48 所 示。

覆盖分析的仿真用例输入完毕后,单击工具条 Simulator 中的“停止”按钮区l结束覆盖分 析 。 开启工具条 MTC Predefined Filters们`啖砐啖啖砐剧,可以设置覆盖分析的过滤项。 图 5-49 列出了常用的覆盖分析按钮图标及 其含义。列表的前三个操作符是工具条 MTC 上的按

啤Q

虔空刮 。



I厅'·—I

`L' , l ,七ll''

只查君已经选中元素的覆盖结杲 跷覆盖分秘所有过滤设置(仿瓦运行中不可使用) 查亏已经覆盖的分支项(绿色)

Q 漫

..._ 8->Res(加) ..._ C->Res (加) 自 FlleView

开启或关闭覆盖结栗的百分比显示

0 欢漫

臼 萨 Chaple心玉e_MTC_INST令etp 已 E3 Chapter5Frve_MTC_INST E:l 编. Bas1cfunc FunctionA (6/6)

Res

1

I

Trxue

歪亏操作符元素的覆盖结果

啖啖逸

BasicFunc

Fa;se

查亏控制元素的覆盖结果

查君信号元责(Signal)的覆盖结果一 查吞解释(Ju文ificatton形式的覆盖结果

图 5-48

项目框架图的 MTC Results 选项卡

常用的稷盖分析按钮图标及其含义

图 5-49

可通过菜单 View一 MTC Filters 一 Save Filter to File 和 View- MTC Filters- Load Filter from 即 e 来保存和载入定制的覆 盖分析过滤规则文件,较完整的覆盖分析如图 5-50 所示。 如比已以沦

亨 4X

巳 品 Chaple在" e_MTC_!NST.elp

`

立 C恼p即歹·.-,e_MTC_INST - 霍 BasicFunc. f'uncilOnA(100.00 名)

A·>R.. ( 10000 勾

'\. B ·>Res(10000.,,_l '\. C · >R的 (10000%)

`

IIN如e

`

A >AssI .

-Name

丘rage

-··AC -

A·习妇

-=-_ 1_ _

' 10000%

Band no1C i•ue fol..

O 知心 1 王'l

A

mIC B

rm.

.

aIse

} -

g -

AC

i 1

句 taRRR

g

霍 B8沁Fune F叩C1IO 心

己 Res 白 石女"# 1

note

妇 扫 A

8

Tru七

石 B

A

T 心 F`

no1M r.ue

石 C

图 5-50

三, F 的e

Te迦 d

-

no

中『df3

True Fabe

g

all”}iec

F 忒,.

Tes 时

T..led

j logrdIdp .1112e



Name

T·啦d

lall

lR 尸

回 _

-

Cove,

rme Fab.

,

_」

INome IB邸吁unC:FunOOnA|

_

“al

仓 Re. 己比嘈 1

5.

Joe 血led Cover叩0Ceses

.

cDv I

0 0

F,,吐

较完整的覆盖分析图

覆盖解决

当找到未覆盖分支的项后,需要找出原因。如果确认是设计模型中的非预期功能,需要将

.. .

模型中的该分支项删除 。如果是以下 3 种原因,可以通过完善需求、仿真用例和仿真规程解决: 基千需求的仿真用例或仿真规程的缺陷。 高层需求的不充分或存在缺陷,而设计模型是基千高层需求的。 先前未确认的派生低层需求。

如果是模型中的非激活功能,则需要 给出解释 。 SCADE 支持以解释作为记录来覆盖分支 。 (1) 解释 Justitication 未稷 盖的分支。 不考虑高层需求、仿真用例是否充分的情况,观察图 5-51 所示含调用关系的 3 个操作符,

_

畸 l1 耆却谥,南盲守韧浅.Jl

_

特别注意 FunctionB 操作符的第二个输入为常批 true 。 零

o

x

萨 0,ap1"牙'iwe.elp

..i

Cl叩江西we

..J Ba”cFunc J 叩 mm

OfuntAB 1啦命ce

“A 9

B



C



Res

沪"

e 山agram_Fu哗一 1

O FuncilonA Ulrue命ce 分

A



B

叶 C ➔

R..

e a叩1am_FuncbOnA_1 OF“nB 亡 匕才一 ➔ ~

A B

.. Rs

IJ `

dlagram_FunctK>nB_ 1

OS曰惶M忒妇,.

_

勹勹 C 、,

D-->邸

'`

图 5-51

) R.. `

含调用关系的 3 个操作符的模型团

显然 FuncAB 和 FunctionA 两个操作符可以达到完全覆盖,而 Functi01出由 千第二 个输入 为常量 true, 无法覆盖 Res 输出为 false 的情况,如图 5-52 所示。

,..,.. _,._. - 孕 0呵油话r,a.J,4TC_INST呻叩

.J

.吵e呴e

Chop.. 心:“o_MTC_INST

雪 B.. 吁unc

FuncAB (1 劝 6J

.缸红Funcr-1(4A)

F血“"的如 A -> Funcoo 心 1(2fl) B·>Func沁心1 叨 C·>F 叩COO 心1(2/2)

II- Bas,cFunc ",. ",. ...

`

fmoo心 1 -► Funchon印, f2/2) ",. FuncbonBfl -> Res(2fl) Func1JonA(6/6) A 心 Rosf2/2) °>Re,(2fl) \. C•>Res 如 0 Bas1tfunc fundlonB(JI4)

` `

霉旺ICFunR.. (1/'ZI

`

B,R臼

芒 R...

际—勹 De吵dCoverageOse.

::.一一 T心 fats· 11i.Na已 oUll>UIJac如led

已 Sand们

tJ B

_

A

T1\1e Fal,.

`\

Troe False Detail IRecordii] True False

Cove,

Tested no

Tested no

一> Res

肋即 BA&& B|

图 5-52

例子

在此情况下,停止覆盖分析 。在项目框架图 的 MTC Results 选项 卡中右击选 中未覆盖的分 支,在弹出的快捷菜单中选择 Insert- Justification Record 选项,如图 5-53 所 示。 在弹出的解释记录向导中填入记录名、覆盖文件名和作者,单击“下一步”按 钮,如图

5-54 所示。 再填写解释信息并确认勾选需要解释的未覆盖项,如图 5-55 所示,再单击“完 成”按钮 。

_ :(3-

谥岳

Bas,cFunc: FuncbonB (3/4 )

-』 \

~ Focus 亨白lter 森

Vi如 Use

1 ~ Detailed Coverage ►

Insert ~

高 Justification Record

Properties...

-'|1

图 5-53 Just 什ic.,tion

Record

Justification Record 选项 X

W妇 rd

Selected entity: 归sicFunc:、印nctionB/B ·>

Res

Record name;



Reco 『 d 甘 2

J

Coverage 乏0



0.

Justifoeotion.crf

Author. UESTCI

I 下-(N)> 1 , 图 5-54 JustI 仗玑 Ion R 如rd

妇妇

Justification Record 界面 一

Wizard

X

妇elected

entity:

Basicfunc:FunctionB/B·> Res

7

Orlleria 俨

口 r 『 UC

巨!False

即虹ion:

一还由千叩轮入咙的 .没有问扈 1

Fmc沁心 1 切勾

\. \. \. \.

B ·>Funcbo心 1 (2/ZJ

C ·> FuncbonN/1 四 Funcbo心 1 ·>Funcbon 印 1 如

FuncuonB' 巨 Res 叨

,- 雪 8..兀Fune fW1cbonA(6/6l

\.A -> Res (动

`` `

B 心如.如

C , 如. (2/Z/

霍 Bas 吁叩c. FuncllonB (◄/◄)

A, 如s 叩

\. B·>Res 叩

心e l_B 玉.

二 Covar呴e 匣二 De101led Cova,叩心..

厂气.二三] :.一

l _

Coverage Tested Te,1et1

,Reco『d#1

__J L -

True False Recoldl2

Tested no

TIU.

no

Fal> FunchO心 1

Coverege

"

2/2

A,Re, A·>Re.

$ 坏

`` `

Func沁心 1->Fun

2/2 2/2

Palh BasocFunc..FuncAB/A·> F叩Cbo心 1 B..,cFunc..F 叩chonB/A ·> Ra• Bas1tfunc F叩OO 心JA·>R .. 8a8 吁uncF"记A8尼•> Funct1onAl#l BsS1cFunc FundlonB/8 .>Res BasocFunc.. Funcbo心汜, Ras BaS1cfunc FuncAB/C .> F叩中OnNI1 BaSlcFunc Funct,orA/C ·> RH Bas,cFune FuncAB/F 叩 c 沁nA/11 ·> F 叩CtK>nB们

`氏nciion印 I •>A.,加

BasicFunc·FuncAB/FuncbonB们 ·>Ras

霍 Bas,cfunc Fun中0

4/4

Ba51cfunc FuncAB/Bas,eFunc Fune沁 nA/#1

晷 Ba5icfunc funm

2/2

Bas沁Fu 忙7FuntAB/BasICF 四 Fu心onB#l

`聆 Fune沁心 1 \. B ·>Res \. B·>R.. C ·> FuncbonA#l

I'-

C·>Rm

I/2 2/2 如

F叩己心

General History

r Name·

Record " 1

Author·

UESTC

Creator

SCA DE SIMULATOil

Descript,on

Date:

图 5-57

2018/03/13 14:32:37

General 选项卡

History 选项卡内容如图 5-58 所示 。 解释记录没有 History 属性,却有 User Coverage 属性,可以在该属性中修改解释对应的未 覆盖分支项,如图 5-59 所示 。

-

General

Cycle

Action

0-55 55- 97

CarD 的ngControl. s$$ CruiseControlBehavior. s芯

图 5-58

History

Cycle

Action

Description

0-8

User Input

History 选项卡

t呤 CF _20180313_1 crf

Coverage Palh 1/2BastcFunc..Func:1l0n8/B -> Res

雹 Reco 『d#l(25/26)

.!;> Justriicabon crt(1 闾 态 Recordl2(1 闾




吓e.. 峦立 国谴l 笠Z p,“如心

General User Coverage Description

FuncAB (16/ 16) \. A·>FuncnonA/11(2/2) \. 8 -> Funcno心1 (2/2) 霍 Bas,cFunc FuncilonAJ/1 (4/4)

雷 Bas,cfunc

匐 Bas,cFunc Funcuon 印 1

卜 霍

``



,回 False

(2/2)

\. C ->Fu心心 1(2/2) \. FuncbonAJJl ·> Funchon 印 1 (2/2) Fun吐on的 ·> Res (2/Zl Bas ,cfunc funcl!OnA (6/6)

A-"让s(2/2)



\. 8 -> Res(2/2) \. C ·> Res (2/Z) 雪 Bas,cfunc FuntbonB (4/4) \. A·> Res (2/2) \. B·>A的 (2/2)

图 5-59

I

User Coverage 屈性

Description 屈性的内容如图 5-60 所示,用户可以再补充修改些信息。 邸...,因ce _

E! 导 Chapter5Five_MTC_INST _etp 仁1 1,, CF _20180313_1 crf(25闾 也 Record#l (砌6)

L刁 J;, Ju函cabo11crf(l 闾 碰 Record 112 (1 闾

固行le... i>,o 区口 10

General

I 淡句应分迈由节湿输入弓 1卿 , 没荀魂.

User Covera驴 Description

图 5-60

6.

Description 屈性

覆盖报告

覆盖分析结束后, SCADE 支持生成覆盖分析报告 。 打开工具条 Reporter 卜呻呾

·叫,

确保下拉列表框切换为 MTC 项 。 单击左侧的"设置”按钮,在弹出的对话框中默认显示 General 选项卡,如图 5-61 所示, SCADE 支持 HTML 格式的报告和 RTF 格式的报告,内置

以 Tel 脚本编写的英文格式和内容的报 告,也可以定制中文格式的内容 。 用户可以设定报告类 型、输出目录、脚本文件 。

X

?

Settings ~Reporter

MTC

General MTC Output file:

[ Chapter5Five_MTC_INST.rtf

Report script:

[Reporter\MtcReport.tcl

Format:

- l

1•• •

],

RTF

严 Coverage Report

L___ |压| 图 5-61

取消

帮助

General 选项卡

切换至 MTC 选项卡后可以选择待显示的内容,包括仿真用例记录、解释记录、仿真用例 输入的历史记录、每个分支的覆盖分析结果、百分比统计等,如图 5-62 所示。 ? ·

Settings 禹 Report巳 r

X

MTC

General MTC Content 回 Acquisition reco

巨I Justification record!

Display 巳 History of acquisition reco 巳 Detailed criteria coverage 回 Percentage

Filter 口 Use filter:

I 图 5-62



1

取消

帮助

MTC 选项卡

设置完毕后单击工具条 Reporter 右侧的按钮生成文档。本例选择 RTF 格式。如果已经预 装好 Word 软件,则会自动弹出 Word 格式的报告,如图 5-63 所示 。

_ Model

Cover .1.

General Information.

I13/03/2018-

言一 Report generation date:

. 2.

ChapterSAve_MTC_[NST\MTC\ChapterSFlve_MTC_INST.etp. ChapterSAve_MTC_INST\MTC\ChapterSAve_MTC_INST.rtf, None ,

Coverage Information .

Coverage percentage of the project : 100.00

%

• 2.2. Covered Operators.



·2 .1. Overview .

巨 图 5-63

Word 格式的报 告

认证级测试坏埮 QTE

5.3

5.2 节介绍的基础验证活动主要用于模型设计后的预仿真,大规模的自动化验证活动推荐 使用 SCADE 的认证级测试环 境 ( Qualified

Test Environment, QTE ) 。 SCADE QTE 是可通过

D0-330 TQL-5 级别鉴定的验证工具 。 SCADE QTE 的 I :作流

5.3.1

SCADEQTE 工作流如图 5-64 所示,主要分为以下 7 个步骤: ( I ) 创建测试工程。 ( 2 ) 设计仿真用例和仿真规程 。

(3) 开发 工程和 测试 工程的配置设置 。

( 4 ) SCADE QTE 在主机上的功能测试 。 ( 5 ) SCADE QTE 在主机上的模型覆盖分析 。 (6) SCADE QTE 在主机上的代码覆盖分析 。 ( 7 ) SCADE QTE 在目标机上的测试 。 SCADE 产品专注千平台无关的应用层开发 , SCADEQTE 能协助用 户在主机上完 成绝 大 部分的测试工作,尽早地发现问题、解决问题,并获取模型的仿真用例、仿真规程和仿真结

果 。 而在目标机上进行软硬件 集 成测试时, SCADE QTE 支待将主机上模型仿真完毕后得到 的仿真用例、仿 真规程自动转换为目标机上的测试用例和测试规程,以便简单快捷地进行目 标机上的测试 。 SCADEQTE 的工作流也可以简化为图 5-65 所示,分为主机七的测试和目标

机上的测试 。

182

SCADf 主机测试环境 主机上的模型仿真

, ...________



I

I

笠 目职几上的济试 目标机新刮呈备

图 5-64

QTE r作流

SCADE Suite 模型

功能测试报告

口 二:一! • ___ 二



,一

-= ,_~, lji下:....乡

分析报告 目标平台 测试用例







妙结果 目标平台测试结果

( 测试报告)

产品全生命周期 笸理 图 5-65

5.3.2

SCADE

QTE 简化后的 l :仆流

创建测试 l ^.程

测试需要有被测对象, SCADE 测试 l一程的对象是 SCADE 设计 T程 。本 例中将基于已有

的设计工程 Chapter5 Five.etp 创建测试工程。 按照图 5-66 所示的步骤操作,确认无误后单击“确定”按钮。 X

1 启动 SCADE

Pn,joc1

,JSCADESUI.meJSCADE Suite Proj红 1ror 沁ignV...,Rer

菜单选择File - New

c厄pt•r5fi心V•nfyl'rOJOCI

己吵屯1em如I forMTC 如It> 一 文ADES“`.mConf,gu...口r Pro如

SCADE System 行

| 2 选郢CADETest ProjectI

-SCAOET己心如I

.J丈ADET..tR如It Projttt O c心(·心wworits 严e

|3 输入工程名称 1

心 dtoCUIrentWOI 虹严·

I4.输入工程路径 1

I 5单击 “ 确定” 按钮 I~ 图 5-66





咚助

I

新建工程

将待测的设计工程找出来,确认无误后单击“完成”按钮,如图 5-67 所示。

x

SCADE Test Projecl

Creates a Test Project for the following SCAOE Suite Project: ..\Chapter5Five\Chapter5Five.etPI

1 选择SCADE待测的设计工程路径

巳 完成

图 5-67

5.3.3

取泊

'

帮助

新建工程

设计 fiii,Ul1 例和仿具规和 在测试规程的项目框架图中切换至 TestView 选项卡,打开工具条 Test Creation, 单击“新

建测试规程 ” 按钮并设置该测试规程的屈性,需要在属性栏 Operator 右侧将待测的操作符选

.主沺唇耆肌和切,',

-

择出来,以供自动生成测试用例框架,如图 5-68 所示。

2 单击工具条Test Creation中的 “ 新建测试规程 ”按钮

3 选中测试规程,在属性窗口中编辑 测试规程名称 选择操作符(用下拉列表框) 设定规程文件(.stp) 的保存位詈 编辑测试规程的描述信息

N暴行心;

严uncA

Otor

. 8Func-FUf1(tkmA

-

- --

-

_

v...句funcA.ttp

仄如pllon:

汁 C 旧plOfSFm工过中归$比Fum: fu~议m凡财符而“'夏采权

图 5-68

-』,



SCADE 测试步骤

然后选中测试规程,新建目录筛选器(可选)和记录,推荐以预定义的命名规 则给目录

筛选器 和记录定义名称,便于后期的脚本识别实现自动化测试,如图 5-69 所示 。



尸 酮 Chapter5FiveVerifyProject.e中 8 ~ VerifyfuncA

二 孕 Chap!"卸eve叩rq釭etp 目 V叩f叩久

...JFolderl

\

I4选中仿阳晒! 1

7 选中目录筛选器 或者仿真规程

|5 的重目录酌辞积可选) 1

| 8部里记录

1

..其

儿配裨

kI

一” n

6 可修改目录筛选器名称

图 5-69

R”臼di

I

9 修改记录名称和描述

SCADE 测试步骤

接下来需要根据预先定义好的仿真用例正式编写仿真规程。同 5.2.2 节, QTE 也支持 多种 格式的场景文件,最常用的是 sss 和 csv 两种格式 。

_ C1).sss 格式: 基千 Tel 脚 本命令格式的仿真文件格式,最常用,可扩展性强。 sss 格式 文件可用于定义别名的场杲文件,定义别名后,可简化场景文件中仿真用例的编写。 (2).CSY 格式:简单符号分隔的仿真文件格式,易千将 Excel 编辑或其他文件编辑的测 试用例转换为 CSY 格式。 CSY 格式文件分为按行布局和按列布局两种方式 。 I..sss 格式的场景文件

QTE 中扩展了 5.2.2 节中. sss 文件的语法,其主要语法规则如下:

(I) SSM::set 。 v扣·为输入变量、外部引用变量 (Sensor ) 的名称。

• •

val 为下 一 周期的输入值 。

(2) SSM::set_tolerance[patb=]

real= 。



var 为期望观察的输出变量、局部变量的名称 。



to l erance 为设 置的检测精度值。一旦设置后,该变量的检测精度保持不变 , 直到有新 的设置改变了检测精度 。

.

C3) SSM: :cycle []。 设置运行 integer 个周期 。



integer 为 整型,数值必须大于 0 。



不填写 integer, 则默认值为 1 。



初始化文件内禁用该语句 。 (4) SSM::alias 。



alias 为别名,不能 与其他别名冲突。



dip 为输入、输出、局部 变贵都包含的全路径名称。



本语句只能在初始化文件内使用 。 ( 5) SSM::check {{ sustain={(forever I )) lreal= }} 。



integer 为整型,必 须大于 0 。



var 为待检测的输出、局部变量的名称或别名 。 该检测语句在下 一 次 SSM::cycle 语句执行时启用。如果 SSM::cycle 语句的周期值为



N 且 N> l,

则 默认情况下,该检测语句仅在第一周期执行,后 N-1 周期不执行;如

果要检测语句保持多执行若干周期,可以使用 sustain= ......语句设置 。



如果 forever 代替 integer, 则变量的检测保持到测试结束。

.

如果没有 sustain= ..的语句,则该变量的检测仅在下一周期启用 。

.

SSM: :set_tolerance 语句 。



该语句的 real=... .检测精度设置优先级高于 SSM::set_tolerance. .语句的设置;如 果没有 real= .....的语句,或者该语句执行完毕后,该浮点型变量的检测精度值遵从 初始化文件内禁用该语句 。

( 6) SSM::uncheck





var 为待检测的输出、 局部变量的名称或别名。

• •

取消检测。 初始化文件内禁用该语句 。 (7) #符号开头的是注释 。

SCADE

SuIte 基干校型的验勹看

第 5章

下面是一些 sss 格式场景文件的范例,供用户参考借鉴 。 别名设置的案例,如图 5-70 所示 。 # 设置输入变益的别名

SSM::alias SSM::alias SSM::alias SSM::alias SSM::alias

INPUT_BOOL Operatorl/lnputl INPUT_ENUM Operatorl/lnput6 INPUT_ARR_INT Operatorl/lnput7 INPUT_ARR_STRUCT Operatorl/lnputB INPUT _STRUCTl Operatorl/lnput9

#设 置输出变量的别名

SSM::alias SSM::alias SSM::alias SSM.:alias

OUTPUT_REAL Operatorl/Output3 OUTPUT_CHAR Operatorl/Output4 OUTPUT_ARR_STRUCT Operatorl/Output8 OUTPUT_STRUCTl Operatorl/Output9

#设置输出变量某元素的别名

SSM::alias PARTl_OUTPUTT {Operatorl/Output7[0]) SSM::al1as PARTl_OUTPUT8 [Operatorl/Output8[1].Bool} SSM::alias PARTl_OUTPUT9 {Operatorl/Output9 Int} SSM::alias PART2_0 叩UTlO {Operatorl/OutputlO.Arrlnt[l]} #设豆探针的别名

SSM::alias PROBE_BOOL Operatorl/Probel #设置外部引用变量的别名

SSM.:alias SENSOR_REAL Sensor3

图 5-70

别名设置的案例

仿真用例设置的案例 l ,如图 5-71 所示 。 #浮点型数组

SSM::set {P1 :: 0perator2/lnputl} (1.0.2.0,3.0) SSM::check {Pl ::Operator2/0utputl} (1.0.2.0,3.0) susta1n=forever #浮点型结构体

SSM::set {P1::0perator2/lnput2) (1.0,2.0,3.0) SSM::check {PL:OperatorVOutput2} (1.0,2.0,3.0) sustain=forever #结构体

SSM ::set {Pl..Operator2/lnput3} {(8,12.2,'Z',valuel,(l,2,3))} SSM ::check {Pl: :Operator2/0utput3} ((8.12 2,'Z',valuel,(1.2.3))} susta1n=forever #结构体数组

SSM:.s et {P1.:0perator2/lnput4} {((8,12 2,'Z'.valuel.(1.2,3)),(8,12 2,'Z',value2,(4,5,6)))} SSM ::check {Pl::Operator2/0utput4} {((8.12.2,'Z',valuel,(1.2,3)),(8,12.2.'Z'.value2,(4.5,6)))} sustain= forever SSM::cycle #第2 周期取消某个元素的检测

SSM ·uncheck {Pl::Operator2/0utput3.Arrlnt} SSM ::uncheck {Pl ::Operator2/0utput4(0]} SSM::cycle

图 5-71

仿贞用例设置的案例 l

仿真用例设置的案例 2, 如图 5-72 所示。 推荐先在验证工程目录下准备好文件夹(如 TestCases) ,然后在 SCAD E 项目框架图内选 中记录项 ,按照图 5-73 所示在 TestCases 文件夹中新建初始化的别名场景文件 VerifyFuncA_ Alias.sss 。

#第3 周期取消整个变量的检测 SSM::check {Pl :: Operator2/0utput3} {(8,12.2,'Z',valuel,(1,2,3))) sustain=forever SSM::check {Pl::Operator2/0utput4} {((8,12.2,'Z' ,valuel,(l,2,3)),(8,12.2,'Z' ,value2,(4,5,6)))} sustain 二forever SSM :匀cle

#第4 周期取消结构体数组的某个元素的检测 SSM::uncheck {Pl.:Operator2/0utput3.Arrlnt[2]} SSM ::uncheck {P1 ::0perator2/0utput4[1] .Ar「 lnt[2]} SS M ::cycle #精度设笠 SSM::set_tolerance SSM ::set_tolerance SSM::set_tolerance SSM::set_tolerance

path=OUTPUT_BOOL real=2 .0 path=OUTPUT_INTEGER real=2.0r path=OUTPUT_CHAR real=2.0r path=OUTPUT_REAL 「eal=2 . 0 SSM竺et_tolerance path=OUTPUT_ENUM rea1=2.0r

困 5-72

仿真用例设置的案例 2

隘—卢 口 径 Chaple心刁veVerifyProjecL叩 -岔 VenfyFuncA

J Folderl , 函 \co叩

I 1 选中记录

1

2 单击新建测试文件

泊克 运

x

|3选择测试文件类型 1 sss 迦$拓氓叩

5 选择是否为初始化

的测试文件

沁心10 fi佐叩

卜下忆t·加即咖血on 氐e心«from•

尸竺汃Ver1和UncA一心s.每

四”一

see~

CSV

| 图 5-73

Ot(1

~ce1

新建别名场景文件

该别名文件会检测待测操作符 FunctionA 含有包的名称、 VO 等全部信息,然后自动生成

推荐的别名内 容。本例中将输入 BasicFunc::FunctionA/A 简化为别名 A, 用户也可以修改 SCADE 推 荐的别名 A 为其他名称,如图 5-74 所示 。

然后在项目框架图内选中记录项,新建场 景文件 VerifyFuncA—TCl.sss 。确认勾选使用别 名文件定义的名称,然后单击“确定”按钮,如图 5-75 所 示。

默认生成的内容如图 5-76 所示,可以 看到其中的 I/0 参数名称都已经使用简写的别名来 命名了,且包含 一 个周期的仿真用例 。用户可以在此基础上按照 sss 文件的格式修改扩展内容, 比较 完整 的仿 真用例集合如图 5-77 所示。

付付付付付付付付付付付付付付付廿付付廿付廿付材材付付材付付廿付付付付付材付付材付

Fl Cl Basicfunc

廿

i:l 匀 O perators 包 D

付 Aliases Table Description

=!



FuncAB D FuncttonA

材付廿材材廿材付付付付付付付付付付付付付付廿廿付付付付付材村村付付付付付付付付付

=勺 In论rface 分

A

>-> B 分

C



Res

吓 inputs

SSH : : alias A BasicFunc : : FunctionA/A SSH: : alias B BasicFunc: : FunctionA/B SSH : : alias C BasicFunc: : Funct ionA/C

~ diagram_FunctionA_l

II

佃 outputs

SSH : : alias Res BasicFunc: :Function研es 图 5-74

别名文件

x

Create New Scenario Scenano file fom口t: 知沺 no file 四伽

口 Create

SSS 文e 叩 no



[TestOtses\VerlfyFuncA_TCl(sss

nn In血IIZllbon scenario

曰 use ·lia眨S

口 Genera也 from a CSV

口 Use a custom scnpt OK

图 5-75

]

Cancel

在项目框架图内选中记求项

II II Scenario Description II 1111111111111111111111111111111111111111111111 SSH : : set A SSH : : set 8 SSH : : set C SSH : : check SSH :: cycle

false false false Res fa 1sa

SSH: : set A SSH : : set B SSH : : set C SSH : : check SSH : : cycle

true false false Res false

SSH :: set A SSH: : set B SSH : : set C SSH :: ch11ck SSH : : cycle

false true false Res false

付付廿付材材付材付材付付材付付付II”“II 付II 付

II Scenario Description II IIIIIIIIIIIIIIIIIIIIIIIIIIIIII 付 “II 付 111111

付付

i nput s

付 bool

SSH : : set A false 材 bool

SSH : : set B fal s e 材 bool

SSH : : s11t C false 吓 output s 付 bool 材 SSH : : check Res false SSH :: cycle

图 5 -76

仿真用例集合默认生成的内容

SSH : : set A false SSH : :Slit B 千 alsci SSH : : scit C truci SSH : : chcick Rcis true SSH : : cycle

图 5 - 77

比较完整的仿真用例集合

2. .csv 格 式 的场景文件 csv 格式的场景文件分为按行布局和按列布局两种方式 。. csv 格式的场景文件无法使用别 名 功 能 ,也 就无需额外创建别名 csv 文件 。 QTE 在运行时会自动将. csv 格式场景文件转换为 sss 文 件 后 再执行测试过程 。 . csv 格式 文件的通用语法如下: ( 1) #字符开头的是注释行。

( 2 ) *SCRIPT *引导仿真用例的变量名称 。 (3 ) 数据由分号或 Tab 符号分隔 。 ( 4 ) 数据定义后,除非修改它,否则 一直取之前设定的值。 ( 5 ) 期望输出数据用逗号表示忽略该期望输出值 。

( 6 ) Repeat n ( n 为整数)表示该仿真用例值连续执行 n 次 。 (7 ) Toi 起始的行或列不作为仿真用例,而是表示某输出的浮点数的精度 。 ( 8 ) Last 起始的行或列表示仿真用例的结束,其后的数据被忽略 。

下 面介绍如何创建 csv 格式的场景文件 。选中项目框架图 的目录筛选器 Fold l , 单击工具 条 Test Creation 中的 New Record 按钮两次,分别给新增项起名为 Record—CsvByLines 和

Record_ CsvByCo lumn s, 如图 5-78 所示 。 臼 蓉 Chapter5FiveVerifyProjeclelp 巳 目 VerifyFuncA

己 O FoIder1

i 门 斗回

田 泊 Recordl 出 S Record_CsvByColumns 印 S Record_Csv8yl1nes

图 5-78

创建 csv 格式场 景文件的方式

创 建横 排 方式的 csv 文件,选中 CsvByLines 记录,单击工具条 Test Creation 中的 New Scenario

氏le 按钮I t scenario,

憩 述沪I, 如图 5 -79 所示,在弹出的对话框中设置文件类型为 CSVsteps-by-lines 新建场景文件 VerifyFuncA _ Stepbylines . csv, 该文件放在前述的 TestCases 文件夹中 。 Create New Scenario

X

-.:, 1

Scenario file fomlat:

lcsv steps虷11佃这enario-

Scenariofile path:

[T estaises\VerifyFuncA_Step切lines.CTN

D Create an Initialization scenario

口 llse

]仁l

aliases

Generata 的 macsv

口 Use

a custom 幻1pt

r 图 5-79

OK

l

0,ncel

csv 横行方式创建界面

确 认无误后单击 OK 按钮,自动生成图 5-80 所示的场景文件内容 。

ISCsvFormat=O

,I IO De3Cmpt10n

春 I' 鲁噜合,鲁合,鲁鲁,',,鲁'',',','"',',','"' 1 鲁鲁,鲁”合,鲁鲁鲁鲁鲁鲁 I,1,`',' ,鲁`'合 t 鲁,鲁鲁鲁 II 鲁 1 鲁”

I

,•SCRIPT•; BasicFunc: : FunctionA/

ItI,tIf,f8,1# , It,t` '` §I 春 1 鲁鲁',鲁 'II,I`' , f 鲁令 I' ` §,马喜#,, I , 1,'',I,IIII ,少,,令, IItIt, ., A 让泛 s1 cFunc:

: FunctionA/B; BasicFunc: : Fun ct ionA/C; Bas i cE'Unc: : rune tionA/Res

I Types ;切 Ql ;加斗; bQ9上 4砰 Last; tal3e; fal3ei fa13e; ?

图 5-80

场景文件内容

推荐用文本编辑器将分号批量改为逗号后再用 Excel 编辑,如图 5-81 所示。 表明仿真用例是按照行布局的

,;,SCsvfo,mat =O #心~叶丘虹丑归吐扣心忙叶呐三尹"山中丑2= =三已它丘之__ J #二=妇二吐

曰00 竺crrptJOO 子万云云d 井女 =#3 耸汗#吐士,,江户年4 斗上七忤 Jd3 #卢云=立芦扛艾红丘立工工3 二”“巧丘亡云口仁乒仁石行丘灶巧之”“五子=仁仁扫 万

•SCRIPT•

加s1cFunc: .Funct 1onNA

Bas心 unc . Funct,onA/B

妇 cFunc:

千 Types

bool

boo!

bool

FALSE TRUE FALSE FALSE TRUE TRUE FALSE TRUE FALSE

FAlSE

FALSE FALSE FALSE TRUE FALSE TRUE TRUE TRUE FALSE

FA氐E

TRUE FAlSE TRUE FA巳正

TRUE TRUE FAlSE

图 5-81

Funct10nNC

由于第 1 行仿真用例的 期望输出为 False. 后续 2行即便未写,依然为 False

Excel 格式的场枭文件

确认编辑完毕后,关闭 Excel 软件 。推荐 用文本编辑器将其中的逗号批掀改为分号后保存 备用。 创建纵排方式的 csv 文件,选中 CsvByLines 记录,单击工具条 Test Creation 中的 New

Scenario File 按钮1

4酌,如 图 5-82 所示,在弹出的对话框中设置文件类型为 CSV steps-by-columns scenario, 新建场景文件 VerifyFuncA _ Slepbycolu1nns.csv, 该文件放在前述 的 Tes tCases 文件夹中。 X

Create New Scenario

csv steps· 叶o,luml\S 玩enano

Scerulno file formot: See叩 no file 沁th:

V

|TestosesWenfyFuncA_SlepbycoIumns.csv

口 Cr的te an lnlU础动on scenano

1口

口 useal1a灾S

Genen,le rn,m • C5V 口 useacu如m script OK

图 5-82

I

cancel

csv 纵排方式创建界面

确认无误后单击 OK 按钮,自动生成图 5-83 所示的场景文件内容 。

,鲁 SCsvFonnat=l ',鲁鲁鲁耆,鲁着鲁#鲁,春 ft 着春春,鲁鲁 t 鲁鲁 ff ,鲁合鲁鲁 ',f, ,鲁鲁,鲁鲁鲁,鲁, tf ,暑鲁普, t , t' 春 t ,鲁 f 鲁鲁鲁 'f 鲁 ff 鲁鲁春 f 喜春 t 鲁

, 导

IO

De,,cription



,鲁鲁鲁, f 鲁鲁,鲁 f 鲁 ,ff §鲁鲁§鲁 IHIHI 售鲁 i f 侍鲁 t,§ f 鲁扩鲁鲁骨鲁 f ,鲁着 I ,鲁,鲁鲁, I, 春,鲁鲁 I 暑鲁鲁',',鲁鲁, t 鲁 ff 鲁鲁, 鲁 *SCRIPT 会; La" 仁

t inputs

严::二芦芦芯:芦:= asicFunc : :FunctionA/C:false;bQQ.l 鼻

senso 工 3

I

OU 亡 puts

距立 cFunc::FunctionA/Res; ?心09上

, probes

图 5-83

场景文件内容

推荐用 文 本编 辑器将分号 批 量改为逗号后再用 Exce l 打开编辑,如图 5 - 84 所示。 确 认编 辑 完 毕后 关 闭 Excel 软件。推荐用文本编辑器将其中的逗号批量改为分号后保存备用。

下什可”一, l l lll, =乓吓什斤

之 10D已cr1pt10n 二,

艾立忒##,,环=仁仁#江#虹斗扛 4廿 4 仁江之力#



•SCRIPT•

Repeat 2

七辽

1 Res(2/2) \. C·>Res(2/2) Chap妇r6Soc.叩 ChaplBr 7Seven elp Chapler8E1ghle1p Chap1er8N1ne etp Commonl1bs etp

..

co612612612SSS612612612 v ra 9

斥u

I~;::;:: \. A ·> Res

Bas,cFu 忙 Fu心onA/A ·) Res

I` 伈 Res

BaS1cFunc

\. \. \. \.

F吓bonA/A ·> Res

Bas 寸unc Fu忙m哗·_>压

B·>Res B·>Ros B·>Ras C-> Res

N如e

B 釭代 Fune:

FuncilOnA/8 ·> R 釭

Bas迁mcFmoonA/B .>心$

Bas,cfunc Funcbo 心./C·>Res Bas,cfunc Funclro 如 ·>Ros BaS1cfunc Funcbor,A/C > Res

Bos1cFunc FunctJonA

l 0m叩ge

'邸

= ' - ·-AC

Name 1

Palh Bas,cFunc FunchonA/A ·> Re.

量 Ba s,cfunc.FunCl!onA 石 Res

石 C

note B T,u~ False A True False notSandll 1'\Jo Folse

图 5-101

覆盖分析的结果

色 A

:El B

Name

Coverage

己一

乒回」 Recordl

" :El Sorf1 芒} San卤1

Deta,ladC.归meO江 es

~ MTCR如rds

R 釭叩-CsvByColumns

Record_CsvBylmes

吁四注! 一 如果覆盖未达到要求,则需要进行覆盖分析,通过模型修改 , 或者 仿 真 用例和仿 真 规程 的修改 , 或者增加 Jus tification 解释,最终确保覆盖达到要求 。 单个操 作 符 的 覆盖 分析细节操 作 可以参考 5 .2.3 节 。

5.3.6

QTE (£ l:札L 上的代码 狻 盖分 析 SCAD E 产品的 MBDV 流程中,在低层需求即模型级完成功能 测 试 和 覆盖分 析并达到 要

求 后 , 认证级代码生成器会确保模型和生成代码的 一 致性 , 代码层不会产生额 外的 非预期内 容。 不 过, D0-178C 标准依然有代码覆盖分析方面的目标要满足,这时可以使用 QTE 在主 机上的



H LR 国

I•••••••

宜 l ……....……… ..

搅型覆盖分拆雉酴

······

~

c 丿G

疵 叩

:::::., J
rollRate, inc- >OnButtonisPressed) ; /• Rril.Race: :RollRate'

:贮 d RollRate _ Roll Rate (void )

勾选

rollRate = • l • RollRateCalculate_RollRate ( joystickCmd) ; I'1 • RollRateWarning_RollR扛 e (roll Rate, & leftWarni:ng , 品 rightWar 吐ng ) mode = /• 1 •/ RollRateMode_RollRate (rollRate, onButtonisPressed);

图 6-17

C 代码勾选与不勾选 的 差异 图

·I

,

~.:=零. .一··· 一一··一·

•i

-

·I

fmeti”$

于以红n k匀沁ol oneu 仁 tonl5Pressed:

----

-- no 正比”“ ”“ab 心, _ _ -- - no Loal,....or; -一·一一 • - -- - - ---.一·一一 八乞认 S node•' 己3n:ex 仁气 -一一一 一一· -- •· no 己 l-ck, “ ?t···m“Ol毛 daco

-- --

L 六亡 M.

n :(比心心丘斗匀 ti 叩心 1

-

=丿=________,'

·灯·',. K 亡g_floatJ2 joy 立 ic 比md;

-- •/--

, R ,止虹\'.. R,. L9 .,匡: :扛 OllRate roll 闷 t.; teRollMode- RollRa 工·,. RO 丘Ra 丘: : Soll 釭 te: :立心., mode; keg bool /' R,.. Ratee:Rol 辽丑 e:,left沁 u心 ng 'I lef 仁四 rning; keg=bool I• •· 11沁芒'决心』 Kare :江oht•um 心 'I riqht•arning ·

kcg_fl心 t32

..,o

-—--=_____=.

=-~

,九 r”

沁叩吓心 t'”

,ll1 二亡.. 1Jym~ 止 "°""'•I

n, : )tput

=

勾选

·lm飞比e”“Ra"出吐已 at.e m1lR 江 ,.n"

不勾选

F, : l l 比ace“"

—-

-

"叩d t 'trJCt

R: :门扫心贮 h 霄

_归

勾选 Wrap C operators 复选框,代码生成器可将算法和相关操作符封装为 C 语言宏定义, 而使用到的宏函数都 定义在 kcg_types.h 文件中。以操作符 Rol!RateWaming 为例,实现文件勾 选该设置前 后的差异如图 6- 18 所示 。 ! include " kcg_ consts . h " ! include " kcg_sensors . h" finclude " RollRate'ilarning RollRate.h"

尸 Roll Ra te: : RollRace付arning •! v oid /* /' /•

不勾选

RollRateWarning_RollRate( RollRate: : RollRateWarning: :rollRace 霄/ k cg_f l oat32 rollRate, RollRate:: RollRateWarning:: leftWarninq • kc g_bool *leftWarning, RollRate: :Rol 压ateWarning::righcWarning •/ kcg_bo o l *r i ghtWarn i ng)

• rightWarning = rollRate > WarnThesho ld_Rol lRate, *leftWarning = rollRate < - War nTheshold_Rol lRate ; 八

Roll. Rate:

沁 id

: RollRateWarning *i RollRatewarning_Ro ll Rate (



RollRate: :Roll.R扛 ewarning:

勾选

: rol~Rate 女/ kcg_float32 rollRate, /* RollRace : : RollRateWarning : : leftWarning •; kcg_bool * l eftWarning, /• Roll.Rate : : RollRatewarning: :rightWarning */ kcg_ bool *rightWarni ng) 食 rightWarning

=

kcg_gt_float32(rol1Rate,

付a r nThesho ld_Rol lRate) ;

* leftWarning = keg lt float 32( rollRate, kcg_uminus_float32(WarnTheshol d_Rol l Rate)) ;

图 6-18

C 代码勾选与不勾选的 差 异图

其中 kcg_gt_ float32 、 kcg_lt—float32 、 keg_uminus_ float32 的宏定义可以在 keg_types .h 文件 中找到如图 6-19 所示。 春.l fn def

tde 丘ne

kcg_gt_float32 kcg_gt_float:32 (kcg_Cl, kcg_C2)

.-end辽尸

keg二扛_ float32

I (kcg_Cl) > {kcg_C2))



hfnde f kcg_lt_float32 t define kcg_lt_float:32 (kcg_Cl, kcg_C2) 斗 endif !• kcg_lt_float32 订

((kcg_Cl) < (kcg_C2J J

釭 fnde f

keg_ uminus _ float32 kcg_uminus_float32(kcg— Cl) t endif ; • keg uminus float32 •/

t de f 江 e

图 6-19

(- {kcg_Cl))

kcg_types . h 文 件的内容

勾选 Keep assertions 复选框,代码生成器可将 Assume 和 G uarantee 语句以宏定义的形 式生成到代码中 。 4.6 . 1 节提过, Assume 和 G uarantee 主要是仿真时辅助验证模型,并不生

成到代码,通过 该设置可以将 二 者内容生成到代码 。

以操作符 RollRate 为例,如图 6-20

所示 。

对输入 joystickCmd 添加名称为 Al 的 Assume 。 对输出 rollRate 添加 名称为 A2 的 G uarantee 。 实现文件勾选该设置前后的差异如图 6-21 所示 。 勾选 Keep probes in generated code 复选框,代码生成器可将探针这类原本被优化掉的局 部

变量生成到代码。以操作符 Rol!Rate 为例,添加探针 UESTC_Probe, 如图 6-22 所示。

_ 们可标的至成冒

第;`-

示题飞行器滚转角限幅及报警系统

乍者. UESTC

悚源ANSYS

UESTC一-·

RollRateWarning

1.,.,dcm

卢〉叩咖叩g

RollRateCalculate

✓ 人1 ",劝 • 1000

“~,“...

、立,哪斗切 · \ 0

图 6-20

->

RollRateMode

~3.

RollRate 操作符逻铅图

/• RollRace: :RollRa 迳真/ void RollRate RollRate(inC RollRat:e RollRat:e *inc, outc RollRat:e RollRate • outC) {

outC->rollRat:e

I•

l

m



l

霄/

RollRateCalculace--'RollRace{inC->joyscickcmd) ;



RollRateWarning_RollRate { out:C->rollRace, 5outC->leftWaming,

不勾选

印utC->rightWarning);

oucc->mode a • 1 食/ RollRateMode RollRate (ou t:C->rollRace, inc->onBucconisPressed); )

/• RollRate: :RollRate 寸 void RollRate_RollRate(inC_RollRate_RollRate •inc, outC_Roll.Rate_RollRate • outC ) (



Roll 归;;e:



RollR 氐 e:

:RollRate: :A2 • , kcg_bool A2; :RollRate: :Al • ' kcg_bool Al;

1酰三三气三三勹Ro:『te(mc RollRateWaming_RollRate ( OUEC- > rollRate , ,autC->leftWarning, , outC->rightWarning) ; outC->mode • • 1 富

>)oyst].ckand)

勾选

RollRat: 纽ode RollRa 仁 e(outC->rollRate,].nc->onBUttonisPressed);

图 6-21

C 代码勾选与不勾选的差异图

示题飞行器漫转角氓幅及报警系统

百·UESTC

陕谦:ANSYS

RollRateWarning

....…立 户——---t

RollRateCalculate

✓ ” ,.,, ..cm, 』 , OO · 、俨 心 一 ·,· · tE

m仓·-......

图 6-22

..

Roll Rate Mode

->~

Rol!Rate 操作符添加探针后逻辑图



`

头文件内增加了该探针对应的变 蜇 ,不再 被优化 ,如图 6-23 所示 。 鲁 include

"kcg_types.h" "RollRateCalculate RollRate.h" 善 include "RollRat:eMode.,..RollRat:e.h" tinclude "RollRateWarning_RollRate.h" 春 include

~~~~~~===== input structure=====—----- ~~======='I typedef struct { keg float32 /* RollRate: ;RollRate: :joystickcmd •! joystickCmd; keg二bool /* RollRate: :RollRate: :onButtonisPressed 盲 1 onButtonlsPressed; I inc RollRate RollRate;

!•

I*====~-~~=

no output str,cture

-----===

尸==

concext type

= = = = •/

================= */

typedef struct I I 食 -----一一一-- ·---------------oucput:s ------- -------------------- •/ keg float32 /• RollRate: :RollRate: :rollRate •; rollRate; teRollMode RollRate /* RollRate: :RollRa 工e: :mode */ mode; kcg_bool / • RollRate:: RollRate:: lefi:Warning • t leftWarning; keg_bool /" RollRate :: RollRate:: rightWarning 滇/ rightWa 口江ng;

I;;g飞0-/三f51卢:f-\5::飞;::;:飞:芒沁::;;1江ST ;一;聂?;1 一 一一 ____________------

:/I

/食

[1

no local memory ----一一一一一一一一一一一一一一一一一一一 寸 I*-------------------- no sub nodes'con;;exts -------------------- •/ /玄__________------- no clocks of observable data------------------ •; outc RollRate Ro llRa工e;

图 6-23

头文件内容

实现文件勾选该设 置前后的差异如图 6-24 所示。 / • Roll Rate: : RollRate * / void RollRate_RollRate( inC_RollRate_RollRate.].nc, outC_RollRate_RollRate • outC ) {

outC->rollRa te I 女

1

=



1

•! RollRateCalculate_RollRate(inC->joystickOnd);

育/

RollRatewarn1ng_RollRate ( outC->rollRate, 不勾选 ~outC->leftWarn1.ng, &outC->rightWarning); outC - 习node = 1• 1 • RollRateMode RollRate(outC->rollRate, inc - >onButtonisPressed); )

I• RollRate: : RollRate • / void RollRate RollRate(inc RollRate RollRate •inc, outc RollRate RollRate • outC ) {

outC ->rollRate =

I

` 1, I

• 1 •/ RollRateCalculace_RollRate(inC->joystickOnd);

RollRateWarning_RollRate{ outC->rollRate, 勾选 &outC - >UESTC Probe, &outC ->rightWarning ) ; outC->leftWarning = cute- >UESTC_Probe; outc- >mode= /• 1 食/ RollRat函ode RollRate( outC ->rollRate, inc- >onButtonisPressed);

图 6-24

实现文件勾选与不勾选该设胃的差异图

勾选 Generate system memory state management 复选框,代码生成器可生成操作符的独立

上下文环境及对应的存取函数 。该 设置对观察状态机等的上下文环境参数特别有用 。 以操作 符

On0ff4_ SetTrans_ Last 为例,如图 6-25 所示 。

Et刁- A-过“—

一代码和其他目标的至冠胃

第;百三

追:基本状态机4(设定卢st值 者 : UESTC

,

护一一一一....-

源:ANSYS

/

- -一一一···---·····-·一一·一一.一.....一一.......................................< SSM ►

:

ON

:

_,. /

SET_ON= true. SET_OFF = false,

; 在

lsOII

lsOn

`、......一......一一..一................../.生笠.屯.s生.今一......一.-----.一一一一..--------.一』 SET_OFF = true,

O汗

图 6-25

OnOff4_SetTrans_Last 操作符逻辑图

操作符默认生成的头文件内容如图 6-26 所示。

=

input s t r u c t u r e - -—-== •/ struct I keg boo!/• StateMachine::onOff4 SetTrans Last: :ON*/ ON; kcg_bool /• StateMach1.ne::OnOff4_Se 七 T 工 ans_Lasc: :OFF •/ OFF ; I inc onoff 4 SetTrans Last State归 chine;

J•

七汀冷 daf

/•

~~~

no output structure

/*==一

con工ex 仁 cype

=~-~

*/

--一--—-—- */

typedef struct I

/· ___________________-



outputs -_______________一一一一一一一一一一 :OnOff4_SetTrans_Last::SET_ON •/ SET_ON; State均 chine: :onoff4 SetTrans Last: :SET OFF •/ SET OFF; J• ---------------------- no local probes ----------------------- •/ !• ----------------- no ini dalization va 工 iables ----一一一一一一一一一一一一一 */ J• ---------------------- local memories ------------------------- */ SSM ST SSM /• StateMachine::OnOff4 SetTrans Last::SSM •I SSM sta te nxt; J• -------------------- no sub nodes' contexts -----------一一一一一一一一一 */ /霄____________--- no clocks of observable data------------------•/ I outC OnOf:f4 SetTrans Last St.at必 chine; kcg_bool J• keg bool /*

S 七 ateMachine:

~ - ---图 6-26

默认生成的头文件内容

添加该设置后,操作符的头文件内新增内容如图 6-27 所示。 I食

---===========

--

state vector type

typedef struct { I女

___________------

m窃垃王心吐

outputs

=========一一一一一一一=====



---________________ .I

keg bool /..scateMachine: : On0ff4 SetTrans Last:: SET OFF • / SET OFF; kcg_bool /• S 扫 t. 吐achine: :onoff4_SetTrans_Last: :SET_ON •1 SET_ON; I .. ---------------------- local memories ------------------------- •! SSM ST SSM /* StateMachine::onoff4 SetTrans Last: :SSM •/ SSM state nxt; I 食 _______-----一一一一一 no local probes ---一一一一一一一一一一一一一一一一一一一一 */ I 食 一一一一一一一一一一一一一一--- no initialization variables ----------------- •/ !• -------------------- no sub nodes'contexts -------------------- •/ J sv onoff4 setTrans Last StateMachine; ex 仁em

void Jccg save SV OnOff4 SetTrans Last: S1:ate归 chine ( SV onoff 4 se1:Trans Last Stat如 chine • sv, ouc.c On0ff4 Se1:Trans Last S1:at:e归 chine •outC) ; extern-void Jccg load iv onoff4 se1:Trans Last Sta1:eMachine ( out:C OOOff4 SetTrans Last StateMachine • outc, sv OnOff4 setTrans Last s1:ate归 chine 合 SV);

图 6-27

新增的头文件内容

操 作符的 实现文件内新增内容如图 6-28 所示。

`

-

—-

void keg save SV On0ff4 SetTrans Last StateMachine( SV OnOff4 SetTrans Last StateMachine *SV, cute OnOff4 setTrans Last StateMachine *outC) SV->SET OFF = outC->SET OFF; SV->SET ON = outC->SET ON; SV->SSM state nxt = outC->SSM state nxt;

-

voi d keg load SV OnOff4 SetTrans Last stateMachine( cute On0ff4 SetTrans Last StateMachine •cute SV OnOff4 SetTrans Last StateMachine *SV) cute- >SET OFF= SV->SET OFF; cute->SET ON = SV->SET ON; cute- >SSM state nxt = SV->SSM state nxt;

图 6-28

操作符的实现文件内容

勾选 Short circuit operators 复选框,代码生成器可将布尔表达式由 C 语言按位操作变为逻

辑操作,该设置不 影响按比特位赋值的预定义操作符 。 以操作符 DoubleEdge 为例,如图 6-29 所示。

昙飞言停测发生器悚源ANSYS\ c

FBY1

1

1

工一) edge_down C

FB沪 1

1

图 6-29

) edge_up

DoubLeEdge 操作符逻辑图

实现文件勾选该设置前后的差异如图 6-30 所示 。 尸 BasicExer::DcubleEdge •t void DcubleEdge_BasicExer( inC_DoubleEdge_BasicExer •inc, outC_DoubleEdge_BasicExer •outC)

/ • Ba5icExer: :DoubleEdge: :_U

•! kcg_bool

/* fby I init 2 •/ if (outC->init) ( outC->init ~ keg false; L4 = inC->c; }

不勾选 else l U = outC->rem c; ) outC->edge_up = !_L4 ;, inc->c; outc->edge_down = I _L4 I inc->c outC - > 工 em c = inc->c;

.

图 6-30

I 、 BasicExer: :沁 ubleEdge •/ void DaubleEdge_BasicExer (

inC_DoubleEdge_BasicExe 工五nc, outC_DoubleEdge_BasicExe 工

L4



/令

BasicExer:

•outC )

: Doub~eE:dge: :

L4

育/

keg bool

fby 1 ini t 2 • / it ( outC->江 it) ( outC->init = keg false; L4 = inc->c;

}

else { L4 = outC->rem c;

勾选

) OU 七c->edge_up =!一”“ inc ->c ;

outc->edge_down = I_L4 11 inc->c; outC->rem c = inc->c;

实现文件勾选与不勾选该设置的差异图

L4;

三三·一:.

代码和其他目标的生成1

1,

第 6-章一

Global prefix 输入栏用千定义生成代码中所有元素的前缀 ,元素包括外部引用、类型、常 量、 根操作符、非扩展操作符、宏、全局变量。以操作符 OnOff4_ SetTrans_ Last 为例,默认情 况下生 成的代码 文件名称和操作符内容如图 6 -31 所示。 食霄食****肖育食令**.*量食食*` `....熏食食食

•'* Generated KCG H files'*' ***食食*

·**· ·**霄...合**食俞言食·· •

*食

RollRate RollRate.h RollRateWarninq_RollRate. h RollRa teMode RollRa 七 e.h RollRa teCalcula te RollRate. h kcg_types.h keg_cons ts. h keg,ensors. h

”“…·骨令~ "…····· ··”“夫. 『Oid RollRace_Ro1lRate(mc_RollRate_ROllRate .inc, ( • RollRate:

*'* Generated KCG C 丘le•**'I

R 心 llRate

'I

autC_RollRate_ROllRate *outC)

outC->rollRate - , , 1 • / RollRatecalculate_RollRate(inC->joystickcmd);

...鲁..良...令覃食···令令亨育 · ··· ···* ·

,• 1 , I

RollRate Roll Rate. c RollRa cewarning_RollRate. c RollRat 咄ode RollRa ce. c Rol.1RateCa.lculate RollRate. c keg_ types. c keg_consts. c

RollRateW. 口11.ng_RollRate

(

outC->rollRate, 心ucC -> leftWarning,

•outC - 江 ightWarning) ; outC->mode • / • 1 • / RollRateMode RollRate (outC->rollRate, inc->onButtonisPressed) ;

Generated SC2C File5 食*食 • • • * • • ·算*食食食食食令女...**食熏*食食...

`*育

U5er macro•. h keg 立~. h

图 6-3 1

--

默认悄况下生成的代码文件内容

在输 入 栏中填入名称为 UE STC 的 前缀,如图 6-32 所 示。 Settings

X

邑Code Ge爬rator

General

KCG

Expansion

Optim四 tions

Separate I/Os

Configuration

Debug

Code Integration Compiler

Build

口 Generate context as global

口 Wrap C operators

□ Keep assertions

口 Keep probes in generat ed code

口 Generate system memory state management 口 Short circuit operators

严勹

|GIobal Name

length

Significance length: |·—~



User con的[$订argetDir)\user_ macros.h

l

Header file

I 图 6-32

~I

7

1·“

眈肖

.

帮助

Settings 对话框的 Configuration 选项卡

添加前缀之后的代码文件名称和操作符的内容如图 6-33 所示。

Name length 输入栏用千定义所有变 量名 称的最大字符长度, Significance length 输入栏用 千定 义所有变量主名称的最大字符长度 。

User config 输入 栏用于设定用户自定义头文件 的位置,默认路径和名称为 $(T扛getDir)\user—macros . h 。

,

............................. • •• Generated KCG H file • •••

UESTC RollRate RollRate.h UESTC_RollRateWarning_Roll.Rate. h UESTC Roll.RateHode RollRate.h UESTC RollRacecalc吐 ate RollRate.h keg_如 5 . h

kcg_const•.h keg •eiuors. b

••• Generated kCG C ELles

I 令 Rol llla te : : Rol. 也te • 怜过邓STC_Rol.lllate_Rol.lllate ( llESTC inc RollR扛 e RollRate • inc, llESTC outC Rol.lllate RollRate • outC)

`..

OU 匕C->ro 旦扣1te

OES'l'C RollRace RcllRate.c OESTC Ro llRatella立Un9 Rol 血 te.c OESTC RollRateMode Roll.Rate .c OESTC Ro llRateCalculate RollRate .c lccg_types.c keg_cons ts . c

Generated SC2C File•

( inC->j oy,ticlccmd);

Roll Rate (

OU 匕C- > ro叩 te,

•outC ->l.eft箕arru.ng. t.outC->righ 氓 arn 山口 )

OU 匕C -习正X让





;

1 `I

邓 STC Ro ll胆 teMode 食禽•

• t 沉 STC_RollRatecalC\l.late_RollRate

• /• 1

咙STC Rollllate博arning

Rol.lRate C outC ->roll 凡江e, inc->onllutton1,Pre,.ed ) ;

.嘈·

.....合食....................

..

user macros.h keg_imported_types . h

图 6-33

添加前缀之后的代码文件名称和操作符的内容

Header file 输入栏用 千包含用户自定义头文件,该头文件将被所有生成的 C 实现代码的顶 部包含。以自定义头文件 UESTC.h 为例,在 Header file 栏 内填入该文件所在的位置,如图 6-34

所示,则所有生成文件的顶部都有如图 6-35 所示的内 容。 Settings

SOC 如_

Optim迈心m

_

1

X

n 父产”“0.

C叩守"tion



Code In时r.tion

Compi~

Build

口 丘mmecont“”“如也

口 业可 C 叩”“

OK如 ”“G心ns

口比中尸心Gin 宇~medcode

/***,..**`食食· 食食

口 Genera11e”“如 mm叩"忒emm丐砌硕

Oshort,ircuit o户f.`" G心I

|

Il

沪 elen 如

S勺nrfianceIength.

200

],-

U父 0ntig”(T"字。,如".h

I如如file

kCG\UESTC.h

~

p

l

— 一口 l

llllll!l

图 6-34

嚼酌

efine 鲁 define

OESTC 运 10

IJESTC DEF 100

嘈 endif

Header file 栏

7. Debug 选项卡 将 Code Generator 配置对话框切换 至 Debug 选项卡。在仿真 (Simulatio n ) 或覆盖分析 (MTC) 时,被勾选操作符的所有局部变 量 不被优化,可以观察到连线、探针等变量的 实时 数据,如图 6-36 所示 。

(1) Debug All: 将所有操作符都设置 Debug 属性。 (2) Selected: 仅将勾选的操作 符设置 Debug 属性。 (3) All except selected: 仅勾选的操作符不设置 Debug 属性 。

`寅额外头文件电的和芦义

*`额外头女件中的宏宇义 `.

食食

亥女女”`'` • `虫富/

食食*育*育*霄言、宣*/

Jifndef

UESTC H

鲁 define

郖 STC H

!ifndef tdefine

"stdic.h"

J-include "stdio.h "

扣 include 权 define 肴 define

UESTC ABC 10 UESTC DEF 100

北 define 志 define

鲁 endif

UESTC H UESTC H

UESTC ABC 10 IJESTC DEF 100

tendif

SCADE S\llte KCG 64-bit c•. 5 (build il2) *'•••食 * *实` ` / • $*言·*实会 ” “ SCADE Sul te KC( Command : kcg65 . 邸尽-~ D:/work/UESTC Textbook/Demos/201711 ** Command: Keq65.exe - C Qnf拉 . 欠哗neration date: 2018-02-16T22:22:36 I** Generation date: 20 1 8 - 02 平

/ ` $* * 令声..言.*凛

食育食,女才曹***育”“”“”“”“”“”“·言”“丈盲****丈*食**穹言育*忙”“$ *II 霄 * *盲***育*******食*





且 fndef

:$盓$立芯笃:::$:::S飞. 鲁 include

操作符实现文件

fdefi ne

"RollRate RollRate.h "

图 6-35

KCG TYPES KCG TYPES

H H

k-cg_typesJi 文件

生成文件顶部的内容

Settings

X

~Code Generator

KCG

`'忐』

General

Expansion Separate I/Os Optimi互 tions Configuration Debug Debug :

**** * *** * " '

口 Debug

All

Code Integration Compiler Build

0

@Selected

All except selected

s □EJ Chaple农SIX 心 中 lut 田 匕仁l math

Ell O..::i pwf1near l!J 0:J RollRate

比 口口 SeperalelO 仔 口Cl Seperalel01 田 口亡I vecl

l

I 图 6-36



I

眈肖

帮助

Settings 对话框的 Debug 选项卡

8. Compiler 选项卡 将 Code Generator 配置对话框切换至 Compiler 选项卡,该选项卡用于设置仿真 (Simulation ) 或覆盖分析 (MTC) 前的编译器参数,如图 6-37 所 示。

( I ) Compiler: 用于选择本机安装过的且注册表内可识别的编译器。 (2) CPU type:

用千选择是 win32 还是 win64 类型 。

(3) Preprocessor defmitions:

用千填写额外的宏定义参数 。

(4) Additional compiler options:

用千填写额外的编译选项。

( 5 ) Additional linker options: 用于填写额外的链接选项。

_

且田

x

Settings i§ Code Genera 回

KCG

General Expansion Separate VOs Optimizations Configuration 氏加g

CPU type: win32

v

勹 7-l

Compiler GNlJ C

Code In比gration Compiler Build

Preprocessor definitions: IBUlLD_DLL

二optlons

Additional compiler options:

I 图 6-37



I I

妇妇

Settings 对话框的 Compiler 选项卡

9. Build 选项卡 将 Code Generator 配置对话框切换至 Build 选项卡,该选项卡用千填写额外的包含目录,

如图 6-38 所示,具体应用可 参考 2.6 .4 节 。 Set廿ngs

X

邑. CodeG如eralDf

KCG

General Expansion Separate I/Os Optimizations Configuration Debug

Code Integration Compiler Build X 令 4

Additional include directories:

l _

f

_

L_ l

Excluded files

I 图 6-38

6.1.2

确定

1

取消

Settings 对话框的 Build 选项卡

1yl 个操作符的代码牛成配罚 Code

Generator 工具条的设置通常是对所有操作符起作用的, Suite 中也支持对单个操作符

代码生成的设置 。选中某操作符,打开屈性对话框的 KCG Pragmas 选项卡,如图 6-39 所示 。

Target 栏可以选择生成 C 或者 Ada 代码。

Gem叩I

T”汗贞

。红 b”hon

C



Typ•Van心 1己

心平

Comm.nl

!氐

Not•

岑.

血霄岱,

f1 心 丘叩

$中五• I心

,沁忱釭心产父

"'RK 心

Codelnt勺 rat,on

MTC

,:



TrK..b攸y

lI

L 图 6-39

KCG Pragmas 选项卡 Target 栏

Name 支持重定义操作符生成代码后的函数名称。以操作符 RollRate 为例,如 图 6-40 所示。

Declaration Type Variables

UESTC

I

C;mment

Keep

Note

傥 Code lntegratior;

□ Expand

口 No 压pand

口 Separate I/Os

口 No Separate I/Os

MTC

~PARK Hide

Traceability

图 6-40

KCG Pragmas 选项卡 Name 栏

生 成的代 码列表和操作符头文件内容如图 6-4 1 所示。 " • Generated KCG H files'** 寅食*噙寞*

*

**食**

**

·*寅令*响***** **食*

'”}dlu 飞" K :q

亡 ypes,h 科

tindsd• "R~,,RateCa cu.late RollRate.h" ,inc1Uje.ROlJ.Rat 吐od今

.让江 lu 中

RollRateCalculate kcg_types.h keg consts. h keg sensors.h

__ RO1lRar-.h”

“Rol 迁迈五 Warning RollRate.h 俨

Rol 印 te.h

II/'~~~

II

".“”“`”“.食育*""

"

""

勺干•def

丐 truct

kcg_float32 keg 噙

.11) ~~色匀

( •

anput structure

=__一一

一一一=. I

Roll 眨 te: : Roll归 te::Joyst1ckcmd

Ro_ : Ra ?了: POl lRat 七:

· t joysuckcmd, ;onButton:sPre,sed''onButtonisPressed,

.重•

Generated KCG C files *寅食 ,•===•__•=—沁 output otructure -=-二-=—--=育/ • • * • ··食俞食肩· ··食”“*”“”“* * | | STC.c ,.= = contexc type -r. ====-'.I Rol lRateWarning_Roll Rate. c t”冷df s 江 rt ( RollRateMojoystic 比玉d )

/• 1 . /

RollRateWarning RollRate ( OUtC->rollRate. •outC->leftWarnu,g, •outc- >立ghtWarning).

OUCC -玉ode

- 1· l . RollRate (outC->rollRate , iJlC->onButconlsPressed);

Roil.Ra 垃ode

图 6-42

实现文件的内容

;

_ 单个操作符等元素的 Expand 、 No Expand 、 Separate I/Os 、 No Separate I/Os 的含义同 6.1.1 节,但设置后的优先级高千 6.1. ]节的工程级设置 。

创建并保存日定义配罚

6.1.3

Code Generator 工具条默认只提供 4 种基本配置项: KCG 、 S imulation 、 MTC 、 Timing and Stack 。用户可以创建定制名称的配置,用于保存专门的设定。 (1) 通过菜单 Project一 Configurations 打开配 置对话框,如图 6-43 所示 。



( 2 ) 单击 Add 按钮打开添加配置对话框,如图 6-44 所示。



亡;;; 9i­

_^v

Configurations





态BOLe



F

.

X

rd

ad

N虹 n叩e IUESTC_Conhg

_j |

0K

I

Cancel

Copy from

e



R” po

如l的



K了 cGMTC

_

.一


dou 勺mt o立 t<ta... p”“一口江·

s”“.气 ”m1 _喜 y. 仁.蛐

I/

(`土亢put龛c- 匕龟箕亡 .

"五八:pu仁"之江心鱼篡 q

pm比..篡 OU 严t 簪斗 u.JJ

亡《寸,oh.lcl.一· `巳\D . OU--. II C - r

o”“心 C 已鱼·

to丈 0~te

;



V-, ; } 巴

cyc1.

p工蠡吐Q 己·一 t们一 :

,

} ..”“,(1) ; // r.w.rn o;

run 王o工·v.工

图 6-51

C 代码模块集成的主呐数示例

值得一提的是,当有模型中有自定义的复杂类型时, keg_types.c 文件会自动生成这些自 定义复杂类型的默认比较函数。而实践中,即便需要比较自定义类型对应的变量,用户 也会设 计专门的操作符来实现。所以,如果 keg_types.c 内容对集成框架无用,则推荐删除该文件, 不集成到程序中去。 代码仗成的其他考虑

6.2.3

D0-178C 中标识了两方面的集成 : 开发活动的集成,即编译、链接和加载过程 ;测试活

动的集成 ,包括软件/软件集成和软件/硬件集成“]。本节关注升发活动中 的 集成和软件的加载 控制。验证活动中的集成已经在第 5 章中介绍仁 使用源代码来建立可执行目标码的过程称为“构建过程”。 D0-178C 编码阶段的输出包 括源代码,以及编译和链接指令。编译和链接指令编写在“构建指令”中。构建过程 的编译器、

连接器可能会产生警告和错误。应当评审和分析这些警告和错误,标识是否有可接受 的 警告。 构建指令必须用可重复的步骤良好编档,因为他们记录了构建将要用于安全关键操作 的可执行 程序 的过程 。 构建指令经常包括多个脚本(例如 makefile 文件)。由千这些脚本在可执行程序 的开发

中有着重要的作用,因此它们应当同源代码一样,需要评审并纳入配置管理。遗憾 的是,编译 和链接资料的评审通常被忽视。 构建软件正式发布之前,推荐有 一个干净的构建。需要清除所 有的软件,对构建机器进 行消理,或者准备好专用于构建的机器。然后用批准的正式软件安装到 构建机器,再使用“干

净构建规程”。这种干净构建确保使用的是批准的环境,而且构建环境是可 以再次生成的 , 这

对千维护很重要。构建机器被正确配置后,执行软件构建指令 , 生成软件用于发布 [I] 。 可执行代码只有被加载到目标硬件上才会有用 。推荐一个受控 的软件加载过程中关注如 下几点 :



批准的加载规程。就像构建指令一样,加载规程应当作为 D0-178C 符合性活动的 一 部分来开发和验证。



加载验证。应当有一些手段来确保软件是没有被破坏地完全加载的。这通常是通 过 一 些类型的完整性检查,例如循环冗余校验 (C RC ) 或数字摘要实现的。



零部件标记验证。需要有一些方式来标识加载的软件,以确认加载的零部件号 和版本 与批准的一致。一旦软件被加载,应当验证其标识与批准的相符。



6.3

硬件兼容性 。批准的硬件和软件兼容性应当被编档 和遵守 。

Simulink 的 S 由数牛成 Simulink 是 MathWorks 公司推出的模型级仿真环境,应用广泛,融入了许多成熟的第三

方库 , 便于进行快速原型仿真验证。 SCADE 模型支持生成 S in叫 ink 中的 S 函数,然后可在 Sirnulink 软件中导入该 S 函数进行联 合仿真。生成步骤如下 :

( I ) 打开 Code Generator 工具条,切换 至 Code Integration 选项卡 。 (2) 设置 Target, 在下拉列表框中选择 Simulink, 则名为 S imulink 的选项卡将自动显示 , 如图 6-52 所示。

_ Settings 邑 Code

X

?

Genera!Or

KCG

Optimizations General

Configuration Expansion

Debug Compiler Build Simulink Separate VOs Code Integration

O None I@Iarget

I-=

SimuhnK

0 "1daptor,\沪 MCD ·2MC

I OtheI 吐e叩ons

1巳心aS,m-onEJdensIOn 口 MTC

lnstrumenterWrapper

Periodicity Eeriod. Override

v

J

Q佑 et..

!.!mt:

I 图 6-52



l

尸 |ms 甘

耽肖

.

营助

选择 Simuli 咄作为目标代码的方法

(3) 在下拉列表框中对 S 函数的周期性执行进行修改 。 Simulink 程序不能在没有周期性

设置的清况下生成 S 函数,不可选择 No periodicity 。 ( 4 ) 单击 Sinm1ink 选项卡,设置生成选项,如图 6-53 所示 。 父tongs

O心 G0吨or

兰 丘心心emx

贮 山汀OW如i 归窜X-

....... 氏一

-p咖如e

,f沁m,~~`)心面0·`让TE}S(TIME巾

Generabon name:

[S(NodeName) _ ~

。10nholl

__勹

心叩重10m 。门卢 b

I 图 6-53

寸I

(NONE

OK

I

I 「 云了1

设置 Simulink 生成选项

( 5 ) 勾选 E nabl e wh 让e box 复选框支持在 Simulink 中白盒仿真 S 函数,默认为黑盒仿真。

( 6 ) 勾选 User-provided sensor declaration 复选框支持防止将 Suite 定义的外部引用变量作 为 S 函数的输入。 (7) 勾选 Record scenario 复选框支待每次在 Simulink 环境中运行仿真时都生成测试用例

.

C .in 格式)供 Suite 重用。为设置测试用例的输出位置等信息,用户可以使用以下变量:



$(Configuration) :当前配置的名称 。 $(DATE) 和$(TIME) :创建测试用例文件时使用的日期/时间 。

注意:默认情况下,测试用例文件与 S 函数的 DLL 在同一目录下。测试用例文件名称的

命名参照仿真运行的日期和时间。

(8) 在 Generation name 中指定 S 函数文件名和函数名 。 默认的名字是$( NodeName), NodeName 为代码生成器配置中的根操作符 。 (9) 单击 OK 按钮,再单击“生成”按钮屯匹

,范凸凸

,生成目录下的

XXX_SFCT 前缀的 m 和 c 文件即 Simulink 斋要的文件 。

(10) 如果 Simulink 预安装完毕,且环境变量识别无误,则 Suite 下能直接生成 S 函数 : 否 则,仅生成待编译为 S 函数的所有 C 代码 。 用户可以在 Simulink 软件下设定特定的编译器 将 Suite 生成的 C 代码编译为 S 函数 。

NI VeriStand'上成

6.4

VeriStand 是 National Instruments 公司 专 门针对硬件在环仿真 (Hardware in the Loop ) 测 试系统开发出来的软件环境。 VeriStand 可用于执行各种应用的测试,包括嵌入式软件验证以 及测功机和基千伺服液压的测试等物理测试应用,支持跨多个同步实时控制器的分布式测试。

SCADE Suite 中的 VeriStand 接口基千 National li1strun1ents 的模型接口工具包 (Mode l Interface Toolkit. MIT) 等技术,支待将 SCADE 模型导出到 VeriStand 中,为用户提供使用 NI Verista n d 进行真实系统仿真和快速原型搭建的完整工作流,如图 6-54 所示。

Data/scenarios

`.

l

••·^ ·



-

...-

`

Outputs/probes



.立.

-

.......酝..

-/,I 图 6-54

/1

SCADE 怢型 与 VeriStand 模型在环仿真 示意 阳

导出 Veristand 接口文件(配置 SCADE Suite 代码生成器设置,将 SCADE 模型导出到 VeriSta nd 中)的步骤如下: ( I ) 打开 Code Generator 工具条,切换至 Code integration 选项卡 。 (2) 在 Target 下拉列表框中选择 NI YeriSt邸d, 确认设置周期时间信息,如图 6-55 所示,

NI VeriStand 选项卡将自动显示 。

如n千

邑 CodeGenerator

也一 _ 1 _0ebug General 己一 O

T-





I

心心 I,ICO-2

p三 kar

、__一.皇尸

None

^b

~ - -

.~

口 MTC 压归芯七W啤归f

[F叩 roo1aperator

Penod Offset



归.

l

l3

I

;n,'a

,

ms

I

I 图 6 - 55

OK

II

臼~1 1

吵]

选择 NI VeriStand 代码集成方法

( 3 ) 在 NI VeriStand 选项卡中设置目标特定选项,如图 6- 56 所示 。 泗,ngs

巴 Recotd scenano

Scenario p忒m和,e

S(Coriigurat,on)lscenano-S(DATE)-S(TIME).,

巴 丘必叩e bax.

Co-host

Sil.ocaHo云

I 图 6-56

OK

l l o- l l

Help

|

设置 NI VeriStand 生成选项

( 4 ) 勾选 Record scenario 复选框,在仿真过程中记录测试用例 (.m 格式)。在 Scenario pathname 中指 定测试用例文件的位置,默认提供以下宏定义:



$(Configuration) : 使用当前配置的名称 。



$(DATE) 和 $(TIME) : 创建每个测试用例文件时使用的日期/时间 。

( 5 ) 白盒仿真复选框 : 是否进行白盒联合仿真 。 设置白盒仿真后, Veristand 仿真时 Su ite 软件 会同步启动,联合运行。默认为不勾选白盒仿真 。 ( 6 ) 当启用白盒联合仿真时,可在 Co-s imul ation h ost 字段中指定主机的 IP 地址 。

(7 ) 单击 OK 按钮,再单击代码生成工具栏中的 Build 按钮匼] 生成文件,生成目录下的 XXX _NIVS . dll 即可导入 V eristand 软件中的文件 。

已:`r:二j

6.5

FMU 牛成

6.5.1

Moclelica 协会与统建桢 il切

——石田-面目标的生成1',

第 6云__欠 `」

欧洲仿真协会 EUROSIM 千 1996 年组织瑞典等 6 个国家建模与仿真领域的 14 位专家, 针对多 领域物理统 一建模 技术展开研究,提出通过国际合作的形式研究设计下 一 代多领域统一 建模 语言 Modelica, 并千 2000 年成立非盈利的国际仿真组织

Modelica 协会 。

该协会每隔一年半组织一次 Modelica 学术会议,交流和探讨 Modelica 相关理论和应用的 研究 进展,并基于 Modelica 开展领域知识模型库建设与维护 。 统一建模语言具有领域无关的通用模型描述能力,采用该语言进行建模能够实现复杂系 统不同 领域模型间的无缝集成 。

6.5.2

FMI 标雅'; Fl\1U 文件 FMI 标准的诞生来自于欧盟 Modelisar 项目,最初由 Daimler AG 发起、组织和领导,包

括工具 供应商、工业用户和科研机构在内有 28 个欧洲实体参与。 FMI 标准用于解决困扰用户 的工具碎片化、模型重用难、知识产权保护难的问题 。 FMI 标准如图 6-57 所示。 现状/需求 供应商开发组件



制造商菜成各组件



繁多的不同的仿真工具

`心~□~i lH 丘向 l

出丙吓 2

"枚屯 1

解决立案

供贷虾、3

供垃仇'

识应陬 3

DLL (横型导入) 工员耦合(联合仿真)

供应商保护楼型的知识产权



提升妇,确保质量

``

灼供

3

g

尽早地确认设计

坦商

1





优势

顽瓟$

·` 占





fo氐叶I

吹反向$



制造商能豆用供应商的模型

.

侣代刁心

,g

~

图 6-57

FMI 标准

Modelisar 项目于 2008 年启动,第 一期项目到 2011 年结束,投入经费超过 3 千万欧元, 制定了 FMI 1.0 标准 。 2012 年, FMI 2.0 标准的制定纳入到 Modelica 协会 管理下 , 并在 2014

年初 推出了 FMI 2.0 的成熟标准 。 FMI 标准的全称是 Functional Mock-up Interface ,是 一 个不依赖于工具的标准 ,其通过 XML 文件 和已编译的 C 代码的组合来同时支持动态模型的模型交换 (Model Exchange) 和联合仿真 ( Co-Sinmlation) 。

FMI 是针对功能和性能模型重用的接口标准,通过 FMI 标准导出的文件是一个压缩包, 文件 的扩展名为. fmu, 即 Functional Mock-up Unit 。 FMU 压缩包文件里包含了描述模型接口信

息和 数据的 xml 文件、实现模型动态行为功能的文件 (C 代码或 二 进制文件)和其他用户希望 包含在 FMU 中的文件和数据 。

父“一

一飞

由千 FMl 标准是一个通用的第三方接口标准,不依赖于任何工具特有的接口形式,因此只要

是支持 FMl 标准的工具都可以将其他工具导出的 FMU 文件导入到自身的软件平台内,这时仿 真 软件会自动解析 FMU 中的 xml 文件,并在软件的操作界面上给用户提供操作 FMU 的选项 。 FMl 标准共包括两种 模型重用的方法 : Model Exchange (模型交换)和 Co-Simulation (联 合仿真)。两者的区别是依据 Model Exchange 方法导出的 FMU 文件不包含求解模型方程的求 解器,而依据 Co-Simulation 方法导出的 FMU 文件包含求解模型方程的求解器。是否包含求 解器是两者最大的区别 。

Suite 生成 FMll 文件

6.5.3

Suite 模型支持 FMI 标准,可以生成 FMU 文件 。 生成完毕后,可在 ANSYS Twin Builder

等多学科仿真软件内导入,进行多学科仿真 。 SCADE R17 以上版本软件支持 FMI 2.0 标 准 。 下面来说明如何创 建模型的 FMU 。 ( I ) 打开 Code Generator 工具条,切换至 Code integration 选项卡,选择 Target, 在下拉 列表框中选择 FMU, 如 图 6-58 所示 。

l



O

T"'l)lll

~ 凡乙虹

I1[Olher

rFMU h丸I 心2 戍:

…-

矗 ,

口出一丘

:

□P印“山i mc-... - ·•

P“心

L竺-_ __二]

l

n

Off立







l

I l 图 6-58

OK

IL ~

ll _呤

_'

栈型生成 FMU 代码的方法

(2) 指定 FMU 调用 SCADE 模型循环函数的周期参数(需要从根操作符级设置周期 参 数),如图 6-59 所 示。 (3 ) 在 FMU 选项 卡中设置目标特定选项,如图 6-60 所示 。

(4) 在 Mode l Identifier 栏中可指定生成 FMU 文件的名称 。

( 5 ) Record scenario 复选框用千在仿真过程中记录输入场景 (.in 格式),在 Scenario pathname 栏中指定场景文件的位置,以下变 量可用 :



$(Configuration) : 使用当前配置的名称 。



$(DATE) 和$(TIME) :创 建每个新会话文件时使用的日期/时间。

勾选该设置的好处 是,通过仿真自动生成测试用例 。

士嘈可圃芦“',

心归小年诅躁匿.1

Settings

X

邑 Code Gan"叭"

立G

Optimizations General

-

Configuration 压pansion

Debug Compiler Build FMU Separate VOs Code Integration

ONone ,FMU

0

-,\':AM MCD-2 MC

Adaptor

J 丿

@Iarget

I



Periodicity

I

1-

~

| 胆 6-59

i

-.

OVerride

|初

Settings 对话框



书Code~…口

[心

巳 氏一

父--

-“一.如ATE}-S(JlME)舅 以匕心心)

_

l 图 6-60

OK -

_J

ll

o

l

指定 FMU 导出选项

(6) Enable white box 复选框用 于设置是否进行白盒仿真。不勾选该设置 ,相当于 FMI 中的 Mod el Exchange (模型交换)模型 重用方式;勾选该设置,相当于 FMl 中的 Co-S 皿ulation (联合 仿真)模型 重用方式。 (7) 对于白盒仿真,可在 Co-simulation host 文本框中指定主机的 IP 地址 。 如果 Suite 生 成的 FMU 和类似 Twin Builder 多学科仿 真软件运行在同一机器上, 则不要修改默认的 IP 设置。

(8) 单击 OK 按钮,再单击代码生成工具栏中的 Build 按钮固,生成 FMU 。 (9) 无论是黑盒仿真模式还是白盒仿真模式, SCADESuite 都会在默认文件夹中生成一 个名为< FMU_Name >(与配置名称相同的名称)的 zip 文件,里面包含了 FMU 和其他需要 的 FMl 文件 。

__ 黜臼a

Ada}!tor 生成

6.6

SCADE Suite 适配器用千生成轻量级的和 RTOS 相 关的包装代码。通过 Adaptor 设置, 代 码生成器不仅可以生成模型对应的应用 层代码,还可以生成操作系统 RTOS 相 关 的集成代 码 。 理想情况下,所有代码生成完毕后,无需额外的手工编码,可以直接编译链接特定目标 机程序 。 由千 RTOS 众多, Suite 中仅嵌入 了常用几款 RTOS 的包装代码 。 这些 RTOS 是:



OSEK



µC/0S-Il



INTEGR1TY-l 78B



VxWorks 653



VxWorks CERT



PikeOS

注意:生成的 RTOS 相关的包装代码可用于 客户的仿真与集成工作,这些包装代 码与 模 型无关,不属于认证级代码,需要客户自己验证确保 安全性。

此处以 OSEK Adaptor 代码 生成为例,其他 Adaptor 可参考其步骤进行配置并生成代码 。 具体步骤如下:

(l) 打开 Code Generator 工具条 ,切换 至 Code Integration 选项卡 。 (2) 选中 Adaptor, 并在下拉列 表框中选择 OSEK, 如图 6-61 所示,名为 OSEK 的 选项 卡将自动显示 。 Settings 邑 Code

X

Generator

Optimi互tions

General

KCG

Configuration Expansion

O None l>nnol孔可

IOSEK

I_

_

丿

0 Iarget I 蚽如

Debug Compiler Build OSEK Separate I/Os Code Integration

`

d

ig』

Periodicity



Override

I 图 6-61



I-

取四

: L 帮助

选择 OSEK 适配器作为代码扩展的方法

(3) 在下拉列表框中设置 Periodicity 时间周期属性 。 (4) 单击 OSEK 选项卡,选择代码生成选项,如图 6-62 所示 。

巳片 三二-—

—飞码和其他目标的生成1 ?

Settings ~Code Generator General

第 6云-- 1

X

KCG 压pansion

Optimizations

Separate I/Os Code Integration Debug Compiler Build OSEK

Configuration

Task name:

~OSEK

Task priority: `

Task stack

[4000

I

图 6-62



1

-

一 取;i-1 -ff面~

为周期性任务设置 OSEK 生成选项

( 5 ) 支待在 Task name 栏中修改任务名称。 (6) 在 Task priority 栏中用 一 个 1 ~ 255 的整数来指定任务优先级。

(7) 在 Task stack size 栏中用字节指定任务堆栈大小。

(8) 单击 OK 按钮,再单击代码生成工具栏中的 Build 按钮匼],可生成 Adaptor 代 码。

6.7

设计义护i'I::从 成 Sui te 模型相当千 D0-178B/C 标准中开发阶段的低层需求。验证阶段评审、分析 低 层需求

的对象不是模型,而是模型对应的文档 。 可以通过简单的设置生成 Su ite 模型对应 的 文档。模 型文档生成步骤如下:



( ] )将 Suite 工程的属性填写完整,如图 6-63 所示 。

General Description Document SCADE Page Format Layout , Simulation Traceabili_t},

I

Ti tle:~-扫 Sub title:

|

[第为匠代码阳妞泪郧哇成

Description

』本宣节主要画孜卿酝妇妞置,却磁郔3代码. 图 6-63

工程屈性的添加

(2) 将 Suite 工程的文档属性填写完整,如图 6-64 所示。

(3) 单击 Reporter 工具栏中的“设置”按钮,切换至 General 选项卡,如图 6-65 和 图 6-66 所示。

一心 Company-.

Document SCADE Page Format Layout Simulation Traceability

Authors:

图 6-64

Reference:

IANSYS_- UESTC_- 06

Index:



Date:

1 201 眸3月 30 日

工程文档属性的添加

..酌

tiTML 图 6-65

~

SCADE Sui te

勹二

-""'



图 6-66

一』-

:二

Q&e i

Reporter 工具栏

口 1

中文档报告生成的设置方法

( 4 ) Output file 栏支持对生成报告的名称进行重命名。 ( 5 ) Report script 栏支持选择生成报告内容格式的脚本文件。 S ui te 中报告的模板由 Tel 脚 本文件编写 。 这些报告模板文件保存在 SCADE\scripts\Reporter 目录下。默认脚本文件是

ScadeReport.tel 。 ( 6 ) Format 栏支持选择生成报告的文件类型,仅提供网页 (HTML) 或 Word ( RTF) 两 种格式 。

( 7 ) 切 换至 Structure 选项卡,设置文档的内容,可勾选是否需要添加,如图 6-67 所示 。



Generate cover, TOC, and ti订st section: 封面、内容列表、工程描述信息。



Generate list of figures : 图片列表。



Generate list of tables : 表格列表(仅 RTF 格式适用) 。



Generate Header/Footers: 页眉页脚(仅 RTF 格式适用) 。



In-line images: 强制浮动的图片与文字对齐(仅 RTF 格式适用)。

页眉页 脚信息包括 :



Issue number: 报告标识号。

三、

、``悍,必,il' ,,,',粗躇黜



Reference number: 报告参考号 。



Cm]Jorate logo: 公司商标图片 C.png 或.jpeg 格式) 。

-

Setti叨5 |



噢 Rep如汀

寸 凶m叩



l1l] Generate cov巴. TOC andf四 sectJon

~ Generate 11st of tables

Ge-ootm He志/Footer

tJJ Gen立eliSloffigures ~In如emages

data

Issue nu志r

I码归心归;

Refen,r心心匹芦云忑石妇>

I D

Corporatelogo

SCAOE 呻,,, co如on

1 乒袒e

l 图 6-67



lI

OK

) 1 泗,

切心

I

Settings 对话框的 Structure 选项卡

(8) 切换至 Cover 选项卡,设置文档封面的内容,如图 6 -68 所 示。



Document classification: 文档类别,例如机密、公开。



Distribution list: 文档受众 。



Image file: 封面图片 。



Repmi su1nn1ary: 报告综述 。 父ttings

岛 Reporter

广心 ~~一 五 -`l

亚心已 丁

Co~er

酝…ert da响也on [I才宁.Im, D女戊x如 1st

Im平枷

匕2r

i 习勾 I ,

',l

fTToo.Y Bar, W Gee

I

--

D

妀中“如ary 而sreportm芯心 thedocum式和m 辽om 虹函-ed 切 thet,

l 图 6-68

0K

II

乙~

II

H中



1

Cover 选项卡

(9) 切换至 Project Description 选项卡,确认是否抽取步骤 (2) 的文档默认信息或修改 为其他内容,如图 6-69 所示。

(10) 切换至 Document 选项卡,确认是否抽取步骤 (3) 的工程默认信息或修改为其他 内容,如图 6-70 所 示。

_

父tlJng5

如ngs

奂妀m巴

必陌邓石



&

G

凸呻又i

R&I

g哼y _ _ l

-

orio

tile.

IS(Pr如也造)

I砃心)

人如呻)

二'/

闷~心心

闷幻咖虹陟哱妞志虹e)

R-

{g

厂-

IS(Proledn

5OO.OOO \.

:l :t.\

ode

..

.

00.ouo

u.v,二 1vnn

叩.OOO

..

2叩.I_IIN)

.



1 叩.l'N)O

LINEs or CODE

图 7-2

.

代码隙复杂度与产品规模点图

软件开发的成 本 既 包括软件设计和实现的成本,也包括软件验证的成本。传统方式设计

.出小讯订i;

-

的商用软件中每百万行代码中约有 100 个缺陷,安全关键软件的缺陷数量可能少一个数量级, 每百万行代码中约有 20 个缺陷 。通常缺陷中的 20%是严重等级的, 1 %是灾难等级的。即便以 适航标准的安全关键软件要求来衡量,每百万行代码中平均 5 个缺陷中就至少有 l 个严重的缺

陷。而统计数据表明在软件的不同生命周期阶段检测出缺陷的 成本如图 7-3 所示。

Defee rs found dtwing req11irernents = $] 50 IDefCCIsfOIInddmmgdcs/gn = $500 Defecrsfound during coding and testing= $1,250 Defectsfound qfrer release= $5,000 图 7-3

软件的不同生命周期阶段检测出缺陷的成本

由于安全关键系统的全生命周期会长达几十年,再考虑到其后的维护、改造和升级费用, 传统方式设计的安全关键软件的成本几乎不可控制。有什么技术,能在现代安全关键软件规模 急剧增长 的前提下,适当降低设计的 复杂度,同时又能在开发阶段的前 期检测出缺陷,以减少

开发成本呢? MBDV 方法就是其中的 一 个好方法 (28) 。

7.1.2

I\IBDV Ji 法的优势 MBDV 方法,相对于代码,是 一种较高层的抽象。 MBDV 方法将设计和验证过程提前,

降低了设计复杂度。构建即正确 (Correct-By-Construction) 方法与 MBDV 方法 一 样,也是尽

早地提前验证系统 [28] 。如果 MBDV 方 法背后的模型是真正的形式 化的语言,那么将基于模型 的构建即正确方法 (Correctness by Construction on Formal modeling) 与可通过鉴定的认证级代 码生成器结合,就可以更好地降低或者隐藏设计的复杂度(模型的复杂度会影 响代码的生成和 验证活动) ,提前检测并修正缺陷,并彻底省略手工编码和代码级的单元测试活动。其中,工

具生 成的代码量是由模型的复杂度决 定的。优化模型就可以减 少模型对应的代码量。

7.1.3

松刚优化的 11 标和准则 模型优化的目标: (I) 布局格式美观简洁。使得模型可读性强,容易理解。 (2) 复杂度的降低。

布局格式的美观简洁可以通过以下 3 个手段来实现: (I) 定义排版布局规则。

(2) 采用预定义样式实现 。

(3) 撰写必要的注释和批注 。 复杂度的降低,可以通过以下 3 个方面的效果来衡量: (l) 降低了程序的最坏运行时间 。 (2) 减少了程序的堆栈占用。 (3) 节省了验证活动的成本 。

按照 D0-331 标准中 MBDV 的定义,模型是分为规范模型和设计模型两个层次的。规范 模型涉及架构层,设计模型涉及实现层。模型的复杂度准则在架构层和实现层是不一 样的。不 幸的是 ,由千描述架构的规范模型背 后的语言机制千差万别,因此至今都没有公 认的、通用的

_ 架构层复杂度衡量准则。传统复杂度概念更多的是应用在代码级,由千描述实现层的设计模型

最终是用千自动生成代码的,因此设计模型的复杂度准则可以借鉴代码的复杂度指标。 通常认为复杂度的特点是 :

能够帮助用户预测错误率和维护的工作量;计算的方法简单;

与 所 用 的 高级程序设计语言类型无关;有利千项目规划,能衡量大部分程序的复杂度等[28] 。

( 1 ) McC abe 复杂度指标。 McCabe 复杂度指标关注架构的数据流,它定义程序图有 4 个参数: E 代表边界数量, N 代 表节点数, P 代表互相关联的模块数,则复杂度 C 为 C=E-N+2P 。

McCabe 复杂度指标的不足是程序图和编程语言之间的映射粒度较难把控 。 同一程序图映 射到不同编程语言后,两个分析工具可能得出完全不同的复杂度结果 。

( 2 ) Halstead 复杂度指标。 Ha l stead 复杂度指标关注编程的工作量。可分析代码或者伪代码。它定义: nl 为独立的 操作符数量, n2 为独立的运算符数量, NI 为所有操作符数量, N2 为所有运算符数量。则软

nl . N2

件长度 N = Nl +N2, 软件词汇量 n = nl +n2, 软件容量 V = N*logn, 开发难度 D = — *—-,

2

n2

2

E * *-=-

开发工作量 E= D *V, 开发时间 T=E/18, 缺陷数 Bugs: ~ o 3000

Halstead 复杂度指标对千预测程序工作计划和程序的 Bug 非常有用,不足是它太关注代 码 , 而不是软件设计,其中计算时间的常量 18 和计算软件缺陷的常量 3000 需要根据软件具体 情况修改。 ( 3 ) Zage 复杂度指标。

定义 De 为模块外部接口数 :

De =e1 *(#inputs*#outputs)+e2 *(#fanin*fanout) 其中,#inputs 和 #outputs 是输入和输出接口数,#fanin 和#fanout 是扇入和扇出数量, e1 和 e2 是自定义权重。 定义 D, 为模块内部接门数 :

D, =i1 *CC+i2 *DSM+i3 *110 其中, i 1 、 i2 和 i 3 是自定义权重, CC 是程序调用数量, DSM 是复杂数据类型的引用次数 (指针 、 数组等), 1/0 是操作的输入输出数噩(读设备、写文件、从网络读数据)。 Zage 复杂度指标的不足是外部接口的评估未考虑架构的数据流 (McCabe 考虑了);内部 接口的评估较难映射到编程语言,编程语言可能隐藏了实现细节 。 ( 4 ) 程序元素计数。

某些情况下 , 编程语言的原数据也是评估软件复杂度的良好参照。可以简单地将程序中

出现的运算符和变量等元素作为计数对象,以它们出现的次数作为计数目标(直接测量指标), 然后统计出程序容量 。 诸如函数数量、参数数蜇等都可以给开发者直观的复杂度概念。 不得不说 ,

由千实现机制和语法语义的差别,单个复杂度指标并不足以分析出程序的所

有复杂度情况。推荐的方法是 : 针对特定项目的情况,选择这些指标的组合,并定制这些指标 数据的门限,作为综合评估软件复杂度的准则 。 尽管研究和实践表明了, MB DV 方法配合认证级代码生成器确能有效地设计程序、减少

262

`' 验证的工作量。特别是针对安全关键的系统, MBDV 方法能极大地降低软件研制成本。但是 公开 的统计数据都是工具开发商基千对 产品的充分理解和娴熟 的建模技术,并在样例模型上

的分析结果。大型项目的复杂度永远是软件成本飘升的最大不可控因素之一。因此,用户应 该定 制准则来指导开发团队尽可能地降低 复杂度,这样既能真正体现 MBDV 的优势,又能 节省成本。

《评估和降低复杂度对软件模型的影响》 一 文中结合上述的复杂度准则定制了特定的工

具,专 门用于检测 Suite 模型的复杂 度 [28] ,如图 7-4 所 示。 问,

:

:

E”“Gw

D 五日 0

让九口

Op“mtor ll'I“rt 嘉勋俨 X 枷

Oe @净

片中a

r0心”

Comp 片.中 To叩

濂守

G令巾mT”eO译 (K

叶:习 匕 0

心众色”iM

Y

M沁 M如1”

,一 i 邑卜`CG

“'1m9lG仑 I

售-

酝IMW .立 - 已j 邯

`nIIkComeOo o ”

冲…, b

..Jo

省 , 仁 T” 巳 30. 令。一

- 卫皿

令。中

, o ......

,o .....跷"e

芘a T8

会飞 。

`巳J 忙叩幢

图 7-4

检测 Suite 模型复杂度的特定 工具

通过选择菜单 Complexity Tools 的不同指标可以得到对应的分析结果,如图 7-5 所 示。 Output 』~

女 ript 缸 m

NumT叩ut

0>-u

NumOutp山

~

Num F•nln

NumFanOut

~

~、心/~、

D_~v•h.J~

/

I

、气、、心..、

1

OTBLU)

lll22211333 1111111112 000000204 111111111 122211531

O 旦

0TB OT8 己函

OM 五

0Min 已 door O 沁er

Ocoo如呴timer

0 microw1JVe_control 。

Om,crowave M又凶》

H衄忒

图 7-5

Z叩 AI 冬

Complexity Tools 选项卡

而美国 GE 公司在使用 Suite 工具研制航空发动机的 FADEC 时,简单选用了 McCabe 指 标来衡量复杂度,约定当 McCabe>20 时就要重构,如图 7-6 和图 7-7 所示。

Use of Complexity Me t rics GE Aircraft Engines 1 、 U 舒d



lontplexi t V



\lcCalJe(.、.、·domaticCnmplt>xitl'i...

fnr c(JIIlp l P 劝 1

a., a p1 1,dictOl ot USI lng Pffor I llSt·l.I

t ll' 山

d.

”e t 1 ic

y



CodP 的(lu l es m thL OIIlp l P\ I I V, 2O nIllSt or grantP一

沪兀IHI





,

一言- aTT

I

I 勹*一 k>-$1__

…)

M中心o 卜, l...

__, -.J



.

I 沪 TT_ptt;t,

~ .

邸S 、

I

i

-> ..TT_... I

沪0…N...

甘田

图 7-10

AAA

BB8

等距对齐模式

五寸·-::;:'

.

]

沪记1

(立

I

n n

|

1

->丘2

->腔3 kP

Kl

PE

->如

Li.110

->忘5

吵 <心>

图 7 -11

显示出所有图形解释的建模方法

一标还:复数乘法 一设计者: UESTC

一来谏: ANSYS --版本号: UESTC_CN_B2_301

--功能胪

一两个月}入 A,B和一个输出 c 都是复敌类型 --辙出 C 的实部为: re (C) = re (Ahre (B) - im (Ahim (B) --输出 e 的盛部为: im (C) = re (A).+ im (B) + re (B) t im (A) C = (make ComplexType)(A. re B. re - A. im B. im, A. re

*

*

图 7- 1 2

文本方式注释图片

* B. im

- A. im

* B. re) :

尸了一

-

-SCADE

启扂霓数的惯性环;源 ANSY斗 C(s)

第了百

离散化方法双线性变换

K

惯性环节: G(s) = ----- = ------------

R(s) Toll

SUIte 模型酌—

K: 比例常数 Toll :时间常数

Toll*S+1

1

1

Toll

K

K

转换后(------+---) y(n) + (---- - -----)y(n-1)= ---- x(n) + -----x(n-1)

T

2

2

T

2

2

P1

x 沪

P2

图 7-l3

模型方 式 注 释图片

编钳技巧

7.2.2

本节列出 Suite 建模中的编辑技巧,便千用户快速排版等操作 。 I.

编辑技巧 l

多对象批量修改同一属性

用 Ctrl 或 Shift 键配合鼠标右键选中 一 组输入输出等对象,可在属性窗口内批量修改其属 性 状态,如图 7-14 所示 。

__

Pfo 臼叮逢$

➔➔ - I 喻 Copy left卅 ➔

ri 吐t



di 屯气

J尸

lRateCal(

lRat 溫odj 卫 BrowseReferences Goto

图 7-14

编辑技巧 2

lfloat32

Last: °'勹',',.

Kind:

~ Properties,,,

2.

Type:



lRateWar~

_

General Declaration Clock Comment KCG Pragmas

多 对象批 量 修改同 一属性方式

反转操作符 Symmetric 设置

输入和操作符接口的位置相反时,可使用 Symmetric 设置,如图 7-15 所示。 选中右侧的条件操作符,在其属性栏 Use 选项卡的 Symmetric 选项前打钩即可将操作符反 转 ,如图 7-16 和图 7-17 所示 。

1



忙测滚转瑛式

-> 一

__ 图 7-l5

反转操作符 一

U立

Operator

I- Layout }

I CommenI Note

MTC

Input number.

I1

叫 t一

Instance name:

~

— _J

0Symmetric

Higher Order

图 7-16



Properties 窗口

忙测滚转模式

“五三e

图 7-17

3.

编辑技巧 3

反转操作符 二

线段变量命名

在 Suite 模型中所有的连线都是局部变量,在模型仿真时可以观察其数值,在代码生成时

通常都被优化掉 。可以单独给这些连线命名,显式地定义为局部变量便于快速定位等操作 。 方 法是选中某连线,在属性窗口的 Define 选项卡中勾 选 Named Variable Definition 复选项 ,在 Local

Variable 输入框中输入 名称,如图 7-18 所示 。 重新命名后的内部变量名如图 7-19 所示 。

二 -^

• a x

Propem”

Gener.l Oeda 呻on

0,.fi~

I 巳Named

dock

Local

Layout

KCG Pr~gmas

Variable

De硒on

巳比

J

i

图 7-18

属性窗口

//\ 1

LJ

图 7-19

4.

编辑技巧 4

重新命名后的内部变量

对象对齐或者统一尺寸

打开工具条 Layout, 通常包括如图 7-20 所示的功能:

• • • • • • •

顶部对齐 。 中间对齐 。 底部对齐 。

左对齐 。 中心对齐 。 右对齐 。 每两个操作符之间等水平间距 。



每两个操作符之间等竖直间距 。



两个操作符之间等宽 。

.

两个操作符之间等高 。



两个操作符统 一 大小 。

丿曰 曰

曰 图 7-20

Layout 工 具栏

一.严用 选中两个以上的对象,最后 一个选中的对象为对齐基准,再通过 Layout 工具栏中的按钮

设定对齐方式 。 Suite 中连线的对齐 方式为,选中 一 组连线,按 Ctr!+- 或 Ctrl+一分别进行左 对齐和右对齐 。 5.

编辑技巧 5

组对齐

组对齐适用千某组对象整体 与另一元素对齐,如图 7-2 1 所示。

二二ill->二:==[I}->图 7-21

对齐两组对象步骤 -

选中一组对象,先按下 Layout 工具栏中的 Align Like a Group 模式,即单击巨O按钮, 再 单击匡汀按钮将该组对象锁定,然后单击匝]按钮, 在模型画布中选定待对齐的 "铀",即 对齐 的参考线,即可自动对齐,如图 7-22 所 示。

m衄

-> 恤I-

仓书一g

图 7-22

对齐两组对象步骤 二

再单击 Layout 工具栏中的“对齐”按钮匼佃 两组对象对齐,如图 7-23 所示。

roe

->印flW""'"'!I

”也

->心W"'"""IJ

图 7-23

6.

编辑技巧 6

对齐两组对象步骤三

连线的优化以及插入操作 符

如图 7 -24 所示,两操作符间的 一段连线不够平直 。

归操作行

匡转迟雯与项式寸 气-重必窜

户, L40”

飞广鲁·仑

氏-

图 7-24

`>-

连线优化前效果图

右击连线,在弹出的快捷菜单中选择 Optimize 选项, SCADE 将自动 优化 这 条连线,如图 7-25 所示。

启品宁乍拧 阳转逸和与压式寸五 I 〉.,.心虹0 Q 五骥咖``靡

贮r

>~”一

内 ·llr.li... 俨

.>~

-J旷, l l ....

了一

图 7-25

连线优化后效果图

SCADE 同样支持选中多根连线,再通过右键快捷菜单中的 Optimize 选项 批 量优化 。当需

要在操作符间的连线上添 加 操作符时,简单地将操作符拖拽至连线上 即可, SCADE 会自动将 此操作符模块加入其中,如俗 7-2 6 所示。

石笠茫;,i;符

1扣杠[室与扣式寸算 1 >~一 ;) ' `七一 心

->图 7 会 26

7.

编辑技巧 7

两操作符之间添加操作符效果图

快捷键批量连线

先将连线之外的元素排版完毕。当输入、操作符、输出三者的关系恰是一一 对应时,兀

素全部选中后通过快捷键 Ctrl +Shi ft+R 批量连线,如图 7-27 所示。

_

二”“S~

昙芦帮大警告气:误 ANSYS 「ollRate

-lI




1 尸

- Warn The s hold I

图 7-27

-)

lefW'/arnmg

初始状态

本例中可通过快捷键 Ctrl+A 选中所有的对象,或者通过鼠标圈选相关对象,如图 7-28 所示 。

标题:滚转角过大警告模块 作者:

涞源:ANSYS

UESTC



0

D



口 rollRate


---

,

沪 □





le 咄arnmg 口 口口

全选操作符效果图

在按住快捷键 Ctrl+Sh 币的前提下,再按两次 R 键可自动连线,如图 7-29 所示 。

示题 · 滚转角过大警告模块

者· UESTC

涞源: ANSYS

/\ 1

rollRate

->le而arntng

-W arn Th es hold

图 7-29

8.

编辑技巧 8

自动连线后的效果图

自动排列连接线

当出现图示中纵横交错的连接线时,可通过排版分离交错的连线,如图 7-30 所示。

选中连线,再 单击 Layout 工具栏中的横向按钮 巴]或纵向 按钮 0utplll4 图 7-30

自动排列线前效果图

->切p心

沪叩t4 图 7-31

9.

编辑技巧 9

自动排列后效果图

显示画布内的额外信息

Suite 支持 显示连线名称、类型、操作符接口等额外信息。 临时 显示 的方法是:右击画布 空白区域 , 在弹出的快捷菜单中选择特定的子对象 , 如图 7-32 所 示。

配阳 ste Page 朊unds

劝 OWGfld saptcG心

Grid

Propert 底, '

五兀介\

心 Up

1 屯"叩'" w如pace Split Con"出 to to众 ual

-女;t

default 1ransit1on kind as weak

^父tde扫ull

transilion layoul •勺兀 1”ine

氏playOpijons

Display Local Variables D~ptay Internal Varia 以es Display Local Types Displ•y Internal Types 氐 pl•y P,n 阳 nks

Display Pin Names Display Hidden

图 7-32

显示额外信息快捷菜单

Not 氐



保待显 示的方法是 :通 过菜单 Tool s-Options 打开 Options 对话框,在 Views 选项卡中选 择对象,如图 7-33 所示 。 Options

7

Environment MTC

X

General Vie邓 Commands Lar妇ge Timing and S'釭k Simul矶or

Net

1 回 DIsplay mternal types

D Display char arrays as string

I

口 Display pin ranks

口 Display internal variables

0

1 回 DIsplaypm 心m已 ,

Display local types

口 Display local variables

口 Display grid

口 Display generated instance names

口 Display page boundary

口 Display effect on truncated text

口 Display border r

Link labels Symbol

0

,0.0

Grid 回 Display arrays as 3. I

Display grid

口 Display page boundary

I 图 7-33



II

酌肖

蒂助

Options 对话框的 Views 选项卡

当选择 Display pin Names 和 Display internal Types 选项时如图 7-34 所示 。 示愿飞行昙 S 井角屯噶及报芒呆铁

恍漫.ANSYS

"tUESTC

`..“

, RollRateWarning

,,.,,~,

.\ 叩... ~ ..

心."'••r竺"--i RollRateCalculale

、> .一

RollRateM ode

图 7-34

10 .

编辑技巧 10

显示额外信息的结果

自动打包

自动打包功能用千将画布内选中的部分自动生成新的操作符,以便重用。以 RollRate 包 中的 RollRate 操作符为例, 选中 RoURateCalucate 和 RollRateWarning 操作符,然后右击并选 择 Pack-in Operator 选 项 ,

如图 7-3 5 所示。

竖归

i

~-Cut

面 Copy 贮 C立 0勹

底压K

爬 D由"',om Mo如

分。

图 7-35

”“

B 巾wseRd”enc”

自动打包操作

,n 0mr”or InState

切一

打包以后,操作符就会自动生成在新的操作符中,如图 7-36 所示。

->~

.叩置心`零



角·一 ·nmc

图 7-36

1 1.

〉~立已

编辑技巧 11

自动打包结果

更改预定义操作符

选中新的预定义操作符后直接单击原先的预定义操作符即可完成替换,如图 7-37 所示为 直接将乘法操作符放置在加法操作符上。

:气

:扫二 图 7-37

12 .

编辑技巧 12

更换操作符效果图

设置字符数组为宇符串

SCADE 的字符类型默认显示为分离的字符数组,如图 7-38 所示。 V斗ue

T邓心

Constant ································-···················、

田 硬 [RollRateT虹e sholcl. \ ch釭^ 6

Comments

[' I ' , ' M' , , y' , , o',... 图 7-38

字符数组

通过菜单 Tools-O ptions 打开 Options 对话框,在 Views 选项卡中勾选 Display char arrays

as string 复选项,如图 7-39 所示。 7

甲ons

丘ronmmt

MC

妇n.,.I Vi~,

X

Omm.nd, bngu.ge Timing.nd S..ck',

N已

口口spl叮 1ntern.lW妇 口氐 play;nt“心口心 bles 口应 play loc霾I type
Output2 - /*'只/ : Op_FakeData (inC->Inputl); ,')

---------------------------- - -』

示例一对比结果示意图

,.............................乎........< "酝吐 1>-·· ·,

;^ `

一气三->…

" ->户

二"' 图 7-53

7.

一二>0. .

沪-2 |: · ✓

一气严

示例二对比结果示意图

避免使用匿名元素

(l) 推荐预先显式地定义好常量、类型。

(2) 匿名元素生成局部变量有额外的产生和销毁的开销,如阳 7-54 所示。 8.

使用多态技术设计可重用的操作符

(1) 类型的泛化:'T 。

(2) 可变的数组大小: N 。 (3) 操作符功能的多态:特化操作。

可参考 4.5 节多态建模方法。

:

一正归一

?二严8

三三 图 7-54

9.

避免使用匿名元素示意图

注意可激活块与 复杂数据类型的输出

(1) If... Then... Else 操作符 与 If... Block 块。当模型分支输入都比较简单 时建议 使用 If... Then... Else 操作符; 当模型分支输入比较复杂(例如输入是 N ode 操作符或输入含有大数 据运算)时建议使用 If... Block 块,如阳 7-55 所示。 扣-

4”!Icek1>

知心 hhe.:A>r鹹志m

-〉咕

.>...

.〉 咕

false l 冗 Ig 秒 -,3. ,.,

lm. .ThenJ' 釭 f"mm” “也 ”.$L又}}(

1 心 If加可心 erf"酝.... 1.. 吐 lF 巳 L匀!

•!nC.

~...

i 心1 也··加心一一耄归卫卫过n •心lC) I . p·西~•;.:... ;.:},.'几l 心 K 房 1 ~ .., 、 ,id tfBlockJ'.,f心曰沁金 I•...._l,-血3, ( $谥以飞ilieli....,”“心cbindkc1妇C, -f. 吐卧e. `刀tt_ 、乒吐婓 1 忒一 ”Bl六k-P可.,.己n,el”归 ;1贮釭艾3.hC, 如 c_”也丸扣丘严正·l"...-"_巳"记_B, 习tCJ 立`'c-) R·· QtC~, C叩 ”“_1.0 I

·

J

eh..! ·-

~` c->R··

I ”“`”即 . 'l..,...llgih...s.."..心压(压拿_""'·,分压·-fdm.

- · -ke...“1.`

OIC 寸,安雪

J •lte I

心IC- r”“X1_1. o

心 tC 今仅霉息云``

图 7-55



.,盯 formncc!”吓:心屯h:

“id

E心心 1 芒量 l-1

" 1··

Jf... Then ... E l se 操作符与 lf...Block 块示意图

(2) Case 操作符 与 When ... Block 块。当模型分支的输入都比较简单时建议使用 Case 操 作符;当模型分支的输入比 较复杂(例如输入是 Node 操作符或输入含有大数据运算)时建议 使用 When... Block 块,如图 7-56 所 示。 10.

动态扩 展操作符的输出尽量拆分到底

使用动态扩展 Dyna皿c Project 操作符拆解结构体时,尽量拆到最小元素;否则,拆解到 的中间结构体 层级会产生额外的复制开销,如图 7-57 所示。

11.

少用、慎用 Assign 操作符

(1) Assign 操作符作用 千结构体元素时通常会复制整个结构体。 (2) 当需要修改结构体的所有元素时使用 make 操作符 。

户圈1----___,·一 SCADESUIte 校型了7

第 7 章一 飞

勺讥咄札以从."' ~-

? 一口三尸〉妇



D如

一呐一

.> ....

1

,咖廖



RGtO 一射-—

-〉腔

2



LEfT

5 一二三]—〉~

• P•rf.,,..n,·d •. "心心.._,心?如. I “`d c..e_Per”r...cel,sue 乒 itchQ耄._N 呻( i nC_c···-Perfor正m~, l“'U合一年 1tchC..,_Node • lnC,

.

"tC_c···-Perf 叮贮mce1”ue4冲 chC..e.Jlod• 如 IC)

七灿湛寄芦芦忠心忱出芦霖比沁b ··g. UP-Perfom”nce1”uo ; outC->R" • outC分 Conte,t_l. Count break. •••• DO矶 Performance1雪雪 U< :

言:三二.;:,.-.x

Perfor~`,俨 1.. u 俨.: >•ll hCase. !lode: 围h en81,ck •/ •oi d 听1en8l 心 k_Perfor..noeluue_S可i tehCose_Node (

I*

inC_When81ock_Per f or"""1ce Is,ue_S..i tchCa,e_Node •inC易 lssue_Swi tchC.se_Node 亭outC)

outc_,佑 en81oek_Perfor,..oce

(

switch (inC->Jn) ( case UP _Per for 皿ncelssue : /• 4 与/ CounterJ>wllneor_in t (- 2, lrc1_false, loutC->Context_4). outC->Res = outC->Context_4. Count , break , “se 议潭N-Perfor 皿ncclssue : outC 分 Res

= \,

break. ease R!GHT_Perfor...ncelssue : ou\C->Res = 2 break C6"< U千 T_Performoncelssue : I• 2 •/ Counter_,...J ineor _int (15, kcc_false, &outC->Context_2) ; outC->Re, = outC->Context_2. Count . brcak

I l

图 7-56

Case 操作符与 When.. Block 块示意图

->0… 2_-------____------- --- -------_____________________-------

"'°""



lftf)ul3

, l f (-, ithiri b,,:in1arie~l r : outC- 心,output~ - inC->Inputl (inC- >InpucJ (inc- InputJJ;

:

i}

:

:C • :

I Ou rp utl

k I 立 ,订 ; I oleo I

,.,l '`

'. /l!f,_1 - -

:

l ;

1

& {L1l1p - l < l 00 ) ) 1 l Tnp l I • lnc >va J . i 1 ,

(( 0 «. = LmP. l )



心J l C

沁 l,中1 文 I

l

:

I

-~- ------ ------ --------- ------------------------------ ___ ! 图 7-58

Assign 操作符的两种使用方法示例

A

沪1

->

(9 · u 们 t32)

(7 : ulnt32)

x 图 7-59

13.



A

C1 l A

A

-> C2 -)立 A

整数乘除转换为移位操作示意图

查表法:分支赋值转换为数组取值

分支过多会打断处理器的流水线。通过预定义数组并以索引偏移获取数值如图 7-60 所示 。

14. Fold 系列迭代用 mapfold 系列迭代替换 (I) 当 Fold 系列循环的迭代子是结构体时,每次循环都有结构体复制 。

(2) Mapfold 系列循环没有数组输出时,就退化为 fold 系列循环。 KCG 6.5 版本以上 的 mapfold 有多迭代子的功能,可以将原 fold 的结构体迭代子分解为基本元素的多迭代子,以 减 少数据复制的开销,如图 7-61 所 示。

血 厂一二了』巳三— SCADE SUIte 模 型丽石切, t•····.···.-··············................. . 1 =In

;令

;

2,

•11!11ocit1> •··,

>Res

I

l

Constant 习 矛 8esArrl

1

> Res

8,

>知

15,

>Res

Type

, 32345 ' ", ',' --

5

J

23

1

>Res

R.s 知,

,

X



> es R

1 ;

71-今Res

图 7-60

查表法示意图

✓ I~



图 7-61

15 .

2 58152371

”也

Int32 int32 mO2 1/lt32

In

1

Value

Mr知

Ill132

",

• =In

;

第 一了正--

「“..,

户重E..,

->~` ->~

迭代器比较图

分支操作的设计

( I ) 将最经常出现的分支条件置顶、置前。

.

(2) 多个分支条件相”与“时,将最容易 false 的条件置前。

(3) 运算结果一致的分支应该合并。推荐将多个分支条件专门”或“好后传递给某局部 变量,再将该局部变量放到分支条件上 。 1 6.

合理使用外部引用变量 (Sensor)

外部引用变量是只读的,可极大地减小传参的开销 。 不过有弊有利。 ( I ) 弊 : 降低架构的可读性,外部引用变量的初始化需要用户额 外 验证 ,确保 运算 中不 被修改。 (2) 利 :

17.

随处可用,接口简化,性能提升 。

生 成代码选项:扩展 (Expand)

( l ) 科取消函数调用时传参的开销,特别是参数为大数据的复制。

( 2 ) 弊父操作符的代码复杂度提升,增加 MTC 验证分析的难度 。 (3) 绝不要无限制地扩展操作符 。

( 4 ) 仅扩展结构简单的 Functi on 型操作符 。 ( 5 ) 确保每个操作符生成的函数的代码行少千建橾规范定义的大小。例如 F35 项 目 的编

码规范定义 : 函数内的代码行应该小于 200 行 [3OI 。操 作符设置扩展属性的效果如图 7-62 所 示。

1

-

代码生成: N2和 N琪闭咚田:常生成 VOid m ( -inC 诏l t;.nC , o吐C_Kl •outC) ~------------------------------------------------、

I

; I

二三严

: \

N2

(inC->Inputl,,o吐C 心on 切立

I

1) :

(.,

to 伈 HJ 叩'r. 『o,

cod, :

})卜utc->Outpu已 一 l,. (OU”->Con…已 · O严已 , 江C->Input2)

ii

- - - - - - - -- -- - - - - -- - -- - -- - - , - N- 3扩展 - - -- - - - - - - - - - N11 代码生成: N2和操作符正常生成

一· :俨-----------------------------------------一一一一一一一一一 (一: , VO,.d Ill (i.nC_Nl •u,e, oute_ll1 •out.el

; 卜2 (凸C->1npu已匕utc->Coot.xt_l) :

~).,的 1) 1---> ~具 1

; }忡tC->Ou宁t1

.. outC->Cont~豆l.

I

OIoth 叩1 叩Ot”“',

otput1

S 立C->1nput2:

}

I }

------ ------- - ------------------一一 --.-上七 `__'\IJ立比心L -' N2 I 代码生成: N2和 N瑾印氓嘟扩展 ,,------------------------------------------一---m斗d 111 (江C_Nl •inc , outC_lfl •out.e) 一 一一一一,!

!勹三 也fDIl切 N1 叩心

,一 I (

:`)—严' N3

! l°utC->Ou叩吐1 = 图 7-62

18 .

生成代码选项 :

分离 1/0

I

`竺竺兰] r吐 I乙'themollOu 已~ 0吐C -沁on 切 xt l.OUtl. " ~- ·--:·· ,, • • H2(Inl, In2, OUtl, Out2, fby_Outl.cdx t 11 \ outC·>fby_Outl.i 中= ( outC->fby_OUtl . 江让 +1) ' , 'l 2; 'l ', 比"'_copy_Stru (init) { l •/ (ou 七C->init I食 1 1 •/ for (i = 0; i < 2; outc-> 氐y_OUtl , items[iJ = l ;

/• l

l

l l l

i++)

{

) outC->fby_Outl.idx = O;

} •outl = outC->fby_OUtl.items[outC->fby_Outl.idx);, outC->fby_Outl . items[outC->fby_Outl.idx]

=工 nl;

outc->fby_OUtl.idx = (outC->fby_Outl.idx + 1) /* l_l_l_fby_l_init_2 •/ 辽王 (outC->ini t) { kcg_oopy_Stru (OUt2 ,

i

% 2;

I

工 n2 );

) olse { kcg_copy_S 仁 ru (Out2,

}

kcg_copy_Stru(, outC->rem_In2 , outc- >还 it= kcg_fal.M;

图 7-64

19.

心吐C - >rem_In2) ;

)

,·l

,i

J

In2):

分离 I/0 前后 C 代码内容对比

生成代码选项 :局部变量转为静态 (Loca l

variables as static)

局部变量作为静态变量仅创建 一次 ,堆栈开销减少,如图 7-65 所示。

! : , !

' J

_ 否酚迂泣馅讫 : :无局部变玉符静态: .,卜,一',' , ' CruueControl Cn已. eCon 江ol.( 立_ en比霉eControl_, Cn比S心on 比1 ·“nC . outC_CruiaeControl_Cnu.aeControl •outC) : ;

六江 d

L

~ b

,

', (

L



'

CruiaeCont.rol : : C 亡 U1seControl · : SKl

' ,I

·丘心 l 心· ·劝立,

': 'r 、;,-, m o .仁暴tic

.

口 rm 轧ont 工 1,l Cm1seControl( inc_.rui,e~ontrol_CruloeControl • lnC , 沁一尸 ~ml3 忒ontrol_CruiaeC:ontrol • outCI

,:

(

keg bool

SM2_.,..霆 ot

·C 七 SMl_E,心 led:

I

:

::

工 i,,er,n ·.rol,: 均 1 :. E ,士b, 过:



I

卜,:

/•



kc勹_b仁~l

; I

酗 2_ruet_act 亚 l 丘 abled:

-

: Crui 怠eCont.J:ol: :CruueCon 七ro1 ; : 亚l: En心 1.d: : SM2. ,' I ' , :比巳心: : S 出byCo还 tion.I

L



”“cic keg_bool StdbyCondi tion _SMl _ En 心 1 已

SM2 比 tiVO ,

) -- -- -- - - - - - - -- - - - --- -- - -- -- - - - - -



m; ,?;



-一一一一一一一一一一一

.R 产

, l

S. ,_

:

` atr I" ·.rul••丈"江_3 ; :SH :

: ··-

kC9. bo, l

X

: En刁 b4归,: :气 >12:

ErC尸1it1 沁.,

St 北 yCondition __ SMl 它nabled_SHZ_Ac仁 ive;

,, I '

,' ,

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -'

图 7-65

局部变散转为静态前后 C 代码对比

以上介绍的 是 Suite 模型优化的一般方法,这些方法最终都要结合硬件平台的实际运

行效果来取舍。值得 一 提的是,在实际项目中不可能对所有模型都一一精心优化,需要专 门的工 具帮助开发人员快速准确地定位待重点优化的模型。下一节就来介绍这样的性能分 析 工具。

7.4

最坏运行时 1h] 勺堆栈分析 软件工程内的 20-80 原则指出 20 %的模块消耗 80%的运行时间或者占用 80%的堆栈 。在

软件开发过程中,需要尽早地定位出这些性能的瓶颈进行优化 。然而,早期嵌入式 软件的性能 分析只有在操作系统和处理器都确定的情况卜:'在真实目标机上运行才能得出 。 近年来,业内

推出了不少可直接在 PC 上运行的性能分析软件, SCADE 产品中嵌入的 Abslnt 公司的产品就 是其中应用比较广泛的软件之一。

Abs Int 公 司由德国萨尔州大学 C Saarland University) 的 Reinhard Wilhelm 教授领衔的编程 语言和编译器构建 6 人小组千 1998 年 2 月创建 。 SCADE 嵌入了 Abslnt 公司的 aiT WCET 和 StackAnalyzer 两个 工具,并在此基础上定制形成了 SC ADE Suite TSOrrSV ( Timing and Stack

Opt imjzerNerifier ) 两款工具,使得用户可基于 Su ite 模型百接进行性能分析。 a iT WCET 和 StackAnalyzer 两款工具的详细介绍可参考安装目录 F Abslnt 公司的手册,本节介绍其在 SCADE 产品下的使用方法。

7.4.1

TSO 介绍 夕

SCADE Suite TSO 是一个轻散级的静态分析工具,无需编写精确的目标机信息和测试用 例,即可 得出最坏运行时间和堆栈的使用情况。其工作流如图 7-66 所示, Suite 模型由认证级 代码生成器输出 C 代 码 , 并通过选定的交叉编译器配置项生成可执行目标码,再加上其他 一 些辅助信息,经由 Abslnt 分析引擎运贺后返回模型级的性能分析报告 。 TSO 静态分析 不考虑中断、抢占、 DMA 、 软硬件异常等情况,所以评估得出的安全最坏

运行时间和实测结果有差异,只作为定性的参照比较好,如图 7-67 所示 。

丘 , 一_一一圈二.-

-

SCADE ISuite 模型百F飞冒

第了三一~

交又 龋泾膊

图 7-66

静态分析工作流程图

|

厂 石

`; 上

Best case Execution Time

Unsafe: SafeWorstCase Execution Time Execution Time Measu 「ement Guarantee III t , Exact Worst case

Execution 甘 me

图 7-67

1

TSO 评估出的安全最坏运行时间图

TSO 使川方法

7.4.2

确保模型设计完毕且检查无误 。 将 Code Generator 工具条设置为 Timing and Stack, 如图 7-68 所示。

I ;心' 芦n9andStad 图 7 - 68



Code Generator 工具条

单击 Code Generator 工具条左侧的 Settings 按钮,在弹出的对话框内切换至 Code Integration 选项卡,确保 Target 项为 Ti血ng

and Stack Optimizer, 如图 7-69 所示。

切换至 Timing and Stack Analysis Tools 选项卡,选择需要的配置信息 。

Generate loop bounds annotations 指在 AIS 约束文件中包含循环边界注释; Generate types copy functions 指 对复杂类型忽略 macro_ kcg_ assign 宏,采用 field by field 复制函数, 如图 7-70 所示。

`

一,

[T…gend 芷*

邑 Code Goneralor





None

玉兰Opt竺

e , T可如

kor

AS 儿 4 品平凶

Q坛一

日心一一 Wrai>1>« 吓 lnsbunenler

P巳队儿y

Penod

I 加 rootopera1可:)



Offset

几'.~

Ir•

_J

匕 User-prow坛j-­

I

L 图 7-69

OK

lI

9~

11

H中[

Settings 对话框的 Code Integration 选项卡



IT……亚* 生血

Toole 可一·呤比__

t _ _叩,一

l_ 图 7-70

亡三二 T皿 ng and Stack Analysis Tools 选项卡

配置信息设置完毕后 关闭对话框。选中 Sui te 中 待分析的操作符,单击 Rebuild 按钮, 如 图 7-71 所示。

1~ 邑 Timing and Stack 图 7- 71

了已今世竺

Code Generation 工具条

编译无误的情况下,输出窗口内会显示专门的 Timing and Stack 正常输出信息,如图 7-72 所示。 Out p ,n





C匀

Code

b 知

LOGRL GENAL GENFIL GENFlL

如过

.. !日-

日-011

G 己丛 ed 酝



i

i 成 lrtorm忒m

G-edR1es

6

J 今 lrl-

Ged 吐

b知 在 G甲od

lies

O沁eG-orGedflles

T呐 and Sl吐 ~Tools 也ed 妇 心-P_i,T,;

J J

p—如 _sT....

图 7- 72

Timing and Stack 正常输出信息

0

X

.1

凸主皿主和t喟暇'1 -

在 Timing and Stack Analysis Tools T具条中单击“最坏运行时间分析”按钮 , 如图 7-7 3 所示。

忍归心 l

I噶 I Timing and Stacie 图 7- 73

Timing and

Stack 知alysis Tools 工具条

Abslnt 工具会自动运行起来,根据配置分析选中的操作符,如图 7 -74 所示。 丕

0 心 XTC2.2(buIId 232lU) 加心叩 I妇芯 “elli>out 口比 anol叩

--

O心:叩加

儿 F 叩:一G 凶

H/A

凸皇儿心具 1:

"如文立仁,,.,..仁d 切`·y

mlrY

Processing request. .. 卜

“”“炉

S百•..1CTC

1 5叩

5lap

图 7-74

l

Abslnt 工具

分析完毕后将自动生成报告,如图 7-75 所示。

捏 .一一寸『



匣'l1111 .IIm.`七

“',ll

ll

,ll

.,

I1

,.”“

玉立 3

.,..,“ “2心

14 江 1,.

亢.....

O324” ,.,.,,.

.,OO 习`心.... 沁乃3心 .,?心 00

``玉",.90

,"..

`23.,"'

122..g

了"'” J" ' “nn.n,

372103

3了2105 . .

,3了碱

9623,.....

05

..n,..

屯 1`'

I-r.“` ..

1?J“' 1201.....

,1fnnn`..

-IIIIIll"'I丐,一丐'IIl1ffl!1!!fII冒II,1,,可II-,IIIIIT

l”lll

图 7-75

Abslnt 工具生成报告

标题栏缩写中的 WCET 即为 Worst-Case Execution Time 的缩写,前缀 C 为 Cumulative 的 缩写。标题栏分为不含子操作符的累计 WCET 、最大 WCET 、平均 WCET, 含有子操作符的

累计 CWCET 、最大 CWCET 、平均 CWCET, 操作符本身堆栈占用 Stack 、含父操作符的堆栈 占用 CStack, 如图 7-76 所示 。

293

-

Abb,eviabons 归 f 叩 boa

心o”“n

WCET eontnbt,,tion of 妇 funcbon m thoUt d妇 c end1nts, e ``m o 丘h..fun~iOn ACET, comput已伈尸卫 ch com凸 WCET ci th佟沁 ncE,onmmo”tO雹 ”“`o•n 口 ,

WCF了 ( ium i

µ

WCET (mu~

I 更 . m 矗 X Ofth 雹几 ncnon WCET 宜 c-cmput已 ior 朵矗 ch cont庄t

'NCET{ 矗 ag t

WCE'T a~·er.tge of thot func t10J1 ~1thout de5cendilnts. I 色,基 ver.ge ofth 羲 fun~t10n ¼CET.s comput雯d for 毛嘉 ch

CWCEr I,sum:

Curnul 谒 tl\DaCaT 心lo); I· 1 ·/ fo工 Ii • ; i < ; i++) ( |比q copY 0 立ucc 4 的 c,a cc. Li j) ; 1

`

i f C(i.nC->ca叩心le

I

丘 J .心nd 一心D_3 吓Opt 山吐 zationDem王

`

(土nC->ca心心lo[iJ.Dato 一正比勹_旦 t_in 亡 32

( l l) 1 i 1 l++) ( i f (( , <一 (Kcg_”“o) _L1_1 Po,1, ((比,q_•izc) _Ll_l. Pos < _l _口叩一 1_1_1 • _Ll 1 Dal:心心 1ol (K~'_.“zo) _立_ 1 . Po,1 ; )

fo 工( i

l

l

一;

i

l

l

Da 七aTable ) 尸 1../f or (i = ~; i < 1 - ; i++) { lkcq coPY 釭raY l.;t32100( acc, 6outC->UpdatedDataTable) ; 1 i f ( inc->cmdTableli].Kind =心D_SynOpt 卫nizatianDemo _Lib ) ; i 1 1 < , _ ; i 1 1++) { fo工 (i 1 1 = _L15_1_1_1 = acc[i_l_l] = k.cg_lit_int32 ( ) ; 尸 3 •/ if (_Ll5_1_1_l) ( _L28_1_1_1 = (ltcg_int32) i_l_l;

;1

;

else { _L28_1_1_1 if

=

k.cg_lit_int32 (一)

;

({ " cmdTable[i ) .Data;

{

b工 eak;

图 7-95

生成代码

堆栈分析:有一个额外的局部变量 ace 。

性能分析 : 共有 kcg_copy 语句 2 条,其中: (1) 顶层循环有 一次额外数组复制。 ( 2 ) 程序循环之外有一次额外的表复制。

下面是算法二的小结。 设计优势:解决了算法 一中的缺陷。

设计缺陷:仍有轻量级的额外复制。 所以,简单整齐的算法更适用于 Suite 模型的迭代运算 。接下来 进 一步 优化内循环的输入

输出。

7.5.J

符法:·:选择恰节的迭代(· (I) 内循环的输入输出都是布尔型变量。 ( 2 ) 充分利用退出的索引值 index 。 (3) 搜索与插入操作分离 。 实现方法:内循环用 foldw,

内循环迭代子是布尔型变量。

算法三的主操作符 P3 : Main, 里面含有 一个 fold, 如图 7-96 所示 。

算法三 ForeachCmd 操作符中 foldw 的迭代子是布尔型的,如图 7-97 所 示。 算法三的 Add 操作符,里面没有复杂的操作,如图 7-98 所示。

-屯竺 一 题.针对命令表的ADD 命令,在数据表内插入数据

者: UESTC

悚源: ANSYS

算法三:简化算法二中内循环迭代子,搜索与插入操作分离1 lold DataTable)---1 邕

沪pdate心ataTable CmdTa 以 e

ForeachCmd

法三的性能有很大的提升, 内循环的迭代子将简化为 bool型值变量,搜索和插入操作分离

图 7-96

主操作符 P3 逻辑设计

题.针对命令表的ADD 命令,在数据表内插入数据

I

者: UESTC 株源: ANSYS 法三简化算法二中内循环迭代子,搜索与插入操作分离1 CmdKind =心 D

false

e叫_i 立

lsNotEmpty

DataTable

DataTa啦产寸 I

e见I一心X -1

7匕

~ NewOataTable

CmdDat

~4曰 >心

·1

法三的性能有很大的提升, 内循环的迭代子将简化为 boo1 型值变量 索和插入操作分离

内循环的子函数负贡搜索操作,通过返回的 idx值 内循环当前模型中做插入操作

图 7-97

ForeachCmd 操作符逻辑设计

示题:针对命令表的 ADD 命令,在数据表内插入数据

乍者: UESTC

株源: ANSYS

法三简化算法二中内循环迭代子,搜索与插入操作分离

lsEmpty

'-

:) Continue

缸三 法三的性能有很大的提升. 内循环的迭代子将简化为 bool 型值变量 索和插入操作分离 处是内循环的子函数, 只负贡搜索空元素,不再负贡插入操作

图 7-98

Add 操作 符逻辑设计

将所有操作符设置 Expand 属性,查看生成的代码,如图 7-99 所示 。 堆栈分析:没有额外的局部变 量。

性能分析:仅有 一条 kcg_copy 语句 。

kc9-..l.ze” I· 3y“OptlJU.Z 釭立,n.o,,:oo.'P."3'..”“ 吐"、心: L., 今/ kcg_bool _L7_1_1; I· 3yn行立 i.cimdC:,. 区"!10 : ; P3: r”“ 匕立ua:1,lx • ,' kcg_int32 虹红_ 1_1; /• Syn勺九江已五 t 立 0n 丘: ,1'3: 王oopdatedO..taTable[i_l_lJ kcg_li 亡 int32 ( ) ; e 吐 t_i 山_l_l 一 (kcg_int32) (i_l_l + . ) ; i王

1 1)

(L7

-

;1

{

b 工eak;

l ( exic_idx_l_l -

el 多 e

kcg_lie_in 仁 32

(I;

I 1

/•

寸辽

让lx_1_1

(_L 又 l_l)

-

-

) el... { idx_l_l <一

kcg_l 虹_ int32

() ;

kcg_l 江_int32(-)

l i.f ((

I

exit 扛江 l_l

{kcg_~i•eJ

;

idx_l_l) • ((keg 立江)虹lx_l_l < )) I I (kcg_~i 江) 江lx_l_l) - 10C->ClndT心 le 丘 I.Data;

OU 七 c->o尸坛 tedDocaT 吐 le

图 7-99

生成代码

下面是算法 兰 的小结。

设计优势 : 算法优化,内循环迭代 f 类型简单 。 设计缺陷 : 外层循环迭代子未简化 所以, Suite 模型设计中应尽屈减小复制内容的大小和复制操作的次数。接 下来 着 手优化 外循环。

7.5.4

环法四:关注数据的 SC ADE Suit(.、处校最作)i 式 ( 1 ) 内外循环的输入输出都是简单的仇变敬。 ( 2 ) 搜索与插入操作分离。

实 现 方法 : 外循环用 mapfold ,

内外循坏迭代子都是值变屈。

算法四的主操作符 P4: Mai n , 里血含有 一 个 ma pfold , 如图 7-100 所示。 示题针对命令表的 ADD 命令,在数据表内插入数据

作者: UESTC

悚源: ANSYS

佴法四基千数据的设计思路,轰优算法1 。 '-fl 0 呾Ta以 e Cm叮a01e•D主Ta以 es忆勇

ForeachData1

法四基千数据的设计思路对模型是母佳的 内外循环的迭代子都简化为值变量 索和插入操作分离 卜循环的迭代子是int型值变量

图 7-100

}:操仵符 P4 逻辑设计

_ 算法四的 ForeachCmd 操作符,里面含有 一 个 foldw) ,如图 7-101 所示 。 题针对命令表的ADD 命令.在数据表内插入数据

者 UESTC 悚源: ANSYS 法四 :基千数据的设计思路,悬优算法l

- ace) • (inc->cm心心 le [i_l_ll .正nd ADD_SynOpt 虹心 zationDemo_工立) I (inC->cmdTable[i_l_l).Data 一 kcg_lit_in 七 32 ( ) ) ; i 1 11 • 1 •; (keg in1:32) (i_l_ 1 今) ; /• l -. i.f (found 1 l J I break;





I

I } el 怎 e

f lll -

i

kcg_lit int32 ( ) ;

) - c.. 王口 und • if (found l 1) ( L1 1 1 IfBl.oc 旦- i_l_11 - kcg_l 上仁 in 仁 32 ( ) ; i.f ((<一 (kcg_•i1e) _L1_1_1_IfBlockl) l I (keg

))

吐 ze)

_I.7_l_l_I 丘 lockl


cmdm 心 le[

(ltcg __ •i•e) _ L7_1_1_IfBlock1 ) .Data;

) el.o ! 0 吐 C-沁ew 归taT 心 le[i)

-立 C- >归仁 aTable [土]

;

) non星工e



1

i

1 11;

} ol. 星 e

I

OU江 C -沁 e..Da 口?心 le[i)

noname_l -

一 inc- >压仁 aT 心 le[il;

ace;

)

)

图 7- 103

生成代码

WCET 夕H升纣甘札

7.5.5

WCET 分析结果如图 7-104 所示。 算法一的累计最坏运行时间是最差的,复制数据占了 97 %的时间。 算法二的累计最坏运行时间较好,复制数据占了 21 %的时间。

算法三的累计最坏运行时间最好,复制数据占了 0 .82 %的时间。

图 7 -l04

7.5.6

堆栈分析结果 堆栈分析结果如图 7-105 所示。 算法一的堆栈占用是最差的。

WCET 分析结果



-



l l -





lllI了一!一





Cvde function•



算法四的累计最坏运行时间很好,复制数据占了 7%的时间。

算法二的堆栈占用是较差的。 算法三和算法四的堆栈占用一样好。 .ycle functions

fO 屯竺屯 竺 I-

,` '1. 午

24-64-64

P::Main

104

P3::Main P2: :Ma1n

448

488

P! ::Main

1264

1304

图 7- 105

堆栈分析结果

练习题 ]. 使用各种编辑技巧将模型布局更加简洁优 美。 2.

40 104

P4: :Main

定制样式并应用到模型上。

3. 使用 TSO 工具分析模型的最坏运行时间和堆栈。

8 埋 管





项 H 组织

8.1

多 人 协同开发的软件项目应当在前期约定好 一 定的规则 ,

以确保开发和验证 过程 的便利 。

其中可关注的内容包括命名规则、工程管理和文件管理等 。

命名规则

8.1.1

好 的 命名规则可以使定义的名称让其他项目成员迅速理解 , 可以方便后 期 用 脚 本 文件进 行 批处理自动化的操作 。 推荐所有目录、文件、操作符、函数 、 输入、输出、常揽等 对象的名称 :

• •

由 一 个或 一 系列英文字母组成 。 若下英文单词的首字母大写,其余小写 。 按照主谓宾方式连接相关涵 义的词组,例如 Lin订 tValvePres s ure 比 ValvePress ureLi mjtation 更好。

8. 1.2



使用下划线”_”来连接特定意思的词组,不再包含其 他 特殊字符 ,例如 Math_Sqrt .cpp 。



输入输出类型推荐包含类型标识 。



常量全部用大写,例如 PAI 。 J飞凡 程符埋

项目计划阶段,团队成员需要提前讨论制定出公共部分的设计内容。例 如 常量 、 类型 、

Suite 常用操作符、常用的导入代码、资源(颜色表、线型 、 线宽 、 纹理表、字 体 ) 、 注释 、批 注、排版、布局等内容 。 为防止团队成员重复开发,甚至同一功能输出不同结果 , 应当 将 上述

公共部分预先统一设计完毕后作为基础库被调用 。 基础库在被调用时是只读的 。 其他非公共部分可按照较完整的独立功能分 配 给 不同的 工 程师完成 。 随着项目研发工作的开展,会产生更多具有通用功能的常量、类型、操作符 等 , 需 要组织团队成员进行阶段性的讨论,补充修改基础库 。

_ I. SCADE Suite 库 SCADE 支持库形式的模型重用,便于快速开发 。任何设计完毕的 SCADE 工程都可以作 为库被其他 SCAD E 工程调用。 SCADE 库在被调用的工程中是只读的 。 SCADE 库可以只包 含 类型 和 常量。

2. SCADE Sui te 标准库 SCADE 安装完毕的路径 S CADE\l ibraries\SC65 下提供了如下标准库:



libA661 : 用于 A RINC 661 解决方案 UA 端设计的操作符。



libdigi tal: 用于数字运算和真值表运算的操作符 。



libimpl : 用于类型转换和定点运算的操作符 。



liblinear: 用于线性函数和滤波器运符的操作符 。



libmath: 用千基础数学运算的操作符,如平均数、最大值、最小值 等。



libmathex t: 用千 三 角函数和幕运算的操作 符。



libmtc : 用千插桩待覆盖分析对象的操作符 。



libpwlinear: 用千离散的线性函数和滤波器运笳的操作符 。



libsmlk: 用千 Simul叫(模型转换为 Suite 模型的操作符 。



libveri f: 用于形式化方法中安全属性验证的操作符 。

如果确定需要使用 SCADE 提供的标准库,推荐将相关的标准库复制到项目的实际工程目 录下 , 再导入 SCADE 工程中 。值得 一 提的是,标准库内的操作符是常用操作的推荐案例,并

未宣 称 是通过安全鉴定的,因此在正式项目中仍应该巾使用者进行必要的验证才行。

3. SCADE Suite 自定义库 本节通过一个案例来展示如何使用 SCADE Suite 自定义库 。 将设计完毕的 S CADE 工程切换至项目框架图的 FileView 选项卡,右击选中工程 , 在弹出 的快捷 菜单中选择 Insert Folder 选项,创建 一 个名称为 User l ibraries 的目录,扩展名定义为 etp 。 填写完毕后单击 OK 按钮,如图 8-1 所示 。

-—

臼 购lo-

,, . 电 Cn,,心n"ol 灯W

刁 年 1子吓·111 扑伺

D··,gnVo,如 Fa. I

00m.eControleIp

如smSe如10n

..JO” 叩 Vo,lfl0n',心IIOII

.J 2Funct/Ol1ilIRequ“ements J 2 I Se/octContro/M心OnControl Psnel Funct,on 22 C的In 知sureM时S”ementFunctIOII J) 2 3 Norms/ Automst/CControl Fu心IIOII 1) 24 Man四心卯/rotFunctIOII .J 25 0,吵1ng Con/rol Funct,on

J

j

26 巳nergency 压仅部亚eFu心的n (C..btn 压o

J

27 从mtor1ngAnd 庙户mngFu心tIOII .J 3 Arch爬cture R叨wiements :i: j 31 SystemCm”t” 田沁n: ,

,心,一-应~~一..l >3.....,,d 伈“E.... ,.'"'""

I

I,ep,...nts 心心~/um v.心. ,

Apply Styles

r上“

ln 心m凶IAu如m比心心令 mlASC“"..t 如 OFV 印eedComm•ndw如加 0b,r.

..~叩叽T,”“一

“m心e”“`.“r 心n 中.一 tC心n AhihHf• • OFV._.已,一一 1

-

•.,-•

I

.“

·-

I'

卜,.dfr~

I •11

巳知忒心呻心"卢心m REQ_SW_ PC_OI , °“`l^moru”CO

In_,心血.文沁志,坎 e”SC 心 II”I 仇. OFV

Spffd

Comm•••

w徊n 仇•

ca•1n

-Is 妇$如n 如凸咖tO的心伽沁

OFV,_.,_. •

T

St 心心沁

REQ..SW_PC;_ OS

I•,-•

图 8-44

特定样式应用示例图

x

j

则中间 文 件的内 容变 化如 图 8-45 所示。 [ NoNormal Requirement_ID

PC 04

虹及_SW

| Covezs :汜Q

Requl.rement-Traceab让五y -

In Normal

虹 quirement_Text

Requirement_Text Requirement_Text Requirement_Text Requirement_Text Requlrement_Text

Au 亡 omatic

A吓0 叩C C3 1 Mode, the OEV Speed

C中皿却 d

shall

and 1...

represents the absolute value.

I

Requ江 ement_ID

Requirement_LD Requirement ID

邸Q

SW PC 0!!

芯芯:::女产切。认冗二点二,它忒虹11

set the OfV

Requirement_Text

Requ 辽飞ment_Text

Require立nt_Text

Normal NOrm`l

尸::二芯芦沁宁-牛。ver3 .旺Q AOTO Requirement Tex 亡 Requirement Text

In

FONC 03 1 Normal Automatic Mode, the IASC shall set the OEV

图 8 -45

中间文件的内容变化

2 ) 在 Types 选项卡中展开软件需求类型的 reference-Coverage, 确认内容为^Requ 订ement_ Traceability[ \ t]Covers : [

\t] * ( *)$, 如图 8 -46 所示。 Configuration - MyTraceability

N

厄…





.



叹叭五

氏er.SJ

E设计 贝程类艺 言秉类艺

氏“印



试用 例类艺 妻设计类型 欣件霄求类型

OAna1产 下一_Tnicei归A`Pl \只飞

* "员即

.一 h亿memg归“心凶飘昌 i

令撼山也”e 亢"日忒

广`_



• tel11

Q

十,d叩



"j,系绞云求类主

图 8-46

确认 Coverage 内容

3) 保存 并在程序中刷新 , 可以得到软件需求到系统需求间的追踪关系。其中黑色的标识 号是建 立 追踪 关 系的, 红色的标识号是没有建立追踪关系的 , 如图 8-47 所示。

3.

定制解析 Excel 的文件格式

Excel 表格只能以“列 ” 的 方式 抽 取关键字。示例文件的工作表内容如阳 848 所 示。 转换后的中间 文 件内 容如图 849 所示。

`'ii111i11,II-A,.;」

,『

霆 SCADELit丈卢硒ui,ements Management Gat,w.iy • MyT”“•bihty 即

Edit”m

IOO1. 8叩O”,

.:J”

II如

3 J 勹亡 axo J 夕勹书 dJ 古、 j 口 . 加酝} 即……mV~1 如钉叩eAm户 V~1 、`!叩…一心芒 G"祀oI`~1 至硒ui,…心心· 1 | 铅系蜊"系田"凄型 1 也枚件雷求钦归求纪 '"'一 J '.

二 」 2 F-m已印皿心

心」乙,一 00~d”~F­

仁 j

已h比扭f叩C_. `

.扣啊~~妇”

:'.l ,],&~臼心$

3压o,屯义.印毗一心 2..。_沁汪L.印忙一”

\J '.2 ,也心心,心,飞·

J

"垃Q一限漫L_f叩c..卓 . .生正戍l.,_f\)吓_归

C U 丘 C心m__F仁

1 4 0`,..心心

J“'R..“心”“一

2Rf0...心U上心一” 23

'J

,.,..~ 才 L'”“

j , s,

=J

"

__O叩dF-

;

岁吐矗叩-f四C-01

J



. . . .心心$

3 ,凸次门啊m

j” 。“

岁冗QA叩_,心应

J 心父心贮,次心如

J 吧`心TD.fl皿;一” 3..OA叩JU邓一”

- 9•

0

-

凶 "只r”---~... 从江,3工沁,

2..”“-f叩L』”

j ”“3....' ,如 II.江心心心 竺 U `C叩心./.VR-昙 .J".....0-

- U”“”她, 0F­

“知一心1卫也01

J 叩-巴礼内叱_m

乞知5w_以 c_01

2l 延0-....廿_.mc一”

艺氓 Q5立UC卫2 寸阮0§w_uc一”

“知-·蜊-F叩c_.. 2..Q上也H-,心应

夕泛a_s 和_撬 C又

臼廿”“叩 0~

2 屯3一”t_MC一” 己hm5兄此一”

已l 延Q~am:t 伽恤呻心'.,

`...._

夕喂尺哑J虹"

隽 1j,2 O妇'----俨炉,一一_,,_

-斗,. C止·止·

2心心J切'·"

I\ I\

”“',"-':'一""!a".._

I\

少九扫元王心l "..0一心句."" "...只m.-...

. 9, .一 0-“一

·初 ,1,.,“耘亭嘐~

I-~

I I

:,,,. ...七心心心归守卢 :l ..;“.九广中叩 己一

II" 一

ii~ ,一一 ` j 厂心=仁

m,'-4 ..

j

\I.-1

,勺~-....

"J• 一几止七己心

岁叩'“'.m丈们 "喧•."儿”叱卫

, j·t _ _

已 哑 Q.,心"""-.,

己毗0 .岱忱 m

力 气也.m-..

寸 饮.心};

己 心归心贝

2 心,已

`,J“°毗_.om删^仁心卿

“'文· ,丘.艺

...." ...

1 鲤9,-氏”~'"夕畸`mom.心,, •1 -.l " ...宴-,一

r

”“一八正”

仁 J`”“ 知晌0C~-

"王·----....会 y.”“__ _ "哑G少也尺一”

"..9,.“... 9 ... -尸匹更

夕喧气卧_又

" "',}畸如J仍史,

夕电 3."-叱_

惫丿 2. r寸妇,由'旦即,"仁吵.

,寰`""·":一”

..

" ...}臧心一”叱5.. 夕哑^....

乙 `3.m 斤.心

3l 叩一口蝗过“"'"-"

l'I

"毗9.赋心毗,~""'''

II

3 .. 入“OO一叩止氯

企 \.1 ',一___ 2丿 赈立械夕必吧事,区

\

\I



1

夕屯 "'b 气 霄

Jm,o,腻…窄'-2.. , 也氏.m

宅吵:;--爷一 ~ 芞?,守.'....

3 赚0.赋归“O.“ 和见

?' 叽."巍必叩“`叱 ..

寄 凶,..甘 l”·L, 广 』 ..~L」,且l,皇

`

奄 ,1 "屿-

图 8-52

8.2.4

追踪结果

SCADE 文件的追踪 不同千普通文本类型文件的标识号需要用正则表达式解析, SCADE 文件的元素是自动 识

别出来 的 。接下来介绍 Suite 模 型追踪的典型步骤。 C I ) 在拓扑结构图中追加 一 个新元素,类型选择 Scade 6 项并指定对应的 etp 文件,如图 8-53 所示。

,Ju,« 叫 I 酝.归

R 呱l 曝"

0x霹,心t出人今工

飞1.l ,.憾几

C IIJI 如 ....

°

`:“亡_w_

图 8 -5 3

v

氏J山戍怀

在拓扑结构图中追加新元素



( 2 ) 打开要进行追踪管理的 Suite 工程,选中左侧. etp 工程名称,

修改并确认属性

Traceability 栏内的. rqtf 追踪管理文件是正确的,如图 8-54 所示。 嗣 ~•--•Ip .. 三,.........,.,_..

-乙l kh 叩”



!:I 阳加老廪

.二扯m呻

, 二”一

马 仁”“比`谑窜

血l-“ R\,...

= 0,“-_,

.)
SCAD氐 一,删试规程类艺

+

+啊无如

Fl叩

0Analysis

乙. 一) . 盒 ''i(T“Pn,c_\S ..I



-+mkmmo +忒炉妞

+m“i.. 儿七忒e



令 11nk

R比 e(,+丿)



例类型

嘈·

也“II

忱 Q 图 8-59

观察 requirement 栏的默认正则表达式

( 2 ) 打开要进行追踪管理的 Suite 验证工程,选中左侧的. etp 工程名称,修改并确认在属

性的 Traceability 栏内是正确的 rqtf 追踪管理文件,如图 8-60 所示 。

白 Tm 虹hV叩

gg巴 }g

erai.P

-



. ti ntnrty ”mlaea

etitib n0WTr aceab·1 ·1 ty

匠芒六\UESTC_Textbook\Demo毗“'叩.,一 今之凸叩

-L凸

• • SCAD哉计

0 比如书,如如叫

个剿i 砐U迈

_`如哎累~

I 諒亏

·-..,

芦 -妇吻`

.,.,

-糖"呵噢"

--

-?玉一、'=曰-`

"!,F一

Q

.五

-配~~上一夕 .工 一己几心~.._归

. `崖

-.L

图 8-64

定制测试结果类型文件的 Reference 和 Attribute 属性

( 6 ) 在 Graphical View 中观察整个项目开发流、验证流的追踪效果,如图 8-65 所示 。 ......

.霾丛鼻具襄

.',一一

畴 4`. · 一 ._

···-----、一一一·

'`一-一 -- 矗晕

__

皇 _

·

气,一-__~- ·



,艺•·一一一一--

-

.,一 `--> ` 一__--.. `鱼气

::::::=

;

a

l`今- ' ·一 一一 -彝·

8.2.6

__ _

_俨-~

酝畔一气

一--一__ ..一,">

`

,.,,,-、·'· ~J .' `..气.鼻

心 一宁 · -·

、"'

•· ~



图 8-65

观察追踪效果

生成快照 追踪关系的建立是迭代进行的,每个阶段性的工作完成后,推荐将当前追踪的状态冻结,

生成快照,进行配置管理 。当 再次修改追踪关系并生成新的快照后,可以与前次生成的进行比 对,查看工作进度或修改项。生成快照的操作如下: ( 1 ) 通过选择菜单 File-- New Snapshot for Current Project 打开或者在“配置”对话框中 单击按钮切换至快照选项卡 Snapshots, 如图 8-66 和图 8-67 所示 。 ( 2) 在其中根据项 目命名规则和当前状态填写快照信息。

(3) 生成快照后,单击任 一快照可以自动弹出当时锁定的追踪状态。

已-- 111”__--圈 ■.■ 一圈·

·1l

1 项目管可

第 5云— i

! 唱 Configuration· MyTrac..ability 1 斤le Di$卢y

阳ports T叫

Help

Configuration - MyTraceability

扣 氏

C1o” 图 8 - 66



快照选项卡 Snapshots

雹 Snapshot information

X

N

IUESTC_T-_c 吐,"盯 I

阳 日 l!J: 21)1~钥 25曰l

l

0k

图 8-67

-玉|

埴写快照信息

( 4 ) 当有两个以上的快照时,任意选中两个,会在右侧差异栏中显示不 同项,如图 8 -68 所示。 Configuration File

Di叩lay

MyTr釭eability

Reports

Tool

Help

R

oo巳巴 L巳·

;;;, 测试最程测试晟程类丕 ~ modlied sedlonC,)

~. !...

-民 v~心…心如n.

夕臼叩`c,TC_ll __TC_li) 夕还

S· 图 8-68

8.2.7

含有两个快照时的差异栏

,上成追踪矩阵 ;

建立追踪关系只是过程,最终提交给审核方的是追踪报告。只有两个直接 相 关 的 层 级元 素能生成追踪报告。下面介绍生成追踪报告的步骤。

( l ) 在程序的 Impact Analysis View 选项卡中选中系统需求和软件需求 , 单击菜单 Reports

-Library Reports-Traceability Matrix, 如图 8-69 所示 。

- 白玉

_

SCADELif忒ycle R勺 uirements



Edit

v,,,... Tools

|

Management Gatew叮• MyTraceability

Reports

屯尼

-—

3C 已》才 Edit 轩eports

心;r- 氏t,,i1.l 、如m

Ana扣i$心

Pr如氏如西~`

U户右ff/ft Impact"一·

凸~m行“mlm”“lysis

&ite

句sof 儿也已 lnfe>"'I 0

@Function

Specialize

图 9-7

Source

E

关联设罚

(4) 求含有 N 个元素的数组的最值操作符的创建。

l ) 求数组中元素的最大值操作符的创建。

通过大千和 If... Then... Else 操作符设计取较大值的操作符 max_2, I/0 接口如表 9-4 所示,

-



为了同时匹配整型和浮点型的输入,将接口类型设置为通用类型 。 表 9-4

求取两个数中较大的数的操作符 max_2 的 1/0 变量列表

作用

变量名称

类型

accln

Input

'T

V

Input

'T

accOut

Output

'T

逻辑设计如图 9-8 所示 。

飞题:求两个数中录大值

作者: UESTC

涞源: ANSYS

accln v

>-——嘈

>

1

v尸

accln

图 9-8

accOut

求两数中最大值的逻辑设计

建立操作符 max 对操作符 max_2 进行 mapfold 迭代,用来取数组的最大值;由于不确 定 数组中元素的个数,因此将此操作符设计为带 参数 N 的操作符,设置 I/0 如表 9-5 所示 。 表 9-5

求取一个数组中元素的最大值操作符 max 的 1/0 变量列表

变量名称

作用

1

类型

1

V

Input

'TI\N

M

Output

'T

逻辑设计如图 9-9 所示 。

飞题 : 求数组中的录大值

乍者 : UESTC

涞源: ANSYS

勹尸

v(Ol

v

图 9-9

求数组中最大值的逻辑设计

2) 求数组中 元素的最小值操作符的创建。

通过小千和 If... Then... Else 操作符设计取较小值的操作符 min_2, 1/0 接口如表 9-6 所示,

配',,扭l 为了同时匹配整型和浮点型的输入,将接口类型设置为通用类型。 表 9-6

-

求取两个数中较小的数的操作符 min_2 的 1/0 变量列表

变量名称

类型

作用

ace m

Input

'T

V

Input

'T

ace out

Output

'T

逻辑设计如图 9-10 所示 。

飞题:求两个数中录小值

者 : U ESTC

悚源: ANSYS

v

->还一如 v

图 9-10

求两数中最小值的逻辑设计

建立操作符 min 对操作符 min_2 进行 mapfold 迭代,取数组的最小值,将此操作符设计为 带参数 N 的操作 符,设置 1/0 如表 9-7 所示。 表 9-7

求取—个数组中元素的最小值操作符 min 的 1/0 变 晕列表 类型

作用

变量名称

v m

Input

'T^N

Output

'T

逻辑设计如图 9-11 所示 。

习题 . 求数组中的录小值

者 : UESTC

涞源: ANSYS

a勹

v

阳 9-11

求数组中蚊小值的逻辑设计

(5) 计算 less 和 greater 大小的操作符的创建 。 l) 计 算比 guess 小的数 (less) 的个数操作符的创建。

创建操作符 count_lt_2, 1/0 设置如表 9-8 所示 。 表 9-8

操作符 count_lt_2 的 1/0 变量列表

作用

变量名称

类型

ace m

Input

int32

V

Input

'T

guess

Input

'T

ace out

Output

int32

逻辑设计如图 9-12 所示 。

示题

计算比guess 小的数的个数的应用操作符

者 UESTC

涞源: ANSYS

v

q 虹 in+



1 I

r> 一呻

m

图 9-12

计算比 guess 小的数的个数操作符的逻辑设计

建立操作符 count_lt 对操作符 count_lt_2 进行 mapfold 迭代,来计算比 guess 小的数的个

数,将此操作符设计为带参数 N 的操作符,设置 VO 如表 9-9 所示 。 表 9-9

操作符 count_lt 的 1/0 变量列表

变量名称

类型

作用

V

Input

'T^N

guess

Input

'T

count

Output

int32

逻辑设计如图 9-13 所示 。

飞题:计算比 guess小的数的个数

作者: UESTC

涞源: ANSYS

a 1 炉纪廷` *

"叩t_lt_2

N

图 9-13

计算比 guess 小的数的个数的逻辑设计

->co皿

iii叩而', 一 2) 计算比 guess 大的数 ( greater) 的个数操作符的创建 。

创建操作符 count_gt—2, 1/0 设置如表 9-10 所示。 表 9-10

操作符 count_gt_2 的 1/0 变量列表

变量名称

类型

作用

ace rn

Input

int32

V

lnput

'T

guess

lnput

'T

acc_out

Output

int32

逻辑设计如图 9-14 所示。

示题:计算比guess大的数的个数的应用操作符

作者: UESTC

涞源: ANSYS

v

们氏五三

-> aoe_0U1 还 m

图 9-14

计算比 guess 大的数的个数操作符的逻辑设计

建立操作符 count__gt 对操作符 count__gt_2 进行 mapfold 迭代,来计算比 guess 大的数的个 数,将 此操作符设计为带参数 N 的操作 符设置 I/0 如表 9-11 所示 。 表 9-11

操作符 count_gt 的 1/0 变 爵列表

变量名称

类型

作用

V

Input

'T^N

guess

lnput

'T

count

Output

int32

逻辑设计如图 9-15 所示。

示题 :计算比 guess 大的数的个数

作者: UESTC

严S

^N

图 9-15

涞源: ANSYS

., 二曰 co田I 计笃比 guess 大的数的个数的逻辑设计

一 .见 (6) 定义新的最值的操作符的创建。 1) 最小值操作符的创建 。

创建操作符 above_2 作为新最小值的迭代 应用操作符, 1/0 设置如表 9-12 所示。 表 9-12

操作符 above_2 的 1/0 变昼列表

变昼名称

ace

类型

作用

m

Input

'T

V

Input

'T

guess

Input

'T

ace out

Output

'T

逻辑设计如图 9-16 所示 。

飞题 :计算新的录小值的操作符的应用操作符

乍者 UESTC

涞源: ANSYS

::::-:二 -> aoc_out ace

图 9- 16

11

计算新的最小值的操作符的逻辑设计

建立操作符 above 对操作符 above—2 进行 mapfold 迭代,取比 guess 大的那部分里面的最 小值为新的最小值,将此操作符设计为带 参数 N 的操作符,设置 1/0 如表 9-13 所示。 表 9-13

操作符 above 的 1/0 变量列表

变量名称

作用

类型

max

Input

'T

V

Input

'T^N

guess

Input

'T

mingtguesss

Output

'T

逻辑设计如图 9-17 所示 。 2) 定义新的最大值操作符的创建 。 创建操作符 below_2 作为计算新最大值的操作 符, VO 设置如表 9-14 所 示。

血-严二,二__

正如列,~

_

第五厂

飞题:计算新的录小值

作者: UESTC 涞源: ANSYS

v 尔纪ss•

->-叩竺廷

N

图 9-17

表 9-14

计算新的最小值的逻辑设计

操作符 below_2 的 1/0 变量列表

变量名称

ace

类型

作用

m

Input

'T

V

Input

'T

guess

1nput

'T

ace out

Output

'T

逻辑设计如图 9-18 所示 。

飞题

计算新的最大值的操作符的应用操作符

作者: UESTC

涞源: ANSYS

:>了Il 二 ->玉一如 a心心,

图 9-18

"`

计算新的最大值的操作符的逻辑设计

建立操作符 below 对操作符 below_2 进行 mapfold 迭代,取比 guess 小的那部分里面的最 大值为新的最大值,将此操作符设计为带参数 N 的操作符,设置 VO 如表 9-15 所示 。 表 9-15

操作符 below 的 1/0 变量列表

变量名称

作用

类型

llllll

lnput

'T

V

lnput

'TAN

guess

Input

'T

maxltguesss

Output

'T

逻辑设计如图 9-19 所示 。 (7) 集成后的计算中位数的操作符的创建 。

1

I1

示题 争 取比guess 小的那部分中录大值作为下一过程是大值

作者 UESTC

涞源: ANSYS

".

-> -t严SSS

炉. N

图 9- 1 9

取比 guess 小的那部分数中的垃大值的逻辑设计

] )集成后的 guess 计算操作符的创建 。

创建操作 符 guess, 调用设计完毕的其他操作符,通过 If 块筛选出要求的中位数,添加局 部变量 break 、 greater 、 gt1ess 、 half、 less 、 max 、 maxltguess 、 min 、 mingtguess, 将 guess 设计 为带参数 N 的操作 符, l/0 设置如表 9- 16 所示。 表 9-16

操作符 guess 的 1/0 变量列表

作用

变量名称

类型

accln

Input

'T^2

V

Input

'TI\N

continue

Output

bool

accOut

Output

'T^2

逻辑设计如 图 9-20 所示。

二:二三…` ,雷堇也, 牙鬼玉矗

2

~三

二:::二汇》三>一 ,--·- ·-··-·-· -···· ·--· ---·-···-·-- · ·--·.. ··---·-·