53 lines
1.5 KiB
Python
53 lines
1.5 KiB
Python
import serial
|
|
import struct
|
|
import time
|
|
|
|
def calcula_crc(data):
|
|
"""Calcula o CRC16-Modbus"""
|
|
crc = 0xFFFF
|
|
for byte in data:
|
|
crc ^= byte
|
|
for _ in range(8):
|
|
if crc & 0x0001:
|
|
crc = (crc >> 1) ^ 0xA001
|
|
else:
|
|
crc >>= 1
|
|
return struct.pack('<H', crc)
|
|
|
|
def enviar_comando(ser, endereco, funcao, endereco_reg, quantidade):
|
|
"""Envia um comando Modbus RTU e lê a resposta"""
|
|
comando = struct.pack('>BBHH', endereco, funcao, endereco_reg, quantidade)
|
|
comando += calcula_crc(comando)
|
|
ser.write(comando)
|
|
time.sleep(0.1) # Aguarda resposta
|
|
resposta = ser.read(7 + 2 * quantidade) # Espera pelo menos 7 bytes + dados
|
|
return resposta
|
|
|
|
# Configurar porta serial
|
|
porta_serial = "COM112" # Substitua pelo nome correto da porta (ex: COM3 no Windows ou /dev/ttyUSB0 no Linux)
|
|
baudrate = 115200
|
|
|
|
ser = serial.Serial(porta_serial, baudrate=baudrate, bytesize=8, parity='N', stopbits=1, timeout=1)
|
|
|
|
# Endereço do driver (geralmente 1)
|
|
endereco_dispositivo = 1
|
|
|
|
# Código de função Modbus RTU (0x03 = Ler registradores)
|
|
codigo_funcao = 0x03
|
|
|
|
# Registrador de velocidade do motor (exemplo: 0x0001)
|
|
endereco_registrador = 0x0001
|
|
|
|
# Quantidade de registradores a ler (exemplo: 2)
|
|
quantidade_registros = 2
|
|
|
|
# Enviar comando e exibir resposta
|
|
resposta = enviar_comando(ser, endereco_dispositivo, codigo_funcao, endereco_registrador, quantidade_registros)
|
|
|
|
if resposta:
|
|
print("Resposta Hex:", resposta.hex())
|
|
else:
|
|
print("Nenhuma resposta recebida.")
|
|
|
|
ser.close()
|