联合仿真组件
算盘仿真组件分类思维导图
最新的仿真组件思维导图见《算盘仿真资料附件》
方框图仿真组件🔧
开发控制系统仿真组件、模板,实现单步仿真和仿真数据显示。新开发组件:阶梯激励、方波激励、传递函数(连续/离散)、状态空间表达式(连续/离散)、信号聚合。
算盘仿真组件2分钟演示视频:
传递函数演示案例
用传递函数实现的一个IIR低通滤波器数字信号处理仿真演示。按键单步执行。
PID控制器
该模块实现了连续和离散时间PID控制算法.
内部使用线性时不变系统(LTI)时域响应仿真。
一次接收一个浮点数值,输出一个浮点数值。
PID控制器系统通过传递函数描述。s 为连续系统,z为离散系统传递函数。
方框图模型
关于方框图描述数据参考语雀文档-动态系统框图前端显示及交互。
反馈环🔄
此节点在流计算实现控制反馈环功能,即下面方框图红框所示模块功能
此组件有两个输入,方便标记了“+”代表控制信号,和“-”代表反馈信号,在连接时请对应连接。
异步接收两个浮点数,输出相减值。
请在部署前将此节点配置为“异步接收”
实时变步长组件
实时变步长的仿真组件让用户可以控制每个仿真系统组件的仿真步长。比如应用在与和硬件做联合仿真,即硬件在环(HIL,Hardware in Loop)仿真。
现有实时变步长组有:
比起普通不带“(实时)”和他们同名的组件相比,增加了一个输入端口“实时步长”,
不建议对于“离散”(如Z域的传递函数)的传递函数和状态空间系统做变步长仿真。因为他们的表达式已经包含了其固定步长的信息。即尽量使用连续系统表达式描述系统,并配置为连续系统。
以下以LTI传递函数仿真(实时)为例,
输入1:一次接收一个浮点数值,输出一个浮点数值。
输入2:接收当前仿真实时步长,单位秒。
信号聚合(多通道)
信号聚合(多通道)输出可作为线形图显示,
如果您需要增加输入通道可在下面“输入桩”增加输入端口,并将“具体类型”配置为“float”。
如果您需要减少输入通道可依次删除排在最后的输入桩。
如下所示的配置可以聚合4路信号,每个输入都为浮点型数据(float)。
此组件支持异步输入模式,需要选择一个输入通道为异步触发通道(0,1,2,3...)。仅在此通道有输入时才会触发输出,其他通道输入只会被内部缓存。
dt可以设定为固定的正数,单位秒,在绘图时候将把此值作为两连续时间数据的时间轴横坐标间隔时间,如果设定为负数(如-1),将使用数据实时到达此组件的时间作为横坐标时间。
自定义数据上传
在参数设置中上传一个csv文件。csv文件每行代表一个时间戳的数据,可以有单列或多列代表多通道数据。
如果您需要增加输出通道可在下面“输出桩”增加输出端口,并将“具体类型”配置为“float”。
如果您需要减少输出通道可依次删除排在最后的输出桩。
您需要确保输出通道和您上传的csv文件列数相同。
如下图,配置了输出两个通道。
仿真执行控制
请配置为异步输入
- 开始/停止
- 单步执行
- 激励信号复位
通过连接3个前面板按键实现仿真控制。
各个按键在前面板配置如下
其他模板案例
反馈环,变步长模板
变步长的值通过“常数激励”+“随机数(高斯)”模拟
反馈(Feedback)节点的“-”输入端子连接的是最右侧的传递函数输出。
(点击下图查看大图)
联合仿真组件🔌
联合仿真FMU组件
关于FMI的详细内容可参考语雀文档-功能模型接口 Functional Mock-up Interface(FMI)。
组件说明
功能模型FMU(Functional Mock-up Unit)
用于联合仿真(Co-Simulation)。联合仿真FMU内含求解器(Solver)。
FMU可由包括Ansys CFX,CATIA,MATLAB Simulink在内的多个仿真工具导出。
导出的FMU模型可以脱离原仿真工具(如MATLAB)单独运行,支持单步仿真及修改原模型中各模块配置参数。
关于如何将SIMULINK仿真模型导出为一个FMU文件,请参考文档相关章节,FMI Kit for Simulink。由于算盘运行环境为64位Linux系统,需要导出的FMU文件包含64位linux二进制文件才能支持在该系统内运行仿真,因此需要用Linux 版本的MATLAB导出FMU模型。最新版的Linux 版本MATLAB可在MathWorks官网下载,下载地址。
在首次部署模板前请在参数设置中上传FMU文件以及配置FMU模型的初始参数。如使用模型导出前原仿真工具默认初始参数则无需额外配置(即在此文本框填空Json字符串: {})。
输入一次接收一个浮点数值,输出一个浮点数值。
如果您的FMU带有两个输入,请使用对应的同名“双输入”组件,端口顺序对应您在SIMULINK中定义的“Port number”顺序。如下图,在部署后此节点的执行日志中也可查看两个输入对应的顺序,如下图中两个输入(input)对应顺序为“Force”和“Pressure”。
使用案例模板-飞机纵向飞行控制
以SIMULINK中“飞机纵向飞行控制”案例导出的仿真模型为基础,演示在算盘上运行飞机俯仰姿态控制的仿真。
用户可自定义模型输入,查看模型输出,配置模型内部节点参数。
原模型介绍:
此示例说明如何对飞机纵向运动的飞行控制进行建模。飞机和作动器行为的一阶线性近似值连接到一个模拟飞行控制设计,该设计使用飞行员的倾角操纵杆指令作为飞机俯仰姿态的设定值,并使用飞机俯仰角度和俯仰率来确定指令。合并了简化的 Dryden 阵风模型来干扰系统。
模型输入:飞行员的倾角操纵杆指令
模型输出:飞机俯仰角度。
下图模板中的“联合仿真FMU”节点负责加载FMU模型。仿真开始前,该节点根据右面板参数配置FMU模型的初始参数,如设定原模型左上角“Pilot”信号生成器信号幅值为0从而disable它,因为我们只想让联合仿真FMU接受算盘节点(加法器)的输出值作为输入,模拟飞行员的倾角操纵杆指令。
运行仿真效果如下,点击一次按键都会让仿真单步执行一个时间点。
FMU仿真模板搭建指导👨🏫
前面板按钮组件:
Param设置{\"value\":1},代表每次点击按钮它对应的后面板节点将会发送{"value":1}
在按钮对应的后面板组件修改其输出数据类型为memory.json,不然可能不能连接后续激励节点。
线形图
改变图标色系参数让两条线颜色容易区别。#0084ff, #00841f
切换到后面板
创建一个方波激励节点
在参数设置中方波激励的总步数(steps),总共周期数和幅值。如此时配置的参数中总步数为1000,周期数为6,代表一个周期将需要1000/6步(steps)。
类似的,创建一个随机数(高斯)节点,并配置其参数步数(steps)、方差。
创建一个加法器节点用于将两个激励信号进行相加操作
创建一个联合仿真FMU节点并配置其参数,步长、初始化参数配置、上传FMU文件。
{
"Pilot_Amplitude": 0,
"Pilot_Frequency": 0.1
}
此演示案例中的slexAircraftExample_2.fmu文件可以通过单击链接下载到本地然后点击按键选择该文件上传。
创建一个信号聚合(双通道)节点并配置其步长(dt)和最大序列长度,
改节点用于将单步信号聚合为时序数据二位数组,2行,N列,
第一行为时间序列,第二行为信号数值序列。
其中设置的最大序列长度可以根据线形图显示要求而定。如只需要显示最新的200步时序数据,可以将最大序列长度配置为200,即在运行时如果时序数据长度大于200步,将会滚动显示最新的200步时序数据。
按照图示连接所有节点
点击部署按键,等待所有节点都显示绿色钩图标。
如果有报错显示红叉,可以在执行日志中查看程序报错信息
打开前面板页面,先点击后面板空白处,然后点击右侧显示的前面板连接
点击按键,单步执行一次,
如果您想自动点击按键,可以通过浏览器自动执行。
在Chrome浏览器按F12按键,点击Console,输入如下代码,回车。浏览器将会自动点击按键1000次。1000次后将达到两个激励节点的步长上限,仿真将结束,如需重新运行仿真需释放模板然后再次部署。
记得将您按键的ID替换为实际按键 ID。
btnId="ifrq"
btnObj = document.getElementById(btnId)
for (let i = 0; i < 9000; i++) {
btnObj.click()
}
使用案例模板-串口物联仿真
演示使用Windows系统虚拟串口和SSCOM App模拟单片机发送数据到本地Python程序。
逻辑顺序:
单片机发送JSON字符串,如{"force": 4, "position": 4, "dt": 0.001}
到串口,本地Python程序接收到数据后请求算盘HTTP POST API,请求返回后本地Python程序提取返回的浮点数据发送会串口。依次往复直达用户Ctrl+C终止本地Python程序。单片机发送的JSON字符串最后需要带回车,其中每个字段需要在算盘上对应“提取数值”节点的参数设置中配置。此例子中dt
对应的值为联合仿真的实时步长,单位为秒。
单片机接收一个浮点数带换行符,如"12.123456\n",浮点数均保持小数点后6位。
算盘线上模板
其中3个“提取数值”节点用于提取JSON数据
{"force": 4, "position": 4, "dt": 0.001}
中的3个浮点数,提取的“key”值在每个节点的参数设置中配置,如第二个“提取数值”节点配置为提取“position”对应的数值。
“联合仿真FMU(实时)双输入”节点除了接收两个输入数据以外还接收当前仿真实时步长,单位秒。
本地Python程序
Python 3.5+
依赖包:pyserial
运行main.py程序,如下格式传递参数python main.py --port COM5 --baud 115200 --url "https://spxxxxxxxxxxxxxxx988/test"
程序帮助说明:
usage: main.py [-h] --port PORT [--baud BAUD] --url URL
本地串口程序HTTP Post程序。
optional arguments:
-h, --help show this help message and exit
--port PORT 连接单片机的串口名称,COM口,如"COM5"
--baud BAUD 串口波特率
--url URL 算盘web input HTTP POST 请求 URL
算盘web input HTTP POST 请求 URL可以在web input 节点右面板概览页查看,如下图。
运行程序,
python main.py
模型交换FMU
请参考文档:
https://xuelangyun.yuque.com/docs/share/1b3c0421-e081-4ab0-9e4a-c9d60605cd8d?# 《模型交换FMU》
或内部链接
https://xuelangyun.yuque.com/suanpan_doc/simulation-dev/md0dy6