4. 数据管理

任务说明

在MBD(基于模型的设计)开发流程中,信号与参数的数据管理是模型与代码生成之间的关键桥梁。本案例目标为:在Simulink环境中定义一组用于车辆纵向动力学仿真的信号对象与参数对象,明确其数据类型、初始值、存储类别及作用范围,并验证这些定义能够被模型正确引用且生成代码时保持属性一致。

数据对象定义

采用Simulink数据字典(.sldd)作为数据管理载体,在其中创建以下对象:

  • 信号对象:VehicleSpeed(车速信号,单位km/h)、AccelPedalPos(加速踏板开度信号,%)、BrakePedalPos(制动踏板开度信号,%)
  • 参数对象:VehicleMass(整车质量,kg)、DragCoeff(风阻系数)、FrontalArea(迎风面积,m²)、GravityConst(重力加速度,m/s²)

所有对象均基于内置类型Simulink.Signal和Simulink.Parameter创建,并设置存储类别以控制生成代码中的全局变量或宏定义。

实现步骤

以下MATLAB脚本完整创建数据字典并定义上述对象,同时设置关键属性:

<code>% 创建数据字典
dictName = 'VehicleData.sldd';
if exist(dictName, 'file')
    delete(dictName);
end
myDictObj = Simulink.data.dictionary.create(dictName);

% 打开设计数据节
dDataSectObj = getSection(myDictObj, 'Design Data');

% --- 定义信号对象 ---
sigNames = {'VehicleSpeed', 'AccelPedalPos', 'BrakePedalPos'};
for i = 1:length(sigNames)
    sigObj = Simulink.Signal;
    sigObj.DataType = 'single';          % 单精度浮点
    sigObj.InitialValue = '0';           % 初始值
    sigObj.StorageClass = 'ExportedGlobal'; % 生成代码中作为全局变量导出
    addEntry(dDataSectObj, sigNames{i}, sigObj);
end

% --- 定义参数对象 ---
% 整车质量
massObj = Simulink.Parameter;
massObj.Value = 1500;                    % 单位:kg
massObj.DataType = 'single';
massObj.StorageClass = 'ImportedExtern'; % 生成代码中引用外部定义
addEntry(dDataSectObj, 'VehicleMass', massObj);

% 风阻系数
dragObj = Simulink.Parameter;
dragObj.Value = 0.32;
dragObj.DataType = 'single';
dragObj.StorageClass = 'Define';         % 生成代码中作为宏定义
addEntry(dDataSectObj, 'DragCoeff', dragObj);

% 迎风面积
areaObj = Simulink.Parameter;
areaObj.Value = 2.2;                     % 单位:m²
areaObj.DataType = 'single';
areaObj.StorageClass = 'Define';
addEntry(dDataSectObj, 'FrontalArea', areaObj);

% 重力加速度
gravObj = Simulink.Parameter;
gravObj.Value = 9.81;                    % 单位:m/s²
gravObj.DataType = 'single';
gravObj.StorageClass = 'Define';
addEntry(dDataSectObj, 'GravityConst', gravObj);

% 保存并关闭字典
saveChanges(myDictObj);
close(myDictObj);
disp('数据字典创建完成:VehicleData.sldd');

模型引用与验证

在Simulink模型中,通过模型资源管理器将上述字典附加到模型(Model Properties → Data Dictionary)。随后在模型中使用Signal Specification模块或直接连线时输入信号名称,即可自动解析为字典中定义的信号对象。参数对象可直接在模块参数(如Gain模块的增益值)中填写DragCoeff等名称。

验证方法:在模型中使用Ctrl+D更新图后,检查模型编译是否报错;若编译通过,则说明所有信号/参数名称均被字典正确解析。进一步执行Ctrl+B生成代码,在生成的.h文件中应看到:extern float VehicleSpeed;等全局变量声明(对应ExportedGlobal信号),以及#define DragCoeff 0.32F等宏定义(对应Define参数)。若生成代码中属性与字典设置一致,则判定通过。

数据管理结构示意

VehicleData.sldd 数据字典 信号对象 • VehicleSpeed (single) • AccelPedalPos (single) • BrakePedalPos (single) StorageClass: ExportedGlobal 参数对象 • VehicleMass = 1500 • DragCoeff = 0.32 • FrontalArea = 2.2 • GravityConst = 9.81 Simulink 模型 Vehicle_Dynamics.slx 信号连线引用 Gain: DragCoeff Constant: VehicleMass 生成代码 vehicle_dynamics.c/.h extern float VehicleSpeed; extern float AccelPedalPos; #define DragCoeff 0.32F #define FrontalArea 2.2F extern float VehicleMass; extern float GravityConst; 附加字典 名称解析 代码生成 验证:编译通过 + 生成代码中属性与字典定义一致

判定标准

完成上述定义与模型引用后,按以下标准验证任务闭环:

  1. 数据字典文件VehicleData.sldd成功创建,且包含全部7个对象;
  2. 模型附加字典后更新图无错误,所有信号/参数名称均被解析;
  3. 生成代码中,ExportedGlobal信号以extern全局变量形式出现,Define参数以#define宏形式出现,ImportedExtern参数以extern声明形式出现;
  4. 数据类型均为single,初始值与设定一致。

满足以上条件即表示数据管理定义成功,可在后续模型开发中直接复用该字典。