32#ifndef PROTOCORE_MODBUS_H
33#define PROTOCORE_MODBUS_H
42enum class ModbusFunction : uint8_t
44 MODBUS_FC_READ_COILS = 0x01,
45 MODBUS_FC_READ_DISCRETE_INPUTS = 0x02,
46 MODBUS_FC_READ_HOLDING_REGS = 0x03,
47 MODBUS_FC_READ_INPUT_REGS = 0x04,
48 MODBUS_FC_WRITE_SINGLE_COIL = 0x05,
49 MODBUS_FC_WRITE_SINGLE_REG = 0x06,
50 MODBUS_FC_WRITE_MULTIPLE_COILS = 0x0F,
51 MODBUS_FC_WRITE_MULTIPLE_REGS = 0x10,
52 MODBUS_FC_MASK_WRITE_REG = 0x16,
53 MODBUS_FC_READ_WRITE_MULTIPLE_REGS = 0x17,
57enum class ModbusException : uint8_t
59 MODBUS_EX_ILLEGAL_FUNCTION = 0x01,
60 MODBUS_EX_ILLEGAL_DATA_ADDRESS = 0x02,
61 MODBUS_EX_ILLEGAL_DATA_VALUE = 0x03,
62 MODBUS_EX_SERVER_FAILURE = 0x04,
66#define MODBUS_ADU_MAX 260
75typedef void (*ModbusWriteCb)(uint8_t fc, uint16_t start, uint16_t count);
82void pc_modbus_server_init();
85void pc_modbus_on_write(ModbusWriteCb cb);
87bool pc_modbus_get_coil(uint16_t addr);
88void pc_modbus_set_coil(uint16_t addr,
bool on);
89bool pc_modbus_get_discrete_input(uint16_t addr);
90void pc_modbus_set_discrete_input(uint16_t addr,
bool on);
91uint16_t pc_modbus_get_holding_reg(uint16_t addr);
92void pc_modbus_set_holding_reg(uint16_t addr, uint16_t value);
93uint16_t pc_modbus_get_input_reg(uint16_t addr);
94void pc_modbus_set_input_reg(uint16_t addr, uint16_t value);
111size_t pc_modbus_process_adu(
const uint8_t *req,
size_t req_len, uint8_t *resp,
size_t pc_resp_cap);
113#if PC_ENABLE_MODBUS_RTU
125size_t pc_modbus_rtu_process_adu(
const uint8_t *req,
size_t req_len, uint8_t *resp,
size_t pc_resp_cap,
134void pc_modbus_rx(uint8_t slot);
138const struct ProtoHandler *pc_modbus_proto_handler(
void);
User-facing configuration for ProtoCore.
Per-protocol connection event/poll callbacks (Layer 5 dispatch vtable).