79#define nmbs_error_is_exception(e) ((e) > 0 && (e) < 5)
81#ifndef NMBS_BITFIELD_MAX
82#define NMBS_BITFIELD_MAX 2000
86#if ((NMBS_BITFIELD_MAX & 7) > 0)
87#error "NMBS_BITFIELD_MAX must be divisible by 8"
90#define NMBS_BITFIELD_BYTES_MAX (NMBS_BITFIELD_MAX / 8)
105#define nmbs_bitfield_read(bf, b) ((bool) ((bf)[(b) >> 3] & (0x1 << ((b) & (8 - 1)))))
110#define nmbs_bitfield_set(bf, b) (((bf)[(b) >> 3]) = (((bf)[(b) >> 3]) | (0x1 << ((b) & (8 - 1)))))
115#define nmbs_bitfield_unset(bf, b) (((bf)[(b) >> 3]) = (((bf)[(b) >> 3]) & ~(0x1 << ((b) & (8 - 1)))))
120#define nmbs_bitfield_write(bf, b, v) ((bf)[(b) >> 3] = ((bf)[(b) >> 3] & ~(1 << ((b) & 7))) | ((v) << ((b) & 7)))
124#define nmbs_bitfield_reset(bf) memset(bf, 0, sizeof(bf))
130 NMBS_TRANSPORT_RTU = 1,
131 NMBS_TRANSPORT_TCP = 2,
160 int32_t (*
read)(uint8_t* buf, uint16_t count, int32_t byte_timeout_ms,
162 int32_t (*
write)(
const uint8_t* buf, uint16_t count, int32_t byte_timeout_ms,
164 uint16_t (*
crc_calc)(
const uint8_t* data, uint32_t length,
180#ifndef NMBS_SERVER_DISABLED
181#ifndef NMBS_SERVER_READ_COILS_DISABLED
182 nmbs_error (*read_coils)(uint16_t address, uint16_t quantity,
nmbs_bitfield coils_out, uint8_t unit_id,
void* arg);
185#ifndef NMBS_SERVER_READ_DISCRETE_INPUTS_DISABLED
186 nmbs_error (*read_discrete_inputs)(uint16_t address, uint16_t quantity,
nmbs_bitfield inputs_out, uint8_t unit_id,
190#if !defined(NMBS_SERVER_READ_HOLDING_REGISTERS_DISABLED) || !defined(NMBS_SERVER_READ_WRITE_REGISTERS_DISABLED)
191 nmbs_error (*read_holding_registers)(uint16_t address, uint16_t quantity, uint16_t* registers_out, uint8_t unit_id,
195#ifndef NMBS_SERVER_READ_INPUT_REGISTERS_DISABLED
196 nmbs_error (*read_input_registers)(uint16_t address, uint16_t quantity, uint16_t* registers_out, uint8_t unit_id,
200#ifndef NMBS_SERVER_WRITE_SINGLE_COIL_DISABLED
201 nmbs_error (*write_single_coil)(uint16_t address,
bool value, uint8_t unit_id,
void* arg);
204#ifndef NMBS_SERVER_WRITE_SINGLE_REGISTER_DISABLED
205 nmbs_error (*write_single_register)(uint16_t address, uint16_t value, uint8_t unit_id,
void* arg);
208#ifndef NMBS_SERVER_WRITE_MULTIPLE_COILS_DISABLED
209 nmbs_error (*write_multiple_coils)(uint16_t address, uint16_t quantity,
const nmbs_bitfield coils, uint8_t unit_id,
213#if !defined(NMBS_SERVER_WRITE_MULTIPLE_REGISTERS_DISABLED) || !defined(NMBS_SERVER_READ_WRITE_REGISTERS_DISABLED)
214 nmbs_error (*write_multiple_registers)(uint16_t address, uint16_t quantity,
const uint16_t* registers,
215 uint8_t unit_id,
void* arg);
218#ifndef NMBS_SERVER_READ_FILE_RECORD_DISABLED
219 nmbs_error (*read_file_record)(uint16_t file_number, uint16_t record_number, uint16_t* registers, uint16_t count,
220 uint8_t unit_id,
void* arg);
223#ifndef NMBS_SERVER_WRITE_FILE_RECORD_DISABLED
224 nmbs_error (*write_file_record)(uint16_t file_number, uint16_t record_number,
const uint16_t* registers,
225 uint16_t count, uint8_t unit_id,
void* arg);
228#ifndef NMBS_SERVER_READ_DEVICE_IDENTIFICATION_DISABLED
229#define NMBS_DEVICE_IDENTIFICATION_STRING_LENGTH 128
230 nmbs_error (*read_device_identification)(uint8_t object_id,
char buffer[NMBS_DEVICE_IDENTIFICATION_STRING_LENGTH]);
236 uint32_t initialized;
251 uint16_t transaction_id;
259 int32_t byte_timeout_ms;
260 int32_t read_timeout_ms;
265 uint8_t dest_address_rtu;
266 uint16_t current_tid;
272static const uint8_t NMBS_BROADCAST_ADDRESS = 0;
300#ifndef NMBS_SERVER_DISABLED
333#ifndef NMBS_CLIENT_DISABLED
462 uint16_t* registers_out, uint16_t write_address, uint16_t write_quantity,
463 const uint16_t* registers);
475 char* major_minor_revision, uint8_t buffers_length);
488 char* user_application_name, uint8_t buffers_length);
503 uint8_t ids_length, uint8_t buffer_length,
504 uint8_t* objects_count_out);
541uint16_t
nmbs_crc_calc(
const uint8_t* data, uint32_t length,
void* arg);
543#ifndef NMBS_STRERROR_DISABLED
nmbs_error nmbs_read_input_registers(nmbs_t *nmbs, uint16_t address, uint16_t quantity, uint16_t *registers_out)
Definition nanomodbus.c:2027
nmbs_error
Definition nanomodbus.h:55
@ NMBS_ERROR_INVALID_UNIT_ID
Definition nanomodbus.h:58
@ NMBS_ERROR_NONE
Definition nanomodbus.h:65
@ NMBS_ERROR_INVALID_ARGUMENT
Definition nanomodbus.h:64
@ NMBS_EXCEPTION_ILLEGAL_DATA_ADDRESS
Definition nanomodbus.h:69
@ NMBS_ERROR_TRANSPORT
Definition nanomodbus.h:61
@ NMBS_ERROR_INVALID_TCP_MBAP
Definition nanomodbus.h:59
@ NMBS_ERROR_INVALID_REQUEST
Definition nanomodbus.h:57
@ NMBS_ERROR_INVALID_RESPONSE
Definition nanomodbus.h:63
@ NMBS_EXCEPTION_ILLEGAL_DATA_VALUE
Definition nanomodbus.h:70
@ NMBS_ERROR_TIMEOUT
Definition nanomodbus.h:62
@ NMBS_EXCEPTION_ILLEGAL_FUNCTION
Definition nanomodbus.h:68
@ NMBS_EXCEPTION_SERVER_DEVICE_FAILURE
Definition nanomodbus.h:71
@ NMBS_ERROR_CRC
Definition nanomodbus.h:60
nmbs_error nmbs_write_multiple_registers(nmbs_t *nmbs, uint16_t address, uint16_t quantity, const uint16_t *registers)
Definition nanomodbus.c:2108
nmbs_error nmbs_write_single_register(nmbs_t *nmbs, uint16_t address, uint16_t value)
Definition nanomodbus.c:2054
nmbs_error nmbs_send_raw_pdu(nmbs_t *nmbs, uint8_t fc, const uint8_t *data, uint16_t data_len)
Definition nanomodbus.c:2377
void nmbs_callbacks_create(nmbs_callbacks *callbacks)
Definition nanomodbus.c:1896
nmbs_error nmbs_client_create(nmbs_t *nmbs, const nmbs_platform_conf *platform_conf)
Definition nanomodbus.c:1962
nmbs_error nmbs_read_device_identification_regular(nmbs_t *nmbs, char *vendor_url, char *product_name, char *model_name, char *user_application_name, uint8_t buffers_length)
Definition nanomodbus.c:2286
void nmbs_set_byte_timeout(nmbs_t *nmbs, int32_t timeout_ms)
Definition nanomodbus.c:256
nmbs_error nmbs_read_holding_registers(nmbs_t *nmbs, uint16_t address, uint16_t quantity, uint16_t *registers_out)
Definition nanomodbus.c:2022
void nmbs_set_destination_rtu_address(nmbs_t *nmbs, uint8_t address)
Definition nanomodbus.c:269
nmbs_error nmbs_receive_raw_pdu_response(nmbs_t *nmbs, uint8_t *data_out, uint8_t data_out_len)
Definition nanomodbus.c:2391
nmbs_error nmbs_server_poll(nmbs_t *nmbs)
Definition nanomodbus.c:1921
const char * nmbs_strerror(nmbs_error error)
Definition nanomodbus.c:2419
uint8_t nmbs_bitfield[NMBS_BITFIELD_BYTES_MAX]
Definition nanomodbus.h:95
nmbs_error nmbs_read_device_identification_basic(nmbs_t *nmbs, char *vendor_name, char *product_code, char *major_minor_revision, uint8_t buffers_length)
Definition nanomodbus.c:2250
void nmbs_platform_conf_create(nmbs_platform_conf *platform_conf)
Definition nanomodbus.c:261
nmbs_error nmbs_write_file_record(nmbs_t *nmbs, uint16_t file_number, uint16_t record_number, const uint16_t *registers, uint16_t count)
Definition nanomodbus.c:2172
nmbs_error nmbs_write_multiple_coils(nmbs_t *nmbs, uint16_t address, uint16_t quantity, const nmbs_bitfield coils)
Definition nanomodbus.c:2074
void nmbs_set_callbacks_arg(nmbs_t *nmbs, void *arg)
Definition nanomodbus.c:1955
nmbs_error nmbs_read_device_identification_extended(nmbs_t *nmbs, uint8_t object_id_start, uint8_t *ids, char **buffers, uint8_t ids_length, uint8_t buffer_length, uint8_t *objects_count_out)
Definition nanomodbus.c:2322
nmbs_error nmbs_server_create(nmbs_t *nmbs, uint8_t address_rtu, const nmbs_platform_conf *platform_conf, const nmbs_callbacks *callbacks)
Definition nanomodbus.c:1902
nmbs_error nmbs_read_coils(nmbs_t *nmbs, uint16_t address, uint16_t quantity, nmbs_bitfield coils_out)
Definition nanomodbus.c:1990
nmbs_error nmbs_read_file_record(nmbs_t *nmbs, uint16_t file_number, uint16_t record_number, uint16_t *registers, uint16_t count)
Definition nanomodbus.c:2142
void nmbs_set_read_timeout(nmbs_t *nmbs, int32_t timeout_ms)
Definition nanomodbus.c:251
void nmbs_set_platform_arg(nmbs_t *nmbs, void *arg)
Definition nanomodbus.c:274
nmbs_error nmbs_read_write_registers(nmbs_t *nmbs, uint16_t read_address, uint16_t read_quantity, uint16_t *registers_out, uint16_t write_address, uint16_t write_quantity, const uint16_t *registers)
Definition nanomodbus.c:2207
uint16_t nmbs_crc_calc(const uint8_t *data, uint32_t length, void *arg)
Definition nanomodbus.c:279
nmbs_transport
Definition nanomodbus.h:129
uint8_t nmbs_bitfield_256[32]
Definition nanomodbus.h:100
nmbs_error nmbs_write_single_coil(nmbs_t *nmbs, uint16_t address, bool value)
Definition nanomodbus.c:2032
nmbs_error nmbs_read_discrete_inputs(nmbs_t *nmbs, uint16_t address, uint16_t quantity, nmbs_bitfield inputs_out)
Definition nanomodbus.c:1995
nmbs_error nmbs_read_device_identification(nmbs_t *nmbs, uint8_t object_id, char *buffer, uint8_t buffer_length)
Definition nanomodbus.c:2358
Definition nanomodbus.h:179
Definition nanomodbus.h:244