解决方案
状态机是 Sysblock 中区别于传统框图编程的状态事件建模工具,它提供了一种基于状态图和流程图的建模方法,可以方便地实现循环逻辑。
下面分别使用图函数以及直接在状态中写 while 循环的方式来实现功能。
示例
案例模型文件见最下方的附件。
使用图函数构型实现 While 循环
1.添加状态机:在仿真 ribbon 栏中,找到 “文件” -> “新建模型” -> “Sysblock状态机”,点击条目后修改状态机模型名称为 state_test,完成状态机模型添加。

2.编辑状态机:双击 chart 图标,进入状态机内部,右侧打开库浏览器。拖入 Sysblock-StateMachine-State,开始创建 while 循环逻辑。

实现以下代码逻辑:
int count = 0;
int y = 0;
int u;
% 接收输入
u = input;
% while循环
while (count < u) {
y = y + 1;
count = count + 1;
}
% 输出结果
output = y;
3.添加循环构型到状态机中

4.编辑循环构型内容,表达式写入 count<u, Do 动作写入 y=y+1; count = count+1

5.在状态机顶层空白处右键,点击编辑状态机变量条目,在 chart 中添加输入和输出端口,在F中添加输入和输出端口以及本地变量 count。(注意:所有输出及本地变量都需要检查初始值)

6.构建完成后,在状态中调用循环函数 F(u)。并在外层对输入 u 连接常数 5000,实际输出 y=5000 符合预期


在状态中直接写 while 函数(基于 modelica 语法)
1.添加状态机:在仿真 ribbon 栏中,找到 “文件” -> “新建模型” -> “Sysblock状态机”,点击条目后修改状态机模型名称为 state_test,完成状态机模型添加。

2.编辑状态机:双击 chart 图标,进入状态机内部,右侧打开库浏览器。拖入 Sysblock-StateMachine-State,开始创建 while 循环逻辑。

实现以下代码逻辑:
int count = 0;
int y = 0;
int u;
% 接收输入
u = input;
% while循环
while (count < u) {
y = y + 1;
count = count + 1;
}
% 输出结果
output = y;
3.状态机状态中编辑文本:在状态机中拖入一个状态,并写入符合 modelica 语言规范的 while 语句,如下所示。

4.运行仿真查看结果,可以看出仿真结果与图函数效果一致。

注意事项
- 图函数构建时需要注意输出及常数值的初始值设定。
- 基于 modelica 语法在状态中直接实现 while 循环时不可复用。需要多处构建。