def ramp(self, setpoint, maxStep=.5, disconnectWhenFinished=False): tag = self.pSetpointTag currentSetpoint = tagClient.readTags([tag]) diff = setpoint - currentSetpoint if diff > maxStep: currentSetpoint += maxStep elif diff < -maxStep: currentSetpoint -= maxStep else: currentSetpoint += diff tagClient.writeTags([tag], [currentSetpoint]) if abs(diff) > .001: #schedule a callback, allowing some time for actuation sched = datetime.now() + timedelta(seconds=1.5) Core.schedule(sched, self.ramp) print("{me} is scheduling another ramp call: {cs}".format( me=self.channelNumber, cs=currentSetpoint)) if disconnectWhenFinished == True and setpoint == 0: print("ramp with disconnect completed, disconnecting {me}". format(me=self.channelNumber)) self.disconnect() else: print("{me} is done ramping to {set}".format(me=self.name, set=setpoint))
def cleanup(): tags = [ "BRANCH_1_BUS_1_FAULT", "BRANCH_1_BUS_2_FAULT", "BRANCH_2_BUS_1_FAULT", "BRANCH_2_BUS_2_FAULT", "CROSSTIE_1_FAULT_1", "CROSSTIE_1_FAULT_2", "CROSSTIE_2_FAULT_1", "CROSSTIE_2_FAULT_2", "MAIN_BUS_FAULT" ] vals = [False] * 9 tagClient.writeTags(tags, vals)
def openRelay(self): if self.locked: print("TRIED TO OPEN LOCKED RELAY {nam}".format(nam=self.tagName)) return False else: if self.type == "infrastructure": tagClient.writeTags([self.tagName],[True]) elif self.type == "load" or self.type == "source": tagClient.writeTags([self.tagName],[False]) self.closed = False return True
def connectWithSet(self, setpoint, voffset=0): self.setpoint = setpoint droopCoeff = self.setpoint / (self.noLoadVoltage - self.refVoltage) #set up parameters for droop control tags = [self.noLoadVoltageTag, self.droopCoeffTag, self.droopSelectTag] values = [ self.noLoadVoltage + voffset, self.setpoint / (self.noLoadVoltage - self.refVoltage), True ] tagClient.writeTags(tags, values) #close relay and connect source self.connected = self.connect() return self.connected
def connectSoft(self, mode, setpoint): ch = self.channelNumber if mode == "Vreg": tagClient.writeTags([self.vSetpointTag], [0]) tags = [ self.battSelectTag, self.powerSelectTag, self.swingSelectTag ] tagClient.writeTags([tags], [False, False, True]) tagClient.writeTags([self.relayTag], [True]) tagClient.writeTags([self.vSetpointTag], [setpoint]) elif mode == "Preg": tagClient.writeTags([self.pSetpointTag], [0]) tags = [ self.battSelectTag, self.powerSelectTag, self.swingSelectTag ] tagClient.writeTags([tags], [False, True, False]) tagClient.writeTags([self.relayTag], [True]) self.ramp(setpoint) elif mode == "BattCharge": tags = [self.pSetpointTag, self.battSelectTag] tagClient.writeTags([tags], [0, True]) tag = "SOURCE_{d}_BatteryReqCharge".format(d=self.channelNumber) tagClient.writeTags([tag], [True]) tagClient.writeTags([self.pSetpointTag], [setpoint]) else: print("CHANNEL{ch} received a bad mode request: {mode}".format( ch=self.channelNumber, mode=mode)) if tagClient.readTags([self.relayTag]): self.connected = True return True else: self.connected = False return False
def addVoltageOffset(self, deltavoffset): voffset = tagClient.readTags([self.noLoadVoltage]) voffset += deltavoffset tagClient.writeTags([self.noLoadVoltage], [voffset])
def setVoltageOffset(self, voffset): tagClient.writeTags([self.noLoadVoltageTag], [self.noLoadVoltage + voffset])
def changeReserve(self, newPower, voffset): self.setpoint = newPower droopCoeff = self.setpoint / (self.noLoadVoltage - self.refVoltage) tagClient.writeTags([self.droopCoeffTag, self.noLoadVoltageTag], [droopCoeff, self.noLoadVoltage + voffset])
def changeSetpoint(self, newPower): self.setpoint = newPower droopCoeff = self.setpoint / (self.noLoadVoltage - self.refVoltage) tagClient.writeTags([self.droopCoeffTag, self.noLoadVoltageTag], [droopCoeff, self.noLoadVoltage])
def connect(self): tagClient.writeTags([self.relayTag], [True]) #read tag to confirm write success self.connected = tagClient.readTags([self.relayTag]) #self.connected = True return self.connected
def disconnectSoft(self): #change setpoint to zero tagClient.writeTags([self.pSetpointTag], [0]) #callback and keep calling back until the current is almost zero now = datetime.now() Core.schedule(now + timedelta(seconds=1), self.waitForSettle)
def disconnect(self): #disconnect power from the source tagClient.writeTags([self.relayTag], [False]) #read tag to confirm write success return tagClient.readTags([self.relayTag])
def timed_fault(tag, duration): tagClient.writeTags([tag], [True], "SG") time.sleep(duration) tagClient.writeTags([tag], [False], "SG")
def persistent_fault(tag): tagClient.writeTags([tag], [True], "SG")
def connectCustomer(self): tagClient.writeTags([self.relayTag],[True])
def disconnectCustomer(self): tagClient.writeTags([self.relayTag],[False])