0001 function [xfmr, bus, warns, bus_name] = psse_convert_xfmr(warns, trans2, trans3, verbose, baseMVA, bus, bus_name)
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 [PQ, PV, REF, NONE, BUS_I, BUS_TYPE, PD, QD, GS, BS, BUS_AREA, VM, ...
0050 VA, BASE_KV, ZONE, VMAX, VMIN, LAM_P, LAM_Q, MU_VMAX, MU_VMIN] = idx_bus;
0051 [F_BUS, T_BUS, BR_R, BR_X, BR_B, RATE_A, RATE_B, RATE_C, ...
0052 TAP, SHIFT, BR_STATUS, PF, QF, PT, QT, MU_SF, MU_ST, ...
0053 ANGMIN, ANGMAX, MU_ANGMIN, MU_ANGMAX] = idx_brch;
0054
0055
0056 nb = size(bus, 1);
0057 nt2 = size(trans2, 1);
0058 nt3 = size(trans3, 1);
0059
0060
0061 starbus = zeros(nt3, VMIN);
0062 if nt3 > 0
0063 mb = max(bus(:, BUS_I));
0064 b = 10^ceil(log10(mb+1));
0065 wind1bus = trans3(:,1);
0066 e2i = sparse(bus(:, BUS_I), ones(nb, 1), 1:nb, max(bus(:, BUS_I)), 1);
0067 starbus(:, BUS_I) = (b+1:b+nt3)';
0068 starbus(:, BUS_TYPE) = PQ;
0069 starbus(trans3(:,12)==0, BUS_TYPE) = NONE;
0070 starbus(:, VA) = trans3(:,31);
0071 starbus(:, VM) = trans3(:,30);
0072 starbus(:, [BUS_AREA, ZONE]) = bus(e2i(wind1bus), [7,11]);
0073 starbus(:, BASE_KV) = 1;
0074 starbus(:, VMAX) = 1.1;
0075 starbus(:, VMIN) = 0.9;
0076 end
0077
0078
0079 [tf,fbus] = ismember(trans2(:,1), bus(:, BUS_I));
0080 [tf,tbus] = ismember(trans2(:,2), bus(:, BUS_I));
0081
0082 k = find(fbus == 0 | tbus == 0);
0083 if ~isempty(k)
0084 warns{end+1} = sprintf('Ignoring %d two-winding transformers with bad bus numbers', length(k));
0085 if verbose
0086 fprintf('WARNING: Ignoring %d two-winding transformers with bad bus numbers', length(k));
0087 end
0088 fbus(k) = [];
0089 tbus(k) = [];
0090 trans2(k, :) = [];
0091 nt2 = nt2 - length(k);
0092 end
0093 Zbs = bus(:, BASE_KV).^2 / baseMVA;
0094 if nt2 > 0
0095 cw2 = find(trans2(:,5) == 2);
0096 cw3 = find(trans2(:,5) == 3);
0097 cw23 = [cw2;cw3];
0098 cz2 = find(trans2(:,6) == 2);
0099 cz3 = find(trans2(:,6) == 3);
0100 cz23 = [cz2;cz3];
0101
0102 R = trans2(:,21);
0103 X = trans2(:,22);
0104 Zb = ones(nt2, 1);
0105 Zb(cz23) = trans2(cz23,25).^2 ./ trans2(cz23,23);
0106 R(cz2) = R(cz2) .* Zb(cz2) ./ Zbs(fbus(cz2));
0107 X(cz23) = X(cz23) .* Zb(cz23) ./ Zbs(fbus(cz23));
0108 R(cz3) = trans2(cz3,25).^2 ./ trans2(cz3,21) ./ Zbs(fbus(cz3));
0109 tap = trans2(:,24) ./ trans2(:,40);
0110 tap(cw23) = tap(cw23) .* bus(tbus(cw23), BASE_KV)./bus(fbus(cw23), BASE_KV);
0111 tap(cw3) = tap(cw3) .* trans2(cw3,25)./trans2(cw3,41);
0112 shift = trans2(:, 26);
0113 end
0114
0115
0116 [tf,ind1] = ismember(trans3(:,1), bus(:, BUS_I));
0117 [tf,ind2] = ismember(trans3(:,2), bus(:, BUS_I));
0118 [tf,ind3] = ismember(trans3(:,3), bus(:, BUS_I));
0119
0120 k = find(ind1 == 0 | ind2 == 0 | ind3 == 0);
0121 if ~isempty(k)
0122 warns{end+1} = sprintf('Ignoring %d three-winding transformers with bad bus numbers', length(k));
0123 if verbose
0124 fprintf('WARNING: Ignoring %d three-winding transformers with bad bus numbers', length(k));
0125 end
0126 ind1(k) = [];
0127 ind2(k) = [];
0128 ind3(k) = [];
0129 trans3(k, :) = [];
0130 starbus(k, :) = [];
0131 nt3 = nt3 - length(k);
0132 end
0133
0134
0135
0136
0137
0138 if nt3 > 0
0139 cw2 = find(trans3(:,5) == 2);
0140 cw3 = find(trans3(:,5) == 3);
0141 cw23 = [cw2;cw3];
0142 cz2 = find(trans3(:,6) == 2);
0143 cz3 = find(trans3(:,6) == 3);
0144 cz23 = [cz2;cz3];
0145
0146 tap1 = trans3(:, 32);
0147 tap2 = trans3(:, 48);
0148 tap3 = trans3(:, 64);
0149 tap1(cw23) = tap1(cw23) ./ bus(ind1(cw23), BASE_KV);
0150 tap2(cw23) = tap2(cw23) ./ bus(ind2(cw23), BASE_KV);
0151 tap3(cw23) = tap3(cw23) ./ bus(ind3(cw23), BASE_KV);
0152 tap1(cw3) = tap1(cw3) .* trans3(cw3, 33);
0153 tap2(cw3) = tap2(cw3) .* trans3(cw3, 49);
0154 tap3(cw3) = tap3(cw3) .* trans3(cw3, 65);
0155 shift1 = trans3(:, 34);
0156 shift2 = trans3(:, 50);
0157 shift3 = trans3(:, 66);
0158
0159 trans3(cz3, 33) = bus(ind1(cz3), BASE_KV);
0160 trans3(cz3, 49) = bus(ind1(cz3), BASE_KV);
0161 trans3(cz3, 65) = bus(ind1(cz3), BASE_KV);
0162
0163 R12 = trans3(:, 21);
0164 X12 = trans3(:, 22);
0165 R23 = trans3(:, 24);
0166 X23 = trans3(:, 25);
0167 R31 = trans3(:, 27);
0168 X31 = trans3(:, 28);
0169 Zb1 = trans3(:, 33).^2 ./ trans3(:, 23);
0170 Zb2 = trans3(:, 49).^2 ./ trans3(:, 26);
0171 Zb3 = trans3(:, 65).^2 ./ trans3(:, 29);
0172
0173 R12(cz2) = R12(cz2) .* Zb1(cz2) ./ Zbs(ind1(cz2));
0174 X12(cz2) = X12(cz2) .* Zb1(cz2) ./ Zbs(ind1(cz2));
0175 R23(cz2) = R23(cz2) .* Zb2(cz2) ./ Zbs(ind2(cz2));
0176 X23(cz2) = X23(cz2) .* Zb2(cz2) ./ Zbs(ind2(cz2));
0177 R31(cz2) = R31(cz2) .* Zb3(cz2) ./ Zbs(ind3(cz2));
0178 X31(cz2) = X31(cz2) .* Zb3(cz2) ./ Zbs(ind3(cz2));
0179
0180 R12(cz3) = (trans3(cz3,33)*1000) .^ 2 ./ trans3(cz3,21) ./ Zbs(ind1(cz3));
0181 X12(cz3) = trans3(cz3,22) .* Zb1(cz3) ./ Zbs(ind3(cz3));
0182 R23(cz3) = (trans3(cz3,49)*1000) .^ 2 ./ trans3(cz3,24) ./ Zbs(ind2(cz3));
0183 X23(cz3) = trans3(cz3,25) .* Zb2(cz3) ./ Zbs(ind3(cz3));
0184 R31(cz3) = (trans3(cz3,65)*1000) .^ 2 ./ trans3(cz3,27) ./ Zbs(ind3(cz3));
0185 X31(cz3) = trans3(cz3,28) .* Zb3(cz3) ./ Zbs(ind3(cz3));
0186
0187 R1 = (R12+R31-R23) ./ 2;
0188 R2 = (R12+R23-R31) ./ 2;
0189 R3 = (R31+R23-R12) ./ 2;
0190 X1 = (X12+X31-X23) ./ 2;
0191 X2 = (X12+X23-X31) ./ 2;
0192 X3 = (X31+X23-X12) ./ 2;
0193 end
0194
0195
0196
0197 xfmr2 = zeros(nt2, ANGMAX);
0198 if nt2 > 0
0199 xfmr2(:, [F_BUS T_BUS]) = trans2(:,[1,2]);
0200 xfmr2(:, [BR_R BR_X TAP SHIFT]) = [R X tap shift];
0201 xfmr2(:, [RATE_A RATE_B RATE_C]) = trans2(:,[27,28,29]);
0202 xfmr2(:, BR_STATUS) = trans2(:,12);
0203 xfmr2(:, ANGMIN) = -360;
0204 xfmr2(:, ANGMAX) = 360;
0205 end
0206
0207
0208 xfmr3 = zeros(3*nt3, ANGMAX);
0209 if nt3 > 0
0210 idx1 = (1:3:3*nt3)';
0211 idx2 = idx1+1;
0212 idx3 = idx1+2;
0213
0214 xfmr3(idx1, [F_BUS T_BUS]) = [trans3(:,1), starbus(:,1)];
0215 xfmr3(idx2, [F_BUS T_BUS]) = [trans3(:,2), starbus(:,1)];
0216 xfmr3(idx3, [F_BUS T_BUS]) = [trans3(:,3), starbus(:,1)];
0217
0218 xfmr3(idx1, [BR_R BR_X TAP SHIFT]) = [R1 X1 tap1 shift1];
0219 xfmr3(idx2, [BR_R BR_X TAP SHIFT]) = [R2 X2 tap2 shift2];
0220 xfmr3(idx3, [BR_R BR_X TAP SHIFT]) = [R3 X3 tap3 shift3];
0221
0222 xfmr3(idx1, [RATE_A RATE_B RATE_C]) = trans3(:,[35,36,37]);
0223 xfmr3(idx2, [RATE_A RATE_B RATE_C]) = trans3(:,[51,52,53]);
0224 xfmr3(idx3, [RATE_A RATE_B RATE_C]) = trans3(:,[67,68,69]);
0225 xfmr3(:, ANGMIN) = -360;
0226 xfmr3(:, ANGMAX) = 360;
0227
0228 xfmr3(:, BR_STATUS) = 1;
0229 status = trans3(:, 12);
0230 k1 = find(status == 0 | status == 4);
0231 k2 = find(status == 0 | status == 2);
0232 k3 = find(status == 0 | status == 3);
0233 if ~isempty(k1)
0234 xfmr3(idx1(k1), BR_STATUS) = 0;
0235 end
0236 if ~isempty(k2)
0237 xfmr3(idx2(k2), BR_STATUS) = 0;
0238 end
0239 if ~isempty(k3)
0240 xfmr3(idx3(k3), BR_STATUS) = 0;
0241 end
0242 end
0243
0244
0245 xfmr = [xfmr2; xfmr3];
0246
0247
0248
0249
0250
0251
0252
0253
0254 bus = [bus; starbus];
0255 if nt3 > 0
0256 warns{end+1} = sprintf('Added buses %d-%d as star-points for 3-winding transformers.', ...
0257 starbus(1, BUS_I), starbus(end, BUS_I));
0258 if verbose
0259 fprintf('Added buses %d-%d as star-points for 3-winding transformers.\n', ...
0260 starbus(1, BUS_I), starbus(end, BUS_I));
0261 end
0262 end
0263 if nargin > 6 && nargout > 3
0264 starbus_name = cell(nt3, 1);
0265 for k = 1:nt3
0266 starbus_name{k} = sprintf('STAR_POINT_XFMR_%d', k);
0267 end
0268 bus_name = [bus_name; starbus_name];
0269 end