ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

NI HIL自动化测试19-Matlab-Simulink自动化建模

NI HIL自动化测试19-Matlab-Simulink自动化建模

重复的复制、粘贴和修改,让人感觉到很是枯燥无味,对于有规律的Simulink 建模,可以通过M脚本来实现。下面以CAN解析为例,主要功能包括,根据信号名称的个数自动添加Constant、Convert等模块,然后自动连线。

第一步

第二步:选择要解析的信号名称

第三步 :运行脚本

function dbc = DBC()
%获取句柄
handle = gcbh;
%获取编辑模型Parent
path = get(gcbh,‘Parent’);
%获取信号信息,里面包含了一帧报文里面的所有信号名称
signals = get(handle,‘SignalInfo’)
%获取的位置,根据这个位置来确定信号的名称locatin=strfind(signals,′的位置,根据这个位置来确定信号的名称 locatin=strfind(signals,'的位置,根据这个位置来确定信号的名称locatin=strfind(signals,‘);
%获取信号名称的个数
number0fsignals = str2num(get(handle,‘NSignals’));
%定义一个字符向量元胞数组,长度根据信号名称的个数,用来存放信号名称
signal = {number0fsignals};
%提取信号名称
for i=1:number0fsignals
if i==1
%disp(signals(1:locatin(1)-1));
signal{i}=signals(1:locatin(1)-1);
else
%disp(signals(locatin((i-1)*11)+2:locatin(((i-1)*11)+1)-1));
signal{i}=signals(locatin((i-1)*11)+2:locatin(((i-1)*11)+1)-1);
end
end
%提取信号符号标识位、信号长度、转换因子、偏移量
signalinfmation={number0fsignals};
for k=1:number0fsignals
signalinf=[0,0,0,0];
for a=1:4
signalinf(1) = str2num(signals(locatin(2+(k-1)11)+1:locatin(3+(k-1)11)-1));%将 数据长度 添加到数组的第1个位置
signalinf(2) = str2num(signals(locatin(6+(k-1)11)+1:locatin(7+(k-1)11)-1));%将 有符号无符号 添加到数组的第2个位置
signalinf(3) = str2num(signals(locatin(7+(k-1)11)+1:locatin(8+(k-1)11)-1));%将 转换因子 添加到数组的第3个位置
signalinf(4) = str2num(signals(locatin(8+(k-1)11)+1:locatin(9+(k-1)11)-1));%将 偏移量 数据长度添加到数组的第4个位置
end
signalinfmation{k} = signalinf;
end
%删除CANPACK 模块,调试显示用,后期删除
%delete_block(‘m_control_mdl03/CAN Pack’);
%显示用,后期删除
%disp(str);
%添加模块,根据获得的信号个数number0fsignals和信号名称number0fsignals进行自动添加
for j=1:number0fsignals
%向指定的模型中增加Constant模块,并且指定控件的位置
add_block(‘simulink/Sources/Constant’,strcat(path,‘/’,signal{j}),‘Position’,[30 (100+60
(j-1)) 100 (100+60
(j-1))+30]);
%向指定模型中增加Data Type Conversion模块,并且指定控件的位置
add_block(‘simulink/Commonly Used Blocks/Data Type Conversion’,strcat(path,‘/’,‘Con’,signal{j}),‘Position’,[300 (100+60
(j-1)) 400 (100+60
(j-1))+30]);
%向指定模型中增加AM_HIL_Signal模块,并且指定控件的位置
add_block(‘dfdfd_ModleLib/TestBase_IO_LIB/AM_HIL_Signal’,strcat(path,‘/’,‘Switch’,signal{j}),‘Position’,[600 (100+60
(j-1)) 700 (100+60
(j-1))+30]);
%向指定模型中增加NIVeriStand Out1模块,并且指定控件的位置
add_block(‘NIVeriStandBlocks/NIVeriStand Out1’,strcat(path,‘/’,‘NI’,signal{j}),‘Position’,[1000 (100+60
(j-1)) 1080 (100+60
(j-1))+30]);
%自动连线
add_line(path,strcat(signal{j},’/‘,‘1’),strcat(‘Con’,signal{j},’/‘,‘1’));
add_line(path,strcat(‘Con’,signal{j},’/‘,‘1’),strcat(‘Switch’,signal{j},’/‘,‘1’));
add_line(path,strcat(‘Switch’,signal{j},’/‘,‘1’),strcat(‘NI’,signal{j},’/‘,‘1’));
%修改Data Type Conversion模块参数
set_param([path,strcat(’/‘,‘Con’,signal{j})],‘OutDataTypeStr’,strcat(‘fixdt(’, num2str(signalinfmation{j}(2)),’,‘,num2str(signalinfmation{j}(1)),’,‘,num2str(signalinfmation{j}(3)),’,‘,num2str(signalinfmation{j}(4)),’)'));
end
end

效果如下:

总结

原本一个项目,可能建模需要1天,现在几分钟就搞定了。还有优化的空间,以实际需求为向导,总有实现的方式。遗憾的是没有LIN解析模块。

返回列表