23#ifdef MODBUS_ENABLE_COILS
39 uint16_t start_shift = 0;
48 *coils |= (1<<start_shift);
52 *coils &= ~(1<<start_shift);
56 *coils ^= (1<<start_shift);
79 Exception = &Exception_tmp;
82 uint16_t start_shift = 0;
88 return ((*coils)&(1<<start_shift));
107 uint16_t start_shift = 0;
115 modbus_msg->
ByteCnt = Divide_Up(modbus_msg->
Qnt, 8);
117 uint16_t mask_for_coils = 0;
118 uint16_t setted_coils = 0;
119 uint16_t temp_reg = 0;
120 uint16_t coil_cnt = 0;
123 int shift = start_shift;
125 for(; ind <= Divide_Up(start_shift + modbus_msg->
Qnt, 16); ind++)
129 for(; shift < 0x10; shift++)
131 mask_for_coils |= 1<<(shift);
132 if(++coil_cnt >= modbus_msg->
Qnt)
138 modbus_msg->
MbData[ind] = (*(coils+ind)&mask_for_coils) >> start_shift;
140 modbus_msg->
MbData[ind-1] |= ((*(coils+ind)&mask_for_coils) << 16) >> start_shift;
144 for(; ind >= 0; --ind)
145 modbus_msg->
MbData[ind] = ByteSwap16(modbus_msg->
MbData[ind]);
159 if ((modbus_msg->
Qnt != 0x0000) && (modbus_msg->
Qnt != 0xFF00))
166 uint16_t start_shift = 0;
173 if(modbus_msg->
Qnt == 0xFF00)
174 *(coils) |= 1<<start_shift;
176 *(coils) &= ~(1<<start_shift);
190 if (modbus_msg->
ByteCnt != Divide_Up(modbus_msg->
Qnt, 8))
197 uint16_t start_shift = 0;
204 uint16_t mask_for_coils = 0;
205 uint32_t setted_coils = 0;
206 uint16_t temp_reg = 0;
207 uint16_t coil_cnt = 0;
210 int shift = start_shift;
211 for(
int ind = 0; ind <= Divide_Up(start_shift + modbus_msg->
Qnt, 16); ind++)
215 for(; shift < 0x10; shift++)
217 mask_for_coils |= 1<<(shift);
218 if(++coil_cnt >= modbus_msg->
Qnt)
227 temp_reg = *(coils+ind);
229 setted_coils = ByteSwap16(modbus_msg->
MbData[ind]) << start_shift;
232 setted_coils |= ((ByteSwap16(modbus_msg->
MbData[ind-1]) << start_shift) >> 16);
236 *(coils+ind) = setted_coils & mask_for_coils;
238 *(coils+ind) |= temp_reg&(~mask_for_coils);
241 if(coil_cnt >= modbus_msg->
Qnt)
uint8_t MB_Process_Read_Coils(RS_MsgTypeDef *modbus_msg)
Обработать функцию Read Coils (01 - 0x01).
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).
MB_ExceptionTypeDef MB_DefineCoilsAddress(uint16_t **pCoils, uint16_t Addr, uint16_t Qnt, uint16_t *start_shift, uint8_t WriteFlag)
Define Address Origin for coils.
uint16_t MB_Coil_Read_Global(uint16_t Addr, MB_ExceptionTypeDef *Exception)
Считать коил по глобальному адресу.
MB_CoilsOpTypeDef
Enum for coils operation.
MB_ExceptionTypeDef MB_Coil_Write_Global(uint16_t Addr, MB_CoilsOpTypeDef WriteVal)
Выставить/сбросить коил по глобальному адресу.
MB_ExceptionTypeDef
Enum for modbus exception codes.
@ ET_ILLEGAL_DATA_VALUE
Значение, содержащееся в поле данных запроса, является недопустимой величиной
Structure for modbus messsage.
uint16_t Qnt
Quantity of modbus data.
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.
uint16_t Addr
Modbus Address of data.