De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.
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.
#!/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()
This policy contains information about your privacy. By posting, you are declaring that you understand this policy:
This policy is subject to change at any time and without notice.
These terms and conditions contain rules about posting comments. By submitting a comment, you are declaring that you agree with these rules:
Failure to comply with these rules may result in being banned from submitting further comments.
These terms and conditions are subject to change at any time and without notice.
Comentários