在之前的一篇关于Simulink标定量与观测量的文章中,传送门:Excel管理Simulink SWC中的标定量与观测量之标定量
主要介绍了基于Excel的标定量m文件自动生成。对于观测量来说,若是采用Simulink Signal方式,生成起来更加简单。本文将详细介绍观测量的m文件自动生成。
通过Simulink手动建立一个Signal,主要参数界面如下:


导出的m文件如下:
Sig1 = Simulink.Signal;
Sig1.CoderInfo.StorageClass = 'ExportedGlobal';
Sig1.CoderInfo.Identifier = '';
Sig1.CoderInfo.Alignment = -1;
Sig1.Description = 'test';
Sig1.DataType = 'uint16';
Sig1.Min = 0;
Sig1.Max = 65535;
Sig1.DocUnits = 's';
Sig1.Dimensions = -1;
Sig1.DimensionsMode = 'auto';
Sig1.Complexity = 'real';
Sig1.SampleTime = -1;
Sig1.InitialValue = '0';
主要的参数如下:
MeasureName:观测量名
StorageClass:存储类,都设置为ExportedGlobal,即全局变量
DataType:数据类型
Min:最小值,在A2L导入标定工具测量时会有影响
Max:最大值,在A2L导入标定工具测量时会有影响
DocUnits:单位
Dimensions:维度,如果测量的是多个数据,需要设定该值
Complexity:实数or虚数,基本都是实数
Description:描述信息

以单个观测量和数组观测量为例,设定参数如上图所示。
观测量暂时没有用到多维的,初始值也按一个值处理。
与标定量类似,先找到观测量参数所在列
Measurementcolumn = {'MeasureName','DataType','InitialValue','Min',...
'Max','Unit','Dimensions','StorageClass','Complexity','Description'};
[~,Sheet_Cell] = xlsfinfo(Excel_Name)
...
[~,~,Measurement] = xlsread(Excel_Name,Sheet_Cell{ii})%获取观测量表中的信息
Measurecolumn_num = size(Measurement,2);%获取列数
Measurerow_num = size(Measurement,1);%获取行数
%获取参数在表中的列数
for j = 1:Measurecolumn_num
for jj = 1:length(Measurementcolumn)
if strcmpi(Measurement{1,j},Measurementcolumn{jj})
Measurement_column_num(j) = jj;%Parameter所在列
break;
else
Measurement_column_num(j) = 0;
end
end
end
for ii = 1:Measurecolumn_num%找不到对应列名称时报错
if Measurement_column_num(ii) == 0
error('not find Measurementcolumn:%s',Measurementcolumn{ii});
end
end
对于Measurement来说,不需要特别处理。部分代码如下:
output_m_file = 'Model_Measurement.m';
fid = fopen(output_m_file,'wt');
for row = 2:Measurerow_num
if ~isnan(Measurement{row,Measurement_column_num(1)})
MeasurementName = Measurement{row,Measurement_column_num(1)};
MeasurementDataType = Measurement{row,Measurement_column_num(2)};
MeasurementInitialValue = Measurement{row,Measurement_column_num(3)};
MeasurementInitialValue = num2str(MeasurementInitialValue);
outputMeasurement_str = strcat(MeasurementName,' = ','Simulink.Signal',';\n');
fprintf(fid,outputMeasurement_str);
outputMeasurement_str = strcat(MeasurementName,'.CoderInfo.StorageClass',' = ','''ExportedGlobal''',';\n');
fprintf(fid,outputMeasurement_str);
outputMeasurement_str = strcat(MeasurementName,'.DataType',' = ','''',MeasurementDataType,'''',';\n');
fprintf(fid,outputMeasurement_str);
outputMeasurement_str = strcat(MeasurementName,'.InitialValue',' = ','''',MeasurementInitialValue,'''',';\n');
fprintf(fid,outputMeasurement_str);
fprintf(fid,'\n');
end
end
fclose(fid);
数字需要转为字符串,其他正常写入就好了。
MyMeasurement =Simulink.Signal;
MyMeasurement.CoderInfo.StorageClass ='ExportedGlobal';
MyMeasurement.Description ='this is my measurement';
MyMeasurement.DataType ='uint16';
MyMeasurement.Min =0;
MyMeasurement.Max =65535;
MyMeasurement.DocUnits ='mm';
MyMeasurement.Dimensions =1;
MyMeasurement.Complexity ='real';
MyMeasurement.InitialValue ='0';
MyMeasurement1 =Simulink.Signal;
MyMeasurement1.CoderInfo.StorageClass ='ExportedGlobal';
MyMeasurement1.Description ='this is my measurement1';
MyMeasurement1.DataType ='boolean';
MyMeasurement1.Min =0;
MyMeasurement1.Max =1;
MyMeasurement1.DocUnits ='

关于Excel管理Simulink标定量和观测量,基本的已经实现了。后面如果有扩展会继续加入。
此处引入一个新的问题,若是之前就已经做好了sldd,再手动建立excel也是十分费时间的,虽然说sldd也可以转m文件,但是仍需要推送到Excel中去管理。所以sldd转m文件后应该可以导入到excel中,得到我们期望格式的Excel。此处比较麻烦的仍然是标定量的一维表和二维表,为了改起来方便,需要按我们之前设定的Excel Map格式进行转换。有时间的话将在后面的文章中介绍。
若你觉得本文对你有帮助,欢迎点赞,关注,收藏,转发~~~
你的鼓励是对小弟的最大支持~~~
建了一个WX公众号,《汽车电子学习笔记》感兴趣可以关注一下~~~文章都会同步更新~