Esempio n. 1
0
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;
		}
	
	}
	
}
Esempio n. 2
0
//*-----------------------------------------------------------------------------
//* 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ê"