如何利用Matlab對Comtrade99格式的故障錄波文件進行數據讀取

如何利用Matlab對Comtrade99格式的故障錄波文件進行數據讀取

近來看了幾個採用Matlab對標準故障錄波數據進行讀取的例子,自己參照着動手實踐了下,發現有些問題,現在記錄下來以備大家參考。
圖形用戶界面(Graphical User Interface,GUI)又稱圖形用戶接口,是指採用圖形方式顯示的計算機操作用戶界面。創建Matlab GUI界面通常有兩種方式:一種是使用.m文件直接動態添加控件;另一種是使用GUIDE快速的可視化生成GUI界面。
電力系統瞬態數據交換通用格式(Common format for transient data exchange,COMTRADE)是IEEE爲了解決數字故障錄波裝置、數字保護、微機測試裝置之間的數據交換問題,於1991年提出、1999年修訂和完善的一種公用的數據傳輸格式標準。該標準提供一種易於說明的數據交換通用格式,爲不同廠家生產的設備所遵循。本文采用GUIDE方法創建Matlab GUI實現Comtrade格式錄波數據顯示。

1.準備資料:
matlab 就不用我說了,另外一個就是要下載 COMTRADE reader.m
或者 閱讀 基於Matlab GUI的Comtrade格式錄波數據顯示
具體實現方法也是《基於Matlab GUI的Comtrade格式錄波數據顯示》來操作的,但是將其細化了。現在展示給大家供大家參考和借鑑。具體代碼和文件我都有鏈接,文章末尾將上傳,因第一次上傳文章,所以要積分的哈。
2.具體實現步驟:
首先,啓動matlab,在命令窗口輸入guide。
輸入guide

在彈出的窗口選擇 Blank GUI。
新建GUI工程
這裏要勾選 Save new figure as,並將其命名爲guitest.fig文件。後面將會調用該文件。

隨後彈出的窗口中,左側是工具欄,可以拖拽;右側是展示界面。
添加靜態文本、座標和按鈕

左側工具欄控件按圖中順序依次爲:

按鈕 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:
在這裏插入圖片描述
在跳轉到的77行 修改代碼如上圖所示。
增加的代碼爲:
[t,data]= ComtradeRead(); %% 顯示
axes(handles.fig); %打開fig的句柄
subplot(3,1,1)
plot(t,data(:,1),‘r’,t,data(:,2),‘g’,t,data(:,3),‘b’)
subplot(3,1,2)
plot(t,data(:,4),‘k’)
subplot(3,1,3)
plot(t,data(:,5),‘r’,t,data(:,6),‘g’,t,data(:,7),‘b’)

% read_comtrade();%讀取dat文件是ACII碼時用到

這裏需要特別說明的是:
ComtradeRead()函數是從《基於Matlab GUI的Comtrade格式錄波數據顯示》中給出的源代碼,需要拷貝下面的代碼並保存爲ComtradeRead.m文件。[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

保存上述的修改,然後在Matlab同一文件目錄下 確保有guitest.fig 、guitest.m、ComtradeRead.m文件。回到guitest.fig界面,點擊綠色的三角形 開始按鈕,運行GUI。
運行GUI
單擊“選擇文件” 按鈕,選擇路徑,導入 *.cfg 和 *.dat 所在的目錄,選擇cfg文件打開。
打開Comtrade99格式文件
以上就是完成了Comtrade 文件在matlab中的顯示和讀取。 各相通道數據保存在data 中。
值得注意的是,上述文件只能打開 dat文件以binary 二進制數保存的文件。如果要打開dat文件是以ASCII 保存的文件,則需要進行修改。
1.ComtradeRead.m 文件中缺少dat_string()函數。具體怎麼實現,後續文章再跟進。

2.利用read_comtrade()函數實現。
修改腳本guitest.m 中第77行 function pushbutton1_Callback(hObject, eventdata, handles) 的定義
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(3,1,1)
% plot(t,data(:,1),‘r’,t,data(:,2),‘g’,t,data(:,3),‘b’)
% subplot(3,1,2)
% plot(t,data(:,4),‘k’)
% subplot(3,1,3)
% plot(t,data(:,5),‘r’,t,data(:,6),‘g’,t,data(:,7),‘b’)

read_comtrade();%讀取dat文件是ACII碼時用到
保存後,拷貝read_comtrade.m 到guitest.m 文件所在目錄。 點擊 運行 按鍵,打開 *.cfg 和 *.dat 所在的目錄和文件
,會彈出一個選擇界面
選擇 ALL Channels
運行結果如下:
運行結果

以上就是整個的運行結果,後續將奉上對其數據進行數據處理的詳細過程和代碼。
爲了方便大家,我將所有源碼進行了打包,方便大家對其結果進行驗證測試。不過需要收取一定積分,盡請諒解。
附件: 本文源代碼 Matlab讀取Comtrade數據並顯示

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章