Excel管理Simulink SWC中的标定量与观测量之标定量

前言

在基于Simulink的模型开发中,对于标定量和观测量的管理大部分都是通过.sldd的数据字典。但对于数据字典来说,创建,修改变量都不是很方便,特别是在大的模型开发过程中,标定量和观测量可能成千上万个。所以,引入Excel来管理标定量和观测量是非常有必要的。

标定量的格式

通过Simulink手动建立一个Paramter,主要参数界面如下:

导出m文件的格式如下:

MyPortParam = mypackage.Parameter;
MyPortParam.Value = [0 300 600 900 1200 1500 1800];
MyPortParam.CoderInfo.StorageClass = 'Custom';
MyPortParam.CoderInfo.Identifier = '';
MyPortParam.CoderInfo.Alignment = -1;
MyPortParam.CoderInfo.CustomStorageClass = 'mysc';
MyPortParam.CoderInfo.CustomAttributes.HeaderFile = '';
MyPortParam.CoderInfo.CustomAttributes.DefinitionFile = '';
MyPortParam.CoderInfo.CustomAttributes.Owner = '';
MyPortParam.Description = ['this is my description'];
MyPortParam.DataType = 'uint16';
MyPortParam.Min = 0;
MyPortParam.Max = 10000;
MyPortParam.DocUnits = 'mA';
MyPortParam.GenericProperty = [];
MyPortParam.DoubleProperty = 0;
MyPortParam.Int32Property = int32(0);
MyPortParam.LogicalProperty = false;
MyPortParam.CharProperty = '';
MyPortParam.OnOffCharProperty = 'off';
MyPortParam.ColorCharProperty = 'red';

主要的参数如下:

ParameterName:标定量名

Package:一般就是自定义的package或者Simulink package

Object:Parameter or Siganl

DataType:数据类型

Value:参数值,可能是数值,也可能是一维数组,也可能是二维数组,这个比较麻烦,需要特殊处理

Min:最小值,在A2L导入标定工具标定时会有影响
Max:最大值,在A2L导入标定工具标定时会有影响
Unit:单位
Dimensions:维度,根据实际输入的value来的,可以不用填
StrorageClass:自定义的存储类,在生成标定量时会添加#pragam宏
Description:描述信息

Excel表格式

以三个标定量为例,一个为二维数组,一个为一维数组,一个为常量

建立了两个sheet,一个为Caliration,一个为MapData,将标定量为数组的value链接到对应的MapData表中的数据上

MapData表

设置链接属性

在参数名上右键,选择定义名称


新建好名称后,在Caliration中可以新建超链接

定义超链接

在Caliration value处右键新建一个超链接,链接到之前定义的对应名称上


以上,关于Paramter的Excel表格的格式就建立好了。下面需要解析Excel表中的内容到matlab中的.m文件中

maltab脚本解析Excel信息

解析Parameter所在列

考虑兼容性,先查找对应参数所在的列,这样的话在列位置改变后仍然可以获取正确的信息。

Parametercolumn = {'ParameterName','ParameterPort','DataElement','SwCalibrationAccess',...
    'DisplayFormat','Package','Object','DataType','Value','Min','Max','Unit','Dimensions',...
   'StrorageClass', 'Description'};
        column_num = size(Parameter,2);%获取列数
        row_num = size(Parameter,1);%获取行数
        %获取参数在表中的列数
        for j = 1:column_num
            for jj = 1:length(Parametercolumn)
                if strcmpi(Parameter{1,j},Parametercolumn{jj})
                    Parameter_column_num(j) = jj;%Parameter所在列
                    break;
                else
                    Parameter_column_num(j) = 0;
                end 
                
            end
        end
        for ii = 1:column_num%找不到对应列名称时报错
            if Parameter_column_num(ii) == 0
                    error('not find Parametercolumn:%s',Parametercolumn{ii});
            end
        end

解析MapData

思路是通过Paramter名来查找,数据在Paramter名的下一行。

优先找到Paramter个数,然后循环查找Value。**注意:**最后一个参数需要特殊处理,其他按位置赋值就好了。

[~,~,Mapdata]  = xlsread(Excel_Name,Sheet_Cell{ii})%获取map表中的信息
        MapDatacolumn_num = size(Mapdata,2);%获取列数
        MapDatarow_num = size(Mapdata,1);%获取行数
        for i = 1:MapDatarow_num
            if isnumeric(Mapdata{i,1}) == 0 & ~isnan(Mapdata{i,1})
               MapDataNamerow(i) = i;
            end
        end
        MapDataNamerow(find(MapDataNamerow==0))=[];%去除数组中为0的元素
         for i=1:length(MapDataNamerow)
             if i==length(MapDataNamerow)%最后一个需要特殊处理
                 MapDataName{i}  = Mapdata{MapDataNamerow(i),1};
                 MapDataValue{i,1} = Mapdata(MapDataNamerow(i)+1:end,1:end);
             else
             MapDataName{i}  = Mapdata{MapDataNamerow(i),1};%获取名称
             MapDataValue{i,1} = Mapdata(MapDataNamerow(i)+1:MapDataNamerow(i+1)-2,1:end);%获取数组
             end 
         end

循环写Paramter

Value参数需要特殊处理,其他正常转换就好了。目前只判断参数名和Value不为空时就可以写。部分代码如下:

output_m_file = 'Model_parameter.m';
        fid = fopen(output_m_file,'wt');
for row = 2:row_num 
            if ~isnan(Parameter{row,Parameter_column_num(1)}) &  ~isnan(Parameter{row,Parameter_column_num(9)})
                ParameterName = Parameter{row,Parameter_column_num(1)};
                ParameterPackage = Parameter{row,Parameter_column_num(6)};
                ParameterObject = Parameter{row,Parameter_column_num(7)};
                ParameterPackageObject = strcat(ParameterPackage,'.',ParameterObject);
                ParameterDataType = Parameter{row,Parameter_column_num(8)};
                if isnumeric(Parameter{row,Parameter_column_num(9)}) == 1%判断输入是否为数值
                    ParameterValue = Parameter{row,Parameter_column_num(9)};
                    ParameterValue_str = num2str(ParameterValue);%转为字符串
                else
                    for ii = 1:length(MapDataName)
                        if strcmp(MapDataName{ii},ParameterName)
                            ParameterValue = MapDataValue{ii,1};
                            
                            if size(ParameterValue,1)>1
                                for i = 1:size(ParameterValue,1)
                                    ParameterValueS=cell2mat(ParameterValue(i,:));%cell转为数组
                                    
                                    ParameterValueS=ParameterValueS(~isnan(ParameterValueS))%去除NaN
                                    ParameterValue_str = num2str(ParameterValueS);%转为字符串
                                    if i == 1
                                        ParameterValue_allstr = strcat('[...\n',ParameterValue_str,';\n');
                                    elseif i == size(ParameterValue,1)
                                        ParameterValue_allstr = strcat(ParameterValue_allstr,ParameterValue_str,']');
                                    else
                                        ParameterValue_allstr = strcat(ParameterValue_allstr,ParameterValue_str,';\n');
                                    end
                                end  
                                ParameterValue_str = ParameterValue_allstr;
                            else
                                ParameterValue=cell2mat(ParameterValue);%cell转为数组
                                ParameterValue=ParameterValue(~isnan(ParameterValue))%去除NaN
                                ParameterValue_str = num2str(ParameterValue);%转为字符串
                                ParameterValue_str = strcat('[',ParameterValue_str,']');
                            end
                        end
                    end
                end
 
                
                outputParameter_str = strcat(ParameterName,' = ',ParameterPackageObject,';\n');
                fprintf(fid,outputParameter_str);
                outputParameter_str = strcat(ParameterName,'.Value',' = ',ParameterValue_str,';\n');
                fprintf(fid,outputParameter_str);
            end
        end

对一维和二维数组需要特殊处理,具体可以参考上面的代码。

生成的m文件

% --------------------------------------------
%Auto Generated at:2022-07-17 10:25:27
%----------------Designed by Zan--------------%
%----------------Version : V101---------------%
%--------------------------------------------- 

MyPortParam =mypackage.Parameter;
MyPortParam.Value =[...
-155 -120  -85  -80  -75  -60  -55  -40  -35   30  195  205  475  565  575  665  600  735;
-1505 -1185  -840  -760  -670  -565  -510  -470  -380   355  1130  2290  4060  5055  5310  5470  6350  7230;
-1460 -1090  -725  -640  -555  -455  -405  -365  -295   345  1095  2170  3385  3795  4015  4245  5235  6220;
-1310  -965  -620  -535  -445  -350  -305  -270  -195   335  1065  1665  2270  2575  2830  3085  4070  5055;
-1240  -875  -510  -420  -325  -230  -185  -155   -85   220   470   530   770  1205  1565  1905  3040  4180;
-1120  -785  -455  -365  -280  -200  -165  -135   -75    95   135   195   340   645   960  1255  2390  3525;
-1135  -775  -415  -340  -260  -190  -160  -130   -70    90   130   190   300   510   735   970  1960  2950];
MyPortParam.CoderInfo.StorageClass ='Custom';
MyPortParam.CoderInfo.CustomStorageClass ='mysc';
MyPortParam.Description ='test parameter';
MyPortParam.DataType ='int16';
MyPortParam.Min =-32768;
MyPortParam.Max =32767;
MyPortParam.DocUnits ='N';

MyPortParam1 =mypackage.Parameter;
MyPortParam1.Value =[1800  1500  1200   900   600   300   100     0];
MyPortParam1.CoderInfo.StorageClass ='Custom';
MyPortParam1.CoderInfo.CustomStorageClass ='mysc';
MyPortParam1.Description ='test parameter2';
MyPortParam1.DataType ='uint16';
MyPortParam1.Min =0;
MyPortParam1.Max =5000;
MyPortParam1.DocUnits ='mA';

MyPortParam3 =mypackage.Parameter;
MyPortParam3.Value =22;
MyPortParam3.CoderInfo.StorageClass ='Custom';
MyPortParam3.CoderInfo.CustomStorageClass ='mysc';
MyPortParam3.Description ='test parameter3';
MyPortParam3.DataType ='uint8';
MyPortParam3.Min =0;
MyPortParam3.Max =255;
MyPortParam3.DocUnits ='';

运行m文件后生成的Paramter


注意:如果需要生成的是mypackage类型的Parameter,请确保已经建立了对应的mypackage,否则请选择Simulink Parameter,不然的话运行m文件会报错。

用到的函数记录

size

size-获取二维数组的大小

size(A,1)-获取行数

size(A,2)-获取列数

strcmpi

比较两个字符串是否相等,相等时为1,否则为0,带i的是不区分大小写,不带i的是区分大小写

error

报错到命令行,error(‘message’);和输出printf一样,可以加入占位符

isnumeric

判断输入是否为数字,1为真,0为假

isnan

判断输入是否为NaN,1为真,0为假

find

通过find函数去除数组中非0的元素
MapDataNamerow(find(MapDataNamerow==0))=[];

strcat

拼接字符串,第一个参数为输入的字符串,后面跟的为需要拼接的字符串

num2str

数值转字符串

去除NaN

ParameterValueS=ParameterValueS(~isnan(ParameterValueS))%去除NaN

fopen

打开文件,若文件不存在,则创建文件,wt,可读可写,r,可读。返回值为文件句柄

cell2mat

cell转数组

fprintf

向文件中写入数据,第一个参数为文件句柄,后面为需要写入的内容

若你觉得本文对你有帮助,欢迎点赞,关注,收藏,转发~~~

你的鼓励是对小弟的最大支持~~~

建了一个WX公众号,《汽车电子学习笔记》感兴趣可以关注一下~~~文章都会同步更新~

  • 6
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: AUTOSAR是一种用于汽车软件架构的标准化框架,而Simulink则是一种广泛使用的建模和仿真工具。在AUTOSAR,软件组件(SWC)是实现特定功能的模块。使用AUTOSAR Simulink工具包可以简化SWC的建模工作。该工具包提供了一个AUTOSAR库,可以直接在Simulink创建AUTOSAR软件组件模型。 建模过程可以从创建一个新的Simulink模型开始,然后导入AUTOSAR库。根据需要选择合适的SWC类型、接口和端口,并将它们与Simulink模型的信号和模块连接起来。在工具包还可以定义系统架构、描述接口以及配置代码生成选项等。AUTOSAR工具包还可以自动生成AUTOSAR组件描述文件(ARXML),该文件描述了组件的结构、接口和端口,并且可以用于之后的代码生成。 需要注意的是,在建模过程需要遵守AUTOSAR的规范和要求,例如使用正确的模块命名、实现正确的接口协议等。同时,还需要设计测试用例来验证模型的正确性和功能。 总之,使用AUTOSAR Simulink工具包可以加速AUTOSAR软件组件的建模,提高开发效率和代码质。 ### 回答2: Autosar 是一个面向于汽车电子系统的开放标准,它主要通过定义标准化的接口和架构,来提高汽车电子系统的可靠性和可扩展性。 在 Autosar 标准Simulink SWC 建模是非常重要的一部分。SWC 是软件构件的缩写,也就是软件单元。在 Simulink ,每个模块都可以作为一个 SWC 进行建模。Simulink SWC 建模主要包括以下几个方面的内容: 1. SWC 架构设计。根据 Autosar 标准的规范,设计 SWC 架构,包括定义每个 SWC 的输入输出端口,以及 SWC 之间的通讯方式等。 2. SWC 接口设计。定义每个 SWC 需要实现的接口,包括输入输出接口和服务接口。对于每个接口,需要说明它的数据类型,访问方式和返回值等。 3. SWC 建模。在 Simulink ,对每个 SWC 进行建模,包括编写相应的模块代码和控制逻辑,并实现 SWC 的输入输出接口。 4. 集成测试。将各个 SWC 集成在一起,进行联合测试,确保各个 SWC 之间的通讯和数据交互正常。 总之,Autosar Simulink SWC 建模是在 Autosar 标准下进行软件单元建模和集成测试的一种重要方式。它可以提高汽车电子系统的可靠性和可扩展性,为汽车电子系统的开发提供了良好的支持。 ### 回答3: Autosar 是一种标准化的软件架构,用于开发汽车电子系统。在 Autosar ,许多软件组件(SWC)被设计为独立的模块,通常以 Simulink 建模。这种建模方法允许工程师以图形方式设计和模拟 SWC,从而快速轻松地进行系统开发、测试和验证。 建模时,需定义Autosar构造元素,例如端口、组件命名空间等,并创建模型组(Model组),将自己创建的swc放入模型组。 建模时应格外注意以下方面: 1. SWC 的接口定义应与 Autosar 架构一致,必须使用与架构一致的端口,以确保与其他 SWC 可以交互。 2. Autosar 架构需要的元素必须在模型明确定义,例如运行时参数、事件的监听器、模拟器等。 3. SWC 的实现需要满足 Autosar 的标准,例如通过标准化的接口实现 Application 和 Basic Software 之间的通信。 由于 Autosar Simulink SWC 建模简单、易用、可视化程度高等特点,逐渐成为当前汽车电子系统开发的主流方法,能够帮助开发人员快速、准确、高效地开发出高质的自动驾驶系统和其他汽车电子系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赞哥哥s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值