Example #1
0
 def write_zstring(self, reg, value, orders=0):
     cv = ConvertValue()
     cv.convert_zstring(value, orders)
     cache   = self.cache
     slave_address = cache.slave_address
     lh      = cache.lh
     lh.command(PresetMultipleRegisters(slave_address, reg, cv.buffer))
Example #2
0
    def write_time_6(self, reg, time_value, orders=0):
        #tt = time.localtime(time_value)
        ##print 'write_time_6 ', tt
        #self.write_word(reg,   tt[5], orders)
        #self.write_word(reg+1, tt[4], orders)
        #self.write_word(reg+2, tt[3], orders)
        #self.write_word(reg+3, tt[2], orders)
        #self.write_word(reg+4, tt[1], orders)
        #self.write_word(reg+5, tt[0], orders)

        cv = ConvertValue()
        cv.convert_time_6(time_value, orders)

        cache   = self.cache
        slave_address = cache.slave_address
        lh      = cache.lh
        lh.command(PresetMultipleRegisters(slave_address, reg, cv.buffer))
Example #3
0
 def perform_command(self, cmd):
     _module_lock.acquire()
     try:
         try:
             if   (cmd.function == 1) or (cmd.function == 2): #read coil / input status
                 base_register = 1
                 if cmd.function == 2: base_register = 10001
                 if len(cmd.buffer) > 5:
                     register = cmd.register()
                     count = cmd.count()
                     answer = ConvertValue()
                     for i in range(register,register+count):
                         if self.debug: print '>>>> MODBUS Read coil offset: ' + str(i)
                         value = 0
                         if self.map.has_key(i+base_register):
                             for r in self.map[i+base_register]:
                                 value |= int(r.read())
                         answer.convert_bits(value)
                     if self.debug: print 'server response: ', register, count, answer
                     response = ServerReadResponse(cmd.slave_address, cmd.function, None)
                     response.buffer += chr((count + 7) / 8)
                     response.buffer += answer.collapsed_buffer()
                     return response
             elif (cmd.function == 3) or (cmd.function == 4): #read holding registers
                 base_register = 40001
                 if cmd.function == 4: base_register = 30001
                 if len(cmd.buffer) > 5:
                     register = cmd.register()
                     count = cmd.count()
                     answer = []
                     for i in range(register,register+count):
                         if self.debug: print '>>>> MODBUS Read offset: ' + str(i)
                         #combine the outputs of all nodes that contribute to this register
                         value = [0,0]
                         if self.map.has_key(i+base_register):
                             nodes = self.map[i+base_register]
                             force = len(nodes) > 1
                             for r in nodes:
                                 val_list = r.read(i)
                                 value[0] |= val_list[0]
                                 value[1] |= val_list[1]
                         answer.extend(value)
                     if self.debug: print 'server response: ', register, count, answer
                     return ServerReadResponse(cmd.slave_address, cmd.function, answer)
             elif cmd.function == 5: #force single coil
                 if len(cmd.buffer) > 5:
                     register = cmd.register()
                     value = cmd.word_at(4)
                     if value: value = 1
                     if self.map.has_key(register+1):
                         for r in self.map[register+1]:
                             r.write(value != 0)
                     else:
                         return ErrorResponse(cmd.slave_address, cmd.function, 2) #ILLEGAL DATA ADDRESS
                     return ServerWriteResponse(cmd)
             elif cmd.function == 6: #write single register
                 if len(cmd.buffer) > 5:
                     register = cmd.register()
                     if self.map.has_key(register+40001):
                         nodes = self.map[register+40001]
                         force = len(nodes) > 1
                         for r in nodes:
                         #for r in self.map[register+40001]:
                             r.write(register, cmd.buffer[4:6])
                             if force: #if more than one node at this register, force update to value
                                 r.convert_buffer_to_value()
                                 r.buffer = None
                     else:
                         return ErrorResponse(cmd.slave_address, cmd.function, 2) #ILLEGAL DATA ADDRESS
                     return ServerWriteResponse(cmd)
             elif cmd.function == 16: #write multiple registers
                 if len(cmd.buffer) > 6:
                     register = cmd.register()
                     if self.debug: print 'register', str(register)
                     count = cmd.count()
                     if self.debug: print 'count', str(count)
                     for i in range(0, count):
                         byte_offset = i*2 + 7
                         if self.debug: print '>>>> MODBUS write offset: ' + str(register+i)
                         if self.map.has_key(register+i+40001):
                             nodes = self.map[register+i+40001]
                             for r in nodes:
                                 if self.debug:
                                     print 'node', str(r), str(register+i), str(cmd)
                                     print repr(cmd.buffer)
                                     print str(byte_offset)
                                     print repr(cmd.buffer[byte_offset:byte_offset+2])
                                     print type(cmd.buffer[byte_offset:byte_offset+2])
                                     #print repr(cmd.buffer[byte_offset:byte_offset+2].tostring())
                                     #print repr(r.write)
                                     print 'about to write'
                                 r.write(register+i, cmd.buffer[byte_offset:byte_offset+2]) #.tostring())
                                 if self.debug: print 'finished write'
                         else:
                             return ErrorResponse(cmd.slave_address, cmd.function, 2) #ILLEGAL DATA ADDRESS
                     if self.debug: print 'server response: ', register, count #, answer
                     return ServerWriteResponse(cmd)
             elif cmd.function == 15: #write multiple coils
                 if len(cmd.buffer) > 6:
                     register = cmd.word_at(2)
                     count = cmd.word_at(4)
                     for i in range(0, count):
                         byte_offset = (i/8) + 7
                         bit_offset = i & 0x7
                         if self.debug: print '>>>> MODBUS write offset: ' + str(register+i)
                         if self.map.has_key(register+i+1):
                             value = ord(cmd.buffer[byte_offset]) & (1 << bit_offset)
                             for r in self.map[register+i+1]:
                                 r.write(value != 0)
                         else:
                             return ErrorResponse(cmd.slave_address, cmd.function, 2) #ILLEGAL DATA ADDRESS
                     if self.debug: print 'server response: ', register, count, answer
                     return ServerWriteResponse(cmd)
             if self.debug: print 'Modbus device: Error response sent', cmd.buffer
             return ErrorResponse(cmd.slave_address, cmd.function + 128, 1)
         except:
             msglog.exception()
             if self.debug: print 'modbus server exception during command'
             return ErrorResponse(cmd.slave_address, cmd.function + 128, 4)
     finally:
         _module_lock.release()
Example #4
0
 def perform_command(self, cmd):
     _module_lock.acquire()
     try:
         try:
             if (cmd.function == 1) or (cmd.function
                                        == 2):  #read coil / input status
                 base_register = 1
                 if cmd.function == 2: base_register = 10001
                 if len(cmd.buffer) > 5:
                     register = cmd.register()
                     count = cmd.count()
                     answer = ConvertValue()
                     for i in range(register, register + count):
                         if self.debug:
                             print '>>>> MODBUS Read coil offset: ' + str(i)
                         value = 0
                         if self.map.has_key(i + base_register):
                             for r in self.map[i + base_register]:
                                 value |= int(r.read())
                         answer.convert_bits(value)
                     if self.debug:
                         print 'server response: ', register, count, answer
                     response = ServerReadResponse(cmd.slave_address,
                                                   cmd.function, None)
                     response.buffer += chr((count + 7) / 8)
                     response.buffer += answer.collapsed_buffer()
                     return response
             elif (cmd.function == 3) or (cmd.function
                                          == 4):  #read holding registers
                 base_register = 40001
                 if cmd.function == 4: base_register = 30001
                 if len(cmd.buffer) > 5:
                     register = cmd.register()
                     count = cmd.count()
                     answer = []
                     for i in range(register, register + count):
                         if self.debug:
                             print '>>>> MODBUS Read offset: ' + str(i)
                         #combine the outputs of all nodes that contribute to this register
                         value = [0, 0]
                         if self.map.has_key(i + base_register):
                             nodes = self.map[i + base_register]
                             force = len(nodes) > 1
                             for r in nodes:
                                 val_list = r.read(i)
                                 value[0] |= val_list[0]
                                 value[1] |= val_list[1]
                         answer.extend(value)
                     if self.debug:
                         print 'server response: ', register, count, answer
                     return ServerReadResponse(cmd.slave_address,
                                               cmd.function, answer)
             elif cmd.function == 5:  #force single coil
                 if len(cmd.buffer) > 5:
                     register = cmd.register()
                     value = cmd.word_at(4)
                     if value: value = 1
                     if self.map.has_key(register + 1):
                         for r in self.map[register + 1]:
                             r.write(value != 0)
                     else:
                         return ErrorResponse(cmd.slave_address,
                                              cmd.function,
                                              2)  #ILLEGAL DATA ADDRESS
                     return ServerWriteResponse(cmd)
             elif cmd.function == 6:  #write single register
                 if len(cmd.buffer) > 5:
                     register = cmd.register()
                     if self.map.has_key(register + 40001):
                         nodes = self.map[register + 40001]
                         force = len(nodes) > 1
                         for r in nodes:
                             #for r in self.map[register+40001]:
                             r.write(register, cmd.buffer[4:6])
                             if force:  #if more than one node at this register, force update to value
                                 r.convert_buffer_to_value()
                                 r.buffer = None
                     else:
                         return ErrorResponse(cmd.slave_address,
                                              cmd.function,
                                              2)  #ILLEGAL DATA ADDRESS
                     return ServerWriteResponse(cmd)
             elif cmd.function == 16:  #write multiple registers
                 if len(cmd.buffer) > 6:
                     register = cmd.register()
                     if self.debug: print 'register', str(register)
                     count = cmd.count()
                     if self.debug: print 'count', str(count)
                     for i in range(0, count):
                         byte_offset = i * 2 + 7
                         if self.debug:
                             print '>>>> MODBUS write offset: ' + str(
                                 register + i)
                         if self.map.has_key(register + i + 40001):
                             nodes = self.map[register + i + 40001]
                             for r in nodes:
                                 if self.debug:
                                     print 'node', str(r), str(register +
                                                               i), str(cmd)
                                     print repr(cmd.buffer)
                                     print str(byte_offset)
                                     print repr(
                                         cmd.
                                         buffer[byte_offset:byte_offset +
                                                2])
                                     print type(
                                         cmd.
                                         buffer[byte_offset:byte_offset +
                                                2])
                                     #print repr(cmd.buffer[byte_offset:byte_offset+2].tostring())
                                     #print repr(r.write)
                                     print 'about to write'
                                 r.write(
                                     register + i,
                                     cmd.buffer[byte_offset:byte_offset +
                                                2])  #.tostring())
                                 if self.debug: print 'finished write'
                         else:
                             return ErrorResponse(cmd.slave_address,
                                                  cmd.function,
                                                  2)  #ILLEGAL DATA ADDRESS
                     if self.debug:
                         print 'server response: ', register, count  #, answer
                     return ServerWriteResponse(cmd)
             elif cmd.function == 15:  #write multiple coils
                 if len(cmd.buffer) > 6:
                     register = cmd.word_at(2)
                     count = cmd.word_at(4)
                     for i in range(0, count):
                         byte_offset = (i / 8) + 7
                         bit_offset = i & 0x7
                         if self.debug:
                             print '>>>> MODBUS write offset: ' + str(
                                 register + i)
                         if self.map.has_key(register + i + 1):
                             value = ord(cmd.buffer[byte_offset]) & (
                                 1 << bit_offset)
                             for r in self.map[register + i + 1]:
                                 r.write(value != 0)
                         else:
                             return ErrorResponse(cmd.slave_address,
                                                  cmd.function,
                                                  2)  #ILLEGAL DATA ADDRESS
                     if self.debug:
                         print 'server response: ', register, count, answer
                     return ServerWriteResponse(cmd)
             if self.debug:
                 print 'Modbus device: Error response sent', cmd.buffer
             return ErrorResponse(cmd.slave_address, cmd.function + 128, 1)
         except:
             msglog.exception()
             if self.debug: print 'modbus server exception during command'
             return ErrorResponse(cmd.slave_address, cmd.function + 128, 4)
     finally:
         _module_lock.release()