def writeCosPhi(self, valCosPhi=1.0, test=False): #self.logger.info('writeCosPhi called') addr = 61706 # Modbus address of FixedCosPhi if test: # Check to see if this function is going to be used for testing or just writing to register if self.tcpClient.is_open(): try: data_conv = utils.encode_ieee(valCosPhi) regs_data = self.tcpClient.write_multiple_registers( addr, [data_conv & 0xffff, (data_conv & 0xffff0000) >> 16]) return str(regs_data) except Exception as exc: self.logger.exception(exc) client.captureException() return False else: self.tcpClient.open() return False else: try: data_conv = utils.encode_ieee(valCosPhi) regs_data = self.tcpClient.write_multiple_registers( addr, [data_conv & 0xffff, (data_conv & 0xffff0000) >> 16]) return str(regs_data) except Exception as exc: self.logger.exception(exc) client.captureException() return False
def test_encode_ieee(self): # test IEEE NaN self.assertEqual(utils.encode_ieee(float('nan')), 2143289344) # test +/- infinity #self.assertTrue(math.isinf(utils.decode_ieee(0xff800000))) #self.assertTrue(math.isinf(utils.decode_ieee(0x7f800000))) # test some values self.assertAlmostEqual(utils.encode_ieee(0.3), 0x3e99999a) self.assertAlmostEqual(utils.encode_ieee(-0.3), 0xbe99999a)
def realtime(self, battVal=0.0, cosPhi=1.0): #self.logger.info('StorageRT function called') if battVal > 0: command_mode = 4 # Discharging (positive values) elif battVal < 0: command_mode = 3 # Charging (negative values) else: command_mode = 1 # Battery power battPower = abs(battVal) # [W]: float32: [-3300W ... 3300W] powerFloat = utils.encode_ieee(battPower) # Converting to ieee float32 if self.tcpClient.is_open(): # Setting time self.tcpClient.write_multiple_registers( self.addr_time, [self.timeBatt & 0xffff, (self.timeBatt & 0xffff0000) >> 16]) # Setting mode self.tcpClient.write_single_register(self.addr_command, command_mode) # Setting power if command_mode == 4: regs_disPower = self.tcpClient.write_multiple_registers( self.addr_disPower, [powerFloat & 0xffff, (powerFloat & 0xffff0000) >> 16]) if str(regs_disPower ) != "True": # Check if write function worked return 0 else: return float(time.time()) elif command_mode == 3: regs_chaPower = self.tcpClient.write_multiple_registers( self.addr_chaPower, [powerFloat & 0xffff, (powerFloat & 0xffff0000) >> 16]) if str(regs_chaPower ) != "True": # Check if write function worked return 0 else: return float(time.time()) else: return 0 else: self.tcpClient.open() return -1
def write_float(self, address, floats_list): b32_1 = [utils.encode_ieee(f) for f in floats_list] b16_1 = utils.long_list_to_word(b32_1) return self.write_multiple_registers(address, b16_1)
def write_float(self, address, floats_list): b32_l = [utils.encode_ieee(f) for f in floats_list] b16_l = utils.long_list_to_word(b32_l) return self.write_multiple_registers(address, b16_l)
def set_floats(cls, address, floats_list): b32_l = [utils.encode_ieee(f) for f in floats_list] b16_l = utils.long_list_to_word(b32_l) return cls.set_words(address, b16_l)
def write_float(self, address, floats_list): b32_l = [utils.encode_ieee(f) for f in floats_list] b16_l = utils.long_list_to_word(b32_l) return self.modbusClient.write_multiple_registers(address, floats_list)
def urlBased(self, devId, state=None, powerReal=0, cosPhi=1.0): #self.logger.info('Storage URL function called') if state == None: batt = requests.get(url=self.PWRNET_API_BASE_URL + "device/" + devId + "/", timeout=10) battStatus = batt.json()["status"] power = batt.json()["value"] phi = batt.json()["cosphi"] print "power: ", power print "phi: ", phi else: battStatus = state if (battStatus == "DISCHARGE"): command_mode = 4 elif (battStatus == "CHARGE"): command_mode = 3 else: command_mode = 1 powerFloat = utils.encode_ieee( powerReal) # Converting power to ieee float32 #powerFloat = utils.encode_ieee(power) # Converting power to ieee float32 if self.tcpClient.is_open(): #print 'TCP battery Opened!' # Setting time self.tcpClient.write_multiple_registers( self.addr_time, [self.timeBatt & 0xffff, (self.timeBatt & 0xffff0000) >> 16]) # Setting mode self.tcpClient.write_single_register(self.addr_command, command_mode) # Setting cosphi #print "writing cosphi" #regs_cosphi = self.writeCosPhi(valCosPhi=phi) regs_cosphi = self.writeCosPhi(valCosPhi=cosPhi) #print "regs_cosphi: ", regs_cosphi if regs_cosphi == False: return -1 # Setting power if (command_mode == 4): regs_disPower = self.tcpClient.write_multiple_registers( self.addr_disPower, [powerFloat & 0xffff, (powerFloat & 0xffff0000) >> 16]) if (str(regs_disPower) != "True"): # Check if write function worked return 0 else: return float(time.time()) elif (command_mode == 3): regs_chaPower = self.tcpClient.write_multiple_registers( self.addr_chaPower, [powerFloat & 0xffff, (powerFloat & 0xffff0000) >> 16]) if (str(regs_chaPower) != "True"): # Check if write function worked return 0 else: return float(time.time()) else: return 0 else: #self.logger.debug('tcpClient is not open') self.tcpClient.open() #print 'Returning batt...' return -1
def write_multiple_floats(self, address: int, floats_list: list): integer_32bits_representation_list = [modbus_utils.encode_ieee(number) for number in floats_list] integers_represented_in_list_of_16bits = modbus_utils.long_list_to_word(integer_32bits_representation_list) return self.write_multiple_registers(address, integers_represented_in_list_of_16bits)
def write_float(self, address: int, float_number: float): integer_32bits_representation = modbus_utils.encode_ieee(float_number) integer_represented_in_list_of_16bits = modbus_utils.long_list_to_word([integer_32bits_representation]) return self.write_multiple_registers(address, integer_represented_in_list_of_16bits)
c = ModbusClient() c.host(client_host) c.port(client_port) if not c.is_open(): if not c.open(): print("unable to connect to " + client_host + ":" + str(client_port)) def int32_to_int8(n): mask = (1 << 16) - 1 return [(n >> k) & mask for k in range(0, 32, 16)] var_int = utils.encode_ieee(7.5) print(var_int) sonuc=int32_to_int8(var_int) print(sonuc) if c.is_open(): # read 10 registers at address 0, store result in regs list print(var_int) c.write_single_register(0,5) c.write_multiple_registers(1,sonuc) regs = c.read_holding_registers(0,100) # if success display registers if regs: print("reg ad #0 to 9: " , regs) bits = c.read_discrete_inputs(0, 16)