我有这段代码,它应该将模型中的引用子系统更改为普通子系统,因为我有另一个脚本,由于应用程序库更改为引用子系统,它不再在matlab 2020上工作,只在2017年工作。当我运行它时,我会得到多个:
*** W02293: SIMULINK DATA TYPE RESTRICTIONS:
*** Could not perform min/max logging or overflow detection for signal.
*** The ufix1 Simulink data type is not supported.
紧随其后的是:
Error using change (line 4)
Invalid Simulink object handle
有人知道为什么吗?我使用带有TargetLink 5.1p1 的Matlab R2020b版本
refSubsystem = 'subsys20b';
modelName = 'modelRefSubsys20b';
open_system("Application Name");
oldBlock = [ modelName '/Subsystem Reference'];
newBlock = [ modelName '/subsystem'];
% create a copy of the referenced subsystem
add_block('built-in/Subsystem', newBlock)
Simulink.BlockDiagram.copyContentsToSubsystem(refSubsystem, newBlock)
% Retrieve useful info from the old block
t1 = get_param(oldBlock, 'Portconnectivity');
t2 = get_param(oldBlock, 'PortHandles');
t3 = get_param(newBlock, 'PortHandles');
% delete old lines
h = get_param(oldBlock, 'LineHandles');
ni = numel(h.Inport);
no = numel(h.Outport);
delete_line(h.Inport);
delete_line(h.Outport);
% create connections to new block
for i=1:numel(t2.Inport)
srcBkhdl = t1(i).SrcBlock; % source block handle
srcNm = getfullname(srcBkhdl); % source block name
srcBkPts = get_param(srcNm, 'PortHandles'); % source block port handles
srcPt = srcBkPts.Outport(t1(i).SrcPort+1); % source port
dstPt = t3.Inport(i); % destination port
add_line(modelName, srcPt, dstPt);
end
% create connections from new block
for i=1:numel(t2.Outport)
dstBkhdl = t1(ni+i).DstBlock; % dest block handle
dstNm = getfullname(dstBkhdl); % dest block name
dstBkPts = get_param(dstNm, 'PortHandles'); % dest block port handles
dstPt = dstBkPts.Inport(t1(ni+i).DstPort+1); % dest port
srcPt = t3.Outport(i); % src port
add_line(modelName, srcPt, dstPt);
end
% copy to same position
pos = get_param(oldBlock, 'position');
set_param(newBlock, 'position', pos);
% remove old block
delete_block(oldBlock);
% save changes
save_system(modelName);
我刚刚遇到了一个类似的错误,想要将引用的子系统恢复为简单的子系统。然而,在我的情况下,我不想通过编程来实现这一点。
我使用MATLAB2021a,并有一个项目初始化搜索路径。
从引发的块参数中删除参考子系统链接:
Invalid Simulink object handle
阻止我保存模型。我找到的解决方法是:
- 打开模型而不加载我的项目。由于找不到引用的子系统的引用文件,因此未加载项目阻止了该子系统的加载。在其他人的情况下,可以简单地将引用的文件移动到搜索路径之外
- 删除指向引用文件的链接。我发现在加载失败后执行此操作不会导致相同的错误
- 一旦链接被删除,就可以安全地打开所述引用的文件,复制其内容并将其粘贴到现在简单的子系统块中
- 保存
我知道您希望以编程方式执行此操作,我希望这能帮助您或其他人。请记住,我不是专家。我只是到处乱搞,发现了一些对我有用的东西。