本帖最后由 Cello1995 于 2018-11-12 12:21 编辑
图形用户界面(Graphical User Interface,GUI)又称图形用户接口,是指采用图形方式显示的计算机操作用户界面。创建Matlab GUI界面通常有两种方式:一种是使用.m文件直接动态添加控件;另一种是使用GUIDE快速的可视化生成GUI界面。
电力系统瞬态数据交换通用格式(Common format for transient data exchange,COMTRADE)是IEEE为了解决数字故障录波装置、数字保护、微机测试装置之间的数据交换问题,于1991年提出、1999年修订和完善的一种公用的数据传输格式标准。该标准提供一种易于说明的数据交换通用格式,为不同厂家生产的设备所遵循。本文采用GUIDE方法创建Matlab GUI实现Comtrade格式录波数据显示。
首先,启动matlab,在命令窗口输入guide。
在弹出的窗口选择 Blank GUI。
随后弹出的窗口中,左侧是工具栏,可以拖拽;右侧是展示界面。
左侧工具栏控件按图中顺序依次为:
按钮 Push Button 滚动条 Slider
单选按钮 Radio Button 检查框 Checkbox
可编辑文本 Edit Text 静态文本 Static Text
弹出式菜单 Popup Menu 列表框 Listbox
切换按钮 Toggle Button 表格 Table
坐标 Axes 面板 Panel
按钮组 Button Group ActiveX控件
双击控件,在检查器中显示各控件的属性,其中常规属性有(以按钮控件为例):
在展示界面添加静态文本、坐标和按钮。
编辑静态文本为“Comtrade格式录波数据显示”;编辑坐标为“fig”;编辑按钮为“选择文件”。
进一步编辑按钮的事件响应Callback,单击图中红框内的按钮:
跳转到脚本guitest.m:
直接修改上图红框中的代码如下:
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
[t,data]= ComtradeRead();
%% 显示
axes(handles.fig); %打开fig的句柄
subplot(311)
plot(t,data(:,1),'r',t,data(:,2),'g',t,data(:,3),'b')
subplot(312)
plot(t,data(:,4),'k')
subplot(313)
plot(t,data(:,5),'r',t,data(:,6),'g',t,data(:,7),'b')
其中,[t,data]=ComtradeRead()源程序如下,相关代码已作注释:
function [t,data] = ComtradeRead()
%% 导入数据
[CFGFileName,PathName] = uigetfile('*.cfg','选择.CFG文件'); %打开.CFG文件
CFGPathFile = [PathName CFGFileName]; %读取.CFG文件路径和名称
DatFileName = [CFGFileName(:,1:length(CFGFileName)-4) '.dat']; %获得.DAT文件名称
DATPathFile = [PathName DatFileName]; %获得.DAT文件路径
%% 读取配置文件
CFGid = fopen(CFGPathFile);
CFG = textscan(CFGid,'%s','delimiter','\n');
fclose(CFGid);
CFG_len = length(CFG{1,1});
CFG_str = cell(size(CFG{1,1}));
for i = 1:CFG_len
temp_str = char(CFG{1,1}{i});
CFG_str{i}=textscan(temp_str,'%s','delimiter',',');
end
% 通道数目
No_Ch = str2double(cell2mat(CFG_str{2,1}{1,1}(1)));
Ana_Ch = CFG_str{2,1}{1,1}{2,1};
Ana_Ch(length(Ana_Ch)) = [];
Ana_Ch = str2double(Ana_Ch);
Dig_Ch = CFG_str{2,1}{1,1}{3,1};
Dig_Ch(length(Dig_Ch)) = [];
Dig_Ch = str2double(Dig_Ch);
% 采样频率
samp_rate = textscan(cell2mat(CFG_str{5+No_Ch,1}{1,1}(1)),'%f');
samp_rate = samp_rate{1,1};
% 数据长度
dat_len = textscan(cell2mat(CFG_str{5+No_Ch,1}{1,1}(2)),'%f');
dat_len = dat_len{1,1};
% 存储格式
format=char(CFG_str{8+No_Ch,1}{1,1}(1));
%% 读取数据文件
DAT_id = fopen(DATPathFile);
algdat = zeros(dat_len,Ana_Ch+2);
num = zeros(dat_len,1);
time = zeros(dat_len,1);
if strcmpi(format, 'BINARY')
for i = 1:dat_len
num(i) = fread(DAT_id,1,'int32');
time(i) = fread(DAT_id,1,'int32');
row_array = fread(DAT_id,Ana_Ch+ceil(Dig_Ch/16),'int16');
for j=3:Ana_Ch+2
algdat(i,j) = row_array(j-2);
end
end
algdat(:,1) = num;
algdat(:,2) = time;
else
DAT = textscan(DAT_id, '%s', 'delimiter', '\n');
for i = 1:dat_len
DAT_str = textscan(char(DAT{1,:}(i)), '%n', 'delimiter', ',');
for j=1:Ana_Ch+2
algdat(i,j) = dat_string(j);
end
end
end
fclose(DAT_id);
t = algdat(:,2)./1000;
%% 获得最终数据
data = zeros(dat_len, Ana_Ch);
for i = 1:Ana_Ch
j = i+2;
var_string = strcat('Ch',char((CFG_str{j,1}{1,1}{1,1})));
multiplier = str2double(CFG_str{j,1}{1,1}{6,1});
offset = str2double(CFG_str{j,1}{1,1}{7,1});
data(:,i) = algdat(:,i+2)*multiplier+offset;
end
end
单击开始按钮,运行GUI。
选择相应的.cfg文件,运行结果如下: