本文最后更新于 2026年5月11日。
你好!我是 Simulink大师。
在 MATLAB App Designer (.mlapp) 中修改 Simulink Data Dictionary (.sldd) 里的标定量,核心思路是使用 MATLAB 的 Simulink Data Dictionary API。
你不能像修改工作区变量那样直接赋值,而是需要通过“打开字典 -> 获取分段 -> 获取条目 -> 修改值 -> 保存”的标准流程来操作。
以下是具体的实现步骤和代码范例。
核心流程详解
-
建立连接:使用
Simulink.data.dictionary.open打开目标.sldd文件。 -
定位数据:获取字典中的
Design Data分区(通常标定量都在这里)。 -
查找变量:使用
getEntry找到你要修改的具体变量名。 -
修改数值:
-
如果变量是纯数值(double/single),直接设值。
-
如果变量是
Simulink.Parameter对象,需要修改该对象的.Value属性。
-
-
保存更改:调用
saveChanges写入硬盘。
代码实现范例
你可以将下面的函数复制到你的 .mlapp 的 methods 区域中,或者作为一个独立的回调函数逻辑。
场景:在 App 中按下一个按钮修改参数
假设你的 SLDD 文件名为 myParams.sldd,你要修改的变量名为 K_Gain,新的值来自 App 的输入框 app.EditField.Value。
Matlab
% 按钮回调函数 (ButtonPushed)
function UpdateParamButtonPushed(app, event)
% 1. 定义文件和变量信息
dictionaryFile = 'myParams.sldd';
varName = 'K_Gain';
newValue = app.EditField.Value; % 假设这是从界面获取的新值
try
% 2. 打开数据字典
myDict = Simulink.data.dictionary.open(dictionaryFile);
% 3. 获取 'Design Data' 分区 (标定量通常存放在此)
dData = getSection(myDict, 'Design Data');
% 4. 检查变量是否存在
if exist(dData, varName)
% 获取条目 (Entry)
entry = getEntry(dData, varName);
% 获取当前条目的值 (可能是数值,也可能是 Simulink.Parameter 对象)
currentVal = getValue(entry);
% 5. 根据数据类型修改值
if isa(currentVal, 'Simulink.Parameter')
% 如果是参数对象,修改其 Value 属性
currentVal.Value = newValue;
setValue(entry, currentVal);
else
% 如果是普通数值 (double, single 等),直接修改
setValue(entry, newValue);
end
% 6. 保存更改到文件
saveChanges(myDict);
% (可选) 在 App 界面提示成功
uialert(app.UIFigure, ['已成功将 ', varName, ' 修改为 ', num2str(newValue)], '成功');
% (可选) 如果模型已打开,可能需要刷新模型以应用更改
% set_param(bdroot, 'SimulationCommand', 'update');
else
uialert(app.UIFigure, ['变量 ', varName, ' 在字典中不存在!'], '错误');
end
% 7. 关闭字典 (释放文件占用)
% close(myDict); % 根据需求决定是否立即关闭,频繁读写建议保持 open 状态
catch ME
uialert(app.UIFigure, ['修改失败: ', ME.message], '错误');
end
end
关键注意事项
1. 数据类型 (Simulink.Parameter vs double)
在工程实践中,标定量通常被定义为 Simulink.Parameter 对象(为了设置数据类型、最大最小值、存储类等)。
-
错误做法:直接
setValue(entry, 5)覆盖整个对象。这样会丢失该参数定义的 StorageClass 或 DataType。 -
正确做法:先
getValue取出对象,修改对象的.Value属性,再setValue放回去(如上面的代码所示)。
2. 并发冲突 (File Locking)
.sldd 是基于 SQLite 的文件。如果你的 App 打开了字典,同时你也在 Simulink Model Explorer 中手动打开了该字典,可能会遇到锁定冲突。
- 建议:在 App 操作完成后,如果没有后续立即操作,建议执行
close(myDict)或者在使用前先检查是否已经打开 (Simulink.data.dictionary.getOpenDictionaryPaths)。
3. 模型刷新
如果你的 Simulink 模型正在后台打开:
-
修改 SLDD 后,模型通常会自动感知到变化。
-
但如果你正在仿真或者需要立即看到效果,可以在代码末尾添加
set_param('ModelName', 'SimulationCommand', 'update')来强制刷新图表。
4. 事务管理
如果你需要一次性修改 100 个参数,不要每次修改都调用 saveChanges(myDict)。
- 优化:在循环中执行
setValue,循环结束后只调用一次saveChanges(myDict)。这会显著提高 App 的响应速度。
总结
在 App Designer 中修改 SLDD 归根结底就是三行核心代码:
-
dData = getSection(Simulink.data.dictionary.open('文件名.sldd'), 'Design Data'); -
setValue(getEntry(dData, '变量名'), 新值); -
saveChanges(myDict);
你是否需要我提供一个包含“批量读取”和“批量修改”功能的完整 App 逻辑示例?