0001 function [mpc, warnings] = cdf2mpc(cdf_file_name, mpc_name, verbose)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060 [PQ, PV, REF, NONE, BUS_I, BUS_TYPE, PD, QD, GS, BS, BUS_AREA, VM, ...
0061 VA, BASE_KV, ZONE, VMAX, VMIN, LAM_P, LAM_Q, MU_VMAX, MU_VMIN] = idx_bus;
0062 [GEN_BUS, PG, QG, QMAX, QMIN, VG, MBASE, GEN_STATUS, PMAX, PMIN, ...
0063 MU_PMAX, MU_PMIN, MU_QMAX, MU_QMIN, PC1, PC2, QC1MIN, QC1MAX, ...
0064 QC2MIN, QC2MAX, RAMP_AGC, RAMP_10, RAMP_30, RAMP_Q, APF] = idx_gen;
0065 [F_BUS, T_BUS, BR_R, BR_X, BR_B, RATE_A, RATE_B, RATE_C, ...
0066 TAP, SHIFT, BR_STATUS, PF, QF, PT, QT, MU_SF, MU_ST, ...
0067 ANGMIN, ANGMAX, MU_ANGMIN, MU_ANGMAX] = idx_brch;
0068 [PW_LINEAR, POLYNOMIAL, MODEL, STARTUP, SHUTDOWN, NCOST, COST] = idx_cost;
0069
0070
0071 if nargin < 2
0072 verbose = 1;
0073 mpc_name = '';
0074 elseif ischar(mpc_name)
0075 if nargin < 3
0076 verbose = 1;
0077 end
0078 else
0079 verbose = mpc_name;
0080 mpc_name = '';
0081 end
0082
0083
0084
0085 [cdf_path cdf_name cdf_ext] = fileparts(cdf_file_name);
0086 if isempty(cdf_ext)
0087 cdf_ext = '.cdf';
0088 cdf_file_name = strcat(cdf_name , cdf_ext);
0089 end
0090
0091
0092 [fid, msg] = fopen(cdf_file_name, 'r');
0093 if fid < 0
0094 disp(msg);
0095 error('cdf2mpc: Can not read the input file: %s', cdf_file_name )
0096 end
0097 if verbose
0098 fprintf('Converting file ''%s''\n', cdf_file_name);
0099 fprintf(' WARNINGS:\n');
0100 end
0101
0102
0103 warnings = {};
0104
0105
0106 title_cdf = fgetl(fid);
0107 if isnumeric(str2num(title_cdf(32:37))) && not(isempty(str2num(title_cdf(32:37))))
0108 baseMVA = str2num(title_cdf(32:37));
0109 if length(strfind(title_cdf(2:9), '/')) == 2
0110 warnings{end+1} = sprintf('check the title format in the first line of the cdf file.');
0111 end
0112 else
0113 error('cdf2mpc: Error getting the Base MVA, check the title format in the first line of the file.')
0114 end
0115
0116
0117 while 1
0118 line = fgetl(fid);
0119 if line(1:16) == 'BUS DATA FOLLOWS', break, end
0120 end
0121
0122
0123 ibus = 0;
0124 igen = 0;
0125 iarea = 0;
0126
0127 while 1
0128 line = fgetl(fid);
0129 if line(1:4) == '-999', break, end
0130
0131
0132 ibus = ibus + 1;
0133 bus(ibus, BUS_I) = str2num(line(1:4));
0134 bus_name{ibus} = strtrim(line(6:17));
0135 bus(ibus, BUS_TYPE) = str2num(line(25:26));
0136 if bus(ibus, BUS_TYPE) == 0
0137 bus(ibus, BUS_TYPE) = 1;
0138 end
0139 if (bus(ibus, BUS_TYPE) < 2)
0140 bus(ibus, PD) = str2num(line(41:49)) - str2num(line(60:67));
0141 elseif (bus(ibus, BUS_TYPE) >= 2)
0142 bus(ibus, PD) = str2num(line(41:49));
0143 end
0144 bus(ibus, QD) = str2num(line(50:59));
0145 bus(ibus, GS) = baseMVA*str2num(line(107:114));
0146 bus(ibus, BS) = baseMVA*str2num(line(115:122));
0147 bus(ibus, BUS_AREA) = str2num(line(19:20));
0148 bus(ibus, VM) = str2num(line(28:33));
0149 bus(ibus, VA) = str2num(line(34:40));
0150 bus(ibus, BASE_KV) = str2num(line(77:83));
0151 bus(ibus, ZONE) = str2num(line(21:23));
0152 bus(ibus, VMAX) = 1.06;
0153 bus(ibus, VMIN) = 0.94;
0154
0155
0156 Pg = str2num(line(60:67));
0157 Qg = str2num(line(68:75));
0158 Qmax = str2num(line(91:98));
0159 Qmin = str2num(line(99:106));
0160 if bus(ibus, BUS_TYPE) >= 2
0161 igen = igen + 1;
0162 if bus(ibus, BUS_TYPE) == 3, refgen = igen; end
0163 gen(igen, GEN_BUS) = bus(ibus, BUS_I);
0164 gen(igen, PG) = Pg;
0165 if gen(igen, PG) < 0
0166 bus(ibus, PD) = bus(ibus, PD) - gen(igen, PG);
0167 warnings{end+1} = sprintf('negative Pg at bus %g treated as Pd', bus(ibus, BUS_I));
0168 if verbose
0169 fprintf(' %s\n', warnings{end});
0170 end
0171 gen(igen, PG) = 0;
0172 end
0173 gen(igen, QG) = Qg;
0174 gen(igen, QMAX) = Qmax;
0175 gen(igen, QMIN) = Qmin;
0176 if Qmax - Qmin < 0.01
0177 gen(igen, QMAX) = Qmin + 0.1 * baseMVA;
0178 warnings{end+1} = sprintf('Qmax = Qmin at generator at bus %4i (Qmax set to Qmin + %g)', bus(ibus, BUS_I), baseMVA/10);
0179 if verbose
0180 fprintf(' %s\n', warnings{end});
0181 end
0182 end
0183 gen(igen, VG) = str2num(line(85:90));
0184 gen(igen, MBASE) = baseMVA;
0185 gen(igen, GEN_STATUS) = 1;
0186 gen(igen, PMAX) = gen(igen, 2) + baseMVA;
0187 gen(igen, PMIN) = 0;
0188
0189 gencost(igen, MODEL) = POLYNOMIAL;
0190 gencost(igen, STARTUP) = 0;
0191 gencost(igen, SHUTDOWN) = 0;
0192 gencost(igen, NCOST) = 3;
0193
0194
0195
0196 end
0197 end
0198
0199 totload = sum(bus(:, PD));
0200 totgen = sum(gen(:, PG));
0201 if totgen < 1.04 * totload
0202 gen(refgen, PMAX) = gen(refgen, PG) + 1.1 * totload - totgen;
0203 warnings{end+1} = sprintf('Insufficient generation, setting Pmax at slack bus (bus %d) to %g', gen(refgen, [GEN_BUS, PMAX]));
0204 if verbose
0205 fprintf(' %s\n', warnings{end});
0206 end
0207 end
0208
0209
0210 ng = size(gen, 1);
0211
0212
0213
0214 zg = find(gen(:, PG) == 0);
0215 gencost(zg, COST) = 0.01 * ones(size(zg));
0216 gencost(zg, COST+1) = 40 * ones(size(zg));
0217 nzg = find(gen(:, PG) ~= 0);
0218 gencost(nzg, COST) = 10 * ones(size(nzg)) ./ gen(nzg, PG);
0219 gencost(nzg, COST+1) = 20 * ones(size(nzg));
0220 gencost(:, COST+2) = zeros(ng, 1);
0221
0222
0223 while 1
0224 line = fgetl(fid);
0225 if line(1:19) == 'BRANCH DATA FOLLOWS', break, end
0226 end
0227
0228
0229 k = 0;
0230 while 1
0231 line = fgetl(fid);
0232 if line(1:4) == '-999', break, end
0233
0234 k = k + 1;
0235 branch(k, F_BUS) = str2num(line(1:4));
0236 branch(k, T_BUS) = str2num(line(6:9));
0237 branch(k, BR_R) = str2num(line(20:29));
0238 branch(k, BR_X) = str2num(line(30:40));
0239 branch(k, BR_B) = str2num(line(41:50));
0240 branch(k, RATE_A) = str2num(line(51:55));
0241 if branch(k, RATE_A) < 0.000001
0242 branch(k, RATE_A) = 0;
0243 warnings{end+1} = sprintf('MVA limit of branch %d - %d not given, set to %g', branch(k, [F_BUS, T_BUS, RATE_A]));
0244 if verbose
0245 fprintf(' %s\n', warnings{end});
0246 end
0247 end
0248 branch(k, RATE_B) = str2num(line(57:61));
0249 branch(k, RATE_C) = str2num(line(63:67));
0250 branch(k, TAP) = str2num(line(77:82));
0251 branch(k, SHIFT) = 0;
0252 branch(k, BR_STATUS) = 1;
0253 end
0254 if verbose
0255 fprintf('Done.\n');
0256 end
0257 fclose(fid);
0258
0259
0260 mpc.baseMVA = baseMVA;
0261 mpc.bus = bus;
0262 mpc.branch = branch;
0263 mpc.gen = gen;
0264 mpc.gencost = gencost;
0265 mpc.bus_name = bus_name;
0266 mpc = loadcase(mpc);
0267
0268
0269 if ~isempty(mpc_name)
0270 comments = {''};
0271 if ~isempty(title_cdf)
0272 comments{end+1} = sprintf(' %s', title_cdf);
0273 end
0274 comments{end+1} = '';
0275 comments{end+1} = sprintf(' Converted by MATPOWER %s using CDF2MPC on %s', mpver, date);
0276 comments{end+1} = sprintf(' from ''%s''.', cdf_file_name);
0277
0278
0279 comments{end+1} = '';
0280 comments{end+1} = ' WARNINGS:';
0281 for k = 1:length(warnings)
0282 comments{end+1} = sprintf(' %s', warnings{k});
0283 end
0284 comments{end+1} = '';
0285 comments{end+1} = sprintf(' See CASEFORMAT for details on the MATPOWER case file format.');
0286
0287 if verbose
0288 spacers = repmat('.', 1, 45-length(mpc_name));
0289 fprintf('Saving to MATPOWER case ''%s'' %s', mpc_name, spacers);
0290 end
0291 savecase(mpc_name, comments, mpc);
0292 if verbose
0293 fprintf(' done.\n');
0294 end
0295 end