86 lines
2.5 KiB
Python
86 lines
2.5 KiB
Python
|
|
from pymodbus.client import ModbusSerialClient
|
||
|
|
from pymodbus.constants import Endian
|
||
|
|
from pymodbus.payload import BinaryPayloadDecoder, BinaryPayloadBuilder
|
||
|
|
import struct
|
||
|
|
|
||
|
|
# Configuração do cliente Modbus
|
||
|
|
client = ModbusSerialClient(
|
||
|
|
method='rtu',
|
||
|
|
port='COM3', # Substitua pelo seu porto serial
|
||
|
|
baudrate=9600,
|
||
|
|
stopbits=2,
|
||
|
|
bytesize=8,
|
||
|
|
parity='N',
|
||
|
|
timeout=1
|
||
|
|
)
|
||
|
|
|
||
|
|
# Função para calcular CRC-16
|
||
|
|
def calculate_crc(data):
|
||
|
|
crc = 0xFFFF
|
||
|
|
for pos in data:
|
||
|
|
crc ^= pos
|
||
|
|
for _ in range(8):
|
||
|
|
if (crc & 1) != 0:
|
||
|
|
crc >>= 1
|
||
|
|
crc ^= 0xA001
|
||
|
|
else:
|
||
|
|
crc >>= 1
|
||
|
|
return crc
|
||
|
|
|
||
|
|
# Função para ler um registro
|
||
|
|
def read_register(address, count=1):
|
||
|
|
response = client.read_holding_registers(address, count, unit=1)
|
||
|
|
if not response.isError():
|
||
|
|
decoder = BinaryPayloadDecoder.fromRegisters(response.registers, byteorder=Endian.BIG)
|
||
|
|
return decoder.decode_16bit_uint()
|
||
|
|
else:
|
||
|
|
print("Erro na leitura do registro")
|
||
|
|
return None
|
||
|
|
|
||
|
|
# Função para escrever em um registro
|
||
|
|
def write_register(address, value):
|
||
|
|
builder = BinaryPayloadBuilder(byteorder=Endian.BIG)
|
||
|
|
builder.add_16bit_uint(value)
|
||
|
|
payload = builder.to_registers()
|
||
|
|
response = client.write_registers(address, payload, unit=1)
|
||
|
|
if response.isError():
|
||
|
|
print("Erro na escrita do registro")
|
||
|
|
else:
|
||
|
|
print("Escrita bem-sucedida")
|
||
|
|
|
||
|
|
# Função para converter resposta em float
|
||
|
|
def get_float(data):
|
||
|
|
float_address = data[3:]
|
||
|
|
temp = struct.unpack('>f', bytes(float_address))[0]
|
||
|
|
return temp
|
||
|
|
|
||
|
|
# Conectar ao cliente Modbus
|
||
|
|
if client.connect():
|
||
|
|
print("Conectado ao driver BLD-300R")
|
||
|
|
|
||
|
|
# Exemplo de leitura de velocidade do motor
|
||
|
|
speed_address = 0x005F
|
||
|
|
speed = read_register(speed_address)
|
||
|
|
if speed is not None:
|
||
|
|
print(f"Velocidade do motor: {speed} rpm")
|
||
|
|
|
||
|
|
# Exemplo de leitura de código de alarme
|
||
|
|
alarm_address = 0x0076
|
||
|
|
alarm_code = read_register(alarm_address)
|
||
|
|
if alarm_code is not None:
|
||
|
|
print(f"Código de alarme: {alarm_code}")
|
||
|
|
|
||
|
|
# Exemplo de escrita de velocidade do motor
|
||
|
|
set_speed_address = 0x0056
|
||
|
|
set_speed_value = 1100 # Velocidade desejada em rpm
|
||
|
|
write_register(set_speed_address, set_speed_value)
|
||
|
|
|
||
|
|
# Exemplo de habilitação do controle RS485
|
||
|
|
enable_address = 0x00B6
|
||
|
|
enable_value = 1 # Habilitar
|
||
|
|
write_register(enable_address, enable_value)
|
||
|
|
|
||
|
|
# Desconectar do cliente Modbus
|
||
|
|
client.close()
|
||
|
|
else:
|
||
|
|
print("Falha na conexão com o driver BLD-300R")
|