📄 comm.c
字号:
ex_modbus_r_head_flag = 0;
if (tmp_speed)
{
SPBRG2 = tmp_speed;
tmp_speed = 0;
}
}
else
{
modbus_r_over = 0;
ex_modbus_r_head_flag = 0;
ex_modbus_r_count = 0;
modbus_proc_flag = 0;
}
}
else
{
modbus_r_over = 0;
ex_modbus_r_head_flag = 0;
ex_modbus_r_count = 0;
modbus_proc_flag = 0;
}
}
}
void Ifr_Init(void)
{
uchar i;
TRISCbits.TRISC0 = IO_OUTPUT;
Ifr_uart_init();
IFR_RS485_EN = RS_485_RCV;
TRISDbits.TRISD7 = IO_OUTPUT;
IFR_WARNING = NO_WARNING;
for(i = 0; i < SENSORS_NUM; i++)
ifr_To[i] = 0;
ex_ifr_r_count = 0;
ex_ifr_r_head_flag = 0;
ex_ifr_start_timer = 0;
ex_ifr_timer_count = 0;
ex_ifr_timer_snd_flag = 0;
ex_ifr_timer_snd_count = 0;
ifr_s_no = 0;
}
const rom uchar ifr_code[] =
{
0x01, 0x03, 0x01, 0x04, 0x8b, 0xf1,
0x02, 0x03, 0x01, 0x04, 0xcf, 0xf1,
0x03, 0x03, 0x01, 0x04, 0x33, 0xf0,
0x04, 0x03, 0x01, 0x04, 0x47, 0xf1,
0x05, 0x03, 0x01, 0x04, 0xbb, 0xf0,
0x06, 0x03, 0x01, 0x04, 0xff, 0xf0,
0x07, 0x03, 0x01, 0x04, 0x03, 0xf1,
0x08, 0x03, 0x01, 0x04, 0x17, 0xf2,
0x09, 0x03, 0x01, 0x04, 0xeb, 0xf3,
};
//-------------------------------------------------------------------------
//
//-------------------------------------------------------------------------
void Ifr_PacketPro(void)
{
uchar crc_h, crc_l;
uchar ifr_r_no;
const rom uchar *ifrp;
uint i, j, tm;
uchar warning;
//报文接收
if (ex_ifr_r_count >= 9)
{
crc_l = CRC16(rs485_rx_buf, 8);
crc_h = CRC16_1(rs485_rx_buf, 8);
if ((crc_l == rs485_rx_buf[8]) && (crc_h == rs485_rx_buf[9]))
{
ifr_r_no = rs485_rx_buf[0];
if( ifr_r_no < SENSORS_NUM)
ifr_To[ifr_r_no] = ((float)rs485_rx_buf[5] *256+rs485_rx_buf[4])*0.1;
}
ex_ifr_r_count = 0;
ex_ifr_r_head_flag = 0;
ex_ifr_start_timer = 1;
ex_ifr_timer_count = 0;
}
//定时发送
if ((ex_ifr_timer_snd_flag) && (ex_ifr_r_count == 0))
{
ifrp = &ifr_code[ifr_s_no*SENSORS_NUM];
for(i = 0; i < 3; i++)
{
rs485_tx_buf[i] = 0xfe;
}
for(i = 3; i < 9; i++)
{
rs485_tx_buf[i] = *ifrp;
ifrp++;
}
for(i = 9; i < 11; i++)
{
rs485_tx_buf[i] = 0xfe;
}
ex_ifr_r_count = 0;
ex_ifr_r_head_flag = 0;
ifr_s_no++;
if (ifr_s_no >= SENSORS_NUM)
{
ifr_s_no = 0;
}
IFR_RS485_EN = RS_485_SND;
for (i = 0; i < 11; i++)
{
while (TXSTA1bits.TRMT == 0)
;
TXSTA1bits.TX9D = 1;
TXREG1 = rs485_tx_buf[i];
TXD = ~TXD;
}
for (i = 0; i < 400; i++) ;//wait50ms
IFR_RS485_EN = RS_485_RCV;
ex_ifr_timer_snd_flag = 0;
ex_ifr_start_timer = 1;
ex_ifr_timer_count = 0;
}
//报警处理
for(warning = 0, i = 0; i < SENSORS_NUM; i++)
{
if(ifr_To[i] >= (float)eepara.Ifr_Warning_Ceiling)
{
warning++;
}
}
if(warning)
IFR_WARNING = WARNING_OUTPUT;
else
IFR_WARNING = NO_WARNING;
}
//-------------------------------------------------------------------------
//
//-------------------------------------------------------------------------
#pragma interrupt High_Inter_Handle
void High_Inter_Handle(void)
{
uchar int_tmp_char;
static uchar r_modbus_len; //接收报文长度计数
//近端采集
if (PIR1bits.RC1IF)
{
PIR1bits.RC1IF = 0;
RXD = ~RXD;
if (ex_ifr_r_head_flag == 0)
{
ex_ifr_r_count = 0;
rs485_rx_buf[ex_ifr_r_count] = RCREG1;
if (rs485_rx_buf[0] == rs485_tx_buf[3])
{
ex_ifr_r_head_flag = 1;
ex_ifr_start_timer = 0;
ex_ifr_timer_count = 0;
}
}
else
{
++ex_ifr_r_count;
if (ex_ifr_r_count > 9)
{
rs485_rx_buf[11] = RCREG1;
}
else
{
rs485_rx_buf[ex_ifr_r_count] = RCREG1;
}
if (rs485_rx_buf[1] != 0x43)
{
ex_ifr_r_head_flag = 0;
ex_ifr_r_count = 0;
}
}
}
//远端查询
if (PIR3bits.RC2IF && (ex_modbus_r_head_flag == 0) && (modbus_r_over == 0))
{
//找到符合本机地址
PIR3bits.RC2IF = 0;
RXD1 = ~RXD1;
ex_modbus_r_count = 0;
modbus_proc_flag = 0;
ex_modbus_start_timer = 1;
ex_modbus_timer_count = 0;
r_modbus_len = 0;
modbus_packet_len = 0;
int_tmp_char = RCREG2;
rs485_rx1_buf[ex_modbus_r_count] = int_tmp_char;
if ( /*(rs485_rx1_buf[0] == 0x00) || */(rs485_rx1_buf[0] ==
eepara.address))
{
//暂时不处理广播地址
ex_modbus_r_head_flag = 1;
ex_modbus_start_timer = 0;
ex_modbus_timer_count = 0;
}
}
else if (PIR3bits.RC2IF && (ex_modbus_r_head_flag == 1) && (modbus_r_over == 0)
)
{
PIR3bits.RC2IF = 0;
++ex_modbus_r_count;
rs485_rx1_buf[ex_modbus_r_count] = RCREG2;
if (ex_modbus_r_count == L_FUN_NO)
{
//功能码
if ((rs485_rx1_buf[ex_modbus_r_count] == FUN_01) ||
(rs485_rx1_buf[ex_modbus_r_count] == FUN_02) ||
(rs485_rx1_buf[ex_modbus_r_count] == FUN_03) ||
(rs485_rx1_buf[ex_modbus_r_count] == FUN_16))
{
//只处理01,02,03,16报文
}
else
{
ex_modbus_r_head_flag = 0;
}
}
else if ((ex_modbus_r_count == MODBUS_LEN) && (rs485_rx1_buf[L_FUN_NO] !=
FUN_16))
{
//01-03接收结束
modbus_proc_flag = 1;
modbus_r_over = 1;
modbus_packet_len = ex_modbus_r_count + 1;
}
else if ((ex_modbus_r_count == L_DNUM) && (rs485_rx1_buf[L_FUN_NO] ==
FUN_16))
{
//16接收数据长度+2CRC字节
r_modbus_len = rs485_rx1_buf[ex_modbus_r_count] + 2;
}
else if (r_modbus_len)
{
//16接收数据
r_modbus_len--;
if ((r_modbus_len == 0) || (ex_modbus_r_count >= MODBUS_RS485_RX_BUF_LEN))
{
//16接收结束
modbus_proc_flag = 1;
modbus_r_over = 1;
modbus_packet_len = ex_modbus_r_count + 1;
}
}
}
else if (PIR3bits.RC2IF)
{
PIR3bits.RC2IF = 0;
int_tmp_char = RCREG2;
}
}
//-------------------------------------------------------------------------
//
//-------------------------------------------------------------------------
#pragma interrupt Lower_Inter_Handle
void Lower_Inter_Handle(void)
{
if (INTCON &0x04)
//TMR0IF==1
{
TMR0H = 0xD9;
TMR0L = 0x00;
INTCON = INTCON &0xFB; //TMR0IF=0;
// if (time == 0)
// {
// count++;
// }
// if (ws_count == 0)
// {
// if (count >= 1000)
// {
// time = 1;
// count = 0;
// }
// }
// if (ws_count == 1)
// {
// if (count >= 400)
// {
// time = 1;
// count = 0;
// }
// }
// if (time1 == 0)
// {
// count1++;
// }
// if (count1 >= 60)
// {
// time1 = 1;
// count1 = 0;
// }
// if (!flag1)
// {
// count7++;
// }
// if (count7 >= 20)
// {
// flag1 = 1;
// count7 = 0;
// }
// if (!flag5)
// {
// count8++;
// }
// if (count8 >= 20)
// {
// flag5 = 1;
// count8 = 0;
// }
// if (!flag2)
// {
// count2++;
// }
// if (count2 >= 240)
// {
// count2 = 0;
// flag2 = 1;
// }
if (!ex_ifr_timer_snd_flag)
{
ex_ifr_timer_snd_count++;
}
if (ex_ifr_timer_snd_count >= 100)
{
ex_ifr_timer_snd_count = 0;
ex_ifr_timer_snd_flag = 1;
}
if (!ex_ifr_start_timer)
{
ex_ifr_timer_count++;
if ((ex_ifr_timer_count > 70) && (ex_ifr_r_count < 9))
{
ex_ifr_r_count = 0;
ex_ifr_r_head_flag = 0;
ex_ifr_timer_count = 0;
ex_ifr_start_timer = 1;
}
}
if (!ex_modbus_start_timer)
{
ex_modbus_timer_count++;
if ((ex_modbus_timer_count > 20) && (ex_modbus_r_count < 7))
{
ex_modbus_r_count = 0;
ex_modbus_r_head_flag = 0;
ex_modbus_timer_count = 0;
ex_modbus_start_timer = 1;
}
}
}
}
//void interrupt HI_ISR()
#pragma code HIGH_VECTOR=0x08
void HIGH_ISR()
{
_asm goto High_Inter_Handle _endasm
}
//-------------------------------------------------------------------------
//
//-------------------------------------------------------------------------
#pragma code LOW_VECTOR =0x18
void LOW_ISR(void)
{
_asm goto Lower_Inter_Handle _endasm
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -