예제 #1
0
    def __init__(self):
        print(ARGVS.fi)
        OlxAPILib.open_olrFile(ARGVS.fi, ARGVS.olxpath)

        #
        self.equipA = set()
        self.busA = set()
        #
        self.brs = OlxAPILib.BranchSearch(gui=0)
예제 #2
0
 def getBusPK_RLGlikeBranch(self, hnd):
     # like
     bra = OlxAPILib.getEquipmentData([hnd], RG_nBranchHnd)
     for br1 in bra:
         bres = OlxAPILib.getBusByBranch(br1)
         self.busPK.update(bres)
         #
         e1 = OlxAPILib.getEquipmentData([br1], BR_nHandle)[0]
         self.equipPK.add(e1)
예제 #3
0
 def getBusPK_RLG(self, hnd):
     br1 = OlxAPILib.getEquipmentData([hnd], RG_nBranchHnd)[0]
     ##        br_res   [] list of branch terminal
     ##        bus_res  [] list of terminal bus
     ##        bus_resa [] list of all bus
     ##        equip    [] list of all equipement
     br_res, bus_res, bus_resa, equip = OlxAPILib.getRemoteTerminals(
         hndBr=br1, typeConsi=[])
     self.busPK.update(bus_resa)
     self.equipPK.update(equip)
예제 #4
0
def run():
    OlxAPILib.open_olrFile(ARGVS.fi, readonly=1)
    bs = OlxAPILib.BusSearch(gui=ARGVS.gui)
    #
    bs.setBusNumber(ARGVS.nu)
    bs.setBusNameKV(ARGVS.na, ARGVS.kv)
    #
    bhnd = bs.runSearch()
    #
    print(bs.stringResult())
예제 #5
0
def run():
    OlxAPILib.open_olrFile(ARGVS.fi, readonly=1)
    bs = OlxAPILib.BranchSearch(gui=ARGVS.gui)
    #
    bs.setBusNum1(ARGVS.nu1)
    bs.setBusNameKV1(ARGVS.na1, ARGVS.kv1)
    bs.setBusNum2(ARGVS.nu2)
    bs.setBusNameKV2(ARGVS.na2, ARGVS.kv2)
    bs.setCktID(ARGVS.cid)
    #
    bhnd = bs.runSearch()
    #
    print(bs.string_result())
예제 #6
0
 def get1(self, b1):
     busTerminal = set()
     abr = OlxAPILib.getBusEquipmentData([b1], TC_BRANCH)[0]
     for br1 in abr:
         inSer1 = OlxAPILib.getEquipmentData([br1], BR_nInService)[0]
         if inSer1 == 1:
             e1 = OlxAPILib.getEquipmentData([br1], BR_nHandle)[0]
             if e1 not in self.equipA:
                 br_res, bus_res, bus_resa, ea1 = OlxAPILib.getRemoteTerminals(
                     br1, typeConsi=[])
                 self.equipA.update(ea1)
                 self.busA.update(bus_resa)
                 busTerminal.update(bus_res)
     return busTerminal
예제 #7
0
def tielines(nParamCode, azNum, equiCode):
    """
     Report tie branches by area or zone
        Args :
            nParamCode = BUS_nArea tie lines by AREA
                       = BUS_nZone tie lines by ZONE
            azNum : area/zone number (if <=0 all area/zone)
            equiCode: code of equipement
               example:
                    = [TC_LINE] => report tie lines
                    = [NULL]    => report tie branches
                    = [TC_LINE, TC_SCAP] => report tie lines and Serie capacitor/reactor

        Returns:
            nC : number of tie branches
            sres: string result

        Raises:
            OlrxAPIException
    """
    equiCode1 = equiCode
    if len(equiCode1) == 0:
        equiCode1 = [TC_LINE, TC_SCAP, TC_PS, TC_SWITCH, TC_XFMR, TC_XFMR3]
    #
    abr = {}
    for ec1 in equiCode1:
        eqa = OlxAPILib.getEquipementHandle(ec1)
        for ehnd1 in eqa:
            bus = OlxAPILib.getBusByEquipement(ehnd1, ec1)
            az = OlxAPILib.getEquipementData(bus, [nParamCode], VT_INTEGER)[0]
            #
            for i in range(len(bus)):
                for j in range(i + 1, len(bus)):
                    if (az[i] != az[j]) and (azNum <= 0 or az[i] == azNum
                                             or az[j] == azNum):
                        abr[ehnd1] = (min(az[i], az[j]), max(az[i], az[j]))
    # sort result
    sa = sorted(abr.items(), key=lambda kv: kv[1])
    # get string result
    sres = ""
    for v1 in sa:
        ec1 = v1[0]
        a1 = v1[1][0]
        a2 = v1[1][1]
        sres += str(a1).ljust(8) + "," + str(a2).ljust(
            8) + "," + OlxAPI.FullBranchName(ec1) + "\n"
    nC = len(sa)
    return nC, sres
예제 #8
0
    def saveReportBusFile(self):
        ARGVS.fb = AppUtils.get_file_out(fo=ARGVS.fb,
                                         fi=ARGVS.fi,
                                         subf='',
                                         ad='_bus',
                                         ext='.txt')
        #
        sr = []
        sr.append('App : ' + PY_FILE)
        sr.append('User: '******'Date: ' + time.asctime())
        sr.append('\nBus report:')

        k = 0
        for b1 in self.busA:
            k += 1
            sb = OlxAPILib.fullBusName(b1)
            sr.append(str(k).ljust(5) + sb)
        if k == 0:
            sr.append('\tNo bus found')
        #
        AppUtils.saveArString2File(ARGVS.fb, sr)
        print('\nReport bus file had been saved in:\n"%s"' % ARGVS.fb)
        #
        if ARGVS.gui > 0 and ARGVS.ut == 0:
            AppUtils.launch_notepad(ARGVS.fb)
예제 #9
0
def getRemoteTerminals_str(br_res, bus_res):
    sres = ""
    for i in range(len(br_res)):
        sres += "\n" + str(i + 1).ljust(
            5) + " Branch: " + OlxAPILib.fullBranchName(br_res[i]) + "\n"
        if len(bus_res[i]) == 0:
            sres += "\t" + str(len(
                bus_res[i])) + " remote terminal (branch out of service)\n"
        else:
            sres += "\t" + str(len(bus_res[i])) + " remote terminals:\n"

        for j in range(len(bus_res[i])):
            if len(bus_res[i]) > 1:
                sres += "\t\t" + str(j + 1) + " " + OlxAPILib.fullBusName(
                    bus_res[i][j]) + "\n"
            else:
                sres += "\t\t" + OlxAPILib.fullBusName(bus_res[i][j]) + "\n"
    return sres
예제 #10
0
def unit_test():
    sres = "\nUNIT TEST: " + PY_FILE + "\n"
    ARGVS.fi = os.path.join(PATH_FILE, "SAMPLE30_1.OLR")
    sres += "OLR file:" + os.path.basename(ARGVS.fi) + "\n"
    #
    OlxAPILib.open_olrFile(ARGVS.fi, readonly=1)
    #
    bs = OlxAPILib.BusSearch(gui=0)
    #
    bs.setBusNameKV("al", 32)
    bhnd = bs.runSearch()
    sres += "\n" + bs.stringResult()
    #
    bs.setBusNameKV("alz", 32)
    bhnd = bs.runSearch()
    sres += "\n\n" + bs.stringResult()
    #
    bs.setBusNameKV("etc", 100)
    bhnd = bs.runSearch()
    sres += "\n\n" + bs.stringResult()
    #
    bs.setBusNameKV("nhs", 33)
    bhnd = bs.runSearch()
    sres += "\n\n" + bs.stringResult()
    #
    bs.setBusNameKV("nhs", 132)
    bhnd = bs.runSearch()
    sres += "\n\n" + bs.stringResult()

    bs.setBusNameKV("jj", 0)
    bhnd = bs.runSearch()
    sres += "\n\n" + bs.stringResult()
    #
    bs.setBusNumber(25)
    bhnd = bs.runSearch()
    sres += "\n\n" + bs.stringResult()
    #
    bs.setBusNumber(250)
    bhnd = bs.runSearch()
    sres += "\n\n" + bs.stringResult()
    print(sres)
    #
    OlxAPILib.unit_test_compare(PATH_FILE, PY_FILE, sres)
예제 #11
0
def linez_fromBus(bsName, bsKV):
    bhnd = OlxAPI.FindBus(bsName, bsKV)
    allBr = OlxAPILib.getBusEquipmentData([bhnd], [TC_BRANCH],
                                          VT_INTEGER)[0][0]
    sres = "All lines from bus: " + OlxAPI.FullBusName(bhnd)
    sres += str("\nNo").ljust(6) + str(",Type   ").ljust(15)
    sres += "," + str("Bus1").ljust(30) + "," + str("Bus2").ljust(30) + ",ID  "
    sres += "," + "Z1".ljust(35)
    sres += "," + "Z0".ljust(35)
    sres += ",Length"
    #
    kd = 1
    for hndBr in allBr:
        if OlxAPILib.branchIsLineComponent(hndBr):
            bra = OlxAPILib.lineComponents(hndBr)
            for bra1 in bra:
                s1 = getsImpedanceLine(kd, bra1)
                sres += s1
                kd += 1
    print(sres)
    return sres
예제 #12
0
 def get_equipByBus(self, bus0):
     res = set()
     for i in range(len(bus0)):
         for j in range(len(bus0)):
             if i != j:
                 self.brs.setBusHnd1(bus0[i])
                 self.brs.setBusHnd2(bus0[j])
                 br1 = self.brs.runSearch()
                 #
                 if br1 > 0:
                     e1 = OlxAPILib.getEquipmentData([br1], BR_nHandle)[0]
                     res.add(e1)
     return res
예제 #13
0
def unit_test():
    sres = "\nUNIT TEST: " + PY_FILE + "\n"
    ARGVS.fi = os.path.join(PATH_FILE, "SAMPLE30_1.OLR")
    OlxAPILib.open_olrFile(ARGVS.fi, readonly=1)
    sres += "OLR file:" + os.path.basename(ARGVS.fi)
    #
    bs = OlxAPILib.BranchSearch(gui=0)
    #
    bs.setBusNameKV1("glen lyn", 132)
    bs.setBusNameKV2("claytor", 132)
    br = bs.runSearch()
    sres += "\n\n" + bs.string_result()

    #
    bs.setCktID("1")
    br = bs.runSearch()
    sres += "\n\n" + bs.string_result()
    #
    bs.setBusNum1(12)
    bs.setBusNum2(15)
    bs.setCktID("")
    br = bs.runSearch()
    sres += "\n\n" + bs.string_result()
    #
    bs.setCktID("2")
    br = bs.runSearch()
    sres += "\n\n" + bs.string_result()
    #
    bs.setNameBranch("/Nev")
    br = bs.runSearch()
    sres += "\n\n" + bs.string_result()
    #
    bs.setNameBranch("Nev/Araz")
    br = bs.runSearch()
    sres += "\n\n" + bs.string_result()
    #
    print(sres)
    OlxAPILib.unit_test_compare(PATH_FILE, PY_FILE, sres)
예제 #14
0
def getStrBus(ws, i):
    nBusNumber = int(ws.getVal(row=i, column=1))
    sBusName = str(ws.getVal(row=i, column=2))
    dBusKv = float(ws.getVal(row=i, column=3))
    sbus = "'" + sBusName + "'," + str(round(dBusKv, 3))
    #
    bhnd = OlxAPI.FindBus(sBusName, dBusKv)
    if bhnd > 0:
        print(sbus.ljust(25), ' : BUS FOUND')
        return sbus
    #
    if nBusNumber > 0:
        bhnd = OlxAPI.FindBusNo(nBusNumber)
    #
    if bhnd <= 0:
        print(sbus.ljust(25), ' : BUS NOT FOUND')
        return ''
    #
    name1 = OlxAPILib.getEquipmentData([bhnd], BUS_sName)[0]
    kv1 = OlxAPILib.getEquipmentData([bhnd], BUS_dKVnominal)[0]
    sbus = "'" + name1 + "'," + str(round(kv1, 3))
    print(sbus.ljust(25), ' : BUS FOUND')
    return sbus
예제 #15
0
def getRemoteTerminals(bhnd):
    """
    Purpose: Find all remote end of all branches (from a bus)
             All taps are ignored. Close switches are included
             =>a test function of OlxAPILib.getRemoteTerminals(hndBr)

        Args :
            bhnd :  bus handle

        returns :
            bus_res [] list of terminal bus

        Raises:
            OlrxAPIException
    """
    br_res = OlxAPILib.getBusEquipmentData([bhnd], [TC_BRANCH],
                                           VT_INTEGER)[0][0]
    bus_res = []
    #
    for br1 in br_res:
        ba = OlxAPILib.getRemoteTerminals(br1)
        bus_res.append(ba)
    return br_res, bus_res
예제 #16
0
 def runBoundaryEquivalent(self):
     #
     ARGVS.fo = AppUtils.get_file_out(fo=ARGVS.fo,
                                      fi=ARGVS.fi,
                                      subf='res',
                                      ad='_res',
                                      ext='.OLR')
     #
     opt = [ARGVS.opt1, ARGVS.opt2, ARGVS.opt3]
     OlxAPILib.BoundaryEquivalent(ARGVS.fo, list(self.busA), opt)
     #
     OlxAPI.CloseDataFile()
     if not os.path.isfile(ARGVS.fo):
         raise Exception(" Run BoundaryEquivalent")
     #
     if ARGVS.gui > 0 and ARGVS.ut == 0:
         AppUtils.launch_OneLiner(ARGVS.fo)
     print('\nOLR result file had been saved in:\n"%s"' % ARGVS.fo)
예제 #17
0
def do1busFlt(bhnd):
    sres = ""
    # all branch connected to bhnd
    bra = OlxAPILib.getBusEquipmentData([bhnd], TC_BRANCH)[0]
    # doFault
    fltConn = [1, 0, 1, 0]  # 3LG, 1LG
    outageOpt = [1, 1, 0, 0]  # one at a time, two at a time
    fltOpt = [1, 1]  # Bus or Close-in, Bus or Close-in w/ outage
    outageLst = []
    for br1 in bra:
        outageLst.append(br1)
    #
    fltR, fltX, clearPrev = 0, 0, 1
    OlxAPILib.doFault(bhnd, fltConn, fltOpt, outageOpt, outageLst, fltR, fltX,
                      clearPrev)
    #
    OlxAPILib.pick1stFault()
    NoFaults = 0
    imax = 0
    fdesmax = ""
    while True:
        NoFaults += 1
        fdes = OlxAPILib.faultDescription()
        sres += "\n\n" + fdes
        sres += "\n                                  "
        mag, ang = OlxAPILib.getSCCurrent(hnd=HND_SC, style=4)
        for i in range(3):
            sres += "," + (str(round(mag[i], 0)) + "@" +
                           str(round(ang[i], 1))).ljust(15)
            if mag[i] > imax:
                imax = mag[i]
                fdesmax = fdes
        #
        if not OlxAPILib.pickNextFault():
            break
    #
    sres += "\n\n" + str(NoFaults) + " Faults Simulated\n"
    sres += "\nMax fault current = " + str(round(imax, 0)) + "A found at:"
    sres += "\n" + fdesmax
    #
    return sres
예제 #18
0
 def run_area_zone(self, ar, zo):
     # get all bus with area = area, zone = zone
     bus_az = set()
     equiCode1 = [TC_LINE, TC_SCAP, TC_PS, TC_SWITCH, TC_XFMR,
                  TC_XFMR3]  #TC_LINE,
     #
     for ec1 in equiCode1:
         eqa = OlxAPILib.getEquipmentHandle(ec1)
         for ehnd1 in eqa:
             bus = OlxAPILib.getBusByEquipment(ehnd1, ec1)
             #
             if len(zo) == 0:
                 ar1 = OlxAPILib.getEquipmentData(bus, BUS_nArea)
                 for i in range(len(bus)):
                     if ar1[i] in ar:
                         bus_az.add(bus[i])
                         if ec1 != TC_LINE:
                             for j in range(len(bus)):
                                 if i != j:
                                     bus_az.add(bus[j])
                             break  # for i
             #
             elif len(ar) == 0:
                 zo1 = OlxAPILib.getEquipmentData(bus, BUS_nZone)
                 for i in range(len(bus)):
                     if zo1[i] in zo:
                         bus_az.add(bus[i])
                         if ec1 != TC_LINE:
                             for j in range(len(bus)):
                                 if i != j:
                                     bus_az.add(bus[j])
                             break  # for i
             #
             else:
                 ar1 = OlxAPILib.getEquipmentData(bus, BUS_nArea)
                 zo1 = OlxAPILib.getEquipmentData(bus, BUS_nZone)
                 for i in range(len(bus)):
                     if (ar1[i] in ar) and (zo1[i] in zo):
                         bus_az.add(bus[i])
                         if ec1 != TC_LINE:
                             for j in range(len(bus)):
                                 if i != j:
                                     bus_az.add(bus[j])
                             break  # for i
     #
     return bus_az
예제 #19
0
def run():
    if not checkInput():
        return
    print("Template file: " + ARGVS.ft)
    print("IEEE-1584 2018")
    #
    import xml.etree.ElementTree as ET
    # update file out
    ARGVS.fo = AppUtils.get_file_out(fo=ARGVS.fo,
                                     fi=ARGVS.fi,
                                     subf='',
                                     ad='',
                                     ext='.csv')
    #
    OlxAPILib.open_olrFile(ARGVS.fi, ARGVS.olxpath)
    #
    ws = AppUtils.ToolCSVExcell()
    ws.readFile(fi=ARGVS.ft, delim=',')
    #
    nSuccess = 0
    #
    for i in range(7, 10000):
        if ws.getVal(row=i, column=1) == None:
            break
        #
        sbus = getStrBus(ws, i)
        if sbus != "":
            if str(ws.getVal(
                    row=6,
                    column=4)) == "Electrode config":  # standardYear = 2018
                data = ET.Element('ARCFLASHCALCULATOR2018')
                data.set('REPFILENAME', ARGVS.fo)  # fo
                data.set('OUTFILETYPE', '2')  # csv file
                if nSuccess == 0:
                    data.set('APPENDREPORT', '0')
                else:
                    data.set('APPENDREPORT', '1')
                #
                data.set('SELECTEDOBJ', sbus)  # bus
                data.set('ELECTRODECFG', str(ws.getVal(row=i, column=4)))
                data.set('BOXH', str(ws.getVal(row=i, column=5)))
                data.set('BOXW', str(ws.getVal(row=i, column=6)))
                data.set('BOXD', str(ws.getVal(row=i, column=7)))
                data.set('CONDUCTORGAP', str(ws.getVal(row=i, column=8)))
                data.set('WORKDIST', str(ws.getVal(row=i, column=9)))
                data.set('BRKINTTIME', str(ws.getVal(row=i, column=10)))
                data.set('ARCDURATION', str(ws.getVal(row=i, column=11)))
                if str(ws.getVal(row=i, column=11)) == "FUSE":
                    data.set('FUSECURVE', str(ws.getVal(row=i, column=12)))
                elif str(ws.getVal(row=i, column=11)) == "FIXED":
                    data.set('ARCTIME', str(ws.getVal(row=i, column=12)))
                elif str(ws.getVal(row=i, column=11)) == "FASTEST":
                    data.set('DEVICETIERS', str(ws.getVal(row=i, column=12)))
            #-------------------------------------------------------------------
            elif str(ws.getVal(
                    row=6,
                    column=4)) == "Equipment Category":  # standardYear = 2012
                raise Exception("Not yet support for standardYear = 2012")
                #
            else:
                raise Exception("Error Template File")
            #
            sInput = ET.tostring(data)
            #
            if OlxAPILib.run1LPFCommand(sInput):
                nSuccess += 1
    #
    if nSuccess > 0:
        print("\nArc-flash calculation ran successfully on " + str(nSuccess) +
              " buses")
        print("Report file had been saved in:\n%s" % ARGVS.fo)

        # open res in Excel
        if ARGVS.ut == 0:
            AppUtils.launch_excel(ARGVS.fo)
    else:
        print(
            "Something was not right (no bus found). No arc flash calculation results."
        )
    return 1
예제 #20
0
def __getsImpedanceLine(kd, bra):  #[TC_LINE,TC_SWITCH,TC_SCAP]
    sres = ""
    typa = OlxAPILib.getEquipementData(bra, [BR_nType], VT_INTEGER)[0]
    #
    bus = OlxAPILib.getEquipementData([bra[0], bra[len(bra) - 1]],
                                      [BR_nBus1Hnd], VT_INTEGER)
    b1, b2 = bus[0][0], bus[0][1]
    #
    kV = OlxAPILib.getEquipementData([b1], [BUS_dKVnominal], VT_DOUBLE)[0][0]
    #
    if len(bra) == 2:  # simple line
        br1 = bra[0]
        typ1 = typa[0]
        equi_hnd = OlxAPILib.getEquipementData([br1], [BR_nHandle],
                                               VT_INTEGER)[0][0]
        #
        if typ1 == TC_LINE:
            val = OlxAPILib.getEquipementData(
                [equi_hnd], [LN_dR, LN_dX, LN_dR0, LN_dX0, LN_dLength],
                VT_DOUBLE)
            r1, x1, r0, x0, length = val[0][0], val[1][0], val[2][0], val[3][
                0], val[4][0]
            #
            idBr = OlxAPILib.getEquipementData([equi_hnd], [LN_sID],
                                               VT_STRING)[0][0]  # id line
            #
            sres += "\n" + str(kd).ljust(5) + str(",Line").ljust(15) + ","
            sres += str(OlxAPI.FullBusName(b1)).ljust(30) + ","
            sres += str(OlxAPI.FullBusName(b2)).ljust(30) + ","
            sres += str(idBr).ljust(4) + ","
            sres += OlxAPILib.printImpedance(r1, x1, kV).ljust(35) + ","
            sres += OlxAPILib.printImpedance(r0, x0, kV).ljust(35) + ","
            sres += "{0:.2f}".format(length)
        elif typ1 == TC_SWITCH:
            idBr = OlxAPILib.getEquipementData([equi_hnd], [SW_sID],
                                               VT_STRING)[0][0]  # id switch
            #
            sres += "\n" + str(kd).ljust(5) + str(",Switch").ljust(15) + ","
            sres += str(OlxAPI.FullBusName(b1)).ljust(30) + ","
            sres += str(OlxAPI.FullBusName(b2)).ljust(30) + ","
            sres += str(idBr).ljust(4) + ","
        elif typ1 == TC_SCAP:
            val = OlxAPILib.getEquipementData([equi_hnd],
                                              [SC_dR, SC_dX, SC_dR0, SC_dX0],
                                              VT_DOUBLE)
            r1, x1, r0, x0 = val[0][0], val[1][0], val[2][0], val[3][0]
            #
            idBr = OlxAPILib.getEquipementData([equi_hnd], [SC_sID],
                                               VT_STRING)[0][0]  # id switch
            #
            sres += "\n" + str(kd).ljust(5) + str(",SerieCap").ljust(15) + ","
            sres += str(OlxAPI.FullBusName(b1)).ljust(30) + ","
            sres += str(OlxAPI.FullBusName(b2)).ljust(30) + ","
            sres += str(idBr).ljust(4) + ","
            sres += OlxAPILib.printImpedance(r1, x1, kV).ljust(35) + ","
            sres += OlxAPILib.printImpedance(r0, x0, kV).ljust(35) + ","
    else:  #Line with Tap bus
        r1a, x1a, r0a, x0a, lengtha = 0, 0, 0, 0, 0
        for i in range(len(bra) - 1):
            br1 = bra[i]
            typ1 = typa[i]
            bus = OlxAPILib.getEquipementData([br1],
                                              [BR_nBus1Hnd, BR_nBus2Hnd],
                                              VT_INTEGER)
            b1i, b2i = bus[0][0], bus[1][0]
            #
            equi_hnd = OlxAPILib.getEquipementData([br1], [BR_nHandle],
                                                   VT_INTEGER)[0][0]
            if typ1 == TC_LINE:
                val = OlxAPILib.getEquipementData(
                    [equi_hnd], [LN_dR, LN_dX, LN_dR0, LN_dX0, LN_dLength],
                    VT_DOUBLE)
                r1, x1, r0, x0, length = val[0][0], val[1][0], val[2][0], val[
                    3][0], val[4][0]
                r1a, x1a, r0a, x0a, lengtha = r1a + r1, x1a + x1, r0a + r0, x0a + x0, lengtha + length
                #
                idBr = OlxAPILib.getEquipementData([equi_hnd], [LN_sID],
                                                   VT_STRING)[0][0]  # id line
                #
                sres += "\n" + str("").ljust(5) + str(",  Line_seg").ljust(
                    15) + ","
                sres += str(OlxAPI.FullBusName(b1i)).ljust(30) + ","
                sres += str(OlxAPI.FullBusName(b2i)).ljust(30) + ","
                sres += str(idBr).ljust(4) + ","
                sres += OlxAPILib.printImpedance(r1, x1, kV).ljust(35) + ","
                sres += OlxAPILib.printImpedance(r0, x0, kV).ljust(35) + ","
                sres += "{0:.2f}".format(length)
            elif typ1 == TC_SWITCH:
                idBr = OlxAPILib.getEquipementData(
                    [equi_hnd], [SW_sID], VT_STRING)[0][0]  # id switch
                #
                sres += "\n" + str("").ljust(5) + str(",  Switch_seg").ljust(
                    15) + ","
                sres += str(OlxAPI.FullBusName(b1i)).ljust(30) + ","
                sres += str(OlxAPI.FullBusName(b2i)).ljust(30) + ","
                sres += str(idBr).ljust(4) + ","
            elif typ1 == TC_SCAP:
                val = OlxAPILib.getEquipementData(
                    [equi_hnd], [SC_dR, SC_dX, SC_dR0, SC_dX0], VT_DOUBLE)
                r1, x1, r0, x0 = val[0][0], val[1][0], val[2][0], val[3][0]
                r1a, x1a, r0a, x0a = r1a + r1, x1a + x1, r0a + r0, x0a + x0
                #
                idBr = OlxAPILib.getEquipementData(
                    [equi_hnd], [SC_sID], VT_STRING)[0][0]  # id switch
                #
                sres += "\n" + str("").ljust(5) + str(",  SerieCap_seg").ljust(
                    15) + ","
                sres += str(OlxAPI.FullBusName(b1i)).ljust(30) + ","
                sres += str(OlxAPI.FullBusName(b2i)).ljust(30) + ","
                sres += str(idBr).ljust(4) + ","
                sres += OlxAPILib.printImpedance(r1, x1, kV).ljust(35) + ","
                sres += OlxAPILib.printImpedance(r0, x0, kV).ljust(35) + ","
        #summary
        sres += "\n" + str(kd).ljust(5) + str(",Line_sum").ljust(15) + ","
        sres += str(OlxAPI.FullBusName(b1)).ljust(30) + ","
        sres += str(OlxAPI.FullBusName(b2)).ljust(30) + ","
        sres += str("").ljust(4) + ","
        sres += OlxAPILib.printImpedance(r1a, x1a, kV).ljust(35) + ","
        sres += OlxAPILib.printImpedance(r0a, x0a, kV).ljust(35) + ","
        sres += "{0:.2f}".format(lengtha)
    return sres + "\n"
예제 #21
0
def run():
    """
      Check phase shift of all 2-winding transformers with wye-delta connection.
          When a transformer with high side lagging the low side is found,
          this function converts it to make the high side lead.

        Args :
            None
        Returns:
            string result
            OLR corrected file

        Raises:
            OlrxAPIException
    """
    #
    if not AppUtils.checkInputOLR(ARGVS.fi, PY_FILE, PARSER_INPUTS):
        return
    #
    OlxAPILib.open_olrFile_1(ARGVS.olxpath, ARGVS.fi, readonly=1)
    s1 = ""
    # get all xfmr
    x2a = OlxAPILib.getEquipmentHandle(TC_XFMR)
    kd = 0
    for x1 in x2a:
        configA = OlxAPILib.getEquipmentData([x1], XR_sCfg1)[0]
        configB = OlxAPILib.getEquipmentData([x1], XR_sCfg2)[0]
        tapA = OlxAPILib.getEquipmentData([x1], XR_dTap1)[0]
        tapB = OlxAPILib.getEquipmentData([x1], XR_dTap2)[0]
        #
        test = False

        # low - hight  =>  low - hight
        #   G   - D             G  - E
        if (tapA < tapB) and configA == "G" and configB == "D":
            test = True
            # set
            OlxAPILib.setData(x1, XR_sCfg2, "E")
            # validation
            OlxAPILib.postData(x1)

        # low - small  =>  low - small
        #  G    - E              G - D
        if (tapA > tapB) and configA == "G" and configB == "E":
            test = True
            # set
            OlxAPILib.setData(x1, XR_sCfg2, "D")
            # validation
            OlxAPILib.postData(x1)
        #
        if test:
            kd += 1
            s1 += '\n' + str(kd).ljust(5) + OlxAPILib.fullBranchName(x1)
    #
    if kd > 0:
        s2 = "Fixed (" + str(
            kd
        ) + ") wye-delta transformers to make the high side lead the low side:"
    else:
        s2 = "All wye-delta transformers in this OLR file have the correct phase shift of the high-side leading the low-side."
    #
    print(s2 + s1)
    #
    if kd > 0:
        ARGVS.fo = AppUtils.get_file_out(fo=ARGVS.fo,
                                         fi=ARGVS.fi,
                                         subf='',
                                         ad='_res',
                                         ext='.OLR')
        #
        OlxAPILib.saveAsOlr(ARGVS.fo)
        if ARGVS.ut == 0:
            print("The modified network had been saved as:\n" + ARGVS.fo)
            AppUtils.launch_OneLiner(ARGVS.fo)
    #
    return s2 + s1
예제 #22
0
def run():
    if not AppUtils.checkInputOLR(ARGVS.fi, PY_FILE, PARSER_INPUTS):
        return
    if not AppUtils.checkInputPK(ARGVS.pk, 'Relay Group', PY_FILE,
                                 PARSER_INPUTS):
        return
    #

    OlxAPILib.open_olrFile(ARGVS.fi, ARGVS.olxpath)
    #
    bhnd, tc = OlxAPILib.FindObj1LPF(ARGVS.pk[0])
    if tc != TC_RLYGROUP:
        s = "\nNo Relay Group is selected: " + str(
            ARGVS.pk) + "\nUnable to continue."
        return AppUtils.FinishCheck(PY_FILE, s, PARSER_INPUTS)
    #
    br1 = OlxAPILib.getEquipmentData([bhnd], RG_nBranchHnd)[0]
    b1 = OlxAPILib.getEquipmentData([br1], BR_nBus1Hnd)[0]
    nTap1 = OlxAPILib.getEquipmentData([b1], BUS_nTapBus)[0]
    inSer1 = OlxAPILib.getEquipmentData([br1], BR_nInService)[0]
    sLocal = "Local Relay Group: " + OlxAPILib.fullBranchName(br1)
    if nTap1 > 0:
        s = '\n' + sLocal + "\n\tis located at a TAP bus. Unable to continue."
        return AppUtils.FinishCheck(PY_FILE, s, None)
    #
    if inSer1 != 1:
        s = '\n' + sLocal + "\n\tis located on out-of-service branch. Unable to continue."
        return AppUtils.FinishCheck(PY_FILE, s, None)
    #
    kr = 0
    sres = ""
    bres = OlxAPILib.getOppositeBranch(
        hndBr=br1, typeConsi=[]
    )  # consider all type [TC_LINE,TC_SWITCH,TC_SCAP,TC_PS,TC_XFMR,TC_XFMR3]
    #
    for bri in bres:
        rg1 = -1
        try:
            rg1 = OlxAPILib.getEquipmentData([bri], BR_nRlyGrp1Hnd)[0]
        except:
            pass
        #
        if rg1 > 0:
            kr += 1
            sres += "\n\t" + OlxAPILib.fullBranchName(bri)
    #
    s0 = 'App: ' + PY_FILE
    s0 += '\nUser: '******'\nDate: ' + time.asctime()
    s0 += '\nOLR file: ' + ARGVS.fi
    s0 += '\n\nSelected Relay Group:' + str(ARGVS.pk[0])

    if kr > 1:
        s0 += "\nRemote groups (" + str(kr) + "):"
    else:
        s0 += "\nRemote group (" + str(kr) + "):"
    #
    ARGVS.fo = AppUtils.get_file_out(fo=ARGVS.fo,
                                     fi=ARGVS.fi,
                                     subf='res',
                                     ad='_res',
                                     ext='.txt')
    #
    AppUtils.saveString2File(ARGVS.fo, s0 + sres)
    print("\nReport file had been saved in:\n" + ARGVS.fo)
    if ARGVS.ut == 0:
        AppUtils.launch_notepadpp(ARGVS.fo)
    return 1
예제 #23
0
def do1busFlt1(bhnd):
    #
    fltConn   = [1,1,1,1]
    #
    fltOpt    = [0]*15
    fltOpt[0] = 1  # Bus or Close-in
    OlxAPILib.doFault(bhnd,fltConn, fltOpt, outageOpt=[], outageLst=[], fltR=0, fltX=0, clearPrev=1)
    OlxAPILib.pick1stFault()
    #
    nRound = 2
    sres = ''
    while True:
        sres += "\n"+ OlxAPILib.faultDescription()
        #
        mag,ang = OlxAPILib.getSCCurrent(hnd=HND_SC,style=4)
        #
        for i in range(3):
            sres += "," + str(round(mag[i],nRound)) +"@"  +  str(round(ang[i],nRound))
        #
        r0 =  OlxAPILib.getEquipmentData([HND_SC],FT_dRZt)[0]
        r1 =  OlxAPILib.getEquipmentData([HND_SC],FT_dRPt)[0]
        r2 =  OlxAPILib.getEquipmentData([HND_SC],FT_dRNt)[0]
        #
        x0 =  OlxAPILib.getEquipmentData([HND_SC],FT_dXZt)[0]
        x1 =  OlxAPILib.getEquipmentData([HND_SC],FT_dXPt)[0]
        x2 =  OlxAPILib.getEquipmentData([HND_SC],FT_dXNt)[0]
        #
        xr = OlxAPILib.getEquipmentData([HND_SC],FT_dXR)[0]
        #  R0+jX0, R1+jX1, R2+jX2, X/R
        sres += "," + str(round(r0,nRound)) +"+j" + str(round(x0,nRound))
        sres += "," + str(round(r1,nRound)) +"+j" + str(round(x1,nRound))
        sres += "," + str(round(r2,nRound)) +"+j" + str(round(x2,nRound))
        sres += "," + str(round(xr,nRound))
        if not OlxAPILib.pickNextFault():
            break
    #
    return sres