前言
事情是这样的,前几天在做电机故障诊断的时候,需要做simulink模型中一个模块参数多次改变后,导出模型的输出,并画出输出和参数变化的关系图。于是想着能不能编写一个程序,自动改变仿真模块的参数,将输出导入到excel表格,并画出输出和参数关系图。下面来介绍一下里面的基本知识以及这个程序
一、如何改变simulink其中一个模块的参数
您可以使用具有以下输入参量的 set_param 函数来设置模块参数的值:
1.模块句柄或包括模块名称的完整模块路径,例如 ‘myModel/mySubsystem/myblock’
2.参数名称
3.要赋给参数的新值
在此示例中,您设置由名为 duanludianjizaixian模型 的 step 模块中的终值(After)参数。
该模块位于 duanludianjizaixian 模型的 DFIG Wind Turbine/故障电机模型 的子系统中。
终值参数存储在After中,我们设置的值是0.05
打开仿真后左上角就是需要改变的模块的地址,这里我们改变左下角的step模块
只要把鼠标放到要改变的参数上就能知道它的名字
可以使用如下代码:
path = 'duanludianjizaixian/DFIG Wind Turbine/故障电机模型/Step';%要设置的simulink模型里面相应模块的地址
h = getSimulinkBlockHandle(path,true);
set_param(h,'After','0.05');%要设置模块的参数名称,设置成m
二、将simulink输出导入到工作区
有两种方法,第一种是将输出连接到to workspace模块,点击模块可以设置名称和数据类型,这里的数据类型我选择带有时间的结构体
第二种是点击scope示波器后点击左上角的配置属性/记录,点击记录数据到工作区,可以改变变量名称,保存格式我选择带时间的结构体。
运行仿真后会在工作区出现对应名字的变量,但也要注意,如果需要变量里面对应的数据,需要看好数据存放的地方
这里的zhengxuD2.signals.values就是数据的位置
三、将matlab工作区变量存入到excel表格中
这里要用到readmatrix和writematrix函数
readmatrix语法
A = readmatrix(filename)
A = readmatrix(filename,opts)
A = readmatrix(___,Name,Value)
这里我用的是第一个语法,其他两个就不介绍了。
filename是要读取的文件的名称,指定为字符向量或字符串标量。也可以用地址,如果该文件不在当前文件夹或 MATLAB 路径下的文件夹中,则在 filename 中指定完整或相对路径名。
例如:‘C:\myFolder\myFile.xlsx’
例如:‘dataDir\myFile.txt’
writematrix语法
writematrix(A)
writematrix(A,filename)
writematrix(___,Name,Value)
filename是要读取的文件的名称,指定为字符向量或字符串标量。也可以用地址,如果该文件不在当前文件夹或 MATLAB 路径下的文件夹中,则在 filename 中指定完整或相对路径名。
示例:‘C:\myFolder\myTextFile.csv’
示例:‘myFolder\myExcelFile.xlsx’
这里我因为要将不同模块参数时的输出导入到表格中,所以需要多个表格,我创建了一个矩阵存储五个表格的地址,然后再写入或读取相应的表格地址就好了
fileList = ["D:\matlab\读研数据\特征量数值1.xlsx", "D:\matlab\读研数据\特征量数值2.xlsx", "D:\matlab\读研数据\特征量数值3.xlsx", ...
"D:\matlab\读研数据\特征量数值4.xlsx", "D:\matlab\读研数据\特征量数值5.xlsx"]; % Excel文件列表
writematrix(out1,fileList(i));%将相应数据写到excel表格中
M = readmatrix(fileList(q));%读取表格数据
四、整体思路和代码
要实现自动改变仿真模块的参数,将输出导入到excel表格,并画出输出和参数关系图。
首先创建一个array矩阵存储需要的参数值,还有一个矩阵存储需要导入的excel表格的地址,然后使用for循环语句,将每个参数值对应的模型输出(这里我选择了最后100个数据)存储到对应的表格中。再使用一个for循环语句,不断读取五个表格中的值到M矩阵中,计算均值,最后得到的M矩阵是含有5个数(每个参数对应的输出均值)的矩阵。画出M矩阵和array矩阵的关系图。
整体代码如下:
clc
clear
array = [0.02 0.04 0.06 0.08 0.1];%要设置的参数值
n = numel(array);
fileList = ["D:\matlab\读研数据\特征量数值1.xlsx", "D:\matlab\读研数据\特征量数值2.xlsx", "D:\matlab\读研数据\特征量数值3.xlsx", ...
"D:\matlab\读研数据\特征量数值4.xlsx", "D:\matlab\读研数据\特征量数值5.xlsx"]; % Excel文件列表
for i = 1:n
m = array(i);
path = 'duanludianjizaixian/DFIG Wind Turbine/故障电机模型/Step';%要设置的simulink模型里面相应模块的地址
h = getSimulinkBlockHandle(path,true);
set_param(h,'After','m');%要设置模块的参数名称,设置成m
sim('duanludianjizaixian');
out1 = zhengxuD2.signals.values(end-99:end);%在模型输出上加上to workspace模块后,取传输到工作区变量的最后100个数据,其中zhengxuD是to workspace模块的名称
writematrix(out1,fileList(i));%将相应数据写到excel表格中
end
tezhengliang = [];
for q = 1:n
M = readmatrix(fileList(q));%读取表格数据
junzhi = mean(M(:));%取均值
tezhengliang(q) = junzhi;%将0.02 0.04 0.06 0.08 0.1对应输出的均值输入到矩阵中
end
plot(array,tezhengliang);