diff --git a/README.md b/README.md index 4725edd..7374ad0 100644 --- a/README.md +++ b/README.md @@ -355,6 +355,13 @@ doubleValue: Value to be converted register_order: Desired Word Order (Low Register first or High Register first - Default: RegisterOrder.lowHigh return: 16 Bit Register values int[] +**def convert_quad_to_four_registers(quadValue, register_order=RegisterOrder.lowHigh): + +Convert 64 Bit Value to four 16 Bit Value to send as Modbus Registers +quadValue: Value to be converted +register_order: Desired Word Order (Low Register first or High Register first - Default: RegisterOrder.lowHigh +return: 16 Bit Register values int[] + **def convert_float_to_two_registers(floatValue, register_order=RegisterOrder.lowHigh)** Convert 32 Bit real Value to two 16 Bit Value to send as Modbus Registers @@ -362,6 +369,12 @@ floatValue: Value to be converted register_order: Desired Word Order (Low Register first or High Register first - Default: RegisterOrder.lowHigh return: 16 Bit Register values int[] +**def convert_float64_to_four_registers(float64Value, register_order=RegisterOrder.lowHigh): + +Convert 64 Bit real Value to two 16 Bit Value to send as Modbus Registers +floatValue: Value to be converted +return: 16 Bit Register values int[] + **def convert_registers_to_double(registers, register_order=RegisterOrder.lowHigh)** Convert two 16 Bit Registers to 32 Bit long value - Used to receive 32 Bit values from Modbus (Modbus Registers are 16 Bit long) @@ -369,9 +382,21 @@ registers: 16 Bit Registers register_order: Desired Word Order (Low Register first or High Register first - Default: RegisterOrder.lowHigh return: 32 bit value +def convert_registers_to_quad(registers, register_order=RegisterOrder.lowHigh): + +Convert four 16 Bit Registers to 64 Bit long value - Used to receive 64Bit values from Modbus (Modbus Registers are 16 Bit long) +registers: 16 Bit Registers +return: 64 bit value + **def convert_registers_to_float(registers, register_order=RegisterOrder.lowHigh)** Convert two 16 Bit Registers to 32 Bit real value - Used to receive float values from Modbus (Modbus Registers are 16 Bit long) registers: 16 Bit Registers register_order: Desired Word Order (Low Register first or High Register first - Default: RegisterOrder.lowHigh -return: 32 bit value real \ No newline at end of file +return: 32 bit value real + +**def convert_registers_to_float64(registers, register_order=RegisterOrder.lowHigh): + +Convert two 16 Bit Registers to 64 Bit real value - Used to receive float values from Modbus (Modbus Registers are 16 Bit long) +registers: 16 Bit Registers +return: 64 bit value real diff --git a/easymodbus/modbusClient.py b/easymodbus/modbusClient.py index 059646a..2570dcd 100644 --- a/easymodbus/modbusClient.py +++ b/easymodbus/modbusClient.py @@ -191,7 +191,7 @@ def read_input_registers(self, starting_address, quantity): """ logging.info("Request to read Input Registers (FC04), starting address: {0}, quantity: {1}" .format(str(starting_address), str(quantity))) - return_value = self.read_analogs(starting_address, quantity, FunctionCode.READ_INPUT_REGISTERS) + return_value = self.execute_read_order(starting_address, quantity, FunctionCode.READ_INPUT_REGISTERS) logging.info("Response to Input Registers (FC04), values: {0}" .format(str(return_value))) return return_value @@ -444,14 +444,14 @@ def baudrate(self, baudrate): @property def parity(self): """ - Gets the of Parity in case of serial connection + Gets the value of Parity in case of serial connection """ return self.__parity @parity.setter def parity(self, parity): """ - Sets the of Parity in case of serial connection + Sets the value of Parity in case of serial connection Example modbusClient.Parity = Parity.even """ self.__parity = parity @@ -562,6 +562,35 @@ def convert_double_to_two_registers(doubleValue, register_order=RegisterOrder.lo return myList +def convert_quad_to_four_registers(quadValue, register_order=RegisterOrder.lowHigh): + """ + Convert 64 Bit Value to four 16 Bit Value to send as Modbus Registers + quadValue: Value to be converted + register_order: Desired Word Order (Low Register first or High Register first - Default: RegisterOrder.lowHigh + return: 16 Bit Register values int[] + """ + myList = list() + + # Append Least Significant Word + myList.append(int(quadValue & 0x000000000000FFFF)) + # Append a little bit more Significant Word + myList.append(int((quadValue & 0x00000000FFFF0000) >> 16)) + # Append a bit more Significant Word + myList.append(int((quadValue & 0x0000FFFF00000000) >> 32)) + # Append Most Significant Word + myList.append(int((quadValue & 0xFFFF000000000000) >> 48)) + if register_order == RegisterOrder.highLow: + # Append Most Significant Word + myList[0] = (int((quadValue & 0xFFFF000000000000) >> 48)) + # Append a little bit less Significant Word + myList[1] = (int((quadValue & 0x0000FFFF00000000) >> 32)) + # Append a bit less Significant Word + myList[2] = (int((quadValue & 0x00000000FFFF0000) >> 16)) + # Append Least Significant Word + myList[3] = (int(quadValue & 0x000000000000FFFF)) + return myList + + def convert_float_to_two_registers(floatValue, register_order=RegisterOrder.lowHigh): """ Convert 32 Bit real Value to two 16 Bit Value to send as Modbus Registers @@ -578,9 +607,30 @@ def convert_float_to_two_registers(floatValue, register_order=RegisterOrder.lowH return myList +def convert_float64_to_four_registers(float64Value, register_order=RegisterOrder.lowHigh): + """ + Convert 64 Bit real Value to two 16 Bit Value to send as Modbus Registers + floatValue: Value to be converted + return: 16 Bit Register values int[] + """ + myList = list() + s = bytearray(struct.pack('> 8 + b[2] = (registers[1] & 0xff) + b[3] = (registers[1] & 0xff00) >> 8 + b[4] = (registers[2] & 0xff) + b[5] = (registers[2] & 0xff00) >> 8 + b[6] = (registers[3] & 0xff) + b[7] = (registers[3] & 0xff00) >> 8 + if register_order == RegisterOrder.highLow: + b[6] = registers[0] & 0xff + b[7] = (registers[0] & 0xff00) >> 8 + b[4] = registers[0] & 0xff + b[5] = (registers[0] & 0xff00) >> 8 + b[2] = registers[0] & 0xff + b[3] = (registers[0] & 0xff00) >> 8 + b[0] = (registers[1] & 0xff) + b[1] = (registers[1] & 0xff00) >> 8 + returnValue = struct.unpack('> 1 - return crc \ No newline at end of file + return crc diff --git a/easymodbus/run.py b/easymodbus/run.py index 9d5dfa2..b113a03 100644 --- a/easymodbus/run.py +++ b/easymodbus/run.py @@ -6,7 +6,7 @@ ''' # @UnresolvedImport -from modbusClient import * +from easymodbus.modbusClient import * # @UnresolvedImport modbusClient = ModbusClient('127.0.0.1', 502) @@ -30,4 +30,4 @@ modbusClient.write_single_register(0, 777) modbusClient.write_multiple_coils(0, [True,True,True,True,True,False,True,True]) modbusClient.write_multiple_registers(0, convert_float_to_two_registers(3.141517)) -modbusClient.close() \ No newline at end of file +modbusClient.close()