/* * @(#)PSSEXfrDataParser.java * * Copyright (C) 2006-2013 www.interpss.org * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU LESSER GENERAL PUBLIC LICENSE * as published by the Free Software Foundation; either version 2.1 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * @Author Mike Zhou * @Version 1.0 * @Date 04/11/2013 * * Revision History * ================ * */ package org.ieee.odm.adapter.psse.parser.aclf; import java.util.StringTokenizer; import org.ieee.odm.adapter.psse.PSSEAdapter.PsseVersion; import org.ieee.odm.common.ODMException; /** * Class for processing IEEE CDF bus data line string * * @author mzhou * */ public class PSSEXfrDataParser extends BasePSSEDataParser { public PSSEXfrDataParser(PsseVersion ver) { super(ver); } @Override public String[] getMetadata() { /* * format V29 * ========== * * 3W Line-1 I, J, K, CKT, CW,CZ,CM, MAG1, MAG2, NMETR, NAME, STAT,O1,F1,...,O4,F4 Line-2 R1-2,X1-2,SBASE1-2,R2-3,X2-3,SBASE2-3,R3-1,X3-1,SBASE3-1,VMSTAR,ANSTAR Line-3 WINDV1, NOMV1, ANG1, RATA1,RATB1,RATC1, COD, CONT,RMA, RMI, VMA, VMI, NTP,TAB,CR,CX Line-4 WINDV2, NOMV2, ANG2, RATA2,RATB2,RATC2, Line-5 WINDV3, NOMV3, ANG3, RATA3,RATB3,RATC3, * 2W Line-1 I, J, K, CKT, CW,CZ,CM, MAG1, MAG2, NMETR, NAME, STAT,O1,F1,...,O4,F4 Line-2 R1-2,X1-2,SBASE1-2 Line-3 WINDV1, NOMV1, ANG1, RATA1,RATB1,RATC1, COD, CONT,RMA, RMI, VMA, VMI, NTP,TAB,CR,CX Line-4 WINDV2, NOMV2 * format V30 * ========== * * 3W Line-1 I, J, K, CKT, CW,CZ,CM, MAG1, MAG2, NMETR, NAME, STAT,O1,F1,...,O4,F4 Line-2 R1-2,X1-2,SBASE1-2,R2-3,X2-3,SBASE2-3,R3-1,X3-1,SBASE3-1,VMSTAR,ANSTAR Line-3 WINDV1, NOMV1, ANG1, RATA1,RATB1,RATC1, COD, CONT,RMA, RMI, VMA, VMI, NTP,TAB,CR,CX Line-4 WINDV2, NOMV2, ANG2, RATA2,RATB2,RATC2, COD2, CONT2,RMA2,RMI2,VMA2,VMI2, NTP2,TAB2,CR2,CX2 Line-5 WINDV3, NOMV3, ANG3, RATA3,RATB3,RATC3, COD3, CONT3,RMA3,RMI3,VMA3,VMI3, NTP3,TAB3,CR3,CX3 * 2W Line-1 I, J, K, CKT, CW,CZ,CM, MAG1, MAG2, NMETR, NAME, STAT,O1,F1,...,O4,F4 Line-2 R1-2,X1-2,SBASE1-2 Line-3 WINDV1, NOMV1, ANG1, RATA1,RATB1,RATC1, COD, CONT,RMA, RMI, VMA, VMI, NTP,TAB,CR,CX Line-4 WINDV2, NOMV2 * format V32 * ========== * 3W Line-1 I, J, K, CKT, CW,CZ,CM, MAG1, MAG2, NMETR, NAME, STAT,O1,F1,...,O4,F4 Line-2 R1-2,X1-2,SBASE1-2,R2-3,X2-3,SBASE2-3,R3-1,X3-1,SBASE3-1,VMSTAR,ANSTAR Line-3 WINDV1, NOMV1, ANG1, RATA1,RATB1,RATC1, COD1, CONT1,RMA1,RMI1,VMA1,VMI1, NTP1,TAB1,CR1,CX1 Line-4 WINDV2, NOMV2, ANG2, RATA2,RATB2,RATC2, COD2, CONT2,RMA2,RMI2,VMA2,VMI2, NTP2,TAB2,CR2,CX2 Line-5 WINDV3, NOMV3, ANG3, RATA3,RATB3,RATC3, COD3, CONT3,RMA3,RMI3,VMA3,VMI3, NTP3,TAB3,CR3,CX3 * 2W Line-1 I, J, K, CKT, CW,CZ,CM, MAG1, MAG2, NMETR, NAME, STAT,O1,F1,...,O4,F4 Line-2 R1-2,X1-2,SBASE1-2 Line-3 WINDV1, NOMV1, ANG1, RATA1,RATB1,RATC1, COD1, CONT1,RMA1,RMI1,VMA1, VMI1, NTP1,TAB1,CR1,CX1 Line-4 WINDV2, NOMV2 Format V30 and V32, data structure is the same, only renamed some of the fields, for example COD -> COD1 * format V33 * ========== * 3W Line-1 I, J, K, CKT, CW,CZ,CM, MAG1, MAG2, NMETR, NAME, STAT,O1,F1,...,O4,F4,VECGRP Line-2 R1-2,X1-2,SBASE1-2,R2-3,X2-3,SBASE2-3,R3-1,X3-1,SBASE3-1,VMSTAR,ANSTAR Line-3 WINDV1, NOMV1, ANG1, RATA1,RATB1,RATC1, COD1, CONT1,RMA1,RMI1,VMA1,VMI1, NTP1,TAB1,CR1,CX1 Line-4 WINDV2, NOMV2, ANG2, RATA2,RATB2,RATC2, COD2, CONT2,RMA2,RMI2,VMA2,VMI2, NTP2,TAB2,CR2,CX2 Line-5 WINDV3, NOMV3, ANG3, RATA3,RATB3,RATC3, COD3, CONT3,RMA3,RMI3,VMA3,VMI3, NTP3,TAB3,CR3,CX3 * 2W Line-1 I, J, K, CKT, CW,CZ,CM, MAG1, MAG2, NMETR, NAME, STAT,O1,F1,...,O4,F4,VECGRP Line-2 R1-2,X1-2,SBASE1-2 Line-3 WINDV1, NOMV1, ANG1, RATA1,RATB1,RATC1, COD1, CONT1,RMA1,RMI1,VMA1, VMI1, NTP1,TAB1,CR1,CX1 Line-4 WINDV2, NOMV2 VECGRP Alphanumeric identifier specifying vector group based on transformer winding connections and phase angles. VECGRP value is used for information purpose only. VECGRP is 12 blanks by default. */ // The data structure applies to both 2W and 3W Xfr return new String[] { // Line-1 // 0----------1----------2----------3----------4 "I", "J", "K", "CKT", "CW", // 5 6 7 8 9 "CZ", "CM", "MAG1", "MAG2", "NMETR", // 10 11 12 13 14 "NAME", "STAT", "O1", "F1", "O2", // 15 16 17 18 19 "F2", "O3", "F3", "O4", "F4", // 20 "VECGRP", // added V33 // // Line-2 (start position 21) // 0----------1----------2----------3----------4 "R1-2", "X1-2", "SBASE1-2", "R2-3", "X2-3", // 5 6 7 8 9 "SBASE2-3", "R3-1", "X3-1", "SBASE3-1", "VMSTAR", // 10 "ANSTAR", // // Line-3 (start position 32) // 0----------1----------2----------3----------4 "WINDV1", "NOMV1", "ANG1", "RATA1", "RATB1", // 5 6 7 8 9 "RATC1", "COD", "CONT", "RMA", "RMI", // 10 11 12 13 14 "VMA", "VMI", "NTP", "TAB1", "CR", // 15 "CX", // // Line-4 (start position 48) // 0----------1----------2----------3----------4 "WINDV2", "NOMV2", "ANG2", "RATA2", "RATB2", // 5 6 7 8 9 "RATC2", "COD2", "CONT2", "RMA2", "RMI2", // V30 and late version // 10 11 12 13 14 "VMA2", "VMI2", "NTP2", "TAB2", "CR2", // V30 and late version // 15 "CX2", // V30 and late version // // Line-5 (start position 64) // 0----------1----------2----------3----------4 "WINDV3", "NOMV3", "ANG3", "RATA3", "RATB3", // 5 6 7 8 9 "RATC3", "COD3", "CONT3", "RMA3", "RMI3", // V30 and late version // 10 11 12 13 14 "VMA3", "VMI3", "NTP3", "TAB3", "CR3", // V30 and late version // 15 "CX3" // V30 and late version }; } @Override public void parseFields(final String[] strAry) throws ODMException { this.clearNVPairTableData(); String lineStr1 = strAry[0]; String lineStr2 = strAry[1]; String lineStr3 = strAry[2]; String lineStr4 = strAry[3]; String lineStr5 = strAry[4]; // for 2W xfr, line-5 = "" // 324558,324023, 0,'1 ',2,2,1, 0.00036, -0.00197,1,'HFL- 1,2 ',1, 1,1.0000 // The name field might have ',' StringTokenizer st = new StringTokenizer(lineStr1, "'"); String s1 = st.nextToken(); // 324558,324023, 0, String s2 = st.nextToken(); // 1 String s3 = st.nextToken(); // ,2,2,1, 0.00036, -0.00197,1, String s4 = st.nextToken(); // HFL- 1,2 String s5 = st.nextToken(); // ,1, 1,1.0000 st = new StringTokenizer(s1, ","); for (int i = 0; i < 3; i++) setValue(i, st.nextToken().trim()); setValue(3, s2.trim()); st = new StringTokenizer(s3, ","); for (int i = 4; i < 10; i++) setValue(i, st.nextToken().trim()); setValue(10, s4); st = new StringTokenizer(s5, ","); setValue(11, st.nextToken().trim()); for (int i = 12; i < 21; i++) if (st.hasMoreTokens()) setValue(i, st.nextToken().trim()); int k = this.getInt("K", 0); int N2 = 21; // Line-1 has 21 fields st = new StringTokenizer(lineStr2, ","); for (int i = N2; i < N2+3; i++){ setValue(i, st.nextToken().trim()); if(i==N2+1 && !st.hasMoreTokens()){ // if MVA base is not provided, use 100 MW as default setValue(N2+2, "100.0"); break; } } if (k != 0) { for (int i = N2+3; i < N2+11; i++) setValue(i, st.nextToken().trim()); } int N3 = N2 + 11; // Line-2 has 11 fields st = new StringTokenizer(lineStr3, ","); for (int i = N3; i < N3+16; i++) setValue(i, st.nextToken().trim()); int N4 = N3 + 16; // Line-3 has 16 fields st = new StringTokenizer(lineStr4, ","); for (int i = N4; i < N4+2; i++) setValue(i, st.nextToken().trim()); if (k != 0) { for (int i = N4+2; i < N4+16; i++) setValue(i, st.nextToken().trim()); } int N5 = N4 + 16; // Line-4 has 16 fields if (k != 0) { st = new StringTokenizer(lineStr5, ","); for (int i = N5; i < N5+16; i++) if (st.hasMoreTokens()) setValue(i, st.nextToken().trim()); } } }