15#ifdef MODBUS_ENABLE_DIAGNOSTICS
25 MB_DIAG.DeviceMode = MODBUS_NORMAL_MODE;
28 MB_DIAG.Counters.BusMessage = 0;
29 MB_DIAG.Counters.BusCommunicationErr = 0;
30 MB_DIAG.Counters.BusExceptionErr = 0;
31 MB_DIAG.Counters.SlaveMessage = 0;
32 MB_DIAG.Counters.SlaveNoResponse = 0;
35 MB_DIAG.Counters.BusCharacterOverrun = 0;
47 if(bit_num == 0 || bit_num > 15)
51 MB_DIAG.DiagnosticRegister |= (1 << bit_num);
53 MB_DIAG.DiagnosticRegister &= ~(1 << bit_num);
64 if(bit_num < 0 || bit_num > 15)
67 return (
MB_DIAG.DiagnosticRegister >> bit_num) & 0x01;
77 uint16_t sub_function = modbus_msg->
MbData[0];
78 uint16_t request_data = modbus_msg->
MbData[1];
81 if (
MB_DIAG.DeviceMode == MODBUS_LISTEN_ONLY_MODE && sub_function != 0x0001)
90 modbus_msg->
MbData[0] = sub_function;
91 modbus_msg->
MbData[1] = request_data;
97 MB_DIAG.DeviceMode = MODBUS_NORMAL_MODE;
100 if (request_data == 0xFF00)
107 MB_DIAG.Counters.BusMessage = 0;
108 MB_DIAG.Counters.BusCommunicationErr = 0;
109 MB_DIAG.Counters.BusExceptionErr = 0;
110 MB_DIAG.Counters.SlaveMessage = 0;
111 MB_DIAG.Counters.SlaveNoResponse = 0;
113 MB_DIAG.Counters.SlaveBusy = 0;
114 MB_DIAG.Counters.BusCharacterOverrun = 0;
117 modbus_msg->
MbData[0] = sub_function;
118 modbus_msg->
MbData[1] = request_data;
123 modbus_msg->
MbData[0] = sub_function;
135 MB_DIAG.DeviceMode = MODBUS_LISTEN_ONLY_MODE;
141 modbus_msg->
MbData[0] = sub_function;
142 modbus_msg->
MbData[1] = 0;
147 modbus_msg->
MbData[0] = sub_function;
153 modbus_msg->
MbData[0] = sub_function;
154 modbus_msg->
MbData[1] =
MB_DIAG.Counters.BusCommunicationErr;
159 modbus_msg->
MbData[0] = sub_function;
165 modbus_msg->
MbData[0] = sub_function;
171 modbus_msg->
MbData[0] = sub_function;
177 modbus_msg->
MbData[0] = sub_function;
183 modbus_msg->
MbData[0] = sub_function;
189 modbus_msg->
MbData[0] = sub_function;
190 modbus_msg->
MbData[1] =
MB_DIAG.Counters.BusCharacterOverrun;
195 MB_DIAG.Counters.BusCharacterOverrun = 0;
197 MB_DIAG.DiagnosticRegister &= ~(1<<0);
198 modbus_msg->
MbData[0] = sub_function;
199 modbus_msg->
MbData[1] = 0;
225 if (
MB_DIAG.Counters.BusCommunicationErr < 0xFFFF)
226 MB_DIAG.Counters.BusCommunicationErr++;
234 if (
MB_DIAG.Counters.BusExceptionErr < 0xFFFF)
235 MB_DIAG.Counters.BusExceptionErr++;
243 if (
MB_DIAG.Counters.BusCharacterOverrun < 0xFFFF)
245 MB_DIAG.Counters.BusCharacterOverrun++;
247 MB_DIAG.DiagnosticRegister |= (1 << 0);
256 if (
MB_DIAG.Counters.SlaveMessage < 0xFFFF)
257 MB_DIAG.Counters.SlaveMessage++;
265 if (
MB_DIAG.Counters.SlaveNoResponse < 0xFFFF)
266 MB_DIAG.Counters.SlaveNoResponse++;
274 if (
MB_DIAG.Counters.SlaveNAK < 0xFFFF)
283 if (
MB_DIAG.Counters.SlaveBusy < 0xFFFF)
uint8_t MB_Process_Diagnostics(RS_MsgTypeDef *modbus_msg)
Обработать функцию Diagnostics (Serial Line only) (0x08)
void MB_Diagnostics_CommunicationErrorCnt(void)
Увеличивает счетчик ошибок связи
void MB_Diagnostics_SlaveMessageCnt(void)
Увеличивает счетчик отсутствия ответов
void MB_Diagnostics_SlaveNAKCnt(void)
Увеличивает счетчик NAK ответов
void MB_Diagnostics_SlaveBusyCnt(void)
Увеличивает счетчик занятости устройства
int MB_Diagnostics_GetBit(int bit_num)
Прочитать состояние бита диагностического регистра
void MB_Diagnostics_ExceptionErrorCnt(void)
Увеличивает счетчик исключений
int MB_Diagnostics_WriteBit(int bit_num, int bit_state)
Выставить бит в регистре диагностике
void MB_Diagnostics_SlaveNoResponseCnt(void)
Увеличивает счетчик отсутствия ответов
void MB_Diagnostics_BusMessageCnt(void)
Увеличивает счетчик сообщений на шине
MB_DeviceModeTypeDef MB_GetDeviceMode(void)
Получение текущего режима устройства
void MB_Diagnostics_CharacterOverrunCnt(void)
Увеличивает счетчик переполнения символов
MB_DiagnosticsInfoTypeDef MB_DIAG
Глобальная структура диагностики
void MB_DiagnosticsInit(void)
Инициализация диагностических счетчиков
MB_DeviceModeTypeDef
Режимы работы устройства
#define FC_ERR_VALUES_START
from this value starts error func codes
@ ET_ILLEGAL_FUNCTION
Принятый код функции не может быть обработан
Диагностика устройства Modbus.
Структура со диагностической информацией устройства модбас
Structure for modbus messsage.
MB_FunctonTypeDef FuncCode
Modbus Function Code.
MB_ExceptionTypeDef Except_Code
Exception Code for the command.
uint8_t ByteCnt
Quantity of bytes of data in message to transmit/receive.
uint16_t MbData[DATA_SIZE]
Modbus Data.