/* * @(#)BPADynamicFaultOperationRecord.java * * Copyright (C) 2006-2008 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 Stephen Hau * @Version 1.0 * @Date 02/11/2008 * * Revision History * ================ * */ package org.ieee.odm.adapter.bpa.dynamic; import static org.ieee.odm.ODMObjectFactory.OdmObjFactory; import org.ieee.odm.adapter.bpa.lf.BPABusRecord; import org.ieee.odm.common.ODMException; import org.ieee.odm.common.ODMLogger; import org.ieee.odm.model.base.ODMModelStringUtil; import org.ieee.odm.model.dstab.DStabDataSetter; import org.ieee.odm.model.dstab.DStabModelParser; import org.ieee.odm.schema.AcscFaultCategoryEnumType; import org.ieee.odm.schema.ApparentPowerUnitType; import org.ieee.odm.schema.BusIDRefXmlType; import org.ieee.odm.schema.CurrentUnitType; import org.ieee.odm.schema.DStabBranchFaultXmlType; import org.ieee.odm.schema.DStabBusFaultXmlType; import org.ieee.odm.schema.DcLineFaultEnumType; import org.ieee.odm.schema.DcLineFaultXmlType; import org.ieee.odm.schema.GenChangeDynamicEventXmlType; import org.ieee.odm.schema.LoadChangeDynamicEventXmlType; import org.ieee.odm.schema.TimePeriodUnitType; import org.ieee.odm.schema.VoltageUnitType; import org.ieee.odm.schema.ZUnitType; public class BPADynamicFaultOperationRecord { public static void processFaultOperationData(String str, DStabModelParser parser ) throws ODMException { // TODO: Get: what is the default value for mode, in case mode field is not defined? int mode = 0; if (!str.substring(36, 37).trim().equals("")) mode = new Integer(str.substring(36, 37).trim()).intValue(); final String strAry[] = getFaultOperationDataFields(str, mode); if(mode==1||mode==2||mode==3||mode==-1||mode==-2||mode==-3){ final String bus1Id = BPABusRecord.getBusId(strAry[2]); BusIDRefXmlType bus1=parser.createBusRef(bus1Id); final String bus2Id = BPABusRecord.getBusId(strAry[5]); BusIDRefXmlType bus2=parser.createBusRef(bus2Id); boolean breaker1Opened=true; if(strAry[1].equals("")){ breaker1Opened=false; } boolean breaker2Opened=true; if(strAry[4].equals("")){ breaker2Opened=false; } //TODO the parallel branch ID can't be set here String parId=""; if(!strAry[7].equals("")){ parId=strAry[7]; } double bus1RatedV=ODMModelStringUtil.getDouble(strAry[3],0.0); double bus2RatedV=ODMModelStringUtil.getDouble(strAry[6],0.0); double operationTime=ODMModelStringUtil.getDouble(strAry[9],0.0); double r=ODMModelStringUtil.getDouble(strAry[10],0.0); double x=ODMModelStringUtil.getDouble(strAry[11],0.0); double faultLocation=ODMModelStringUtil.getDouble(strAry[12],0.0); // bus fault if(mode==1||mode==-1||mode==2||mode==-2){ DStabBusFaultXmlType busFault=OdmObjFactory.createDStabBusFaultXmlType(); busFault.setFaultCategory(AcscFaultCategoryEnumType.FAULT_3_PHASE); // not permanent bus fault; if(mode==1||mode==-1){ if(breaker1Opened==false&&breaker2Opened==false){ busFault.setFaultedBus(bus1); busFault.setFaultedBusRatedV(DStabDataSetter.createVoltageValue(bus1RatedV, VoltageUnitType.KV)); busFault.setRemoteEndBus(bus2); busFault.setRemoteEndBusRatedV(DStabDataSetter.createVoltageValue(bus2RatedV, VoltageUnitType.KV)); busFault.setFaultStartTime(DStabDataSetter.createTimePeriodValue(operationTime, TimePeriodUnitType.CYCLE)); }else if(breaker1Opened==true&&breaker2Opened==false){ if(busFault!=null){ busFault.setFirstOperationTime(DStabDataSetter.createTimePeriodValue(operationTime, TimePeriodUnitType.CYCLE)); busFault.setPermanentFault(true); if(mode==-1){ double duration= busFault.getFirstOperationTime().getValue()-busFault.getFaultStartTime().getValue(); busFault.setFaultDurationTime(DStabDataSetter.createTimePeriodValue(duration, TimePeriodUnitType.CYCLE)); busFault.setPermanentFault(false); } } }else if(breaker1Opened==true&&breaker2Opened==true){ if(busFault!=null){ busFault.setSecondOperationTime(DStabDataSetter.createTimePeriodValue(operationTime, TimePeriodUnitType.CYCLE)); busFault.setPermanentFault(true); if(mode==-1){ double duration= busFault.getSecondOperationTime().getValue()-busFault.getFaultStartTime().getValue(); busFault.setFaultDurationTime(DStabDataSetter.createTimePeriodValue(duration, TimePeriodUnitType.CYCLE)); busFault.setPermanentFault(false); } } } } // permanent bus fault else if(mode==2||mode==-2){ if(mode==2){ busFault.setFaultedBus(bus1); busFault.setFaultedBusRatedV(DStabDataSetter.createVoltageValue(bus1RatedV, VoltageUnitType.KV)); busFault.setRemoteEndBus(bus2); busFault.setRemoteEndBusRatedV(DStabDataSetter.createVoltageValue(bus2RatedV, VoltageUnitType.KV)); busFault.setFaultCategory(AcscFaultCategoryEnumType.FAULT_3_PHASE); busFault.setFaultStartTime(DStabDataSetter.createTimePeriodValue(operationTime, TimePeriodUnitType.CYCLE)); busFault.setPermanentFault(true); }else{ if(busFault!=null){ busFault.setFirstOperationTime(DStabDataSetter.createTimePeriodValue(operationTime, TimePeriodUnitType.CYCLE)); double duration= busFault.getFirstOperationTime().getValue()-busFault.getFaultStartTime().getValue(); busFault.setFaultDurationTime(DStabDataSetter.createTimePeriodValue(duration, TimePeriodUnitType.CYCLE)); busFault.setPermanentFault(false); } } } if(r!=0.0||x!=0.0){ busFault.setFaultZ(DStabDataSetter.createZValue(r, x, ZUnitType.PU)); } } // branch fault else if(mode==3||mode==-3){ DStabBranchFaultXmlType braFault=OdmObjFactory.createDStabBranchFaultXmlType(); braFault.setFaultCategory(AcscFaultCategoryEnumType.FAULT_3_PHASE); if(breaker1Opened==false&&breaker2Opened==false){ braFault.setFromBus(bus1); braFault.setFromBusRatedV(DStabDataSetter.createVoltageValue(bus1RatedV, VoltageUnitType.KV)); braFault.setToBus(bus2); braFault.setToBusRatedV(DStabDataSetter.createVoltageValue(bus2RatedV, VoltageUnitType.KV)); braFault.setFaultLocationFromFromSide(faultLocation); braFault.setFaultStartTime(DStabDataSetter.createTimePeriodValue(operationTime, TimePeriodUnitType.CYCLE)); braFault.setPermanentFault(true); }else if((breaker1Opened==true&&breaker2Opened==false)||(breaker1Opened==false&&breaker2Opened==true)){ if(braFault!=null){ braFault.setFirstOperationTime(DStabDataSetter.createTimePeriodValue(operationTime, TimePeriodUnitType.CYCLE)); braFault.setPermanentFault(true); if(mode==-3){ double duration= braFault.getFirstOperationTime().getValue()-braFault.getFaultStartTime().getValue(); braFault.setFaultDurationTime(DStabDataSetter.createTimePeriodValue(duration, TimePeriodUnitType.CYCLE)); braFault.setPermanentFault(false); } } }else if(breaker1Opened==true&&breaker2Opened==true){ if(braFault!=null){ braFault.setSecondOperationTime(DStabDataSetter.createTimePeriodValue(operationTime, TimePeriodUnitType.CYCLE)); braFault.setPermanentFault(true); if(mode==-3){ double duration= braFault.getSecondOperationTime().getValue()-braFault.getFaultStartTime().getValue(); braFault.setFaultDurationTime(DStabDataSetter.createTimePeriodValue(duration, TimePeriodUnitType.CYCLE)); braFault.setPermanentFault(false); } } } if(r!=0.0||x!=0.0){ braFault.setFaultZ(DStabDataSetter.createZValue(r, x, ZUnitType.PU)); } } } else if(mode==4||mode==-4){ // load change if(strAry[12].equals("")){ String busId = BPABusRecord.getBusId(strAry[1]); BusIDRefXmlType bus=parser.createBusRef(busId); LoadChangeDynamicEventXmlType loadChange=OdmObjFactory.createLoadChangeDynamicEventXmlType(); loadChange.setBus(bus); double busRatedV=ODMModelStringUtil.getDouble(strAry[2], 0.0); loadChange.setBusRatedVoltage(DStabDataSetter.createVoltageValue(busRatedV, VoltageUnitType.KV)); double operationTime=ODMModelStringUtil.getDouble(strAry[5], 0.0); loadChange.setOperationTime(DStabDataSetter.createTimePeriodValue(operationTime, TimePeriodUnitType.CYCLE)); double pp=ODMModelStringUtil.getDouble(strAry[6], 0.0); double qp=ODMModelStringUtil.getDouble(strAry[7], 0.0); double pc=ODMModelStringUtil.getDouble(strAry[8], 0.0); double qc=ODMModelStringUtil.getDouble(strAry[9], 0.0); double pz=ODMModelStringUtil.getDouble(strAry[10], 0.0); double qz=ODMModelStringUtil.getDouble(strAry[11], 0.0); if(pp!=0.0||qp!=0.0){ loadChange.setConstantPChange(DStabDataSetter.createPowerValue(pp, qp, ApparentPowerUnitType.MVA)); } if(pc!=0.0||qc!=0.0){ loadChange.setConstantIChange(DStabDataSetter.createPowerValue(pc, qc, ApparentPowerUnitType.MVA)); } if(pz!=0.0||qz!=0.0){ loadChange.setConstantZChange(DStabDataSetter.createPowerValue(pz, qz, ApparentPowerUnitType.MVA)); } } //power change else{ String busId = BPABusRecord.getBusId(strAry[1]); BusIDRefXmlType bus=parser.createBusRef(busId); GenChangeDynamicEventXmlType genChange= OdmObjFactory.createGenChangeDynamicEventXmlType(); genChange.setBus(bus); double busRatedV=ODMModelStringUtil.getDouble(strAry[2], 0.0); genChange.setBusRatedVoltage(DStabDataSetter.createVoltageValue(busRatedV, VoltageUnitType.KV)); double operationTime=ODMModelStringUtil.getDouble(strAry[5], 0.0); genChange.setOperationTime(DStabDataSetter.createTimePeriodValue(operationTime, TimePeriodUnitType.CYCLE)); String genId=""; if(!strAry[3].equals("")){ genId=strAry[3]; genChange.setGeneratorId(genId); } double pg=ODMModelStringUtil.getDouble(strAry[12], 0.0); if(pg<90000){ genChange.setGenChange(DStabDataSetter.createPowerValue(pg, 0.0, ApparentPowerUnitType.MVA)); }else{ genChange.setGenOutage(true); } } } else if(mode==5){ int sign=new Integer(str.substring(32, 33).trim()).intValue(); if(sign>0){ DcLineFaultXmlType dcFault=OdmObjFactory.createDcLineFaultXmlType(); dcFault.setPermanentFault(true); String bus1Id = BPABusRecord.getBusId(strAry[1]); BusIDRefXmlType bus1=parser.createBusRef(bus1Id); String bus2Id = BPABusRecord.getBusId(strAry[3]); BusIDRefXmlType bus2=parser.createBusRef(bus2Id); dcFault.setFromACBus(bus1); dcFault.setToACBus(bus2); double bus1RatedV=ODMModelStringUtil.getDouble(strAry[2], 0.0); double bus2RatedV=ODMModelStringUtil.getDouble(strAry[4], 0.0); dcFault.setFromACRatedVol(DStabDataSetter.createVoltageValue(bus1RatedV, VoltageUnitType.KV)); dcFault.setToACRatedVol(DStabDataSetter.createVoltageValue(bus2RatedV, VoltageUnitType.KV)); int faultType= new Integer(strAry[5]).intValue(); if(faultType==1){ dcFault.setFaultType(DcLineFaultEnumType.FROM_BUS_BIPOLE_SHORT_CIRCUIT); } if(faultType==2){ dcFault.setFaultType(DcLineFaultEnumType.TO_BUS_BIPOLE_SHORT_CIRCUIT); } double faultLocation=ODMModelStringUtil.getDouble(strAry[10], 0.0); if(faultType==3){ dcFault.setFaultType(DcLineFaultEnumType.FAULT_ON_LINE); dcFault.setFaultLocationFromFromSide(faultLocation); } if(faultType==4){ dcFault.setFaultType(DcLineFaultEnumType.POWER_BLOCKED); } if(faultType==5){ dcFault.setFaultType(DcLineFaultEnumType.POWER_REVERSED); } double changedScale=ODMModelStringUtil.getDouble(strAry[9], 0.0); if(faultType==7){ dcFault.setFaultType(DcLineFaultEnumType.POWER_CHANGE_BY_SPECIFICATION); dcFault.setChangedPower(DStabDataSetter.createPowerValue(changedScale, 0.0, ApparentPowerUnitType.MVA)); } if(faultType==8){ dcFault.setFaultType(DcLineFaultEnumType.CURRENT_CHANGE_BY_SPECIFICATION); dcFault.setChangedCurrent(DStabDataSetter.createCurrentValue(changedScale, CurrentUnitType.KA)); } double startTime=ODMModelStringUtil.getDouble(strAry[7], 0.0); dcFault.setStartTime(DStabDataSetter.createTimePeriodValue(startTime, TimePeriodUnitType.CYCLE)); double faultR=ODMModelStringUtil.getDouble(strAry[8], 0.0); dcFault.setFaultZ(DStabDataSetter.createZValue(faultR, 0.0, ZUnitType.PU)); }else{ // DC line currently is not considered. We will deal with it late String bus1Id = BPABusRecord.getBusId(strAry[1]); BusIDRefXmlType bus1=parser.createBusRef(bus1Id); String bus2Id = BPABusRecord.getBusId(strAry[3]); BusIDRefXmlType bus2=parser.createBusRef(bus2Id); //TODO I can't find the method to get the existed dcFault ,as the previous method: //"DcLineFaultXmlType dcFault=XBeanParserHelper.getDCFaultRecord(tranSimu, bus1, bus2);" //DcLineFaultXmlType dcFault=; //double clearedTime= new Double(strAry[7]).doubleValue(); //double durationTime=clearedTime-dcFault.getStartTime().getValue(); //dcFault.setDurationTime(DStabDataSetter.createTimePeriodValue(durationTime, TimePeriodUnitType.CYCLE)); //dcFault.setPermanentFault(false); } } } private static String[] getFaultOperationDataFields ( final String str, int mode) { final String[] strAry = new String[13]; try{ if(mode==1||mode==2||mode==3||mode==-1||mode==-2||mode==-3){ strAry[0]=ODMModelStringUtil.getStringReturnEmptyString(str,1, 2).trim(); strAry[1]=ODMModelStringUtil.getStringReturnEmptyString(str,4, 4).trim(); strAry[2]=ODMModelStringUtil.getStringReturnEmptyString(str,5, 12).trim(); strAry[3]=ODMModelStringUtil.getStringReturnEmptyString(str,13, 16).trim(); strAry[4]=ODMModelStringUtil.getStringReturnEmptyString(str,18, 18).trim(); strAry[5]=ODMModelStringUtil.getStringReturnEmptyString(str,19, 26).trim(); strAry[6]=ODMModelStringUtil.getStringReturnEmptyString(str,27, 30).trim(); strAry[7]=ODMModelStringUtil.getStringReturnEmptyString(str,32, 32).trim(); strAry[8]=ODMModelStringUtil.getStringReturnEmptyString(str,36, 37).trim(); strAry[9]=ODMModelStringUtil.getStringReturnEmptyString(str,40, 45).trim(); strAry[10]=ODMModelStringUtil.getStringReturnEmptyString(str,46, 51).trim(); strAry[11]=ODMModelStringUtil.getStringReturnEmptyString(str,52, 57).trim(); strAry[12]=ODMModelStringUtil.getStringReturnEmptyString(str,58, 63).trim(); }else if(mode==4){ strAry[0]=ODMModelStringUtil.getStringReturnEmptyString(str,1, 2).trim(); strAry[1]=ODMModelStringUtil.getStringReturnEmptyString(str,5, 12).trim(); strAry[2]=ODMModelStringUtil.getStringReturnEmptyString(str,13, 16).trim(); strAry[3]=ODMModelStringUtil.getStringReturnEmptyString(str,17, 17).trim(); //omit these two BPA data�� //32 MOTOR����д�ַ�M����ʾ�г������򣬱�ʾ�г������ //34 ILE�����Ҫ�г������֧·�ľ�̬���ɣ���дLE����Ӧ��֧·�� strAry[4]=ODMModelStringUtil.getStringReturnEmptyString(str,37, 37).trim(); strAry[5]=ODMModelStringUtil.getStringReturnEmptyString(str,40, 45).trim(); strAry[6]=ODMModelStringUtil.getStringReturnEmptyString(str,46, 50).trim(); strAry[7]=ODMModelStringUtil.getStringReturnEmptyString(str,51, 55).trim(); strAry[8]=ODMModelStringUtil.getStringReturnEmptyString(str,56, 60).trim(); strAry[9]=ODMModelStringUtil.getStringReturnEmptyString(str,61, 65).trim(); strAry[10]=ODMModelStringUtil.getStringReturnEmptyString(str,66, 70).trim(); strAry[11]=ODMModelStringUtil.getStringReturnEmptyString(str,71, 75).trim(); strAry[12]=ODMModelStringUtil.getStringReturnEmptyString(str,76, 80).trim(); }else if(mode==5){ strAry[0]=ODMModelStringUtil.getStringReturnEmptyString(str,1, 2).trim(); strAry[1]=ODMModelStringUtil.getStringReturnEmptyString(str,5, 12).trim(); strAry[2]=ODMModelStringUtil.getStringReturnEmptyString(str,13, 16).trim(); strAry[3]=ODMModelStringUtil.getStringReturnEmptyString(str,19, 26).trim(); strAry[4]=ODMModelStringUtil.getStringReturnEmptyString(str,27, 30).trim(); strAry[5]=ODMModelStringUtil.getStringReturnEmptyString(str,32, 33).trim(); strAry[6]=ODMModelStringUtil.getStringReturnEmptyString(str,37, 37).trim(); strAry[7]=ODMModelStringUtil.getStringReturnEmptyString(str,40, 45).trim(); strAry[8]=ODMModelStringUtil.getStringReturnEmptyString(str,46, 51).trim(); strAry[9]=ODMModelStringUtil.getStringReturnEmptyString(str,52, 57).trim(); strAry[10]=ODMModelStringUtil.getStringReturnEmptyString(str,58, 63).trim(); } }catch(Exception e){ ODMLogger.getLogger().severe(e.toString()); } return strAry; } }