4. 模型数据对象与信号属性设置

任务说明

本案例目标是在Simulink模型中定义数据对象(Simulink.Signal),为信号指定数据类型、初始值和存储类,并验证生成的C代码中变量声明与存储类设置一致。案例使用MATLAB R2021b及以上版本,无需额外工具箱。

模型数据对象定义

首先在MATLAB工作区创建两个信号对象:sig_speed用于存储车速信号(单精度浮点,初值0.0f),sig_brake用于存储制动状态(布尔型,初值false)。两个信号均设置为ExportedGlobal存储类,使生成的代码以全局变量形式导出,便于外部模块访问。

% 创建信号对象并设置属性
sig_speed = Simulink.Signal;
sig_speed.DataType = 'single';          % 数据类型:单精度浮点
sig_speed.InitialValue = '0.0';         % 初始值
sig_speed.CoderInfo.StorageClass = 'ExportedGlobal';  % 存储类:导出全局

sig_brake = Simulink.Signal;
sig_brake.DataType = 'boolean';         % 数据类型:布尔
sig_brake.InitialValue = 'false';       % 初始值
sig_brake.CoderInfo.StorageClass = 'ExportedGlobal';

% 将对象保存到基础工作区
assignin('base', 'sig_speed', sig_speed);
assignin('base', 'sig_brake', sig_brake);

模型搭建与信号关联

新建Simulink模型,添加以下模块并完成信号连接:

  1. Inport(输入端口):speed_raw(数据类型继承,模拟传感器原始值)
  2. Gain(增益模块):增益值设为0.1,用于将原始值转换为实际车速
  3. Relational Operator(关系运算):判断车速是否大于5.0(对应刹车阈值)
  4. Outport(输出端口):brake_cmd(制动指令)

关键步骤是将Gain模块的输出信号与sig_speed关联,将Relational Operator的输出与sig_brake关联。在信号线上右键选择Properties,在Signal name中填入sig_speed(或sig_brake),并勾选Signal object resolution为Resolved。模型结构如下图所示:

speed_raw --> [Gain: *0.1] --> sig_speed --> [Relational Op: > 5.0] --> sig_brake --> brake_cmd
speed_raw Gain ×0.1 sig_speed single, 0.0 ExportedGlobal Relational > 5.0 sig_brake boolean, false brake 信号对象与模型信号关联

代码生成配置与验证

完成模型搭建后,进行代码生成配置:

% 获取模型配置
config = getActiveConfigSet('my_model');
set_param(config, 'GenerateCodeOnly', 'on');
set_param(config, 'TargetLang', 'C');
set_param(config, 'SolverType', 'Fixed-step');
set_param(config, 'FixedStep', '0.01');

% 生成代码
slbuild('my_model');

代码生成后,打开my_model_grt_rtw\my_model.c文件,检查变量声明部分。预期应看到以下全局变量定义:

/* Exported block signals */
real32_T sig_speed = 0.0F;      /* 对应 sig_speed 对象 */
boolean_T sig_brake = false;    /* 对应 sig_brake 对象 */

同时,在my_model.h中应包含对应的extern声明:

extern real32_T sig_speed;
extern boolean_T sig_brake;

验证方法与判定标准

完成上述步骤后,按以下流程验证:

  1. 模型检查:在MATLAB中执行ModelAdvisor或按Ctrl+D更新图,确认无信号属性冲突错误。
  2. 代码生成检查:确认生成的.c和.h文件中存在上述变量声明,且数据类型与存储类符合预期。
  3. 外部访问验证:在另一个C文件中通过extern引用sig_speed和sig_brake,编译链接无错误,证明全局变量可被外部模块访问。

判定标准:生成的代码中sig_speed为float类型且初值为0.0,sig_brake为bool类型且初值为false;两个变量均以全局符号导出,无static限定;模型仿真结果与代码逻辑一致(车速超过5.0时制动指令为true)。满足以上条件即判定案例通过。