|
发表于 2017-4-19 16:59:00
|
显示全部楼层
定义MODBUS主站状态机
enum MODBUS_HOSTS_STATUS
{
enum_MODBUS_STATUS_1,
enum_MODBUS_STATUS_2,
enum_MODBUS_STATUS_3,
enum_MODBUS_STATUS_4,
enum_MODBUS_STATUS_RECV_OVER ,
enum_MODBUS_STATUS_RECV_ERROR ,
enum_MODBUS_STATUS_TIME_OUT ,
enum_MODBUS_STATUS_6,
enum_MODBUS_STATUS_7,
};
void MBHosts_Init(void);
void MBHosts_ReadCoilRegisters(uint8_t DeviceAddr , uint16_t startAddr , uint16_t registerAmount , uint8_t RepeatCount , MODBUS_HOSTS_QUEUE *Queue);
void MBHosts_ReadDiscreteRegisters(uint8_t DeviceAddr , uint16_t startAddr , uint16_t registerAmount , uint8_t RepeatCount , MODBUS_HOSTS_QUEUE *Queue);
void MBHosts_ReadInputRegisters(uint8_t DeviceAddr , uint16_t startAddr , uint8_t registerAmount , uint8_t RepeatCount , MODBUS_HOSTS_QUEUE *Queue);
void MBHosts_ReadHoldingRegisters(uint8_t DeviceAddr , uint16_t startAddr , uint8_t registerAmount , uint8_t RepeatCount , MODBUS_HOSTS_QUEUE *Queue);
void MBHosts_ForceSingleCoil(uint8_t DeviceAddr , uint16_t startAddr , uint16_t On_Off , uint8_t RepeatCount , MODBUS_HOSTS_QUEUE *Queue);
void MBHosts_PresetSingleHoldingRegister(uint8_t DeviceAddr , uint16_t startAddr , uint16_t Value , uint8_t RepeatCount , MODBUS_HOSTS_QUEUE *Queue);
void MBHosts_ForceMultipleCoil(uint8_t DeviceAddr , uint16_t startAddr , uint16_t registerAmount , uint8_t Data_Buffer[] , uint8_t RepeatCount , MODBUS_HOSTS_QUEUE *Queue);
void MBHosts_PresetMultipleHoldingRegisters(uint8_t DeviceAddr , uint16_t startAddr , uint8_t registerAmount , int16_t Data_Buffer[] , uint8_t RepeatCount , uint8_t CodeFunc , MODBUS_HOSTS_QUEUE *Queue);
以下为MODBUS主站轮巡程序
void USART2_MODBUS_Hosts_Poll(void)
{
uint16_t i;
switch (MB_USART2.MBHosts_Query_isr)
{
case enum_MODBUS_STATUS_1:
if (!Queue_Empty())
{
Out_Queue(&USART2_MBHOSTSQueue);
MB_USART2.MBHosts_Query_isr = enum_MODBUS_STATUS_2;
}
break;
case enum_MODBUS_STATUS_2:
MB_USART2.MBHosts_Query_isr = enum_MODBUS_STATUS_3;
for (i = 0 ; i < USART2_MBHOSTSQueue.SendByteCount ; i++)
MB_USART2.send_buffer = USART2_MBHOSTSQueue.Data;
MB_USART2.sendCount = USART2_MBHOSTSQueue.SendByteCount;
USART2_Begin_Send();
#ifdef __DEBUG_stm32f407__
USART2_MODBUS_send_count++;
#endif
break;
case enum_MODBUS_STATUS_RECV_OVER:
//TIM_Cmd(TIM5, DISABLE);
//TIM_SetCounter(TIM5,0x0000);
MB_USART2.MBHosts_Poll_Time = 0x00;
MB_USART2.MBHosts_Query_isr = enum_MODBUS_STATUS_7;
break;
case enum_MODBUS_STATUS_RECV_ERROR:
case enum_MODBUS_STATUS_TIME_OUT:
TIM_Cmd(TIM5, DISABLE);
TIM_SetCounter(TIM5,0x0000);
MB_USART2.MBHosts_Poll_Time = 0x00;
if (--USART2_MBHOSTSQueue.RepeatCount >= 1)
MB_USART2.MBHosts_Query_isr = enum_MODBUS_STATUS_6;
else
MB_USART2.MBHosts_Query_isr = enum_MODBUS_STATUS_7;
break;
}
} |
|