variablenadressierung

2005-08-24
2005-08-29
  • michaonline - 2005-08-24

    hallo,

    ich hab folgendes problem. bei dem als anlage angefügte programm eines Function_Blocks möchte ich die erste adresse (%MX0.0) gern über eine "Input_VAR" vergeben. bei den restlichen adressen soll automatisch die Bitstelle um 1 erhöht werden? ist sowas möglich? ich hab leider nich allzuviel programmiererfahrung in der sps-programmierung

    danke schonmal

    micha

    IMG: adresse.jpg

     
  • Oberchefe - 2005-08-25

    soll der erste Eingang immer nur Bit 0 sein (also nur die Wortnummer variabel)? Weiviele Bits fortlaufend sollen es insgesamt sein?

     
  • michaonline - 2005-08-25

    hallo,

    der erste eingang beginnt immer bei bit 0 (allerdings erhöht sich das Byte der eingäng um 2) d.h. erste adresse im ersten funktionsblock beginnt wie in der abbildung bei 0.0 und geht immer bis 0.4. die adresse des zweiten funktionsblocks soll bei 2.0 beginnen usw. bei den ausgängen ists analog. im ersten FB hab die ausgänge die adresse 1.0 bis 1.7 der zweite FB hätte dann ab 3.0 bis 3.7

    hilfts weiter?

    micha

     
  • Oberchefe - 2005-08-25
    VAR
       StartAdresseMerker: POINTER TO DWORD;
       GewuenschteWortnummer: DINT;
       Temp:DWORD;
       B: BOOL;
       N: BYTE;
    END_VAR
    (* Setzt das N. Bit von Temp auf B *)
    StartAdresseMerker:= ADR(%MD0) + GewuenschteWortnummer*2;      (*Adresse des ganzen Wortes ermitteln*)
    Temp:=StartAdresseMerker^;                                 (*Einlesen des aktuellen Zustands des Ausgangswortes*)
    IF B=TRUE THEN                                             (*Setzen des Bits*)
       Temp:=(Temp OR SHL(1,N));
    ELSE
       Temp:=(Temp AND ROL(4294967294,N));
    END_IF;
    StartAdresseMerker^:=Temp;                                 (*Zurückschreiben des ganzen Wortes*)
    

    B ist der Zustand des gewünschten Ausgangs, N die Bitnummer, GewuenschteWortnummer die Wortnummer

    Vielleicht geht's auch einfacher, keine Ahnung. Die Logik mit SHL und ROL kann bei fixen Bitnummern natürlich einfacher ausfallen.

     
  • michaonline - 2005-08-25

    hallo oberchefe,

    vielen dank erstmal für deine mühe. sieht ja ganz schön wild aus

    ich hab das porgramm jetz in meinen Function_Block reinkopiert. Allerdings hab ich die Variable "GewuenschteWortnummer" als Var_Input deklariert, weil ich diese Variable ja "außen" an den FunctionBlock schreiben will. (siehe Abbildung 2)

    Wenn ich nun auf "Alles Ãœbersetzen" Klicke kommt ne Fehlermeldung "Var, VAR_INPUT, VAR_OUTPUT" oder VAR_IN_OUT erwartet markiert wird die erste zeile nach "End VAR"

    Ne frage hab ich auch noch, wie ich nun die "errechneten Adressen" in den Kontaktplan des Function Blockes einbinde also die erste adresse nehm ich mal an steht in "StartAdresseMerker" wo stehn aber die anderen adressen, wo die Bitstelle um 1 erhöht wurde ich hoffe du kannst mir helfen

    IMG: functionblock.jpg

    IMG: programm.jpg

     
  • Oberchefe - 2005-08-27

    Alles ab Zeile 17(in Deinem Screenshot) gehört ins Programm rein, nicht in den Deklarationsteil. Mein Beispiel ist allerdings in ST geschrieben, nicht in KOP. Am einfachsten wird es sein wenn Du Deiner Funktion nicht nur das Wort mit gibst sondern auch die einzelnen Bits als BOOL. Anbei ein Screenshot von dieser Funktion (als FB).

    IMG: 3s_Ausgänge.gif

     
  • Oberchefe - 2005-08-27

    und so rufst Du diesen FB auf (z.B. in KOP):

    IMG: 3s_KOP.gif

     
  • michaonline - 2005-08-29

    hallo,

    vielen dank für deine antwort. ich werds gleich mal ausprobieren.

    micha

     

Log in to post a comment.