如何把PSCAD的仿真数据导到matlab中?自己写了一个matlab小程序。数据可以保存在硬盘里,想提取哪个就提取哪个,想什么时候提取就什么时候提取,还可以大批量一次性搞定。
今天分享出来,欢迎各位提出改进意见!

用到的函数

  1. 打开和关闭文件
    filename=‘D:\simulation\pscad\1’;
    fid=fopen(filename)

    fclose(fid);

  2. 查找数据
    文件扫描——textscan()
    c1=textscan(fid,’%*s%s%*s%*s%*s%s%*s%*s%*s%n%s%s%[^\n]’,‘delimiter’,’"’,‘headerlines’,6);

  3. 格式转换
    数字转换为字符串——num2str()
    num2str(n,1)
    数字转换为元胞——num2cell()
    num2cell(i+n-1,1)
    字符串转换为浮点数——str2double()
    str2double(sequence{k(i)})+1

  4. 字符串操作
    字符串连接——strcat()
    strcat(name_pro(n2),’_’, num1)
    字符串比较——strcmp()
    strcmp(name{i},str_find)

  5. 数据处理
    取余——rem()
    rem(i-1,10)

思路

首先,需要在PSCAD中开启数据记录,并设置一个保存名称,例如data.out。在仿真中对自己想要采集的数据设置相应的output channel。例如

只有设置了输出通道output channel的数据才能被采集下来,注意一下所采集数据的维度,最好是单维度的,这个原因在后面会讲。

之后,每次运行结束后,PSCAD会在project文件所在的文件夹下生成一个后缀为.gf42的文件夹,如下图所示。仿真过程中记录的数据就保存在这个文件夹里。下次运行时生成的新的.gf42的文件夹会覆盖旧的文件,所以注意重命名。

gf42文件夹里的内容如下所示:

文件夹里的.out文件就是数据了。用记事本可以打开.out文件,但是打开后发现里面一堆的数据,数了数一共11列,第一列是时间序列。而像这样的文件可能有几十个。
那么问题来了,如何知道想找的数据在哪里呢?

好在,后缀为.infx的文档是一个关于数据内容的菜单


经过验证,之前的.out文件中的数据与infx文件中的名称可以一一对应。
这下,有了名称、序列以及相应的数据,剩下的就是找到想要的数据,并把它们分别提取出来。

步骤

1. 从.infx文件中提取出需要的数据

我们需要的数据包括次序,名称以及维度。
利用textscan()函数可以从txt文件中提取出数据。

fid = fopen(filename);  %先打开文件,filename是.infx文件的地址
c1=textscan(fid,'%*s%s%*s%*s%*s%s%*s%*s%*s%n%*s%s%*[^\n]','delimiter','"','headerlines',6);
fclose(fid);
sequence=c1{1};
name=c1{2};
dim=c1{3};
unit=c1{4};

采用" " "作为分隔符,前6行不是我们需要的,因此要跳过。采集出来后分别存好。

2. 处理多维数据

有了名单,找到相应的数据就好办了。例如,我们要找的是数据A,我们可以从之前提取的名单里面找到A的次序编号,然后再根据一个文件里一共有11列,就能算出编号所在的是第几个文件夹里的第几列了。
然而,实际操作发现,有的数据维度是多维的,例如有的电流是三相的,三列数据共同用一个名字。这种情况下,使用之前的序列编号直接计算地址就会出错了。这时当初提取出来的维度数据就有用了。
根据维度数据,可以将实际的各个变量数据的编号计算出来,还可以顺便给它们分别命好名字。(当然,也可以从根源上解决,确保仿真的数据都是单维的)

sequence_pro=cell(sum0,1); %序号也要重新定义
i=1 ;     %数据的个数
n=1;      %多维数据里的次序
x=1 ;     %循环的次数
%由于很多数据是多维的且没有相应的名字,所以要利用维度这个数据对多维的数据重新起名字
%就是在多维的数据的名字后面加上序号
for x=1:size(dim,1)num=dim(x);         %根据维度进行判断if num>1           %如果该数据的维度不为1for n=1:num     %从1到最大的维度进行循环num1=num2str(n,1); %将该序号转为字符格式,为拼接作准备name_pro(i+n-1)=strcat(name(x),'_',num1); %在名字后面加上序号,表示多维数据内容sequence_pro(i+n-1)=num2cell(i+n-1,1);    %将序列补充完整endelseif num<1      %这里发现结尾的维度数据有0出现,当出现0时,说明已经处理完了breakelsename_pro(i)=name(x); %如果是单维的数据就直接按照之前的名字命名即可sequence_pro(i)=num2cell(i,1);  %序号也是一样endi=i+num;   %数据的个数加上维度数目x=x+1 ;    %当前名字的数据的个数已经处理完,进行下一个名字的操作
end

处理完多维数据的问题,就可以准确定位数据了。

3. 定位并提取数据

搜索名称->记录序列编号->计算所在文件夹个数和数据列数->去相应的地址中提取。

line_name=cell(size(set,2),1); %将线的名称存在数组里
Data_base=ones(length(time),1)*nan;    %存储数据的矩阵预定义
%记录存储数据的数目
n3=1;str_find=set{1,fig_l};
%搜索所需要的数据
n=max(size(name));
k=ones(1,1)*nan;
for i=1:nif strcmp(name{i},str_find)  %从name数组中找相同名字的项[b]=i;    %i是name中的该项的位置k=[k,b];end
end
k(:,1)='';
if k(1,1)< 1    %这里想写一个错误处理,但是没成功,反正如果在这里报错,就看str_find,那个就是没找到的变量print='未找到数据!!!';pause;
end   %给没在一起的三相数据命名
if max(size(k))>1                                   %这里有一点不是很好,就是当数据被第二次使用时,依照这种方法就无法找到了,需要加上后缀才行for i=1:max(size(k))n2=str2double(sequence{k(i)})+1;num1=num2str(i);name_pro(n2)=strcat(name_pro(n2),'_',num1); %修改三相数据的名字end
end
%提取相应数据for u=1:max(size(k))                 % k有可能是三相数据,所以是数组n2=str2double(sequence{k(u)})+1;for i=n2:n2+dim(k(u))-1          %从维度开始的序号到维度结束的序号pick2=pick;                  %准备删除*号txtn=ceil(i/10);             %文件数是除以10再取整,ceil是向上取整column=rem(i-1,10)+1;        %列数是除以10再取余,这里i-1是因为当i=10时,取余为0,通过i-1再取余最后+1可以解决这个问题pick2(pin(column))='';       %删除*号,产生提取的格式fid=fopen(faddress{txtn});c1=textscan(fid,pick2,'headerlines',1);fclose(fid);a=c1{1};Data_base=[Data_base,a];                     %保存数据line_name(n3)=name_pro(i);   %保存相应数据的名称n3=n3+1;                     %数据数目累加end
end

4. 补充说明

data文件有多个,提取文档需要用到他们的地址,手动保存会很累,下面的程序可以自动生成他们的地址。

n=max(strfind(filename,'\'));
n1=max(strfind(filename,'.'));
freename=filename(n+1:n1-1);  %提取自定义的存储名
headad=filename(1:n);%提取后面要用到的地址头部,一直到数据文件名前的\
%下面的循环是为了通过拼接产生地址清单,为后面的提取数据作准备
for i=1:total            %循环次数为总的文件的个数,一个文件提取一次n=num2str(i);      %整数转换为字符串格式,为拼接作准备if i<10           %1-9的文件名下划线后面有0faddress_temp=strcat(headad,freename,'_0',n,'.out');  %拼接elsefaddress_temp=strcat(headad,freename,'_',n,'.out') ;  endfaddress(i)={faddress_temp};  %保存地址
end

程序内容

完整的程序内容如下。

%% PSCAD_data_manage.m%该程序可以提取所需要的PSCAD自动存储的数据%输入要提取的变量名称,可以参照.infx
set={'变量1','变量2','变量3','变量4'};%输入数据存储地址
filename='D:/simulation/1/';pick='%*f%*f%*f%*f%*f%*f%*f%*f%*f%*f%*f';
pin=[5 8 11 14 17 20 23 26 29 32];
n=max(strfind(filename,'\'));
n1=max(strfind(filename,'.'));
freename=filename(n+1:n1-1);  %提取自定义的存储名
headad=filename(1:n);%提取后面要用到的地址头部,一直到数据文件名前的\%提取数据的标题
fid = fopen(filename);
c1=textscan(fid,'%*s%s%*s%*s%*s%s%*s%*s%*s%n%*s%s%*[^\n]','delimiter','"','headerlines',6);
fclose(fid);
sequence=c1{1};
name=c1{2};
dim=c1{3};
unit=c1{4};i= ~isnan(dim);
dim=dim(i);                   %去掉里面的nan项,否则无法相加sum0=sum(dim(:));             %所有的数据条数
sum0=uint32(sum0);
name_pro=cell(sum0,1);     %预定义所有的名称数组空间
sequence_pro=cell(sum0,1); %序号也要重新定义
i=1 ;     %数据的个数
n=1;      %多维数据里的次序
x=1 ;     %循环的次数
%由于很多数据是多维的且没有相应的名字,所以要利用维度这个数据对多维的数据重新起名字
%就是在多维的数据的名字后面加上序号
for x=1:size(dim,1)num=dim(x);         %根据维度进行判断if num>1           %如果该数据的维度不为1for n=1:num     %从1到最大的维度进行循环num1=num2str(n,1); %将该序号转为字符格式,为拼接作准备name_pro(i+n-1)=strcat(name(x),'_',num1); %在名字后面加上序号,表示多维数据内容sequence_pro(i+n-1)=num2cell(i+n-1,1);    %将序列补充完整endelseif num<1      %这里发现结尾的维度数据有0出现,当出现0时,说明已经处理完了breakelsename_pro(i)=name(x); %如果是单维的数据就直接按照之前的名字命名即可sequence_pro(i)=num2cell(i,1);  %序号也是一样endi=i+num;   %数据的个数加上维度数目x=x+1 ;    %当前名字的数据的个数已经处理完,进行下一个名字的操作
endsum0=double(sum0);
%处理完标题,下面对具体数据的提取作准备
total=ceil(sum0/10);     %计算总的数据存档文件个数
faddress=cell(total,1);  %预定义文件的地址数组空间%下面的循环是为了通过拼接产生地址清单,为后面的提取数据作准备
for i=1:total            %循环次数为总的文件的个数,一个文件提取一次n=num2str(i);      %整数转换为字符串格式,为拼接作准备if i<10           %1-9的文件名下划线后面有0faddress_temp=strcat(headad,freename,'_0',n,'.out');  %拼接elsefaddress_temp=strcat(headad,freename,'_',n,'.out') ;  endfaddress(i)={faddress_temp};  %保存地址
end
fid = fopen(faddress{1});
c1=textscan(fid,'%f%*[^\n]','headerlines',1);
fclose(fid);
time=c1{1};%%%之前为预定义环节,之后才是具体的提取数据%设置一个矩阵,根据矩阵中的数字,就可以找到相应的数据名line_name=cell(size(set,2),1); %将线的名称存在数组里
Data_base=ones(length(time),1)*nan;    %存储数据的矩阵预定义
%记录存储数据的数目
n3=1;for fig_l=1:size(set,2)str_find=set{1,fig_l};%搜索所需要的数据n=max(size(name));k=ones(1,1)*nan;for i=1:nif strcmp(name{i},str_find)  %从name数组中找相同名字的项[b]=i;    %i是name中的该项的位置k=[k,b];endendk(:,1)='';if k(1,1)< 1        %想写错误处理,没成功,如果在这里报错,就看str_find,那个就是没找到的变量print='未找到数据!!!';pause;end   %给没在一起的三相数据命名if max(size(k))>1                                   %这里有一点不是很好,就是当数据被第二次使用时,依照这种方法就无法找到了,需要加上后缀才行for i=1:max(size(k))%             n2=str2num(sequence{k(i)})+1;               %要知道次序数组里的该位置对应的次序数才能知道该项的name_pro数组里的名字n2=str2double(sequence{k(i)})+1;num1=num2str(i);name_pro(n2)=strcat(name_pro(n2),'_',num1); %修改三相数据的名字endend %提取相应数据for u=1:max(size(k))                 % k有可能是三相数据,所以是数组%         n2=str2num(sequence{k(u)})+1;    %找到相应的包含有维度的数据在表格中的序列号n2=str2double(sequence{k(u)})+1;for i=n2:n2+dim(k(u))-1          %从维度开始的序号到维度结束的序号pick2=pick;                  %准备删除*号txtn=ceil(i/10);             %文件数是除以10再取整,ceil是向上取整column=rem(i-1,10)+1;        %列数是除以10再取余,这里i-1是因为当i=10时,取余为0,通过i-1再取余最后+1可以解决这个问题pick2(pin(column))='';       %删除*号,产生提取的格式%             [a]=textread(faddress{txtn},pick2,'delimiter',' ','headerlines',1);%提取数据fid=fopen(faddress{txtn});c1=textscan(fid,pick2,'headerlines',1);fclose(fid);a=c1{1};Data_base=[Data_base,a];                     %保存数据line_name(n3)=name_pro(i);   %保存相应数据的名称n3=n3+1;                     %数据数目累加endend
endData_base(:,1)='';                   %去掉空列

如果帮到了大家,点个赞再走呗~

pscad仿真数据提取方法相关推荐

  1. MATLAB中PS是什么意思,matlab与pscad的区别

    4.搭建PSCAD运行程序 ? 5.PSCAD图形用于其他文本 ? 6.利用MATLAB中的小波工具包对PSCAD仿 真结果进行分析 1.PSCAD简介 ? PSCAD/EMTDC是一种世界各国广泛. ...

  2. pscad与matlab接口,PSCAD/EMTDC与Matlab接口研究

    仿真是电力系统研究人员进行电力暂态分析的先进手段之一[1-2].近年来,出现了一些应用Matlab与电磁暂态软件联合编程的文献[3-4].这里介绍一款综合利用EMTDC[5-7]与Matlab[1,8 ...

  3. pscad c语言程序,pscad自定义元件.doc

    pscad自定义元件 在PSCAD中要实现新的算法,首先要建立一个自定义元件.自定义元件分为两种,一种是电气元件,一种是信号处理元件.本帖实现的内容是一个非线性电感,其电感值随着电流大小而变化,属于电 ...

  4. pscad 如何产生一个阶跃信号_在PSCAD中实现故障起始角控制及自动遍历的方法与流程...

    本发明属于电力系统故障仿真领域,具体涉及一种在PSCAD中实现故障起始角控制及自动遍历的方法. 背景技术: 在继电保护研究中,往往需要考虑不同故障起始角对算法的影响.故障起始角是指电力系统发生故障时, ...

  5. 从PSCAD中导出数据并绘图MATLAB程序

    方法一 1, PSCAD中右键对应项目"Project Setting" ,在Runtime选项卡下,选择Save channels to disk中的"Yes" ...

  6. 让机器“看见”:图像数据的特征提取方法

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:谢雨飞,趣头条算法工程师 图像特征主要有图像的颜色特征.纹理特征. ...

  7. 三维模型特征提取方法概述

    作者I 开拓者5号@CSDN 编辑I 3D视觉开发者社区 一.三维特征提取概述 三维特征提取是模式识别中最基本的研究内容之一,可以有效地缓解模式识别领域经常出现的"维数灾难"问题并 ...

  8. DF-SLAM:一种深度特征提取方法

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 标题:DF-SLAM: A Deep-Learning Enhanced Visual SLAM Sy ...

  9. 基于点云曲率的图像特征提取方法

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 引子 在无人驾驶领域,车子的实时精确定位是至关重要的.相机由于其成本低.体积小.视觉信息丰富,在无人驾 ...

  10. DNA提取方法对浮游生物群落研究结果的影响

    浮游生物是湖泊与水库生态系统的重要组成部分,在物质循环.污染物降解和水体自净等方面发挥基础和关键作用.浮游生物具有个体小.丰度高和极其复杂多样的特点,导致其难观测.难定量和难分析.长期以来,浮游生物群 ...

最新文章

  1. Sublime Text 3 插件的安装、升级和卸载
  2. 2014-12-27 迎接15年前夕,原来时间是这样过的
  3. 《转》程序员必须知道的10大基础实用算法及其讲解
  4. wordcloud用来制作中文词云
  5. 计算机软件技术基础fifo算法,软件技术基础真题
  6. 发表email所需要
  7. Linux编译和下载嵌入式实验,嵌入式实验6交叉编译及Linux简单程序设计实验
  8. Chrome浏览器扩展开发系列之十五:跨域访问的XMLHttpRequest对象
  9. 学习Java,真的可以月薪过万嘛?真实个人经历告诉你,记录了平时学习的内容以及学习过程中最真实的感受(五)
  10. python遍历文件夹内文件并检索文件中的中文内容
  11. 计算机专业拼音怎样写,拼音汉字计算机输入方法
  12. SpringBoot实现本地、网络文件下载、zip压缩包批量下载
  13. 《深入理解计算机系统(CSAPP)》—— 实验一 数据表示与运算实验
  14. 【绘制矩形】已知二维平面矩形的对角线两点坐标,如何确定四个点的坐标
  15. 如何将一个应用添加开机启动项
  16. 网络核心交换机和普通交换机有什么区别?
  17. python做飞机大战游戏_python实现飞机大战游戏
  18. 下载网页所有图片的最简单的方法
  19. Linux:命令gedit主要作用是什么?
  20. IC学习笔记——DRV8840

热门文章

  1. 3D数学基础----欧拉角
  2. 获取Adobe Flash 及Reader安装包
  3. php宿舍管理系统毕业论文,学生宿舍管理系统(源码+论文)
  4. 博士生“凡尔赛”大赏:全程靠自己发了篇SCI,导师发奖金拿到手软
  5. 机器人matlab仿真步骤,MATLAB机器人仿真程序.doc
  6. 通信原理matlab仿真教程 赵鸿图,通信原理MATLAB仿真教程中国通信学会普通高等教育“十二五”规划教材立项项目课件作者赵鸿图茅艳第8章节.ppt...
  7. linux英特尔蓝牙驱动,IntelBluetoothFirmware 英特尔蓝牙驱动
  8. oracle lgt,第 2 章 Fortran 95 内函数
  9. 电子设计大赛-仪器仪表类题目分析
  10. Unity3D lable控件