htm网站制作,做h5的软件有哪些,咨询北京国互网网站建设,做一个网站app需要多少钱文章目录 前言实现方法结构体在Simulink中的定义SignalGroup提取 总结 前言
在开发Autosar CAN通信模块时#xff0c;对于Signal Group需要建立对应的Interface,其中的数据类型实际是一个结构体#xff0c;包含Group中的Signal的数据类型定义。手动建立比较费时间#xff0… 文章目录 前言实现方法结构体在Simulink中的定义SignalGroup提取 总结 前言
在开发Autosar CAN通信模块时对于Signal Group需要建立对应的Interface,其中的数据类型实际是一个结构体包含Group中的Signal的数据类型定义。手动建立比较费时间本文介绍利用Matlab脚本自动生成SignalGroup对应的Interface
实现方法
主要方法通过正则表达式提取DBC中的SignalGroup生成BUS类型的m脚本再通过Matlab脚本建立Simulnk模型及端口建立RTE Port及mapping最后编译生成Arxml。
结构体在Simulink中的定义
在生成BUS之前首先得清楚BUS的m文件定义 手动建立一个Simulink Bus的数据类型如下所示 导出m文件如下所示
Bus Simulink.Bus;
Bus.Description ;
Bus.DataScope Auto;
Bus.HeaderFile ;
Bus.Alignment -1;
Bus.PreserveElementDimensions false;
saveVarsTmp{1} Simulink.BusElement;
saveVarsTmp{1}.Name a;
saveVarsTmp{1}.Complexity real;
saveVarsTmp{1}.Dimensions 1;
saveVarsTmp{1}.DataType single;
saveVarsTmp{1}.Min [];
saveVarsTmp{1}.Max [];
saveVarsTmp{1}.DimensionsMode Fixed;
saveVarsTmp{1}.SamplingMode Sample based;
saveVarsTmp{1}.DocUnits ;
saveVarsTmp{1}.Description ;
saveVarsTmp{1}(2, 1) Simulink.BusElement;
saveVarsTmp{1}(2, 1).Name a1;
saveVarsTmp{1}(2, 1).Complexity real;
saveVarsTmp{1}(2, 1).Dimensions 1;
saveVarsTmp{1}(2, 1).DataType uint8;
saveVarsTmp{1}(2, 1).Min [];
saveVarsTmp{1}(2, 1).Max [];
saveVarsTmp{1}(2, 1).DimensionsMode Fixed;
saveVarsTmp{1}(2, 1).SamplingMode Sample based;
saveVarsTmp{1}(2, 1).DocUnits ;
saveVarsTmp{1}(2, 1).Description ;
saveVarsTmp{1}(3, 1) Simulink.BusElement;
saveVarsTmp{1}(3, 1).Name a2;
saveVarsTmp{1}(3, 1).Complexity real;
saveVarsTmp{1}(3, 1).Dimensions 1;
saveVarsTmp{1}(3, 1).DataType single;
saveVarsTmp{1}(3, 1).Min [];
saveVarsTmp{1}(3, 1).Max [];
saveVarsTmp{1}(3, 1).DimensionsMode Fixed;
saveVarsTmp{1}(3, 1).SamplingMode Sample based;
saveVarsTmp{1}(3, 1).DocUnits ;
saveVarsTmp{1}(3, 1).Description ;
Bus.Elements saveVarsTmp{1};
clear saveVarsTmp;上面的BUS定义了三个数据对于需要生成的M文件主要关注的是数据的排列序号第二和第三个数据定义以saveVarsTmp{1}(x, 1)开头然后是数据的Name及DataType,此处我们没有考虑Dimensions为多维DBC中都是一维 此处需要留意的是HeaderFile这个属性在后面会着重提
SignalGroup提取
Matlab有解析DBC的API函数但可惜的是不能解析出SignalGroup只能解析出Message和其中的Signal。不过利用正则表达式提取SiganlGroup也不是难事~ 记事本打开DBC查找Group可以找到SignalGroup的定义如下所示
SIG_GROUP_ 258 TestGroupName 1 : TestGroupSignal1 TestGroupSignal2 TestGroupSignal3 TestGroupSignal4;
上面的定义中数字表示的是Group所在的message id,后面跟的是Group的名称再后面跟的是1目前遇到的都是1没有查过具体的定义估计是和信号组复用相关的再后面跟的就是Signal,最后以分号结尾。 正则表达式提取文本中的SignalGroup信息m脚本如下
fid fopen(dbcfile_name,r);
file_code {};
ct 1;
while ~feof(fid)file_code(ct,1){fgets(fid)};ctct1;
end
can_signal_group_pattern1 (?SIG_GROUP_ ).;%提取信号组信息
can_signal_group regexp(file_code,can_signal_group_pattern1,match);%取信号组信息
can_signal_group(cellfun(isempty,can_signal_group))[];%去除空字符串所在行
for i 1:length(can_signal_group) can_signal_group_name{i} regexp(can_signal_group{i},\S,match);
end此处can_signal_group_name包含Group中的元素按空格分开例如第一个为ID第二个为GroupName第三个为1第四个为:后面跟的是Signal
GroupStruct struct(GroupName,{}, ID,{} ,...SignalName,{},DataType,{});
for i 1:length(can_signal_group_name) can_signal_group_Struct(i).GroupName can_signal_group_name{i}{1}{2};can_signal_group_Struct(i).ID can_signal_group_name{i}{1}{1};can_signal_group_pattern_fen .(?;);%用来去除最后一个分号can_signal_group_name{i}{1}{length(can_signal_group_name{i}{1})} regexp(can_signal_group_name{i}{1}{length(can_signal_group_name{i}{1})},can_signal_group_pattern_fen,match);can_signal_group_name{i}{1}{length(can_signal_group_name{i}{1})} can_signal_group_name{i}{1}{length(can_signal_group_name{i}{1})}{1};for j 5:length(can_signal_group_name{i}{1})can_signal_group_Struct(i).SignalName{j-4} can_signal_group_name{i}{1}{j};end
end此处我们已经提取出了SignalGroup中的GroupNameID及其中的SignalName。其中还有一个关键信息就是Signal的数据类型。此处我们利用Matlab自带的函数提取Signal的信息
db canDatabase(dbcfile_name);
for i 1:length(can_signal_group_Struct) for j 1:length(can_signal_group_Struct(i).SignalName) for a 1:length(db.MessageInfo)for b 1:length(db.MessageInfo(a).SignalInfo)if(strncmp(can_signal_group_Struct(i).SignalName{j},db.MessageInfo(a).SignalInfo(b).Name,32))can_signal_group_Struct(i).DataType{j} db.MessageInfo(a).SignalInfo(b).Class;a1;b1;break;endif(i length(can_signal_group_Struct) )break;endendif(i length(can_signal_group_Struct) )break;endendif(i length(can_signal_group_Struct) )break;endendif(i length(can_signal_group_Struct) )break;end
end判断Messag的SignalName和Group中的SignalName是否一致此处只取前32个字节因为太长会导致DBC报错Group中的Name也不会全 到此我们已经提取了生成BUS所需的主要信号。 接下来就是生成M文件及后面的生成接口模型了下一次再说吧。 关于HeaderFile主要是在生成Autosar文件的时候没有配置该属性的话会报错找不到对应的Type
总结
本文介绍了DBC中Signal Group的提取在没接触Autosar软件时没有用过SignalGroupSignal成组之后一方面可以更好的管理另一方面为E2E也提供了载体。