26#ifdef MODBUS_ENABLE_MASTER
40 if(modbus_msg == NULL || reg_arr == NULL)
44 for(
int addr = modbus_msg->
Addr; addr < modbus_msg->Addr + modbus_msg->
Qnt; addr++)
65 if(modbus_msg == NULL || reg_value == NULL)
77 if(reg_addr < modbus_msg->Addr || reg_addr >= modbus_msg->
Addr + modbus_msg->
Qnt)
81 uint16_t reg_index = reg_addr - modbus_msg->
Addr;
84 if(reg_index >= modbus_msg->
ByteCnt / 2)
88 *reg_value = modbus_msg->
MbData[reg_index];
103 if(modbus_msg == NULL || coil_arr == NULL)
108 for(
int addr = modbus_msg->
Addr; addr < modbus_msg->Addr + modbus_msg->
Qnt; addr++)
129 if(modbus_msg == NULL || coil_state == NULL)
139 if(coil_addr < modbus_msg->Addr || coil_addr >= modbus_msg->
Addr + modbus_msg->
Qnt)
143 uint16_t coil_index = coil_addr - modbus_msg->
Addr;
146 uint8_t byte_index = coil_index / 8;
147 uint8_t data_index = coil_index / 16;
148 uint8_t bit_index = coil_index % 16;
151 if(byte_index >= modbus_msg->
ByteCnt)
156 *coil_state = (modbus_msg->
MbData[data_index] >> (bit_index+8)) & 0x01;
158 *coil_state = ((modbus_msg->
MbData[data_index]&0xFF) >> (bit_index-8)) & 0x01;
172 if(modbus_msg == NULL)
182 return modbus_msg->
DevId.NumbOfObj;
195 if((modbus_msg == NULL) || (obj_data == NULL))
204 uint8_t *data = (uint8_t*)modbus_msg->
MbData;
207 for(
int i = 0; i < modbus_msg->
DevId.NumbOfObj; i++)
209 uint8_t current_id = data[ind++];
210 uint8_t current_length = data[ind++];
212 if(current_id == obj_id)
215 *obj_length = current_length;
217 for(
int j = 0; j < current_length; j++)
219 obj_data[j] = data[ind++];
221 obj_data[current_length] =
'\0';
228 ind += current_length;
246 if((modbus_msg == NULL) || (obj_data == NULL))
255 if(index >= modbus_msg->
DevId.NumbOfObj)
258 uint8_t *data = (uint8_t*)modbus_msg->
MbData;
261 for(
int i = 0; i <= index; i++)
263 uint8_t current_id = data[ind++];
264 uint8_t current_length = data[ind++];
267 *obj_id = current_id;
269 *obj_length = current_length;
273 for(
int j = 0; j < current_length; j++)
275 obj_data[j] = data[ind++];
277 obj_data[current_length] =
'\0';
283 ind += current_length;
299 if(modbus_msg == NULL || data == NULL)
310 *data = modbus_msg->
MbData[1];
329 int mb_func_size = 0;
357 mb_func_size = modbus_msg->
ByteCnt + 2;
395 modbus_uart_buff[ind++] = modbus_msg->
MbAddr;
398 modbus_uart_buff[ind++] = modbus_msg->
FuncCode;
404#ifdef MODBUS_ENABLE_DEVICE_IDENTIFICATIONS
408 modbus_uart_buff[ind++] = modbus_msg->
DevId.ReadDevId;
409 modbus_uart_buff[ind++] = modbus_msg->
DevId.NextObjId;
412#ifdef MODBUS_ENABLE_DIAGNOSTICS
416 modbus_uart_buff[ind++] = modbus_msg->
MbData[0] >> 8;
417 modbus_uart_buff[ind++] = modbus_msg->
MbData[0] & 0xFF;
418 modbus_uart_buff[ind++] = modbus_msg->
MbData[1] >> 8;
419 modbus_uart_buff[ind++] = modbus_msg->
MbData[1] & 0xFF;
425 modbus_uart_buff[ind++] = modbus_msg->
Addr >> 8;
426 modbus_uart_buff[ind++] = modbus_msg->
Addr & 0xFF;
429 modbus_uart_buff[ind++] = modbus_msg->
Qnt >> 8;
430 modbus_uart_buff[ind++] = modbus_msg->
Qnt & 0xFF;
435 modbus_uart_buff[ind++] = modbus_msg->
ByteCnt;
438 uint8_t *tmp_data_addr = (uint8_t *)modbus_msg->
MbData;
439 for(
int i = 0; i < modbus_msg->
ByteCnt; i++)
441 modbus_uart_buff[ind++] = tmp_data_addr[i];
448 return RS_COLLECT_MSG_ERR;
452 uint16_t CRC_VALUE = crc16(modbus_uart_buff, ind);
453 modbus_msg->
MbCRC = CRC_VALUE;
454 modbus_uart_buff[ind++] = CRC_VALUE & 0xFF;
455 modbus_uart_buff[ind++] = CRC_VALUE >> 8;
472 int expected_size = 0;
475 modbus_msg->
MbAddr = modbus_uart_buff[ind++];
478 modbus_msg->
FuncCode = modbus_uart_buff[ind++];
487#ifdef MODBUS_ENABLE_DEVICE_IDENTIFICATIONS
491 modbus_msg->
DevId.ReadDevId = modbus_uart_buff[ind++];
493 modbus_msg->
DevId.MoreFollows = modbus_uart_buff[ind++];
494 modbus_msg->
DevId.NextObjId = modbus_uart_buff[ind++];
495 modbus_msg->
DevId.NumbOfObj = modbus_uart_buff[ind++];
500 uint8_t *tmp_data_addr = (uint8_t *)modbus_msg->
MbData;
503 for(
int obj = 0; obj < modbus_msg->
DevId.NumbOfObj; obj++)
506 uint8_t object_id = modbus_uart_buff[ind++];
507 tmp_data_addr[data_index++] = object_id;
510 uint8_t object_length = modbus_uart_buff[ind++];
511 tmp_data_addr[data_index++] = object_length;
514 for(
int i = 0; i < object_length; i++)
516 tmp_data_addr[data_index++] = modbus_uart_buff[ind++];
519 modbus_msg->
ByteCnt += (2 + object_length);
523#ifdef MODBUS_ENABLE_DIAGNOSTICS
527 modbus_msg->
MbData[0] = modbus_uart_buff[ind++] << 8;
528 modbus_msg->
MbData[0] |= modbus_uart_buff[ind++];
529 modbus_msg->
MbData[1] = modbus_uart_buff[ind++] << 8;
530 modbus_msg->
MbData[1] |= modbus_uart_buff[ind++];
539 modbus_msg->
ByteCnt = modbus_uart_buff[ind++];
542 uint16_t *tmp_data_addr = (uint16_t *)modbus_msg->
MbData;
543 for(
int i = 0; i < modbus_msg->
ByteCnt; i++)
546 tmp_data_addr[i/2] = (uint16_t)modbus_uart_buff[ind++] << 8;
548 tmp_data_addr[i/2] |= modbus_uart_buff[ind++];
555 modbus_msg->
Addr = modbus_uart_buff[ind++] << 8;
556 modbus_msg->
Addr |= modbus_uart_buff[ind++];
557 modbus_msg->
Qnt = modbus_uart_buff[ind++] << 8;
558 modbus_msg->
Qnt |= modbus_uart_buff[ind++];
566 uint16_t CRC_VALUE = crc16(modbus_uart_buff, ind);
567 modbus_msg->
MbCRC = modbus_uart_buff[ind++];
568 modbus_msg->
MbCRC |= modbus_uart_buff[ind++] << 8;
570 if(modbus_msg->
MbCRC != CRC_VALUE)
573 return RS_PARSE_MSG_ERR;
631 uint8_t byte_count = (quantity + 7) / 8;
635 for(
int i = 0; i < byte_count; i++) {
637 msg.
MbData[i] = coils_data[i];
652 for(
int i = 0; i < quantity && i <
DATA_SIZE; i++) {
653 msg.
MbData[i] = regs_data[i];
660RS_MsgTypeDef MB_REQUEST_DIAGNOSTIC_QUERY(uint8_t slave_addr, uint16_t sub_function, uint16_t data)
665RS_MsgTypeDef MB_REQUEST_RETURN_QUERY_DATA(uint8_t slave_addr)
667 return MB_REQUEST_DIAGNOSTIC_QUERY(slave_addr, 0x0000, 0x0000);
670RS_MsgTypeDef MB_REQUEST_RESTART_COMMUNICATIONS(uint8_t slave_addr, uint16_t data)
672 return MB_REQUEST_DIAGNOSTIC_QUERY(slave_addr, 0x0001, data);
675RS_MsgTypeDef MB_REQUEST_RETURN_DIAGNOSTIC_REGISTER(uint8_t slave_addr)
677 return MB_REQUEST_DIAGNOSTIC_QUERY(slave_addr, 0x0002, 0x0000);
680RS_MsgTypeDef MB_REQUEST_FORCE_LISTEN_ONLY_MODE(uint8_t slave_addr)
682 return MB_REQUEST_DIAGNOSTIC_QUERY(slave_addr, 0x0004, 0x0000);
685RS_MsgTypeDef MB_REQUEST_CLEAR_COUNTERS_AND_DIAGNOSTIC_REGISTER(uint8_t slave_addr)
687 return MB_REQUEST_DIAGNOSTIC_QUERY(slave_addr, 0x000A, 0x0000);
690RS_MsgTypeDef MB_REQUEST_RETURN_BUS_MESSAGE_COUNT(uint8_t slave_addr)
692 return MB_REQUEST_DIAGNOSTIC_QUERY(slave_addr, 0x000B, 0x0000);
695RS_MsgTypeDef MB_REQUEST_RETURN_BUS_COMMUNICATION_ERROR_COUNT(uint8_t slave_addr)
697 return MB_REQUEST_DIAGNOSTIC_QUERY(slave_addr, 0x000C, 0x0000);
700RS_MsgTypeDef MB_REQUEST_RETURN_SLAVE_EXCEPTION_ERROR_COUNT(uint8_t slave_addr)
702 return MB_REQUEST_DIAGNOSTIC_QUERY(slave_addr, 0x000D, 0x0000);
705RS_MsgTypeDef MB_REQUEST_RETURN_SLAVE_MESSAGE_COUNT(uint8_t slave_addr)
707 return MB_REQUEST_DIAGNOSTIC_QUERY(slave_addr, 0x000E, 0x0000);
710RS_MsgTypeDef MB_REQUEST_RETURN_SLAVE_NO_RESPONSE_COUNT(uint8_t slave_addr)
712 return MB_REQUEST_DIAGNOSTIC_QUERY(slave_addr, 0x000F, 0x0000);
715RS_MsgTypeDef MB_REQUEST_RETURN_SLAVE_NAK_COUNT(uint8_t slave_addr)
717 return MB_REQUEST_DIAGNOSTIC_QUERY(slave_addr, 0x0010, 0x0000);
720RS_MsgTypeDef MB_REQUEST_RETURN_SLAVE_BUSY_COUNT(uint8_t slave_addr)
722 return MB_REQUEST_DIAGNOSTIC_QUERY(slave_addr, 0x0011, 0x0000);
725RS_MsgTypeDef MB_REQUEST_RETURN_BUS_CHARACTER_OVERRUN_COUNT(uint8_t slave_addr)
727 return MB_REQUEST_DIAGNOSTIC_QUERY(slave_addr, 0x0012, 0x0000);
731RS_MsgTypeDef MB_REQUEST_READ_DEVICE_ID_BASIC(uint8_t slave_addr)
733 RS_MsgTypeDef msg = {slave_addr,
FC_R_DEVICE_ID, {0x0E, 0x01, 0x00, 0, 0, 0}, 0, 0, 0, {0}, 0, 0};
737RS_MsgTypeDef MB_REQUEST_READ_DEVICE_ID_REGULAR(uint8_t slave_addr)
739 RS_MsgTypeDef msg = {slave_addr,
FC_R_DEVICE_ID, {0x0E, 0x02, 0x00, 0, 0, 0}, 0, 0, 0, {0}, 0, 0};
743RS_MsgTypeDef MB_REQUEST_READ_DEVICE_ID_EXTENDED(uint8_t slave_addr)
745 RS_MsgTypeDef msg = {slave_addr,
FC_R_DEVICE_ID, {0x0E, 0x03, 0x00, 0, 0, 0}, 0, 0, 0, {0}, 0, 0};
749RS_MsgTypeDef MB_REQUEST_READ_DEVICE_ID_SPECIFIC(uint8_t slave_addr, uint8_t object_id)
751 RS_MsgTypeDef msg = {slave_addr,
FC_R_DEVICE_ID, {0x0E, 0x04, object_id, 0, 0, 0}, 0, 0, 0, {0}, 0, 0};
RS_StatusTypeDef MB_Master_Collect_Message(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modbus_msg, uint8_t *modbus_uart_buff)
Сбор сообщения в буфер UART в режиме мастер (фрейм мастера из msg -> uart).
RS_StatusTypeDef MB_Master_Parse_Message(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modbus_msg, uint8_t *modbus_uart_buff)
Парс сообщения в режиме мастер (фрейм слейва из uart -> msg).
#define RX_FIRST_PART_SIZE
Size of first part of message that will be received first receive info part of message,...
#define FC_ERR_VALUES_START
from this value starts error func codes
#define DATA_SIZE
maximum number of data: DWORD (NOT MESSAGE SIZE)
@ FC_W_HOLD_REG
Запись одиночного регистра
@ FC_R_DEVICE_ID
Чтение информации об устройстве
@ FC_R_COILS
Чтение битовых ячеек
@ FC_R_DISC_IN
Чтение дискретных входов
@ FC_W_COILS
Запись нескольких битовых ячеек
@ FC_R_IN_REGS
Чтение регистров хранения
@ FC_W_COIL
Запись битовой ячейки
@ FC_R_DIAGNOSTICS
Чтение диагностической информации устройства
@ FC_R_HOLD_REGS
Чтение входных регистров
@ FC_W_HOLD_REGS
Запись нескольких регистров
int MB_RespGet_RegisterValue(RS_MsgTypeDef *modbus_msg, uint16_t reg_addr, uint16_t *reg_value)
Получить значение регистра в ответе по его адресу
int MB_RespGet_RegisterAll(RS_MsgTypeDef *modbus_msg, uint16_t *reg_arr)
Получить значение ВСЕХ регистров в ответе
int MB_RespGet_CoilAll(RS_MsgTypeDef *modbus_msg, int *coil_arr)
Получить состояние ВСЕХ coil в ответе
int MB_RespGet_CoilState(RS_MsgTypeDef *modbus_msg, uint16_t coil_addr, int *coil_state)
Получить состояние coil в ответе по его адресу
int MB_RespGet_ObjectById(RS_MsgTypeDef *modbus_msg, uint8_t obj_id, char *obj_data, uint8_t *obj_length)
Найти объект по ID в сообщении
int MB_RespGet_NumberOfObjects(RS_MsgTypeDef *modbus_msg)
Получить количество объектов в сообщении
int MB_RespGet_ObjectByIndex(RS_MsgTypeDef *modbus_msg, int index, uint8_t *obj_id, char *obj_data, uint8_t *obj_length)
Получить объект по индексу в сообщении
int MB_RespGet_Diagnostic(RS_MsgTypeDef *modbus_msg, uint16_t *data)
Получить данные диагностики из сообщения (MbData[1])
RS_MsgTypeDef MB_REQUEST_WRITE_SINGLE_REG(uint8_t slave_addr, uint16_t reg_addr, uint16_t value)
Сформировать запрос на запись одного регистра
RS_MsgTypeDef MB_REQUEST_WRITE_SINGLE_COIL(uint8_t slave_addr, uint16_t coil_addr, uint8_t value)
Сформировать запрос на запись одного коила
RS_MsgTypeDef MB_REQUEST_READ_HOLDING_REGS(uint8_t slave_addr, uint16_t start_addr, uint16_t quantity)
Сформировать запрос на чтение холдинг регистров
RS_MsgTypeDef MB_REQUEST_READ_INPUT_REGS(uint8_t slave_addr, uint16_t start_addr, uint16_t quantity)
Сформировать запрос на чтение инпут регистров
RS_MsgTypeDef MB_REQUEST_READ_DISCRETE_INPUTS(uint8_t slave_addr, uint16_t start_addr, uint16_t quantity)
Сформировать запрос на чтение дискретных регистров
RS_MsgTypeDef MB_REQUEST_WRITE_MULTIPLE_COILS(uint8_t slave_addr, uint16_t start_addr, uint16_t quantity, uint8_t *coils_data)
Сформировать запрос на запись нескольких регистров
RS_MsgTypeDef MB_REQUEST_WRITE_MULTIPLE_REGS(uint8_t slave_addr, uint16_t start_addr, uint16_t quantity, uint16_t *regs_data)
Сформировать запрос на запись нескольких коилов
RS_MsgTypeDef MB_REQUEST_READ_COILS(uint8_t slave_addr, uint16_t start_addr, uint16_t quantity)
Сформировать запрос на чтение коилов
#define TrackerCnt_Err(_cntstruct_)
Инкрементировать переменную - ошибок
RS_StatusTypeDef
Enums for respond CMD about RS status.
Главный заголовочный файл Modbus библиотеки
static int MB_Define_Size_of_Function(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modbus_msg)
Определить размер модбас запроса (МАСТЕР версия).
uint8_t Conformity
Identification conformity level of the device and type of supported access MODBUS_DEVICE_CONFORMITY.
MB_MEITypeDef MEI_Type
MEI Type assigned number for Device Identifications Interface.
Handle for RS communication.
int32_t RS_Message_Size
size of whole message, not only data
Structure for modbus messsage.
MB_FunctonTypeDef FuncCode
Modbus Function Code.
uint16_t Qnt
Quantity of modbus data.
uint8_t MbAddr
Modbus Slave Address.
MB_ExceptionTypeDef Except_Code
Exception Code for the command.
uint16_t MbCRC
Modbus CRC.
MB_DevIdMsgTypeDef DevId
Read Device Identifications Header struct.
uint8_t ByteCnt
Quantity of bytes of data in message to transmit/receive.
uint16_t MbData[DATA_SIZE]
Modbus Data.
uint16_t Addr
Modbus Address of data.