• 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公众号,《汽车电子学习笔记》感兴趣可以关注一下~~~文章都会同步更新~

  • 相关阅读:
    【后端学习笔记·Golang】邮箱邮件验证
    Linux篇13动静态库
    CSP-J 2023 T3 一元二次方程 解题报告
    干货分享 | TSMaster几种过滤器的对比及使用
    【Qt系列】QtableWidget表格列宽自适应表格大小
    echarts案例之日历
    hbuiderx基于安卓app运动员体能综合分析训练系统 微信小程序
    jetCache 缓存框架讲解、SpringBoot 整合 jetCache 代码示例、本地缓存、远程缓存讲解
    [附源码]java毕业设计基于JAVAWEB医院挂号系统
    解决Zotero不显示标签的问题
  • 原文地址:https://blog.csdn.net/weixin_49000276/article/details/126317164