⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 comm.c

📁 pic18f87j10通讯MODBUS-RT应用程序
💻 C
📖 第 1 页 / 共 3 页
字号:
                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 + -