void Modbus_Handler(void) { uint16_t command = 0; if(*(usRegHoldingBuf + MODBUS_COMMAND) != 0) { command = *(usRegHoldingBuf + MODBUS_COMMAND); *(usRegHoldingBuf + MODBUS_COMMAND) = 0; switch(command) { case 1: SaveEEPROM(); break;//save all case 2: LoadModbus(); break;//load case 3: LoadModbusDefault(); break;//default case 4: SaveModbus4(); break;//save 1 case 5: SaveModbus5(); break;//save 2 case 6: SaveModbus6(); break;//save 3 case 7: EraseEEPROM(); break; case 8: CleanFlash(); break; case 9: // g_uartMode = Command; break; case 10: // g_modbusReg4[modbusDefaultSet] = 0;//reboot break; default: break; } } }
//*----------------------------------------------------------------------------- //* Nazwa funkcji : komunikcja_RSwin //* Interpretacja i wykonanie rozkazów wysy³anych z programu RS-win //*----------------------------------------------------------------------------- void komunikcja_RSwin(char *ptr1, char *ptr2, unsigned int *ptr3) { //Zmienne lokalne ---------------------------------------------------------- unsigned long adres =0;; //----------------Koniec zmiennych lokalnych ------------------------------- //Zmienne tymczasowe ------------------------------------------------------- int tmp =0; //----------------Koniec zmiennych tymczasowych ---------------------------- //Zapis do dowolnego segmentu ---------------------------------------------- if ((ptr1[0]==0xAD)& (ptr1[1]==0x05)) { //Zapis programu zrodlowego adres = ptr1[4]+(ptr1[5]*0x100); if (ptr1[3]==0x70) { unsigned int Save = __get_interrupt_state(); __disable_interrupt(); if (adres==0) { //CleanFlash((int)AT91C_IFLASH_MEM->FlashProgram+FlashProgramOfset,0,sizeof(gProg)); CleanFlash((char*)&AT91C_IFLASH_MEM->FlashProgram+FlashProgramOfset,sizeof(gProg)); } at91flashWrite((int)AT91C_IFLASH_MEM->FlashProgram+FlashProgramOfset,adres,ptr1+7,ptr1[6]); __set_interrupt_state(Save); __enable_interrupt(); //Potwierdzenie ptr2[0]=0xAC; ptr2[1]=0x02; *ptr3=2; ptr2[2]=CheckSum(ptr2, ptr3); /* memory_read=(char*)&gProg+adres; for (char i=0; i<ptr1[6]; i++) { *memory_read=*(ptr1+7+i); memory_read++; } */ //przepisz program z flash do ram char *memory_read_prog; memory_read_prog=(char*)(AT91C_IFLASH_MEM->FlashProgram+FlashProgramOfset); char *SourRam= (char*)&gProg; int tProgramTabSize=ProgramTabSize; for (int k = 0 ; k <= tProgramTabSize ; k++) { SourRam[k]=memory_read_prog[k]; } } if (ptr1[3]==0x10) { char *memory_read; memory_read=(char*)&gProg+adres; for (char i=0; i<ptr1[6]; i++) { *memory_read=*(ptr1+7+i); memory_read++; } //Potwierdzenie ptr2[0]=0xAC; ptr2[1]=0x02; *ptr3=2; ptr2[2]=CheckSum(ptr2, ptr3); } }//-----------Koniec zapisu do dowolnego segmentu -------------------------- //Odczyt z dowolnego segmentu ---------------------------------------------- if ((ptr1[0]==0xAD)& (ptr1[1]==0x03)) { //Odczyt programu zrodlowego if ((ptr1[2]==0x00) & (ptr1[3]==0x10) /*& (ptr1[4]!=0x40)*/) { tmp = 2; ptr2[0] =0xAC; ptr2[1] =0x04; //*ptr3=2; adres = ptr1[4]+(ptr1[5]*0x100); char *memory_read; //memory_read=(char*)(AT91C_IFLASH_MEM->FlashProgram+FlashProgramReserveOfset); memory_read=(char*)&gProg; for (int k = 0 ; k <= (ptr1[6]-1) ; k++) { tmp++; ptr2[2+k] =memory_read[adres+k]; } *ptr3=tmp; ptr2[tmp]=CheckSum(ptr2, ptr3); } //tmp if ((ptr1[2]==0x00) & (ptr1[3]>0x70) & (ptr1[3]<0xC0) /*& (ptr1[4]!=0x40)*/) { tmp = 2; ptr2[0] =0xAC; ptr2[1] =0x04; //*ptr3=2; adres = ptr1[4]+(ptr1[5]*0x100); for (int k = 0 ; k <= (ptr1[6]-1) ; k++) { ptr2[2+k] = pProg[adres+k]; tmp++; } *ptr3=tmp; ptr2[tmp]=CheckSum(ptr2, ptr3); } //kon tmp }//------------------Koniec odczytu z dowolnego segmentu-------------------- //Odczyt z segmentu 0 ------------------------------------------------------ if ((ptr1[0]==0xAC)& (ptr1[1]==0x03) & (ptr1[2]!=0x14) & (ptr1[2]!=0x80) ) { //odczyt zmiennych dwustanwych if ( (ptr1[2]+(ptr1[3]*0x100)>= 0xC000) && (ptr1[2]+(ptr1[3]*0x100)<= 0xC7FF) ) { ptr2[0] =0xAC; ptr2[1] =0x04; tmp = 2; for (int k = 0; k <= ptr1[4]-1; k++) { adres = (ptr1[2]+(ptr1[3]*0x100)-0xC000 +k); ptr2[2+k] = BinVarToMaster(&adres); tmp++; } }//Koniec odczytu zmiennych dwustanowych //Odczyt zmiennych analogowych if ( (ptr1[2]+(ptr1[3]*0x100)>= 0xC800) && (ptr1[2]+(ptr1[3]*0x100)<= 0xDFFF) ) { ptr2[0] =0xAC; ptr2[1] =0x04; tmp = 2; for (int k = 0; k <= ptr1[4]-1; k=k+4) { adres = ((ptr1[2]+(ptr1[3]*0x100)-0xC800)/4) +(k/4); Convers_DW_B.DWvar = AnaVarToMaster(&adres); // zmiana kolejnoœci dla nowego RSWINa /* ptr2[k+2] =Convers_DW_B.Bvar[3]; ptr2[k+3] =Convers_DW_B.Bvar[2]; ptr2[k+4] =Convers_DW_B.Bvar[0]; ptr2[k+5] =Convers_DW_B.Bvar[1]; */ ptr2[k+2] =Convers_DW_B.Bvar[0]; ptr2[k+3] =Convers_DW_B.Bvar[1]; ptr2[k+4] =Convers_DW_B.Bvar[2]; ptr2[k+5] =Convers_DW_B.Bvar[3]; tmp=tmp+4; } }//Koniec odczytu zmiennych analogowych *ptr3=tmp; ptr2[tmp]=CheckSum(ptr2, ptr3); }//-------------------Koniec odczytu z segmentu 0--------------------------- //Zapis do segmentu 0------------------------------------------------------- if ((ptr1[0]==0xAC)& (ptr1[1]==0x05)) { //Zapis zmiennych dwustanowych if ( (ptr1[2]+(ptr1[3]*0x100)>= 0xC000) && (ptr1[2]+(ptr1[3]*0x100)<= 0xC7FF)) { for (int k = 0; k <= ptr1[4]-1; k++) { adres = (ptr1[2]+(ptr1[3]*0x100)-0xC000+k); MasterToBinVar(&adres, &ptr1[5]); //Konwersja z formatu Master i zapis } }//Koniec zapisu zmiennych dwustanowch //Zapis zmiennej analogowej if ( (ptr1[2]+(ptr1[3]*0x100)>= 0xC800) && (ptr1[2]+(ptr1[3]*0x100)<= 0xDFFF)) { for (int k = 0; k <= ptr1[4]-1; k=k+4) { /* // zmiana kolejnoœci dla nowego RSWINa Convers_DW_B.Bvar[3] = ptr1[5+(k)+0]; Convers_DW_B.Bvar[2] = ptr1[5+(k)+1]; Convers_DW_B.Bvar[0] = ptr1[5+(k)+2]; Convers_DW_B.Bvar[1] = ptr1[5+(k)+3]; */ Convers_DW_B.Bvar[0] = ptr1[5+(k)+0]; Convers_DW_B.Bvar[1] = ptr1[5+(k)+1]; Convers_DW_B.Bvar[2] = ptr1[5+(k)+2]; Convers_DW_B.Bvar[3] = ptr1[5+(k)+3]; adres= (((ptr1[2]+(ptr1[3]*0x100)-0xC800))/4)+(k/4); MasterToAnaVar(&adres, &Convers_DW_B.DWvar); } //koniec petli k }//Koniec zapisu zmiennych analogowych //Potwierdzenie ptr2[0]=0xAC; ptr2[1]=0x02; *ptr3=2; //koniec potwoerdzenia ptr2[2]=CheckSum(ptr2, ptr3); //suma kontrolna }//------------------Koniec zapisu do segmentu 0--------------------------- //!!! Standardowe pytania -------------------------------------------------- //Przepisz program uzytkowy z Ram do flash if ( (ptr1[0]==0xAC) && (ptr1[1]==0x06) && (ptr1[2]==0x4E) ) { ptr2[0]=0xAC; ptr2[1]=0x02; *ptr3=2; ptr2[2]=CheckSum(ptr2, ptr3); RamToFlash(); ProgramChangeExecute(&gProg); } //Ustaw pu³apkê if ( (ptr1[0]==0xAA)&& (ptr1[1]==0xAA)&& (ptr1[2]==0x01) ) { Trap.Row=ptr1[3]; Trap.Col=ptr1[4]; Trap.Enable=1; Trap.Activ=0; Trap.Change=1; //Potwierdzenie ptr2[0]=0xAB; ptr2[1]=0xAB; *ptr3=2; ptr2[2]=CheckSum(ptr2, ptr3); //suma kontrolna //koniec potwoerdzenia }//koniec "Ustaw pu³apkê" //Usuñ pu³apki if ( (ptr1[0]==0xAA)&& (ptr1[1]==0xAA)&& (ptr1[2]==0x02) ) { Trap.Enable=0; Trap.Row=0; Trap.Col=0; Trap.Activ=0; //Potwierdzenie ptr2[0]=0xAB; ptr2[1]=0xAB; *ptr3=2; ptr2[2]=CheckSum(ptr2, ptr3); //suma kontrolna //koniec potwoerdzenia }//koniec "Ustaw pu³apkê" //Odczytaj stany "Output" procedur (ptr1[3]-startowy rz¹d procedur, ptr1[4]-ilosc rzedow do odczytu if ( (ptr1[0]==0xAA)&& (ptr1[1]==0xAA)&& (ptr1[2]==0x03) ) { ptr2[0] =0xAC; ptr2[1] =0x04; tmp = 2; for (int Row = ptr1[3] ; Row<ptr1[3]+ptr1[4] ; Row++) { for (int Col = 0 ; Col<MaxPrcInLine ; Col++) { ptr2[tmp++] =gProg.Line[Row].Proc[Col].Out>>8; ptr2[tmp++] =gProg.Line[Row].Proc[Col].Out & 0xFF; } } *ptr3=tmp; ptr2[tmp]=CheckSum(ptr2, ptr3); }//koniec "Ustaw pu³apkê"