meta data for this page
  •  

lamaPLC: RP2040_ETH_Modul: Modbus TCP example

The RP2040 module has Ethernet integrated, which can be accessed via UART1. This code creates Modbus Holding registers on the module with contents from 1 to 10.

from machine import UART, Pin
import time
 
# --- Konfiguráció ---
uart1 = UART(1, baudrate=115200, tx=Pin(20), rx=Pin(21), timeout=50)
 
# Regiszterek inicializálása: 10 darab regiszter (index 0..9)
# Értékek: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
holding_registers = [i + 1 for i in range(10)]
 
print(f"Modbus TCP Szerver indul... Regiszterek: {holding_registers}")
 
while True:
    if uart1.any():
        raw_data = uart1.read()
 
        # Modbus TCP minimális hossza: 12 bájt
        if len(raw_data) >= 12:
            header = raw_data[:6]   # MBAP Header
            pdu = raw_data[6:]      # UnitID + PDU
 
            unit_id = pdu[0]
            func_code = pdu[1]
 
            # Start Address (pdu[2:4]) és Quantity (pdu[4:6])
            start_addr = (pdu[2] << 8) | pdu[3]
            quantity = (pdu[4] << 8) | pdu[5]
 
            # 03: Read Holding Registers
            if func_code == 3:
                # Ellenőrizzük, hogy a kért tartomány érvényes-e (0-9 között)
                if start_addr + quantity <= len(holding_registers):
                    # Adatbájtok összeállítása
                    byte_count = quantity * 2
                    data_payload = bytearray()
 
                    for i in range(start_addr, start_addr + quantity):
                        val = holding_registers[i]
                        data_payload.append((val >> 8) & 0xFF) # High byte
                        data_payload.append(val & 0xFF)        # Low byte
 
                    # PDU válasz: UnitID, Func, ByteCount, Adatok
                    pdu_res = bytearray([unit_id, func_code, byte_count]) + data_payload
 
                    # TCP Header frissítése (hossz: UnitID(1) + PDU többi része)
                    res_header = bytearray(header)
                    res_header[4] = 0x00
                    res_header[5] = len(pdu_res)
 
                    uart1.write(res_header + pdu_res)
                    print(f"Kérés: Addr {start_addr}, Qty {quantity} -> Válasz elküldve.")
                else:
                    # Exception 02: Illegal Data Address (ha túl sokat kérne a Master)
                    pdu_res = bytearray([unit_id, func_code + 0x80, 0x02])
                    res_header = bytearray(header)
                    res_header[5] = 3
                    uart1.write(res_header + pdu_res)
                    print("Hiba: Érvénytelen regiszter cím!")
 
    time.sleep(0.01)

This page has been accessed for: Today: 1, Until now: 1