agrobot_base/Python/bld300r/test.py

86 lines
2.5 KiB
Python
Raw Permalink Normal View History

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")