This is an old revision of the document!
Start the LogicPython Modbus RTU slave worker using a pre-opened UART channel.
from cubloc import SetModbus SetModbus(channel: int, baudRate: int, protocol: int, recvSize: int, sendSize: int, slaveAddress: int, coils: object, discreteInputs: object, inputRegisters: object, holdingRegisters: object, memoryLock: object, returnInterval: int = 0)
channel number. OpenCom must already be called for this channel.coils per byte).slaveAddress is outside the supported range.Configure UART settings and start the LogicPython Modbus RTU slave worker.
from cubloc import SetModbus SetModbus(channel: int, baudRate: int, protocol: int, recvSize: int, sendSize: int, slaveAddress: int, coils: object, discreteInputs: object, inputRegisters: object, holdingRegisters: object, memoryLock: object, returnInterval: int = 0)
channel number. Channel 0 maps to UART0 (GP0/GP1) and channel 1 maps to UART1 (GP4/GP5).coils per byte).import struct import time import _thread from cubloc import * OUTPUT_PINS = (25, 16, 18, 20) INPUT_PINS = (6, 8, 10) ADC_CHANS = (0, 1, 2) coils = bytearray(1) discrete_inputs = bytearray(1) input_regs = bytearray(6) holding_regs = bytearray(2) mem_lock = _thread.allocate_lock() for pin in OUTPUT_PINS: Output(pin) Low(pin) for pin in INPUT_PINS: Input(pin) SetModbus(0, 9600, 3, 64, 64, 1, coils, discrete_inputs, input_regs, holding_regs, mem_lock) while True: # Read coils snapshot under lock mem_lock.acquire() try: coils_byte = coils[0] finally: mem_lock.release() # Drive outputs from that snapshot for i, pin in enumerate(OUTPUT_PINS): if coils_byte & (1 << i): High(pin) else: Low(pin) # Sample physical inputs outside the lock din_byte = 0 for i, pin in enumerate(INPUT_PINS): if In(pin): din_byte |= (1 << i) adc_vals = [ADIn(ch) for ch in ADC_CHANS] # Publish a coherent snapshot and read setpoint atomically mem_lock.acquire() try: discrete_inputs[0] = din_byte for i, val in enumerate(adc_vals): struct.pack_into('>H', input_regs, i * 2, val) setpoint = struct.unpack_from('>H', holding_regs, 0)[0] finally: mem_lock.release() time.sleep(0.010)