我如何从我的 GUI 向我的 matlab 模拟工作区 struct() 提供输入
Posted
技术标签:
【中文标题】我如何从我的 GUI 向我的 matlab 模拟工作区 struct() 提供输入【英文标题】:How do i give input from my GUI to my matlab simulation workspace struct() 【发布时间】:2015-04-22 08:36:59 【问题描述】:我目前正在开发一个在 mathworks 上实现锂电池模型的模拟器,当从我的 GUI 运行模拟时,我需要能够更改几个参数。
编译后原始参数驻留在工作区结构中,所以我想这是我需要更改参数的地方。
从中读取的原始文件如下:
%% Populate Lookup Tables
BatteryParams = struct();
for idx = 1:numCells
%% Lookup Table Breakpoints
BatteryParams(idx).SOC_LUT = [0 0.1 0.25 0.5 0.75 0.9 1]';
BatteryParams(idx).Temperature_LUT = [5 20 40] + 273.15;
%% Em Branch Properties (OCV, Capacity)
% Battery capacity
BatteryParams(idx).Capacity_LUT = [
80.0000 79.5000 79.0000]; %Ampere*hours
现在我希望能够在模拟过程中改变电池的容量,但我不知道如何做到这一点,因为我对 simulink 还比较陌生。
我认为它应该包含:
command = sprintf('BatteryParams(%d).Qe_init = %f;', idx, value)
evalin('base', command);
但我非常不确定如何实现这一点,此外,我需要能够在我的 GUI 中输入例如 80Ah,然后将数组放入包含 80.5 80 79.5 的结构中
谁能帮我实现这一点?
【问题讨论】:
【参考方案1】:Simulink 并非真正设计用于执行此操作,它仅在仿真开始时在模型初始化期间检查(基础)工作区的值,类似问题请参阅 How to update variable in From workspace block during runtime。
您可以在工作区中更改参数值后尝试使用set_param
,例如:
set_param(path_to_block,block_parameter_name,BatteryParams)
将path_to_block
替换为相关块的正确路径,将block_parameter_name
替换为您要为相关块更改的正确参数。如果您从 GUI 运行它,您可能需要使用 eval
或 evalin
。
另请注意,这并不适用于所有块/参数,正如您在前面提到的另一个问题中看到的那样。
【讨论】:
实际上,如果我可以在模拟停止或暂停期间更改参数,那就足够了。关键是我们不希望模拟器的用户被不得不更改值和每次想要更改值时编译的困扰。我也在研究转换库块的可能性,以便我可以将参数作为输入端口,但我最近尝试创建一个库,所以这本身就是一个问题。 您也可以使用set_param
来暂停/停止模型,例如set_param(model_name,'SimulationCommand','pause')
之后,您可以尝试使用 set_param
更改参数值,然后再次开始模拟。正如您所说,将参数作为输入将是一个更好的解决方案,但这将需要一些工作/努力来开发和调试。
如何在 GUI 的 simulink 程序中使用 set_param?
首先在 MATLAB 命令行中尝试以检查它是否确实有效,然后转到 GUI,可能使用 evalin
。
我实际上想出了如何修改我当前的库,所以如果我能弄清楚如何获取一个 int 并将 i 变成一个由三个数字组成的数组,那么 Ah 的设置就正确了。 a = [a+0.5 a a-0.5] 或类似的东西以上是关于我如何从我的 GUI 向我的 matlab 模拟工作区 struct() 提供输入的主要内容,如果未能解决你的问题,请参考以下文章
气动学基于matlab GUI二维气体模拟含Matlab源码 2328期