modbus — Modbus RTU 슬레이브 프로토콜

이 모듈은 UART를 통해 통신하는 Modbus RTU 슬레이브의 순수 Python 구현을 제공합니다. 내부 홀딩 레지스터 배열을 유지하며, 표준 Modbus 기능 코드 0x03(Read Holding Registers), 0x06(Write Single Register), 0x10(Write Multiple Registers)에 응답합니다. CRC-16(Modbus 다항식)은 룩업 테이블을 사용하여 계산됩니다.

예를 들어:

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

UART에서 요청을 읽고, 내부 레지스터 배열을 업데이트하며, 해당 응답을 UART로 다시 쓰는 Modbus RTU 슬레이브입니다.

class modbus.ModbusRTU(uart: machine.UART, slave_id: int = 0x01, register_num: int = 30)

ModbusRTU 슬레이브를 생성합니다.

  • uart는 Modbus 프레임을 송수신하는 데 사용되는 UART 인스턴스입니다(예: machine.UART 또는 pyb.UART). UART는 전달되기 전에 적절한 보드 레이트, 패리티, 타임아웃으로 구성되어 있어야 합니다.

  • slave_id는 이 인스턴스가 응답할 Modbus 슬레이브 주소(1-247)입니다. 다른 슬레이브 ID로 주소가 지정된 프레임은 무시됩니다.

  • register_num은 이 슬레이브를 뒷받침하는 16비트 홀딩 레지스터의 개수입니다. 레지스터는 REGISTER 리스트에 저장되며 0으로 초기화됩니다.

SLAVE_ID: int

이 인스턴스가 응답할 Modbus 슬레이브 주소입니다. slave_id 생성자 인수에서 설정됩니다.

uart: machine.UART

생성자에 전달된 UART 인스턴스로, 모든 I/O에 사용됩니다.

register_num: int

16비트 홀딩 레지스터의 개수로, register_num 생성자 인수에서 설정됩니다.

REGISTER: list[int]

현재 16비트 레지스터 값을 담고 있는 길이 register_num의 리스트입니다. 들어오는 Modbus 요청을 통해 수행되는 읽기와 쓰기가 이 리스트를 업데이트합니다. 애플리케이션 코드는 Modbus 마스터와 데이터를 교환하기 위해 이 리스트를 직접 읽거나 쓸 수 있습니다.

CRC16_TABLE: list[int]

Modbus CRC-16 다항식을 위해 미리 계산된 256개 항목의 룩업 테이블로, crc16()에서 사용됩니다.

any() int

기반 UART의 수신 버퍼에 현재 사용 가능한 바이트 수를 반환합니다(uart.any()로 위임). handle()을 호출하기 전에 들어오는 요청을 확인하는 데 사용하십시오.

clear() None

REGISTER의 모든 항목을 0으로 초기화합니다.

crc16(data: bytes | bytearray) bytes

CRC16_TABLE을 사용하여 data의 Modbus CRC-16을 계산하고, Modbus 프레임에 추가하기 적합한 2바이트 리틀 엔디언 bytes 객체로 반환합니다.

  • data 는 체크섬을 계산할 바이트를 담은 bytes/bytearray(또는 정수의 임의의 이터러블)입니다.

handle(debug: bool = False) None

UART에서 단일 Modbus 요청을 읽고, 필요에 따라 내부 레지스터 배열을 업데이트하며, 해당 응답을 UART로 다시 씁니다.

지원되는 기능 코드:

  • 0x03 Read Holding Registers — 요청된 레지스터 값 범위로 응답합니다.

  • 0x06 Write Single Register — 단일 레지스터를 쓰고 주소와 값을 에코합니다.

  • 0x10 Write Multiple Registers — 연속된 레지스터 범위를 쓰고 시작 주소와 개수로 응답합니다.

다음의 경우 Modbus 예외 응답이 반환됩니다:

  • Illegal Function (0x01) — 지원되지 않는 기능 코드.

  • Illegal Data Address (0x02) — 레지스터 인덱스가 범위를 벗어남.

  • Illegal Data Value (0x03) — 바이트 수가 선언된 레지스터 수량과 일치하지 않음.

CRC가 일치하지 않거나 슬레이브 주소가 SLAVE_ID와 일치하지 않는 프레임은 조용히 폐기됩니다.

  • debugTrue이면, 원시 요청, 파싱된 기능 코드, 생성된 응답, 그리고 모든 오류 세부 정보를 REPL에 출력합니다. 기본값은 False입니다.