# 新手入门
半物理仿真接口工具(Hardware-in-the-Loop Export,简称 HIL Export),可以快速、高效地将 Modelica 物理模型转换为适用于实时环境的可执行代码(高效 C 代码或联合仿真代码)。本文介绍了使用 HIL Export 工具箱,将速度跟随物理模型转换为 C 代码并编译运行的方法。
# 分析模型
速度跟随模型内置于 Sysplorer 的车辆动力学模型库中,基于车辆动力学原理和控制理论,使车辆能够按照预定的速度跟随给定的参考速度。该模型通常应用于自动驾驶系统、巡航控制和交通流控制等。模型如下图所示:
速度跟随模型通常包括两个主要部分:速度控制器和车辆动力学模型。速度控制器根据参考速度和当前车辆速度之间的差异,计算出控制指令,如油门开度或制动力。车辆动力学模型根据控制指令和车辆动力学参数,模拟车辆的加速度和速度变化。速度跟随模型的设计同时考虑了车辆的动力学特性、惯性、摩擦力等因素,以实现平稳、精确的速度控制。速度跟随模型通过不断调整控制指令,能够使车辆逐渐接近并跟随参考速度,以保证车辆的稳定性和安全性。
通过本文,您将学习:
使用 HIL Export 工具箱生成速度跟随模型的 C 代码;
生成的代码文件的具体含义;
如何配置 C 代码的主函数;
比较模型仿真结果和生成的 C 代码结果,以了解数值等效性。
# 环境配置
Windows 使用环境:
名称 详细说明 处理器 Intel(R) Core(TM) i7-8550U CPU @ 1.80 GHz 2.00 GHz 内存 8 G 硬盘 240 GB + 500 GB 操作系统 Windows 11 家庭中文版 用途 使用 HIL Export 工具箱生成源代码 Ubuntu 运行环境:
名称 详细说明 处理器 Intel Xeon(R) Silver 4210R CPU @ 2.40 GHz x 40 内存 62.5 GiB 硬盘 3.0 TB 操作系统 Ubuntu 20.04.6 LTS 用途 源代码编译运行平台
# 使用前准备
加载模型库
加载模型库 TADynamics1.2.5。
打开模型
单击
,加载模型。注意
ARM 系统暂不支持打开 ConstantSpeed_Test 示例模型。
打开半物理仿真接口工具
在 Sysplorer 顶部菜单栏,进入工具 > 半物理仿真接口工具,打开 HIL Export 工具箱。
提示
使用本工具箱需要先获取同元 License。
如下提示不影响新手入门的正常操作,请单击确定。如需获取内嵌编译器,可联系 Sysplorer 运维团队,详情参见如何操作。

# 创建 main 函数
创建main_src_2024a.c文件作为本模型的主函数。可参考下方代码示例,函数主要内容如下:
配置求解步长、停止时间,开启文件流,设置文件的保存路径以及读写方式;
进行仿真实例设置以及实例设置检查;
进行初始化以及初始化检查;
设置模型参数;
通过
while函数按时间步长推进仿真。在函数中将每一时刻运行出的结果保存在.csv文件中,同时打印在命令行窗口中。若模型具有输入项,可使用该处代码设置输入;关闭文件流。
#include <stdlib.h>
#include <stdio.h>
#include "mws_autogetset.h"
output out;
int main()
{
MwsReal startTime = 0.0;
MwsReal stopTime = 20.0;
double communicationStepLength = 0.001;
const MoChar* name = "Modelica.Blocks.Examples.ConstantSpeed_Test";
MwsSlaveType simInstance;
printf("program start\n");
simInstance = mwsComp(name);
printf("isimInstantiate end\n");
MwsStatus status = mwsSetup(simInstance, mwsTrue, startTime, mwsTrue, stopTime);
/*开启文件流,并设置保存路径,以及读写方式*/
FILE *fp = fopen("./tmp.csv","w+");
if (status != mwsOK)
{
printf("mwsSimSetupExperiment fail\n");
exit(1);
}
status = mwsInit(simInstance);
if (status != mwsOK)
{
printf("mws Initial fail\n");
exit(1);
}
printf("End initialization\n");
MwsReal step_time = communicationStepLength;
MwsReal current_time = startTime;
MwsReal next_time = startTime;
MwsReal unlessVar;
MwsReal n = 0;
printf("start Simulation\n");
while (current_time < stopTime)
{
next_time = startTime + n * step_time;
status = mwsDoSim(simInstance, current_time, next_time, &unlessVar);
if (status != mwsOK)
{
printf("mwsSimDoStep fail\n");
exit(1);
}
mwsGetOutput (simInstance, &out);
printf("Current time %f, value: %f \n",next_time, out.vehicle_speed);
/*将结果保存csv文件*/
fprintf(fp,"Current:%f | out:%f",current_time,out.vehicle_speed);
current_time = next_time;
n++;
}
printf("Simulation finished\n");
/*关闭文件流*/
fclose(fp);
return 0;
}
# 设置参数
进入 HIL Export 工具箱,配置如下参数:
| 参数名 | 参数设置 | 说明 |
|---|---|---|
| 当前模型 | ConstantSpeed_Test | 参考生成代码的模型正确与否 |
| 参数名 | 参数设置 | 说明 |
|---|---|---|
| 文件格式 | 勾选源代码(包含求解库) | / |
| 算法 | Euler | 此处使用 Euler 算法 |
| 求解步长 | 0.001 | 仿真输出点之间的间隔长度 |
| 停止时间 | 20 | 仿真的停止时间 |
| 参数名 | 参数设置 | 说明 |
|---|---|---|
| 目标系统 | Linux(64) | 选择生成代码的目标部署系统 |
| 目标架构 | x86 | 选择生成代码的目标系统架构 |
| 参数名 | 参数设置 | 说明 |
|---|---|---|
| Output | 勾选 vehicle_speed | 输出车辆的行驶速度 |
| 参数名 | 参数设置 | 说明 |
|---|---|---|
| 导入主函数 | C:/Users/TR/Desktop/main_src_2024a.c | 选择创建的 main_src_2024a.c 文件 |
| 编译脚本 | 勾选是否生成目标平台编译脚本 | 选择生成编译脚本 |
| 保存路径 | C:/Users/TR/Desktop | 自定义生成文件的保存路径 |
# 生成代码
参数配置完成后,单击生成。生成的代码文件会保存在自定义的路径下(
C:/Users/TR/Desktop);
单击输出窗口中的代码生成地址,可打开文件夹查看生成的代码文件。

# 部署代码
当您的系统或集成开发环境中不包含 Sysplorer 产品时,您可以将生成的代码部署至目标平台中,本示例将代码部署至 x86 Linux 平台。
# 编译代码
在目标平台编译代码,通过终端输入./run_main.sh .编译脚本,生成main.out结果文件。
提示
若编译代码时提示无权限,请获取相应权限后再进行编译。
# 运行代码
输入./main.out命令查看运行结果。
# 对比结果
对比实时代码结果和 Sysplorer 仿真结果,以验证生成实时代码的正确性。
# 获取实时代码仿真结果
接下来使用测试框架模型和 Sysplorer 仿真来比较模型仿真和生成代码的结果。
运行实时代码后,仿真结果打印如下图所示:
# 获取 Sysplorer 的模型仿真结果
打开 Sysplorer,进入主页 > 仿真设置,设置步长、终止时间、算法的值为 HIL Export 工具箱配置的值,单击确定,如下所示:

单击仿真,仿真结束后,在结果查看器左侧的仿真浏览器中单击 vehicle_speed,查看生成的速度曲线;

如需查看某一时刻的速度,进入图表>曲线游标,左右移动曲线游标,在曲线窗口左上角查看某一时候的速度。
