#include "modbus.h" #include "Rcc_Nvic_Systick.h" /////////////////////////////////////////////////////////// //u32 RS485_Baudrate=9600;//ͨѶ²¨ÌØÂÊ //u8 RS485_Parity=0;//0ÎÞУÑ飻1ÆæÐ£Ñ飻2żУÑé u8 RS485_Addr=1;//´Ó»úµØÖ· //u16 RS485_Frame_Distance=4;//Êý¾ÝÖ¡×îС¼ä¸ô£¨ms),³¬¹ý´Ëʱ¼äÔòÈÏΪÊÇÏÂÒ»Ö¡ u8 cmd_mode = 0; u8 RS485_RX_BUFF[200];//½ÓÊÕ»º³åÇø200×Ö½Ú u16 RS485_RX_CNT=0;//½ÓÊÕ¼ÆÊýÆ÷ //u8 RS485_FrameFlag=0;//Ö¡½áÊø±ê¼Ç u8 RS485_TX_BUFF[200];//·¢ËÍ»º³åÇø u16 RS485_TX_CNT=0;//·¢ËͼÆÊýÆ÷ //u8 DATA_RX_BUFF[2048];//½ÓÊÕ»º´æ£» //////////////////////////////////////////////////////////////////////////////////////////////////////////// //Modbus¼Ä´æÆ÷ºÍµ¥Æ¬»ú¼Ä´æÆ÷µÄÓ³Éä¹ØÏµ vu32 *Modbus_InputIO[100];//ÊäÈ뿪¹ØÁ¿¼Ä´æÆ÷Ö¸Õë(ÕâÀïʹÓõÄÊÇλ´ø²Ù×÷) vu32 *Modbus_OutputIO[100];//Êä³ö¿ª¹ØÁ¿¼Ä´æÆ÷Ö¸Õë(ÕâÀïʹÓõÄÊÇλ´ø²Ù×÷) u16 Modbus_HoldReg[MODBUS_SIZE];//±£³Ö¼Ä´æÆ÷Ö¸Õë u32 testData1=1201,testData2=1002,testData3=2303,testData4=8204; void Modbus_RegMap(void) { u16 i; for(i=0;iGPIO_Mode_IN_FLOATING(¸¡¿ÕÊäÈë)///////////////////////////////////////////// // GPIO_Init(GPIOA,&GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin=RS485_TX_PIN;//ÐÞ¸ÄPG9£¨RE/DE£©Í¨ÓÃÍÆÍìÊä³ö->PB7£¨RE/DE£©Í¨ÓÃÍÆÍìÊä³ö////////////////////////////////////////////////////////////////////// GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_Init(RS485_TX_GPIO,&GPIO_InitStructure); GPIO_ResetBits(RS485_TX_GPIO,RS485_TX_PIN);//ĬÈϽÓÊÕ״̬ // USART_DeInit(USART2);//¸´Î»´®¿Ú2 // USART_InitStructure.USART_BaudRate=RS485_Baudrate; // USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None; // USART_InitStructure.USART_WordLength=USART_WordLength_8b; // USART_InitStructure.USART_StopBits=USART_StopBits_1; // USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;//ÊÕ·¢Ä£Ê½ // switch(RS485_Parity) // { // case 0:USART_InitStructure.USART_Parity=USART_Parity_No;break;//ÎÞУÑé // case 1:USART_InitStructure.USART_Parity=USART_Parity_Odd;break;//ÆæÐ£Ñé // case 2:USART_InitStructure.USART_Parity=USART_Parity_Even;break;//żУÑé // } // USART_Init(USART2,&USART_InitStructure); // // USART_ClearITPendingBit(USART2,USART_IT_RXNE); // USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);//ʹÄÜ´®¿Ú2½ÓÊÕÖÐ¶Ï // // NVIC_InitStructure.NVIC_IRQChannel=USART2_IRQn; // NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2; // NVIC_InitStructure.NVIC_IRQChannelSubPriority=2; // NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; // NVIC_Init(&NVIC_InitStructure); // // USART_Cmd(USART2,ENABLE);//ʹÄÜ´®¿Ú2 // RS485_TX_OFF;//ĬÈÏΪ½ÓÊÕģʽ // Timer7_Init();//¶¨Ê±Æ÷7³õʼ»¯£¬ÓÃÓÚ¼àÊÓ¿ÕÏÐʱ¼ä Modbus_RegMap();//Modbus¼Ä´æÆ÷Ó³Éä } //¶¨Ê±Æ÷7³õʼ»¯ //void Timer7_Init(void) //{ // TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; // NVIC_InitTypeDef NVIC_InitStructure; // RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7, ENABLE); //TIM7ʱÖÓʹÄÜ // //TIM7³õʼ»¯ÉèÖà // TIM_TimeBaseStructure.TIM_Period = RS485_Frame_Distance*10; //ÉèÖÃÔÚÏÂÒ»¸ö¸üÐÂʼþ×°Èë»î¶¯µÄ×Ô¶¯ÖØ×°ÔؼĴæÆ÷ÖÜÆÚµÄÖµ // TIM_TimeBaseStructure.TIM_Prescaler =7200; //ÉèÖÃÓÃÀ´×÷ΪTIMxʱÖÓÆµÂʳýÊýµÄÔ¤·ÖƵֵ ÉèÖüÆÊýƵÂÊΪ10kHz // TIM_TimeBaseStructure.TIM_ClockDivision = 0; //ÉèÖÃʱÖÓ·Ö¸î:TDTS = Tck_tim // TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIMÏòÉϼÆÊýģʽ // TIM_TimeBaseInit(TIM7, &TIM_TimeBaseStructure); //¸ù¾ÝTIM_TimeBaseInitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯TIMxµÄʱ¼ä»ùÊýµ¥Î» // TIM_ITConfig( TIM7, TIM_IT_Update, ENABLE );//TIM7 ÔÊÐí¸üÐÂÖÐ¶Ï // //TIM7ÖжϷÖ×éÅäÖà // NVIC_InitStructure.NVIC_IRQChannel =TIM7_IRQn; //TIM7ÖÐ¶Ï // NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //ÏÈÕ¼ÓÅÏȼ¶2¼¶ // NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //´ÓÓÅÏȼ¶3¼¶ // NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQͨµÀ±»Ê¹ÄÜ // NVIC_Init(&NVIC_InitStructure); //¸ù¾ÝNVIC_InitStructÖÐÖ¸¶¨µÄ²ÎÊý³õʼ»¯ÍâÉèNVIC¼Ä´æÆ÷ //} ////////////////////////////////////////////////////////////////////////////// //·¢ËÍn¸ö×Ö½ÚÊý¾Ý //buff:·¢ËÍÇøÊ×µØÖ· //len£º·¢Ë͵Ä×Ö½ÚÊý //void RS485_SendData(u8 *buff,u8 len) //{ // RS485_TX_ON;//Çл»Îª·¢ËÍģʽ // #ifdef BAUDRATE_19200 // delay_ms(5); // #else // delay_ms(1); // #endif // while(len--) // { // while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//µÈ´ý·¢ËÍÇøÎª¿Õ // USART_SendData(USART1,*(buff++)); // } // while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);//µÈ´ý·¢ËÍÍê³É // RS485_TX_OFF;//¿ªÆô½ÓÊÕģʽ //} ///////////////////////////////////////////////////////////////////////////////////// //void USART2_IRQHandler(void)//´®¿Ú2ÖжϷþÎñ³ÌÐò //{ // // u8 res; // u8 err; // // if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET) // { // if(USART_GetFlagStatus(USART2,USART_FLAG_NE|USART_FLAG_FE|USART_FLAG_PE)) err=1;//¼ì²âµ½ÔëÒô¡¢Ö¡´íÎó»òУÑé´íÎó // else err=0; // //LED0=0; // res=USART_ReceiveData(USART2); //¶Á½ÓÊÕµ½µÄ×Ö½Ú£¬Í¬Ê±Ïà¹Ø±êÖ¾×Ô¶¯Çå³ý // // if((RS485_RX_CNT<2047)&&(err==0)) // { // RS485_RX_BUFF[RS485_RX_CNT]=res; // RS485_RX_CNT++; // // TIM_ClearITPendingBit(TIM7,TIM_IT_Update);//Çå³ý¶¨Ê±Æ÷Òç³öÖÐ¶Ï // TIM_SetCounter(TIM7,0);//µ±½ÓÊÕµ½Ò»¸öеÄ×Ö½Ú£¬½«¶¨Ê±Æ÷7¸´Î»Îª0£¬ÖØÐ¼ÆÊ±£¨Ï൱ÓÚι¹·£© // TIM_Cmd(TIM7,ENABLE);//¿ªÊ¼¼ÆÊ± // } // } //} /////////////////////////////////////////////////////////////////////////////////////// //Óö¨Ê±Æ÷7ÅжϽÓÊÕ¿ÕÏÐʱ¼ä£¬µ±¿ÕÏÐʱ¼ä´óÓÚÖ¸¶¨Ê±¼ä£¬ÈÏΪһ֡½áÊø //¶¨Ê±Æ÷7ÖжϷþÎñ³ÌÐò //void TIM7_IRQHandler(void) //{ // if(TIM_GetITStatus(TIM7,TIM_IT_Update)!=RESET) // { // TIM_ClearITPendingBit(TIM7,TIM_IT_Update);//Çå³ýÖжϱêÖ¾ // TIM_Cmd(TIM7,DISABLE);//Í£Ö¹¶¨Ê±Æ÷ // RS485_TX_ON;//Í£Ö¹½ÓÊÕ£¬Çл»Îª·¢ËÍ״̬ // RS485_FrameFlag=1;//ÖÃλ֡½áÊø±ê¼Ç // } //} ///////////////////////////////////////////////////////////////////////////////////// //RS485·þÎñ³ÌÐò£¬ÓÃÓÚ´¦Àí½ÓÊÕµ½µÄÊý¾Ý(ÇëÔÚÖ÷º¯ÊýÖÐÑ­»·µ÷ÓÃ) u16 startRegAddr; u16 RegNum; u16 calCRC; void RS485_Service(void) { u16 recCRC; //if(RS485_FrameFlag==1) //{ if(RS485_RX_BUFF[0]==RS485_Addr)//µØÖ·ÕýÈ· { //if((RS485_RX_BUFF[1]==01)||(RS485_RX_BUFF[1]==02)||(RS485_RX_BUFF[1]==03)||(RS485_RX_BUFF[1]==05)||(RS485_RX_BUFF[1]==06)||(RS485_RX_BUFF[1]==15)||(RS485_RX_BUFF[1]==16))//¹¦ÄÜÂëÕýÈ· if((RS485_RX_BUFF[1]==03)||(RS485_RX_BUFF[1]==06)||(RS485_RX_BUFF[1]==16)) { startRegAddr=(((u16)RS485_RX_BUFF[2])<<8)|RS485_RX_BUFF[3];//»ñÈ¡¼Ä´æÆ÷ÆðʼµØÖ· if(startRegAddr>=1;//µÍλÏÈ·¢ËÍ RS485_TX_BUFF[3+i/8]|=((*Modbus_InputIO[startRegAddr+i])<<7)&0x80; if(i==RegNum-1)//·¢Ë͵½×îºóÒ»¸öλÁË { if(RegNum%8) RS485_TX_BUFF[3+i/8]>>=8-(RegNum%8);//Èç¹û×îºóÒ»¸ö×Ö½Ú»¹ÓÐÓàÊý£¬ÔòÊ£ÓàMSBÌî³ä0 } } calCRC=CRC_Compute(RS485_TX_BUFF,ByteNum+3); RS485_TX_BUFF[ByteNum+3]=(calCRC>>8)&0xFF; RS485_TX_BUFF[ByteNum+4]=(calCRC)&0xFF; UART_PushFrame(RS485_TX_BUFF,ByteNum+5); } else//¼Ä´æÆ÷µØÖ·+ÊýÁ¿³¬³ö·¶Î§ { RS485_TX_BUFF[0]=RS485_RX_BUFF[0]; RS485_TX_BUFF[1]=RS485_RX_BUFF[1]|0x80; RS485_TX_BUFF[2]=0x02; //Òì³£Âë UART_PushFrame(RS485_TX_BUFF,3); } } //Modbus¹¦ÄÜÂë01´¦Àí³ÌÐò ///////////////////////////////////////////////////////////³ÌÐòÒÑÑéÖ¤OK //¶ÁÊä³ö¿ª¹ØÁ¿ void Modbus_01_Solve(void) { u16 ByteNum; u16 i; RegNum= (((u16)RS485_RX_BUFF[4])<<8)|RS485_RX_BUFF[5];//»ñÈ¡¼Ä´æÆ÷ÊýÁ¿ if((startRegAddr+RegNum)<100)//¼Ä´æÆ÷µØÖ·+ÊýÁ¿ÔÚ·¶Î§ÄÚ { RS485_TX_BUFF[0]=RS485_RX_BUFF[0]; RS485_TX_BUFF[1]=RS485_RX_BUFF[1]; ByteNum=RegNum/8;//×Ö½ÚÊý if(RegNum%8) ByteNum+=1;//Èç¹ûλÊý»¹ÓÐÓàÊý£¬Ôò×Ö½ÚÊý+1 RS485_TX_BUFF[2]=ByteNum;//·µ»ØÒª¶ÁÈ¡µÄ×Ö½ÚÊý for(i=0;i>=1;//µÍλÏÈ·¢ËÍ RS485_TX_BUFF[3+i/8]|=((*Modbus_OutputIO[startRegAddr+i])<<7)&0x80; if(i==RegNum-1)//·¢Ë͵½×îºóÒ»¸öλÁË { if(RegNum%8) RS485_TX_BUFF[3+i/8]>>=8-(RegNum%8);//Èç¹û×îºóÒ»¸ö×Ö½Ú»¹ÓÐÓàÊý£¬ÔòÊ£ÓàMSBÌî³ä0 } } calCRC=CRC_Compute(RS485_TX_BUFF,ByteNum+3); RS485_TX_BUFF[ByteNum+3]=(calCRC>>8)&0xFF; RS485_TX_BUFF[ByteNum+4]=(calCRC)&0xFF; UART_PushFrame(RS485_TX_BUFF,ByteNum+5); } else//¼Ä´æÆ÷µØÖ·+ÊýÁ¿³¬³ö·¶Î§ { RS485_TX_BUFF[0]=RS485_RX_BUFF[0]; RS485_TX_BUFF[1]=RS485_RX_BUFF[1]|0x80; RS485_TX_BUFF[2]=0x02; //Òì³£Âë UART_PushFrame(RS485_TX_BUFF,3); } } //Modbus¹¦ÄÜÂë05´¦Àí³ÌÐò ///////////////////////////////////////////////////////³ÌÐòÒÑÑéÖ¤OK //дµ¥¸öÊä³ö¿ª¹ØÁ¿ void Modbus_05_Solve(void) { if(startRegAddr<100)//¼Ä´æÆ÷µØÖ·ÔÚ·¶Î§ÄÚ { if((RS485_RX_BUFF[4]==0xFF)||(RS485_RX_BUFF[5]==0xFF)) *Modbus_OutputIO[startRegAddr]=0x01; else *Modbus_OutputIO[startRegAddr]=0x00; RS485_TX_BUFF[0]=RS485_RX_BUFF[0]; RS485_TX_BUFF[1]=RS485_RX_BUFF[1]; RS485_TX_BUFF[2]=RS485_RX_BUFF[2]; RS485_TX_BUFF[3]=RS485_RX_BUFF[3]; RS485_TX_BUFF[4]=RS485_RX_BUFF[4]; RS485_TX_BUFF[5]=RS485_RX_BUFF[5]; calCRC=CRC_Compute(RS485_TX_BUFF,6); RS485_TX_BUFF[6]=(calCRC>>8)&0xFF; RS485_TX_BUFF[7]=(calCRC)&0xFF; UART_PushFrame(RS485_TX_BUFF,8); } else//¼Ä´æÆ÷µØÖ·³¬³ö·¶Î§ { RS485_TX_BUFF[0]=RS485_RX_BUFF[0]; RS485_TX_BUFF[1]=RS485_RX_BUFF[1]|0x80; RS485_TX_BUFF[2]=0x02; //Òì³£Âë UART_PushFrame(RS485_TX_BUFF,3); } } //Modbus¹¦ÄÜÂë15´¦Àí³ÌÐò //////////////////////////////////////////////////////³ÌÐòÒÑÑéÖ¤OK //д¶à¸öÊä³ö¿ª¹ØÁ¿ void Modbus_15_Solve(void) { u16 i; RegNum=(((u16)RS485_RX_BUFF[4])<<8)|RS485_RX_BUFF[5];//»ñÈ¡¼Ä´æÆ÷ÊýÁ¿ if((startRegAddr+RegNum)<100)//¼Ä´æÆ÷µØÖ·+ÊýÁ¿ÔÚ·¶Î§ÄÚ { for(i=0;i>=1;//´ÓµÍλ¿ªÊ¼ } RS485_TX_BUFF[0]=RS485_RX_BUFF[0]; RS485_TX_BUFF[1]=RS485_RX_BUFF[1]; RS485_TX_BUFF[2]=RS485_RX_BUFF[2]; RS485_TX_BUFF[3]=RS485_RX_BUFF[3]; RS485_TX_BUFF[4]=RS485_RX_BUFF[4]; RS485_TX_BUFF[5]=RS485_RX_BUFF[5]; calCRC=CRC_Compute(RS485_TX_BUFF,6); RS485_TX_BUFF[6]=(calCRC>>8)&0xFF; RS485_TX_BUFF[7]=(calCRC)&0xFF; UART_PushFrame(RS485_TX_BUFF,8); } else//¼Ä´æÆ÷µØÖ·+ÊýÁ¿³¬³ö·¶Î§ { RS485_TX_BUFF[0]=RS485_RX_BUFF[0]; RS485_TX_BUFF[1]=RS485_RX_BUFF[1]|0x80; RS485_TX_BUFF[2]=0x02; //Òì³£Âë UART_PushFrame(RS485_TX_BUFF,3); } } //Modbus¹¦ÄÜÂë03´¦Àí³ÌÐò///////////////////////////////////////////////////////////////////////////////////////ÒÑÑéÖ¤³ÌÐòOK //¶Á±£³Ö¼Ä´æÆ÷ void Modbus_03_Solve(void) { u8 i; RegNum= (((u16)RS485_RX_BUFF[4])<<8)|RS485_RX_BUFF[5];//»ñÈ¡¼Ä´æÆ÷ÊýÁ¿ if((startRegAddr+RegNum)>8)&0xFF;// /////////ÏÈ·¢Ë͸ß×Ö½Ú--ÔÚ·¢Ë͵Í×Ö½Ú RS485_TX_BUFF[4+i*2]=(Modbus_HoldReg[startRegAddr+i])&0xFF; // } calCRC=CRC_Compute(RS485_TX_BUFF,RegNum*2+3); RS485_TX_BUFF[RegNum*2+3]=(calCRC>>8)&0xFF; //CRC¸ßµØÎ»²»¶ÔÂ𣿠// ÏȸߺóµÍ RS485_TX_BUFF[RegNum*2+4]=(calCRC)&0xFF; UART_PushFrame(RS485_TX_BUFF,RegNum*2+5); } else//¼Ä´æÆ÷µØÖ·+ÊýÁ¿³¬³ö·¶Î§ { RS485_TX_BUFF[0]=RS485_RX_BUFF[0]; RS485_TX_BUFF[1]=RS485_RX_BUFF[1]|0x80; RS485_TX_BUFF[2]=0x02; //Òì³£Âë UART_PushFrame(RS485_TX_BUFF,3); } } //Modbus¹¦ÄÜÂë06´¦Àí³ÌÐò //////////////////////////////////////////////////////////////////////////////////ÒÑÑéÖ¤³ÌÐòOK //дµ¥¸ö±£³Ö¼Ä´æÆ÷ void Modbus_06_Solve(void) { Modbus_HoldReg[startRegAddr]=RS485_RX_BUFF[4]<<8;//¸ß×Ö½ÚÔÚǰ ////////ÐÞ¸ÄΪ¸ß×Ö½ÚÔÚǰ£¬µÍ×Ö½ÚÔÚºó Modbus_HoldReg[startRegAddr]|=((u16)RS485_RX_BUFF[5]);//µÍ×Ö½ÚÔÚºó RS485_TX_BUFF[0]=RS485_RX_BUFF[0]; RS485_TX_BUFF[1]=RS485_RX_BUFF[1]; RS485_TX_BUFF[2]=RS485_RX_BUFF[2]; RS485_TX_BUFF[3]=RS485_RX_BUFF[3]; RS485_TX_BUFF[4]=RS485_RX_BUFF[4]; RS485_TX_BUFF[5]=RS485_RX_BUFF[5]; calCRC=CRC_Compute(RS485_TX_BUFF,6); RS485_TX_BUFF[6]=(calCRC>>8)&0xFF; RS485_TX_BUFF[7]=(calCRC)&0xFF; UART_PushFrame(RS485_TX_BUFF,8); } //Modbus¹¦ÄÜÂë16´¦Àí³ÌÐò /////////////////////////////////////////////////////////////////////////////////////////////////ÒÑÑéÖ¤³ÌÐòOK //д¶à¸ö±£³Ö¼Ä´æÆ÷ void Modbus_16_Solve(void) { u8 i; RegNum= (((u16)RS485_RX_BUFF[4])<<8)|((RS485_RX_BUFF[5]));//»ñÈ¡¼Ä´æÆ÷ÊýÁ¿ if((startRegAddr+RegNum)>8)&0xFF; RS485_TX_BUFF[7]=(calCRC)&0xFF; UART_PushFrame(RS485_TX_BUFF,8); } else//¼Ä´æÆ÷µØÖ·+ÊýÁ¿³¬³ö·¶Î§ { RS485_TX_BUFF[0]=RS485_RX_BUFF[0]; RS485_TX_BUFF[1]=RS485_RX_BUFF[1]|0x80; RS485_TX_BUFF[2]=0x02; //Òì³£Âë UART_PushFrame(RS485_TX_BUFF,3); } }