📄 fm_sim.m
字号:
function check_model = fm_sim% FM_SIM convert Simulink models into PSAT data files%% CHECK = FM_SIM% CHECK = 0 conversion failed% CHECK = 1 conversion completed%%see also FM_LIB, FM_SIMREP, FM_SIMSET%%Author: Federico Milano%Date: 11-Nov-2002%Update: 21-Feb-2003%Update: 22-Feb-2003%Update: 03-Mar-2003%Update: 28-Jul-2003%Update: 09-Aug-2003%Version: 1.1.0%%E-mail: fmilano@thunderbox.uwaterloo.ca%Web-site: http://thunderbox.uwaterloo.ca/~fmilano%% Copyright (C) 2002-2005 Federico Milano%% This toolbox is free software; you can redistribute it and/or modify% it under the terms of the GNU General Public License as published by% the Free Software Foundation; either version 2.0 of the License, or% (at your option) any later version.%% This toolbox is distributed in the hope that it will be useful, but% WITHOUT ANY WARRANTY; without even the implied warranty of% MERCHANDABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU% General Public License for more details.%% You should have received a copy of the GNU General Public License% along with this toolbox; if not, write to the Free Software% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307,% USA.global File Fig Settings Hdl Path Varname Theme Historycheck_model = 1;fm_dispfm_disp('Simulink Model Conversion');fm_disp(['Simulink File "',Path.data,File.data,'"']);lasterr('');type_con = Varname.fcomp;for i = 1:length(Varname.fcomp), eval([Varname.fcomp{i}, ' = [];']);endtipi = length(type_con)-1;% constants used in the component masks% ----------------------------------------------------------------on = 1;off = 0;omega = 1;power = 2;voltage = 3;monday = 1;tuesday = 2;wednesday = 3;thursday = 4;friday = 5;saturday = 6;sunday = 7;winter_week_day = 1;winter_week_end = 2;summer_week_day = 3;summer_week_end = 4;spring_fall_week_day = 5;spring_fall_week_end = 6;measurements = 1;weibull = 2;composite = 3;% loading Simulink model% ----------------------------------------------------------------filedata = File.data(1:end-5);fm_disp('Loading Simulink Model')cd(Path.data);open_sys = find_system('type','block_diagram');donotclose = 0;for i = 1:length(open_sys) if strcmp(open_sys{i},filedata); donotclose = 1; break endendif ~donotclose, cur_sys = load_system(filedata);else, cur_sys = get_param(filedata,'Handle');end% open status barfm_bar open% load block and mask properties% ----------------------------------------------------------------Settings.mv = str2num(get_param(cur_sys,'ModelVersion'));blocks = find_system(cur_sys,'Type','block');lines = find_system(cur_sys,'FindAll','on','type','line');masks = get_param(blocks,'MaskType');nblock = length(blocks);tipi3 = 1/(tipi + 1 + 2*nblock);fm_bar([1e-3,tipi3])fm_disp(' * * *')fm_disp('Check Blocks ...')Tags = get_param(blocks,'Tag');BlockTypes = get_param(blocks,'BlockType');idx = ones(nblock,1);block_match = strmatch('PSATblock',Tags,'exact');if ~isempty(block_match), idx(block_match) = 0; endblock_types = strmatch('SubSystem',BlockTypes,'exact');if ~isempty(block_types), idx(block_types) = 0; endblock_types = strmatch('PMIOPort',BlockTypes,'exact');if ~isempty(block_types), idx(block_types) = 0; endfixmodel = 0;if sum(idx) idx = find(idx); fm_disp(strcat('Warning: Block "',get_param(blocks(idx),'Name'), ... '" does not belong to the PSAT Simulink Library.')) Settings.ok = 0; uiwait(fm_choice(['Some blocks do not seem to belong to the ', ... 'PSAT library, but could be old blocks. ', ... 'Do you want to fix them?'])) if Settings.ok fixmodel = 1; for iii = 1:length(idx) blocktype = masks{idx(iii)}; if isempty(blocktype) blocktype = get_param(blocks(idx(iii)),'BlockType'); end switch blocktype case {'Bus','Link','Goto','From'} prop = 'Connection'; case {'Supply','Demand','Rmpg','Rrsv','Vltn','Rmpl','Ypdp'} prop = 'OPF & CPF'; case {'Breaker','Fault'} prop = 'Faults & Breakers'; case 'Busfreq' prop = 'Measurements'; case {'Mn','Pl','Thload','Fl','Exload'} prop = 'Loads'; case {'Syn','Mot'} prop = 'Machines'; case {'Ltc','Tap'} prop = 'ULTC'; case 'Phs' prop = 'Phase Shifter'; case {'Tg','Exc','Cac','Cluster','Pss','Oxl'} prop = 'Controls'; case {'Statcom','Upfc','Svc','Hvdc','Tcsc','Sssc'} prop = 'FACTS'; case {'Dfig','Cswt','Ddsg'} prop = 'Wind Turbines'; case {'Sofc','SSR','RLC','Mass'} prop = 'Sparse Dynamic Component'; case {'SAE1','SAE2','SAE3'} prop = 'SAE'; otherwise prop = 'Power Flow'; end set_param(blocks(idx(iii)), ... 'Tag','PSATblock', ... 'Description',prop) end endelse fm_disp('All blocks belong to the PSAT Simulink Library.')endfm_disp(' * * *')fm_disp('Statistics ...')if isunix pathfilt = Path.filters; pathdata = Path.data; if strcmp(computer,'GLNX86') if strcmp(pathdata(1),'~') pathdata = [getenv('HOME'),pathdata(2:end)]; end pathfilt = [getenv('HOME'),pathfilt(2:end)]; end perlcmd = ['perl "',pathfilt,'simblocks" "',pathdata,filedata,'.mdl"']; [w,vector] = unix(perlcmd);else perlcmd = ['perl "',Path.filters,'simblocks" "',Path.data,filedata,'.mdl"']; [w,vector] = dos(perlcmd);endtry vector = eval(vector); dispno(vector(1),'Connections') dispno(vector(2),'Power Flow Components') dispno(vector(3),'OPF & CPF Components') dispno(vector(4),'Faults & Breakers') dispno(vector(5),'Special Loads') dispno(vector(6),'Machines') dispno(vector(7),'Regulating Transformers') dispno(vector(8),'Controls') dispno(vector(9),'FACTS') dispno(vector(10),'Spare Dynamic Components') dispno(vector(11),'Subtransmission Equivalent Areas') dispno(vector(12),'Wind Power Components') dispno(vector(13),'Measurement Components')catch fm_disp(['fm_sim could not evaluate "',vector,'"'],2) fm_disp('Check of Simulink blocks coudn''t be performed.')endfm_disp(' * * *')fm_disp('Definition of component data ...')% component data matrices% ----------------------------------------------------------------kinds = zeros(length(type_con),1);idx_old = 0;for i = 1:nblock tipo = masks{i}; idx = strmatch(tipo,type_con,'exact'); if ~isempty(idx) kinds(idx) = kinds(idx)+1; sidx = num2str(kinds(idx)); if idx ~= idx_old idx_old = idx; fm_disp(['Data "',tipo,'.con"']) end comp_data = get_param(blocks(i),'MaskVariables'); comp_value = get_param(blocks(i),'MaskValueString'); valori = strrep(['[',comp_value,']'],'|',','); indici = comp_data; if strmatch(indici,'pxq=@1;','exact') indici = ':'; else indici = ['[',indici,']']; indici = strrep(indici,'x',':'); indici = strrep(indici,'p',''); indici = strrep(indici,'_',' '); end if Settings.hostver >= 6.5 indici = regexprep(indici,'q=@([0-9]*);',' '); indici = regexprep(indici,'(in|out|ins|ous)=@([0-9]*);',' 1 '); else nvals = length(findstr(indici,';')); for j = 1:nvals indici = strrep(indici,['q=@',num2str(j),';'],' '); indici = strrep(indici,['in=@',num2str(j),';'],' 1 '); indici = strrep(indici,['out=@',num2str(j),';'],' 1 '); indici = strrep(indici,['ins=@',num2str(j),';'],' 1 '); indici = strrep(indici,['ous=@',num2str(j),';'],' 1 '); end end try eval([tipo,'(',sidx,',',indici,') = ',valori,';']); catch fm_disp(['Error: ',tipo,' block ("', ... get_param(blocks(i),'Name'), ... '") has a wrong number of data.'],2) eval([tipo,'(',sidx,',',indici,') = 0;']); end set_param(blocks(i),'UserData',sidx); end if ~rem(i,5), fm_bar([(i-1)*tipi3,i*tipi3]), endend% "Bus" number% ----------------------------------------------------------------busidx = find(strcmp(masks,'Bus'));busname = get_param(blocks(busidx),'Name');Bus_n = length(busidx);Bus(:,1) = [1:Bus_n]';fm_disp(' * * *')fm_disp('Definition of system connections ...')for i = 1:nblock if ~isempty(masks{i}) & ~strcmp(masks{i},'Bus') & ~strcmp(masks{i},'Link') switch masks{i} case 'Exc' [rowno, busno] = connectd(blocks(i),lines,blocks,'Exc','Syn'); eval([masks{i},'(',rowno,',1) = ',busno,';']); case 'Tg' [rowno, busno] = connectd(blocks(i),lines,blocks,'Tg','Syn'); eval([masks{i},'(',rowno,',1) = ',busno,';']); case 'Pss' [rowno, busno] = connectd(blocks(i),lines,blocks,'Pss','Exc'); eval([masks{i},'(',rowno,',1) = ',busno,';']); case 'Oxl' [rowno, busno] = connectd(blocks(i),lines,blocks,'Oxl','Exc'); eval([masks{i},'(',rowno,',1) = ',busno,';']); case 'Mass' [rowno, busno] = connectd(blocks(i),lines,blocks,'Mass','Syn'); eval([masks{i},'(',rowno,',1) = ',busno,';']); case 'Rmpg' [rowno, busno] = connectd(blocks(i),lines,blocks,'Rmpg','Supply'); eval([masks{i},'(',rowno,',1) = ',busno,';']); case 'Rmpl' [rowno, busno] = connects(blocks(i),lines,blocks,'Rmpl','Demand'); eval([masks{i},'(',rowno,',1) = ',busno,';']); case 'Cluster' % destination [rowno, busno] = connectd(blocks(i),lines,blocks,'Cluster','Exc'); if str2num(rowno) > 0, eval([masks{i},'(',rowno,',2) = 1;']); end if str2num(rowno) == -1, History.text(end) = []; [rowno, busno] = connectd(blocks(i),lines,blocks,'Cluster','Svc'); if str2num(rowno) > 0, eval([masks{i},'(',rowno,',2) = 2;']); end end eval([masks{i},'(',rowno,',1) = ',busno,';']); % source [rowno, busno] = connects(blocks(i),lines,blocks,'Cluster','Cac'); eval([masks{i},'(',rowno,',3) = ',busno,';']); otherwise % check connections msg = ['Error: ',masks{i},' block ("', get_param(blocks(i),'Name'),'")']; ports = [get_param(blocks(i),'Ports'), 0, 0, 0, 0, 0]; line_out = find_system(lines,'SrcBlockHandle',blocks(i)); line_in = find_system(lines,'DstBlockHandle',blocks(i)); ports_in = ports(1)+ports(3)+ports(6); ports_out = ports(2)+ports(7); %if ports(6) | ports(7) %if ports(6)+ports(7) ~= length(line_out)+length(line_in) % fm_disp([msg,' has an undefined connection. *'],2) %else % if length(line_out) > ports_out % line_in = [line_in; line_out(ports_out+1:end)]; % line_out = line_out(1:ports_out); % end % if length(line_in) > ports_in % line_out = [line_out; line_in(ports_in+1:end)]; % line_in = line_in(1:ports_in); % end %end %else if length(line_out) ~= ports_out | length(line_in) ~= ports_in fm_disp([msg,' has an undefined connection. *'],2) end %end % find destination block if ~isempty(line_out) & ~strcmp(masks{i},'Cac') & ... ~strcmp(masks{i},'Demand') & ~strcmp(masks{i},'Wind') for j = 1:length(line_out) lineout = line_out(j); dstblock = get_param(lineout,'DstBlockHandle'); while 1 if dstblock == -1, fm_disp([msg,' has an undefined connection.'],2) break end mask_db = get_param(dstblock,'MaskType'); if isempty(mask_db), mask_db = get_param(dstblock,'BlockType'); end if iscell(mask_db), mask_db = mask_db{1}; end switch mask_db case 'Bus' busno = get_param(dstblock,'UserData'); rowno = get_param(blocks(i),'UserData'); switch masks{i} case {'PV','SW','Supply','Rsrv','Rmpg','Vltn', ... 'Syn','SSR','Sofc','Cswt','Dfig','Ddsg'}, d = '1'; case 'Twt' Porta = get_param(lineout,'SrcPortHandle'); Blocco = get_param(blocks(i),'PortHandles'); Numero_Porta = find(Blocco.Outport==Porta); if isempty(Numero_Porta) Numero_Porta = find(Blocco.RConn==Porta); end if Numero_Porta == 1, d = '2'; else, d = '3'; end otherwise, d = '2'; end eval([masks{i},'(',rowno,',',d,') = ',busno,';']); break case 'Outport' porta = str2num(get_param(dstblock,'Port')); subsys = get_param(dstblock,'Parent'); handle = get_param(subsys,'PortHandles'); lineout = find_system(lines,'SrcPortHandle',handle.Outport(porta)); dstblock = get_param(lineout,'DstBlockHandle'); case 'PMIOPort' port_type = get_param(dstblock,'Side'); port_numb = str2num(get_param(dstblock,'Port')); subsys = get_param(dstblock,'Parent'); pmcport = find_system(blocks, ... 'SearchDepth',0, ... 'Parent',getfullname(subsys), ... 'BlockType','PMIOPort'); handle = get_param(subsys,'PortHandles'); if strcmp(port_type,'Left') inport = find_system(pmcport,'Side','Left'); port_numb = find(inport == dstblock); lineout = find_system(lines,'DstPortHandle',handle.LConn(port_numb)); else outport = find_system(pmcport,'Side','Right'); port_numb = find(outport == dstblock); lineout = find_system(lines,'DstPortHandle',handle.RConn(port_numb)); end dstblock = get_param(lineout,'SrcBlockHandle'); case 'SubSystem' porta = get_param(lineout,'DstPortHandle'); handle = get_param(dstblock,'PortHandles'); portno = find(handle.Inport == porta); if isempty(portno) portno = find(handle.LConn == porta); if isempty(portno) portno = find(handle.LConn == get_param(linein,'SrcPortHandle')); end pmcport = find_system(blocks, ... 'SearchDepth',0, ... 'Parent',getfullname(dstblock), ... 'BlockType','PMIOPort'); inport = find_system(pmcport,'Side','Left'); handle = get_param(inport(portno),'PortConnectivity'); handlel = get_param(inport(portno),'LineHandles'); lineout = handlel.RConn; dstblock = handle.DstBlock; else inport = find_system(blocks, ... 'SearchDepth',0, ... 'Parent',getfullname(dstblock), ... 'BlockType','Inport', ... 'Port',int2str(portno)); handle = get_param(inport,'PortHandles') lineout = find_system(lines,'SrcPortHandle',handle.Outport); dstblock = get_param(lineout,'DstBlockHandle');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -