# 新手入门


半物理仿真接口工具(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
    用途 源代码编译运行平台

# 使用前准备

  1. 加载模型库

    加载模型库 TADynamics1.2.5。

  2. 打开模型

    单击

    ,加载模型。

    注意

    ARM 系统暂不支持打开 ConstantSpeed_Test 示例模型。

  3. 打开半物理仿真接口工具

    在 Sysplorer 顶部菜单栏,进入工具 > 半物理仿真接口工具,打开 HIL Export 工具箱。

    提示

    1. 使用本工具箱需要先获取同元 License。

    2. 如下提示不影响新手入门的正常操作,请单击确定。如需获取内嵌编译器,可联系 Sysplorer 运维团队,详情参见如何操作

# 创建 main 函数

创建main_src_2024a.c文件作为本模型的主函数。可参考下方代码示例,函数主要内容如下:

  1. 配置求解步长、停止时间,开启文件流,设置文件的保存路径以及读写方式;

  2. 进行仿真实例设置以及实例设置检查;

  3. 进行初始化以及初始化检查;

  4. 设置模型参数;

  5. 通过while函数按时间步长推进仿真。在函数中将每一时刻运行出的结果保存在.csv文件中,同时打印在命令行窗口中。若模型具有输入项,可使用该处代码设置输入;

  6. 关闭文件流。

#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 自定义生成文件的保存路径

# 生成代码

  1. 参数配置完成后,单击生成。生成的代码文件会保存在自定义的路径下(C:/Users/TR/Desktop);

  2. 单击输出窗口中的代码生成地址,可打开文件夹查看生成的代码文件。

# 部署代码

当您的系统或集成开发环境中不包含 Sysplorer 产品时,您可以将生成的代码部署至目标平台中,本示例将代码部署至 x86 Linux 平台。

# 编译代码

在目标平台编译代码,通过终端输入./run_main.sh .编译脚本,生成main.out结果文件。

提示

若编译代码时提示无权限,请获取相应权限后再进行编译。

# 运行代码

输入./main.out命令查看运行结果。

# 对比结果

对比实时代码结果和 Sysplorer 仿真结果,以验证生成实时代码的正确性。

# 获取实时代码仿真结果

接下来使用测试框架模型和 Sysplorer 仿真来比较模型仿真和生成代码的结果。

运行实时代码后,仿真结果打印如下图所示:

# 获取 Sysplorer 的模型仿真结果

  1. 打开 Sysplorer,进入主页 > 仿真设置,设置步长终止时间算法的值为 HIL Export 工具箱配置的值,单击确定,如下所示:

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

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