# 基于 If 模块与动作子系统的条件控制


# 引言

本示例展示了如何用状态机产生控制信号,并通过 If 模块选择性地激活不同的动作子系统:当 u1 为非零时开启电压并计数,否则关闭电压并计数。通过 merge 模块将分支输出统一到硬件端口,实现清晰高效的决策执行,同时便于统计各分支的运行次数。

# 模型搭建

单击右侧打开示例按钮,在 Sysplorer 中打开文件。

  1. 单击打开示例后,在 Sysblock 中单击用户模型找到 Demo_IfActionSubsystem 的示例,双击打开。

  2. 在库浏览器中搜索 PulseGenerator(输出脉冲信号)、Merge(Merge 模块可将多个输入合并为单个输出)、If(使用类似于 if-else 语句的逻辑选择子系统运行)。各组件对应的模型库路径如下表所示。

    组件名 组件对应的模型库路径
    PulseGenerator Sysblock.Sources(信号源模型库).PulseGenerator
    Merge Sysblock.Utilities(实用工具模型库).Merge
    If Sysblock.Continuous(连续模型库).If
  3. 在库浏览器中找到上述元器件,并且将它们拖到图中,按照如下位置进行摆放。

  4. 双击打开 ElseBodysubsystem 子系统,放置一个 actionPort 模块(将此模块放在子系统中,以从 If 模块或 Switch-Case 模块链接到信号),它的位置在库浏览器 Sysblock.SubSystems(子系统模型库).ActionPort。

  5. 单击键盘上 Backspace 按键回到主系统。

  6. 双击打开 IfBodysubsystem 子系统,同样放置一个 actionPort 模块。

  7. 单击键盘上 Backspace 按键回到主系统。

  8. 单击建模 > 插入状态机,再双击打开状态机。

  9. 放置两个 State(状态)模块,它的位置在库浏览器 Sysblock.StateMachine(状态机模型库).State。

  10. 将 state 名称修改为 Off,state1 名称修改为 On。将鼠标放于 Off 状态模块边框上,待出现红色名称时候,单击边框长按拖出信号线连接到 On 状态模块。将信号线上 [true] 修改为 [switch]{lightSwitch=1}。

  1. 将鼠标放于 On 状态模块边框上,待出现红色名称时候,单击边框长按拖出信号线连接到 Off 状态模块。将信号线上 [true] 修改为 [switch]{lightSwitch=0}。
  1. 右击空白处,单击编辑状态机变量
  1. 单击添加变量,将范围修改为 Output,名称修改为 lightSwitch。
  1. 单击添加事件,将范围修改为 Input,名称修改为 switch,触发方式修改为 either,完成后关闭窗口。单击键盘上 Backspace 按键回到主系统。
  1. 放置三个,Outport 模块,它的位置在库浏览器 Sysblock.Port(端口模型库).Outport。将它们按端口号的顺序分别命名为 voltage_to_hardware、counter_if、counter_else。拖动状态机的边框,将大小调整至合理状态。

# 模块参数设置

  1. 双击打开 pulseGenerator 模块,设置脉冲类型基于采样、振幅 1、周期(采样数) 2、脉冲宽度(采样数) 1、相位延迟(采样数) 0、采样时间 1,单击确定保存设置。

  2. 双击打开 If 模块,设置输入数目 1、If 表达式 u1 <> 0,单击确定保存设置。

# 连接模块

  1. 将 pulseGenerator 模块的输出端口连接到 chart 状态机的输入端口。chart 状态机的输出端口连接到 if 模块的输入端口,if 模块的输出端口 if(u1<>0)连接到 IfBodysubsystem 子系统的 Action 输入端口、else 输出端口连接到 ElseBodysubsystem 子系统的 Action 输入端口。IfBodysubsystem 子系统的输出端口 VoltageOn 连接到 merge 模块的输入端口、输出端口 CounterWithTime 连接到 counter_if 模块的输入端口。ElseBodysubsystem 子系统的输出端口 VoltageOff 连接到 merge 模块的输入端口、输出端口 CounterWithTime 连接到 counter_else 模块的输入端口。merge 模块的输出端口连接到 voltage_to_hardware 模块的输入端口。

  2. 放置三个 Scope(显示仿真过程中生成的信号)模块,用来观察运行结束后的波形,它的位置在库浏览器 Sysblock.Utilities(实用工具模型库).Scope。三个 scope 模块分别连接到 IfBodysubsystem 子系统的输出端口 CounterWithTime、merge 模块的输出端口、ElseBodysubsystem 的输出端口 CounterWithTime。

# 仿真设置

在进行仿真之前需要进行仿真设置,在软件上方功能区,单击主页 > 仿真设置按钮,打开仿真设置界面。在该界面设置开始时间 0,终止时间 10、输出区间步长 0.1。积分算法类型设置为定步长算法Euler (Runge-Kutta, 1 阶, 非刚性)容差 0.0001、积分步数 1,单击确定并保存到模型

# 仿真运行

单击主页 > 仿真,等待仿真运行结束。分别双击 3 个 scope 示波器查看仿真运行结果。