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


    前言

    在之前的一篇关于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';
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    主要的参数如下:

    MeasureName:观测量名

    StorageClass:存储类,都设置为ExportedGlobal,即全局变量

    DataType:数据类型

    Min:最小值,在A2L导入标定工具测量时会有影响

    Max:最大值,在A2L导入标定工具测量时会有影响

    DocUnits:单位

    Dimensions:维度,如果测量的是多个数据,需要设定该值
    Complexity:实数or虚数,基本都是实数

    Description:描述信息

    Excel表格式

    以单个观测量和数组观测量为例,设定参数如上图所示。

    观测量暂时没有用到多维的,初始值也按一个值处理。

    maltab脚本解析Excel信息

    解析观测量参数所在列

    与标定量类似,先找到观测量参数所在列

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    循环写Measurement参数信息

    对于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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    数字需要转为字符串,其他正常写入就好了。

    生成的m文件

    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 ='
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    运行m文件后生成的Measurement

    总结

    关于Excel管理Simulink标定量和观测量,基本的已经实现了。后面如果有扩展会继续加入。

    此处引入一个新的问题,若是之前就已经做好了sldd,再手动建立excel也是十分费时间的,虽然说sldd也可以转m文件,但是仍需要推送到Excel中去管理。所以sldd转m文件后应该可以导入到excel中,得到我们期望格式的Excel。此处比较麻烦的仍然是标定量的一维表和二维表,为了改起来方便,需要按我们之前设定的Excel Map格式进行转换。有时间的话将在后面的文章中介绍。


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

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

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

  • 相关阅读:
    “互动+消费”时代,借助华为云GaussDB重构新零售中消费逻辑
    一些好玩的小游戏
    2021-01-01 - Review代码过程感悟
    Numpy学习笔记
    【数据结构与算法】时间复杂度和空间复杂度
    Nacos 2.1.1 正式发布
    Python 学习 Day39
    pytest自动化框架运行全局配置文件pytest.ini
    Mysql存储过程与存储函数
    docker入门到精通一文搞定
  • 原文地址:https://blog.csdn.net/weixin_49000276/article/details/126317164