logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Mega168][AVRGCC] Synchronizacja zmiennych.

__Maciek__ 18 Kwi 2009 14:20 1284 4
  • #1 6428869
    __Maciek__
    Poziom 20  
    Witam.
    Mam oto taki problem. Robię sterownik wykorzystujący protokół modbus ( konkretnie tą implementację protokołu ).
    Czy może ktoś ma pomysł jak połączyć zmienne stosowane dotychczas w sterowniku z tablicą rejestrów protokołu modbus ??

    A teraz troszkę kodu aby wyjaśnić o co mi chodzi. :
    
    
    // definicja struktury dla sterowników PID.
    
    typedef struct
    {
    
       unsigned int 	Ts;			// stała czasowa regulatora
       float				Kp;			// wzmocnienie członu proporcjonalnego 
       float				Ki;			// wzmocnienie członu całkującego
       float				Kd; 			// wzmocnienie członu różniczkującego
    
       int 				y_max;		// max wartość sterująca
       int 				y_min;		// minimalna wartość sterująca
    
       int				y;  			// wartość sterująca
    
       int 				Tz;			// wartość temperatury zadanej
       int				Ta;			// wartość temperatury aktualnej
    
    	int				Y_speed		// szybkosc narstania wartosci na wyjsciu.
    
    } PidState;
    
    // deklaracja zmiennej 
    
    PidState AusPID;
    
    // definicje rejestrów protokołu modbus ( zgodnie z przykładami ze strony źródłowej. )
    
    #define REG_HOLDING_START 4000
    #define REG_HOLDING_NREGS 30
    
    static USHORT   usRegHoldingStart = REG_HOLDING_START ;
    static USHORT 	 usRegHoldingBuf[REG_HOLDING_NREGS];
    
    
    


    I właśnie chciałbym ( wg mnie najwygodniej by było ) aby poszczególne rejestry odpowiadały np. poszczególnym polom w strukturze. np:

    usRegHoldingBuf[3] = AusPID.Ts

    A jeszcze lepiej gdyby obie zmienne zajmowały ten sam obszar pamięci, ale nie koniecznie.
    Problemy pojawiają się gdy zachodzi potrzeba zapisywania i odczytywani poszczególnych zmiennych.

    Jak zdeklarować taką zależność ?
  • Pomocny post
    #2 6429704
    poczitamagoczi
    Poziom 14  
    Ja w podobnym projekcie zadeklarowałem sobie tablice wskaźników w pamięci programu. Dla zmniejszenia rozmiaru pamięci wskaźniki były typu void.
    I podczas odczytu zmiennych : np funkcjią 0x03
    pisze sobie pętle która ma być wywoływana od adresu początku przesłanego w ramce(offset) do adresu końcowego obliczonego przez dodanie ofsetu i segmentu - oto część mojego kodu:
    EndAdress = OffsetAdress + SegmentAdress;
    j =0;
    for (i = OffsetAdress; i < EndAdress; i++)
    {
    int *pomocniczy;
    pomocniczy = pgm_read_word(&tabelaRW[i]);
    HiLevel  = (*pomocniczy >> 8);
    LoLevel  = *pomocniczy;
    AnswerBuffer[3+(j*2)] = HiLevel;
    AnswerBuffer[4+(j*2)] = LoLevel;
    }
    W przypadku struktury można pokombinować podobnie a nawet bardziej efektywnie zapisując tylko adres początku i odczytywane zmienne były by kolejnym i pozycjami w strukturze :).
  • #3 6429916
    __Maciek__
    Poziom 20  
    Zadając pytanie myślałem raczej o metodzie wskazania kompilatorowi, że zmienne np: a i b to jedna i ta sama zmienna, niezależnie którą nazwę napotyka .

    Po przemyśleniu ... faktycznie ... to może być ta droga.
    Wymaga co prawda przepisania procedur obsługi odczytu i zapisu rejestrów, ale umożliwia zdefiniowanie tablicy przypisania ( przydatne gdy nie wszystkie rekordy ze struktury mają być widoczne jako rejestry. )

    W sumie dzięki !!
  • #5 6431306
    __Maciek__
    Poziom 20  
    Union dzieli obszar pamięci pomiędzy 2 zmienne. Myślałem nad tym. ( w przypadku gdy nie wykorzystuję ciągłego obszaru pamięci - ( nie wszystkie pola struktury chcę mapować na rejestry modbus ) - pojawia się problem. )

    Co więcej rozwiązanie podane przez kolegę wyżej umożliwia swobodną manipulację numerami rejestrów, co również jest cenne.

    Tymczasowo jako że już skończyłem wstępną wersję do testów wykorzystałem procedury synchronizacyjne przepisujące odpowiednie zmienne. Nie jest to eleganckie, ale funkcjonuje.

    Później przerobię sobie procedury odczytu i zapisu rejestrów tak aby wykorzystać wskaźniki przechowywane w pamięci Flash.
REKLAMA