modbus — Protocolo escravo Modbus RTU#
Este módulo fornece uma implementação em Python puro de um escravo Modbus RTU que se comunica por uma UART. Ele mantém um array interno de registradores de retenção (holding registers) e responde aos códigos de função Modbus padrão 0x03 (Read Holding Registers), 0x06 (Write Single Register) e 0x10 (Write Multiple Registers). 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)
class ModbusRTU#
Um escravo Modbus RTU que lê requisições de uma UART, atualiza seu array interno de registradores e escreve a resposta correspondente de volta na 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) usada para enviar e receber quadros Modbus. A UART deve ser configurada com taxa de transmissão (baud rate), paridade e timeouts apropriados antes de ser passada.slave_id é o endereço de escravo Modbus (1-247) ao qual esta instância responderá. Quadros endereçados a outros IDs de escravo são ignorados.
register_num é o número de registradores de retenção de 16 bits que respaldam este escravo. Os registradores são armazenados na lista
REGISTERe inicializados em zero.
- SLAVE_ID: int#
O endereço de escravo Modbus ao qual esta instância responderá. Definido a partir do argumento slave_id do construtor.
- uart: machine.UART#
A instância de UART passada ao construtor, usada para toda a E/S.
- register_num: int#
O número de registradores de retenção de 16 bits, definido a partir do argumento register_num do construtor.
- REGISTER: list[int]#
Lista de comprimento
register_numque mantém os valores atuais dos registradores de 16 bits. Leituras e escritas realizadas por requisições Modbus recebidas 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 de 256 entradas pré-computada para o polinômio CRC-16 do Modbus, usada por
crc16().
- any() int#
Retorna o número de bytes atualmente disponíveis no buffer de recepção da UART subjacente (delega para
uart.any()). Use isto para verificar se há uma requisição recebida antes de chamarhandle().
- crc16(data: bytes | bytearray) bytes#
Calcula o CRC-16 Modbus de data usando
CRC16_TABLEe o retorna como um objetobyteslittle-endian de 2 bytes adequado para anexar a um quadro Modbus.data é um
bytes/bytearray(ou qualquer iterável de inteiros) contendo os bytes a serem somados na verificação.
- handle(debug: bool = False) None#
Lê uma única requisição Modbus da UART, atualiza o array interno de registradores conforme necessário e escreve a resposta correspondente de volta na UART.
Códigos de função suportados:
0x03Read Holding Registers — responde com o intervalo solicitado de valores de registradores.0x06Write Single Register — escreve um único registrador e ecoa o endereço e o valor.0x10Write Multiple Registers — escreve um intervalo contíguo de registradores e responde com o endereço inicial e a contagem.
Respostas de exceção Modbus são retornadas para:
Illegal Function (
0x01) — código de função não suportado.Illegal Data Address (
0x02) — índice de registrador fora do intervalo.Illegal Data Value (
0x03) — a contagem de bytes não corresponde à quantidade declarada de registradores.
Quadros cujo CRC não corresponde ou cujo endereço de escravo não corresponde a
SLAVE_IDsão silenciosamente descartados.debug se
True, imprime no REPL a requisição bruta, o código de função interpretado, a resposta gerada e quaisquer detalhes de erro. O padrão éFalse.