você está aqui: Home  → Arquivo de Mensagens Programe sua mente para aprender inglês - ebook gratuito

Leitura de dados Modbus (TCP) com Python

Colaboração: Felipe Santos

Data de Publicação: 31 de agosto de 2015

Recentemente tenho trabalhado com comunicação de alguns equipamentos em que preciso "coletar" valores com o protocolo MODBUS, algumas vezes tive problemas para fechar essa comunicação e tinha que realizar testes prévios usando algum outro software para ver se realmente o equipamento estava respondendo corretamente. Então resolvi fazer um script em python para realizar a comunicação e coletar os valores.

Download do script

  #!/usr/bin/env python
  
  import socket
  import struct
  import time
  
  # Dados para a comunicacao Modbus TCP
  TCP_IP = 'localhost'
  TCP_PORT = 50001
  BUFFER_SIZE = 0
  sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  sock.connect((TCP_IP, TCP_PORT))
  
  try:
     # Entrada das informacoes MODBUS
     print("\nDIGITE AS INFORMACOES\n")
     endUTR = input("Endereco da UTR : ")
     funcaoModbus = input("Escolha uma Funcao Modbus: \n(1) Read Coils (2) Read Input Discretes (3) Read Holding Registers (4) Read Input Registers: ")
     inicioRegistradores = input("Inicio dos Registradores : ")
     numRegistradores = input("Numero de registradores : ")
  
     # Criando solicitacao pacote
     req = struct.pack('>3H 2B 2H', 0, 0, 6, int(endUTR), int(funcaoModbus), int(inicioRegistradores), int(numRegistradores))
     sock.send(req)
  
     BUFFER_SIZE = (3*2) + (3*1) + (int(numRegistradores)*2)
     rec = sock.recv(BUFFER_SIZE)
  
     def setB():
         global BH
         BH = 'B' #1
     def setH():
         global BH
         BH = 'H' #2
  
     functionLookup = {
         1 : setB,
         2 : setB,
         3 : setH,
         4 : setH
     }
     functionLookup[int(funcaoModbus)]()
  
     s = struct.Struct('>3H 3B %s%s' %(numRegistradores, BH))
     data = s.unpack(rec)
  
     # Mostra os valores dos registradores
     print("\nREGISTRADORES\n")
     for i in range(6, 6+int(numRegistradores)):
         registradorAtual = str((i - 6) + int(inicioRegistradores)).zfill(2)
         print(" Endereco #%s : %s" %(registradorAtual, data[i]))
  
     time.sleep(2);
  
  finally:
     print('\n :* \n')
     sock.close()


Veja a relação completa dos artigos de Felipe Santos