17#ifdef MODBUS_ENABLE_SLAVE
29 RS_Reset_TX_Flags(hmodbus);
32 if(hmodbus->
ID == 0 || modbus_msg->
MbAddr == 0)
140 if( RS_Is_TX_Busy(hmodbus) )
176#ifdef MODBUS_PROTOCOL_TCP
177 modbus_uart_buff[ind++] = modbus_msg->TransactionID >> 8;
178 modbus_uart_buff[ind++] = modbus_msg->TransactionID& 0xFF;
180 modbus_uart_buff[ind++] = modbus_msg->ProtocolID >> 8;
181 modbus_uart_buff[ind++] = modbus_msg->ProtocolID& 0xFF;
183 modbus_uart_buff[ind++] = modbus_msg->PDULength >> 8;
184 modbus_uart_buff[ind++] = modbus_msg->PDULength& 0xFF;
188 modbus_uart_buff[ind++] = modbus_msg->
MbAddr;
191 modbus_uart_buff[ind++] = modbus_msg->
FuncCode;
197#ifdef MODBUS_ENABLE_DEVICE_IDENTIFICATIONS
201 modbus_uart_buff[ind++] = modbus_msg->
DevId.ReadDevId;
203 modbus_uart_buff[ind++] = modbus_msg->
DevId.MoreFollows;
204 modbus_uart_buff[ind++] = modbus_msg->
DevId.NextObjId;
205 modbus_uart_buff[ind++] = modbus_msg->
DevId.NumbOfObj;
210 return RS_COLLECT_MSG_ERR;
216 uint8_t *tmp_data_addr = (uint8_t *)modbus_msg->
MbData;
217 for(
int i = 0; i < modbus_msg->
ByteCnt; i++)
219 modbus_uart_buff[ind++] = *tmp_data_addr;
225#ifdef MODBUS_ENABLE_DIAGNOSTICS
229 modbus_uart_buff[ind++] = modbus_msg->
MbData[0] >> 8;
230 modbus_uart_buff[ind++] = modbus_msg->
MbData[0] & 0xFF;
231 modbus_uart_buff[ind++] = modbus_msg->
MbData[1] >> 8;
232 modbus_uart_buff[ind++] = modbus_msg->
MbData[1] & 0xFF;
239 modbus_uart_buff[ind++] = modbus_msg->
ByteCnt;
243 return RS_COLLECT_MSG_ERR;
248 uint16_t *tmp_data_addr = (uint16_t *)modbus_msg->
MbData;
249 for(
int i = 0; i < modbus_msg->
ByteCnt; i++)
252 modbus_uart_buff[ind++] = (*tmp_data_addr)>>8;
255 modbus_uart_buff[ind++] = *tmp_data_addr;
269 return RS_COLLECT_MSG_ERR;
273#ifndef MODBUS_PROTOCOL_TCP
275 uint16_t CRC_VALUE = crc16(modbus_uart_buff, ind);
277 modbus_msg->
MbCRC = CRC_VALUE;
278 modbus_uart_buff[ind++] = CRC_VALUE;
279 modbus_uart_buff[ind++] = CRC_VALUE >> 8;
297 int mb_func_size = 0;
313 mb_func_size = modbus_msg->
ByteCnt + 2;
332 uint32_t check_empty_buff;
335 int expected_size = 0;
337#ifdef MODBUS_PROTOCOL_TCP
338 modbus_msg->TransactionID =modbus_uart_buff[ind++]<<8;
339 modbus_msg->TransactionID |=modbus_uart_buff[ind++];
341 modbus_msg->ProtocolID =modbus_uart_buff[ind++]<<8;
342 modbus_msg->ProtocolID |=modbus_uart_buff[ind++];
344 modbus_msg->PDULength =modbus_uart_buff[ind++]<<8;
345 modbus_msg->PDULength |=modbus_uart_buff[ind++];
349 if(modbus_uart_buff[ind] != hmodbus->
ID)
356 modbus_msg->
MbAddr = modbus_uart_buff[ind++];
360 modbus_msg->
FuncCode = modbus_uart_buff[ind++];
369#ifdef MODBUS_ENABLE_DEVICE_IDENTIFICATIONS
373 modbus_msg->
DevId.ReadDevId = modbus_uart_buff[ind++];
374 modbus_msg->
DevId.NextObjId = modbus_uart_buff[ind++];
378#ifdef MODBUS_ENABLE_DIAGNOSTICS
383 modbus_msg->
MbData[0] = modbus_uart_buff[ind++] << 8;
384 modbus_msg->
MbData[0] |= modbus_uart_buff[ind++];
386 modbus_msg->
MbData[1] = modbus_uart_buff[ind++] << 8;
387 modbus_msg->
MbData[1] |= modbus_uart_buff[ind++];
388 modbus_msg->
Addr = 0;
395 modbus_msg->
Addr = modbus_uart_buff[ind++] << 8;
396 modbus_msg->
Addr |= modbus_uart_buff[ind++];
399 modbus_msg->
Qnt = modbus_uart_buff[ind++] << 8;
400 modbus_msg->
Qnt |= modbus_uart_buff[ind++];
419 return RS_PARSE_MSG_ERR;
432 return RS_PARSE_MSG_ERR;
434 uint16_t *tmp_data_addr = (uint16_t *)modbus_msg->
MbData;
435 for(
int i = 0; i < modbus_msg->
ByteCnt; i++)
438 *tmp_data_addr = ((uint16_t)modbus_uart_buff[ind++] << 8);
441 *tmp_data_addr |= modbus_uart_buff[ind++];
449#ifndef MODBUS_PROTOCOL_TCP
451 uint16_t CRC_VALUE = crc16(modbus_uart_buff, ind);
453 modbus_msg->
MbCRC = modbus_uart_buff[ind++];
454 modbus_msg->
MbCRC |= modbus_uart_buff[ind++] << 8;
456 if (modbus_msg->
MbCRC != CRC_VALUE)
uint8_t MB_Process_Write_Single_Reg(RS_MsgTypeDef *modbus_msg)
Обработать функцию Write Single Register (06 - 0x06).
uint8_t MB_Process_Read_Device_Identifications(RS_MsgTypeDef *modbus_msg)
Обработать функцию Read Device Identifications (43/14 - 0x2B/0E).
uint8_t MB_Process_Read_Coils(RS_MsgTypeDef *modbus_msg)
Обработать функцию Read Coils (01 - 0x01).
uint8_t MB_Process_Diagnostics(RS_MsgTypeDef *modbus_msg)
Обработать функцию Diagnostics (Serial Line only) (0x08)
uint8_t MB_Process_Write_Miltuple_Coils(RS_MsgTypeDef *modbus_msg)
Обработать функцию Write Multiple Coils (15 - 0x0F).
uint8_t MB_Process_Write_Single_Coil(RS_MsgTypeDef *modbus_msg)
Обработать функцию Write Single Coils (05 - 0x05).
uint8_t MB_Process_Write_Miltuple_Regs(RS_MsgTypeDef *modbus_msg)
Обработать функцию Write Multiple Registers (16 - 0x10).
uint8_t MB_Process_Read_Hold_Regs(RS_MsgTypeDef *modbus_msg)
Обработать функцию Read Holding Registers (03 - 0x03).
uint8_t MB_Process_Read_Input_Regs(RS_MsgTypeDef *modbus_msg)
Обработать функцию Read Input Registers (04 - 0x04).
void MB_Diagnostics_CommunicationErrorCnt(void)
Увеличивает счетчик ошибок связи
void MB_Diagnostics_SlaveMessageCnt(void)
Увеличивает счетчик отсутствия ответов
void MB_Diagnostics_SlaveNAKCnt(void)
Увеличивает счетчик NAK ответов
void MB_Diagnostics_ExceptionErrorCnt(void)
Увеличивает счетчик исключений
void MB_Diagnostics_SlaveNoResponseCnt(void)
Увеличивает счетчик отсутствия ответов
void MB_Diagnostics_BusMessageCnt(void)
Увеличивает счетчик сообщений на шине
MB_DeviceModeTypeDef MB_GetDeviceMode(void)
Получение текущего режима устройства
#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_W_COILS
Запись нескольких битовых ячеек
@ FC_R_IN_REGS
Чтение регистров хранения
@ FC_W_COIL
Запись битовой ячейки
@ FC_R_DIAGNOSTICS
Чтение диагностической информации устройства
@ FC_R_HOLD_REGS
Чтение входных регистров
@ FC_W_HOLD_REGS
Запись нескольких регистров
RS_StatusTypeDef MB_Slave_Collect_Message(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modbus_msg, uint8_t *modbus_uart_buff)
Сбор сообщения в буфер UART в режиме слейв (фрейм слейва из msg -> uart).
RS_StatusTypeDef MB_Slave_Response(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modbus_msg)
Ответ на сообщение в режиме слейва.
RS_StatusTypeDef MB_Slave_Parse_Message(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modbus_msg, uint8_t *modbus_uart_buff)
Парс сообщения в режиме слейв (фрейм мастера из uart -> msg).
#define TrackerCnt_Ok(_cntstruct_)
Инкрементировать переменную - успешных событий
#define TrackerCnt_Err(_cntstruct_)
Инкрементировать переменную - ошибок
#define TrackerCnt_Warn(_cntstruct_)
Инкрементировать переменную - предупреждений
RS_StatusTypeDef RS_Abort(RS_HandleTypeDef *hRS, RS_AbortTypeDef AbortMode)
Отменить прием/передачу RS/UART.
RS_StatusTypeDef RS_Handle_Transmit_Start(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg)
Обработчик для начала передачи.
RS_StatusTypeDef
Enums for respond CMD about RS status.
RS_StatusTypeDef RS_Handle_Receive_Start(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg)
Обработчик для начала приема.
@ ABORT_TX
Отменить передачу
Главный заголовочный файл 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.
unsigned RX_Continue
0 - Продолжить принимать, 0 - Начать прием сначала
unsigned DataUpdated
1 - Данные были обновлены
unsigned EchoResponse
1 - Ответить эхом, 0 - Ответить своим сообщением
unsigned DeferredResponse
1 - Не начинать передачу в IT, 0 - Ответить в прерывании
unsigned MessageHandled
1 - Обработка запроса успешна, 0 - Обработка запроса в процессе или ошибка
Handle for RS communication.
int32_t RS_Message_Size
size of whole message, not only data
RS_MsgTypeDef * pMessagePtr
Указатель на структуру протокола
RS_FlagsTypeDef f
Флаги для контроля приема/передачи
RS_StatusTypeDef RS_STATUS
Статус RS.
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.