modbus — Protocolo Modbus RTU escravo¶
Este módulo fornece uma implementação em Python puro de um escravo Modbus RTU que comunica através de uma UART. Mantém um array interno de registos de retenção e responde aos códigos de função Modbus padrão 0x03 (Ler Registos de Retenção), 0x06 (Escrever Registo Único) e 0x10 (Escrever Múltiplos Registos). O CRC-16 (polinómio Modbus) é calculado usando uma tabela de consulta.
Por exemplo:
from machine import UART
from modbus import ModbusRTU
uart = UART(1, 115200, timeout=10, timeout_char=10)
modbus = ModbusRTU(uart, slave_id=0x01, register_num=30)
while True:
if modbus.any():
modbus.handle(debug=False)
classe ModbusRTU¶
Um escravo Modbus RTU que lê pedidos de uma UART, atualiza o seu array interno de registos e escreve a resposta correspondente de volta para a UART.
- class modbus.ModbusRTU(uart: machine.UART, slave_id: int = 0x01, register_num: int = 30)¶
Constrói um escravo
ModbusRTU.uart é uma instância de UART (por exemplo,
machine.UARToupyb.UART) utilizada para enviar e receber fotogramas Modbus. A UART deve ser configurada com a taxa de baud, paridade e timeouts adequados antes de ser fornecida.slave_id é o endereço escravo Modbus (1-247) ao qual esta instância responderá. Os fotogramas endereçados a outros IDs de escravo são ignorados.
register_num é o número de registos de retenção de 16 bits que suportam este escravo. Os registos são armazenados na lista
REGISTERe inicializados a zero.
- SLAVE_ID: int¶
O endereço escravo Modbus ao qual esta instância responderá. Definido a partir do argumento do construtor slave_id.
- uart: machine.UART¶
A instância UART passada ao construtor, utilizada para todas as operações de E/S.
- register_num: int¶
O número de registos de retenção de 16 bits, definido a partir do argumento do construtor register_num.
- REGISTER: list[int]¶
Lista de comprimento
register_numque contém os valores atuais dos registos de 16 bits. As leituras e escritas realizadas através de pedidos Modbus recebidos atualizam esta lista. O código da aplicação pode ler ou escrever diretamente nesta lista para trocar dados com o mestre Modbus.
- CRC16_TABLE: list[int]¶
Tabela de consulta com 256 entradas pré-calculada para o polinómio CRC-16 Modbus, utilizada por
crc16().
- any() int¶
Devolve o número de bytes atualmente disponíveis no buffer de receção da UART subjacente (delega para
uart.any()). Use este método para verificar se existe um pedido recebido antes de chamarhandle().
- crc16(data: bytes | bytearray) bytes¶
Calcula o CRC-16 Modbus de data usando
CRC16_TABLEe devolve-o como um objetobytesde 2 bytes em little-endian adequado para anexar a um fotograma Modbus.data é um
bytes/bytearray(ou qualquer iterável de inteiros) que contém os bytes a verificar.
- handle(debug: bool = False) None¶
Lê um único pedido Modbus da UART, atualiza o array interno de registos conforme necessário, e escreve a resposta correspondente de volta para a UART.
Códigos de função suportados:
0x03Ler Registos de Retenção — responde com o intervalo pedido de valores de registo.0x06Escrever Registo Único — escreve num único registo e repete o endereço e o valor.0x10Escrever Múltiplos Registos — escreve num intervalo contíguo de registos e responde com o endereço inicial e a contagem.
São devolvidas respostas de exceção Modbus para:
Função Ilegal (
0x01) — código de função não suportado.Endereço de Dados Ilegal (
0x02) — índice de registo fora do intervalo.Valor de Dados Ilegal (
0x03) — contagem de bytes não corresponde à quantidade declarada de registos.
Os fotogramas cujo CRC não coincide ou cujo endereço de escravo não coincide com
SLAVE_IDsão silenciosamente descartados.debug se
True, imprime o pedido bruto, o código de função analisado, a resposta gerada e quaisquer detalhes de erro para o REPL. Por defeito éFalse.