def __init__ (self, packet_str): self.packet = array.array('B') self.packet.fromstring(packet_str) self.station = self.packet[0] self.function = self.packet[1] self.register = self.packet[3] + (self.packet[2]<<8) self.data = self.packet[5] + (self.packet[4]<<8) if self.packet[4] & 0x80: #its negative, perform 2's complement' self.data = -(~self.data + (2<<15)) self.CRC = self.packet[6] + (self.packet[7]<<8) payload = struct.pack('BBBBBB', self.packet[0], self.packet[1], self.packet[2], self.packet[3], self.packet[4], self.packet[5]) self.calculated_CRC = crc16(payload)
def buildpacket(self): self.packet[0] = self.station = PC_STATION self.packet[1] = self.function if self.function == FUNCTION_READ_INPUT_REGISTER: self.packet[2] = 1 self.packet[3] = self.data >> 8 self.packet[4] = self.data & 0x00FF payload = struct.pack('BBBBB', self.packet[0], self.packet[1], self.packet[2], self.packet[3], self.packet[4]) if self.function == FUNCTION_WRITE_SINGLE_REGISTER: self.packet[2] = self.register >> 8 self.packet[3] = self.register & 0x00FF # self.packet[4] = self.data >> 8 self.packet[5] = self.data & 0x00FF payload = struct.pack('BBBBBB', self.packet[0], self.packet[1], self.packet[2], self.packet[3], self.packet[4], self.packet[5]) self.CRC = crc16(payload) if self.function == FUNCTION_READ_INPUT_REGISTER: self.packet[6] = self.CRC >> 8 self.packet[5] = self.CRC & 0x00FF if self.function == FUNCTION_WRITE_SINGLE_REGISTER: self.packet[7] = self.CRC >> 8 self.packet[6] = self.CRC & 0x00FF