79 #define nmbs_error_is_exception(e) ((e) > 0 && (e) < 5)
95 #define nmbs_bitfield_read(bf, b) ((bool) ((bf)[(b) / 8] & (0x1 << ((b) % 8))))
100 #define nmbs_bitfield_set(bf, b) (((bf)[(b) / 8]) = (((bf)[(b) / 8]) | (0x1 << ((b) % 8))))
105 #define nmbs_bitfield_unset(bf, b) (((bf)[(b) / 8]) = (((bf)[(b) / 8]) & ~(0x1 << ((b) % 8))))
110 #define nmbs_bitfield_write(bf, b, v) \
111 (((bf)[(b) / 8]) = ((v) ? (((bf)[(b) / 8]) | (0x1 << ((b) % 8))) : (((bf)[(b) / 8]) & ~(0x1 << ((b) % 8)))))
116 #define nmbs_bitfield_reset(bf) memset(bf, 0, sizeof(bf))
122 NMBS_TRANSPORT_RTU = 1,
123 NMBS_TRANSPORT_TCP = 2,
148 int32_t (*
read)(uint8_t* buf, uint16_t count, int32_t byte_timeout_ms,
150 int32_t (*
write)(
const uint8_t* buf, uint16_t count, int32_t byte_timeout_ms,
165 #ifndef NMBS_SERVER_DISABLED
166 #ifndef NMBS_SERVER_READ_COILS_DISABLED
167 nmbs_error (*read_coils)(uint16_t address, uint16_t quantity,
nmbs_bitfield coils_out, uint8_t unit_id,
void* arg);
170 #ifndef NMBS_SERVER_READ_DISCRETE_INPUTS_DISABLED
171 nmbs_error (*read_discrete_inputs)(uint16_t address, uint16_t quantity,
nmbs_bitfield inputs_out, uint8_t unit_id,
175 #ifndef NMBS_SERVER_READ_HOLDING_REGISTERS_DISABLED
176 nmbs_error (*read_holding_registers)(uint16_t address, uint16_t quantity, uint16_t* registers_out, uint8_t unit_id,
180 #ifndef NMBS_SERVER_READ_INPUT_REGISTERS_DISABLED
181 nmbs_error (*read_input_registers)(uint16_t address, uint16_t quantity, uint16_t* registers_out, uint8_t unit_id,
185 #ifndef NMBS_SERVER_WRITE_SINGLE_COIL_DISABLED
186 nmbs_error (*write_single_coil)(uint16_t address,
bool value, uint8_t unit_id,
void* arg);
189 #ifndef NMBS_SERVER_WRITE_SINGLE_REGISTER_DISABLED
190 nmbs_error (*write_single_register)(uint16_t address, uint16_t value, uint8_t unit_id,
void* arg);
193 #ifndef NMBS_SERVER_WRITE_MULTIPLE_COILS_DISABLED
194 nmbs_error (*write_multiple_coils)(uint16_t address, uint16_t quantity,
const nmbs_bitfield coils, uint8_t unit_id,
198 #ifndef NMBS_SERVER_WRITE_MULTIPLE_REGISTERS_DISABLED
199 nmbs_error (*write_multiple_registers)(uint16_t address, uint16_t quantity,
const uint16_t* registers,
200 uint8_t unit_id,
void* arg);
203 #ifndef NMBS_SERVER_READ_FILE_RECORD_DISABLED
204 nmbs_error (*read_file_record)(uint16_t file_number, uint16_t record_number, uint16_t* registers, uint16_t count,
205 uint8_t unit_id,
void* arg);
208 #ifndef NMBS_SERVER_WRITE_FILE_RECORD_DISABLED
209 nmbs_error (*write_file_record)(uint16_t file_number, uint16_t record_number,
const uint16_t* registers,
210 uint16_t count, uint8_t unit_id,
void* arg);
213 #ifndef NMBS_SERVER_READ_DEVICE_IDENTIFICATION_DISABLED
214 #define NMBS_DEVICE_IDENTIFICATION_STRING_LENGTH 128
215 nmbs_error (*read_device_identification)(uint8_t object_id,
char buffer[NMBS_DEVICE_IDENTIFICATION_STRING_LENGTH]);
235 uint16_t transaction_id;
242 int32_t byte_timeout_ms;
243 int32_t read_timeout_ms;
248 uint8_t dest_address_rtu;
249 uint16_t current_tid;
255 static const uint8_t NMBS_BROADCAST_ADDRESS = 0;
278 #ifndef NMBS_SERVER_DISABLED
306 #ifndef NMBS_CLIENT_DISABLED
435 uint16_t* registers_out, uint16_t write_address, uint16_t write_quantity,
436 const uint16_t* registers);
448 char* major_minor_revision, uint8_t buffer_length);
461 char* user_application_name, uint8_t buffer_length);
476 uint8_t ids_length, uint8_t buffer_length,
477 uint8_t* objects_count_out);
514 uint16_t
nmbs_crc_calc(
const uint8_t* data, uint32_t length);
516 #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:1955
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
uint8_t nmbs_bitfield[250]
Definition: nanomodbus.h:85
nmbs_error nmbs_write_multiple_registers(nmbs_t *nmbs, uint16_t address, uint16_t quantity, const uint16_t *registers)
Definition: nanomodbus.c:2036
nmbs_error nmbs_write_single_register(nmbs_t *nmbs, uint16_t address, uint16_t value)
Definition: nanomodbus.c:1982
nmbs_error nmbs_send_raw_pdu(nmbs_t *nmbs, uint8_t fc, const uint8_t *data, uint16_t data_len)
Definition: nanomodbus.c:2309
struct nmbs_callbacks nmbs_callbacks
nmbs_error nmbs_client_create(nmbs_t *nmbs, const nmbs_platform_conf *platform_conf)
Definition: nanomodbus.c:1890
void nmbs_set_byte_timeout(nmbs_t *nmbs, int32_t timeout_ms)
Definition: nanomodbus.c:192
nmbs_error nmbs_read_holding_registers(nmbs_t *nmbs, uint16_t address, uint16_t quantity, uint16_t *registers_out)
Definition: nanomodbus.c:1950
void nmbs_set_destination_rtu_address(nmbs_t *nmbs, uint8_t address)
Definition: nanomodbus.c:197
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 buffer_length)
Definition: nanomodbus.c:2218
nmbs_error nmbs_receive_raw_pdu_response(nmbs_t *nmbs, uint8_t *data_out, uint8_t data_out_len)
Definition: nanomodbus.c:2323
nmbs_error nmbs_server_poll(nmbs_t *nmbs)
Definition: nanomodbus.c:1847
const char * nmbs_strerror(nmbs_error error)
Definition: nanomodbus.c:2351
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:2100
nmbs_error nmbs_write_multiple_coils(nmbs_t *nmbs, uint16_t address, uint16_t quantity, const nmbs_bitfield coils)
Definition: nanomodbus.c:2002
void nmbs_set_callbacks_arg(nmbs_t *nmbs, void *arg)
Definition: nanomodbus.c:1883
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:2254
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:1831
nmbs_error nmbs_read_coils(nmbs_t *nmbs, uint16_t address, uint16_t quantity, nmbs_bitfield coils_out)
Definition: nanomodbus.c:1918
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:2070
void nmbs_set_read_timeout(nmbs_t *nmbs, int32_t timeout_ms)
Definition: nanomodbus.c:187
void nmbs_set_platform_arg(nmbs_t *nmbs, void *arg)
Definition: nanomodbus.c:202
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:2135
nmbs_transport
Definition: nanomodbus.h:121
struct nmbs_platform_conf nmbs_platform_conf
uint8_t nmbs_bitfield_256[32]
Definition: nanomodbus.h:90
nmbs_error nmbs_write_single_coil(nmbs_t *nmbs, uint16_t address, bool value)
Definition: nanomodbus.c:1960
uint16_t nmbs_crc_calc(const uint8_t *data, uint32_t length)
Definition: nanomodbus.c:207
nmbs_error nmbs_read_device_identification_basic(nmbs_t *nmbs, char *vendor_name, char *product_code, char *major_minor_revision, uint8_t buffer_length)
Definition: nanomodbus.c:2182
nmbs_error nmbs_read_discrete_inputs(nmbs_t *nmbs, uint16_t address, uint16_t quantity, nmbs_bitfield inputs_out)
Definition: nanomodbus.c:1923
nmbs_error nmbs_read_device_identification(nmbs_t *nmbs, uint8_t object_id, char *buffer, uint8_t buffer_length)
Definition: nanomodbus.c:2290
Definition: nanomodbus.h:164
Definition: nanomodbus.h:228