Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 22

Thema: IEC-61131 Pointer mit Index auf BOOL Variable

  1. #1
    Registriert seit
    18.03.2006
    Beiträge
    21
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Habe mich in letzter Zeit mal mit der 3S Sofware beschäftigt und bin auf ein für mich noch nicht lösbares Problem gestoßen.
    Ich möchte gerne mit einem Zeiger in einer BYTE oder WORD oder sonstwas Variablen auf die einzelnen Bits dieser Variablen zugreifen und mit einem Indexwert jedes einzelne Bit ansprechen können.
    Ich habe es schon mit einem ARRAY OF BOOL hinbekommen, aber mit ner Normalen BYTE Variablen gehts irgendwie nicht.
    Wollte dann das BYTE in ein ARRAY [0..7] OF BOOL schreiben, das geht aber auch nur total umstaendlich ueber Scheibebefehle usw. (Fehlermeldung war bei normalem move Befehl "Kann BYTE nicht in BOOL konvertieren :("
    Komme normalerweise aus der Siemenswelt und würde das dort mit einem Pointer machen, den ich dann bitweise hochzaehlen würde.
    Hat einer von euch ne Idee wie man so etwas "einfaches" in IEC hinbekommen kann ?
    Zitieren Zitieren IEC-61131 Pointer mit Index auf BOOL Variable  

  2. #2
    Registriert seit
    06.10.2004
    Ort
    Kopenhagen.
    Beiträge
    4.639
    Danke
    377
    Erhielt 803 Danke für 644 Beiträge

    Standard

    Verwendest du ST (Structured Text) ?
    Du hast ein Array von BYTEs oder WORDs und du willst die einzelne bits zugreifen. Was wäre es mit ein zweidimensionalen array ?
    Jesper M. Pedersen

  3. #3
    Avatar von Stussi
    Stussi ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    18.03.2006
    Beiträge
    21
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ich verwende ST oder auch alles andere wenns nur geht.
    Nein ich habe kein Array, das war nur ein Versuch von mir der aber super umständlich ist.
    Ich versuch es mal in AWL-S7 zu zeigen.
    Mein Wunsch war es (Sinn oder Unsinn mal dahingestellt) indirext auf ein einzelnes Bit einer BYTE, WORD oder sonst was Variablen zuzugreifen.

    S7 Bsp.:

    L P##Word //Anfangsadresse des Variablen
    LAR1 //Adressregister geladen

    u b[ar1,P#0.0] //Nulltes Bit
    = Signal

    L 1
    +AR1 //Adressregister in Bit weitergesetzt

    LOOP // danach z.B Schleifen umlauf bis Ende WORD usw.


    Wie kann ich sowas in IEC machen ?? Ohne ein ARRAY zu benutzen?
    Es gibt ja ADR Befehle und auch POINTER sind möglich, doch immer wenn
    ich darin was verändern will, streikt die PLC.
    Zitieren Zitieren ST oder alles andere  

  4. #4
    Registriert seit
    06.10.2004
    Ort
    Kopenhagen.
    Beiträge
    4.639
    Danke
    377
    Erhielt 803 Danke für 644 Beiträge

    Standard

    Dies ist also ein ganz klares job für IEC ST oder S7 SCL.
    Ich habe keine ahnung von indirektes addresierung in IEC IL oder LD.
    Ich kenne und hasse das indirekte addressierung in S7 STL.
    Jesper M. Pedersen

  5. Folgender Benutzer sagt Danke zu JesperMP für den nützlichen Beitrag:

    Stussi (09.08.2007)

  6. #5
    Avatar von Stussi
    Stussi ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    18.03.2006
    Beiträge
    21
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Schade, wollte mal ein bisschen mit diesem IEC spielen, muß dann wohl mal umdenken und anders programmieren. Vielleicht hat ja noch jemand ne Idee ansonsten erst mal danke Jesper. Und nen schönen Gruß nach Kopenhagen.
    Zitieren Zitieren Schade  

  7. #6
    Registriert seit
    06.10.2004
    Ort
    Kopenhagen.
    Beiträge
    4.639
    Danke
    377
    Erhielt 803 Danke für 644 Beiträge

    Standard

    Und nen schönen Gruß nach Kopenhagen.
    Oh danke schön.

    Warum willst du nicht mit IEC ST "spielen" ?
    Bei S7 muss du dafür viel geld bezahlen. Bei CoDeSys kriegst du es umsonst.
    Wenn es um arrays un indirekte addressierung handelt, ist ST (und SCL) 100x mehr produktiv.
    Jesper M. Pedersen

  8. #7
    Avatar von Stussi
    Stussi ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    18.03.2006
    Beiträge
    21
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ich schreib mal in ST was ich schon probiert habe oder wo ich hin will.

    VAR
    Zeiger= POINTER_TO_BOOL; (*Zeiger auf das Byte*)
    Wert = BYTE; (*Byte aus dem gelesen werden soll*)
    Index = INT; (*Indexzeiger fuer Bitadresse*)
    Start = BOOL; (*Startsignal*)
    Ergebniss = BOOL; (*Ergebnissbit*)
    VAR_END

    Zeiger:= ADR(Wert);

    if Start=true
    Then
    for Index:=0 to 7 by 1 do (*Index von 0 bit 7tes Bit durchgehen*)
    Ergebniss:= Zeiger^+Index; (*BOOL Ergebniss aus Zeiger + Index*)
    if Ergebniss = true (*Ergebniss OK dann Ende*)
    Then RETURN
    END_FOR
    END_IF (*usw.*)


    Sowas in der Art hatt ich eigendlich vor, aber das hochsetzten des POINTER und die Derefferenzierung des POINTER funktionieren so nicht.
    Hab langsam keine Idee mehr wie man sowas machen kann.
    Zitieren Zitieren ST ist nicht das Problem  

  9. #8
    Registriert seit
    06.10.2004
    Ort
    Kopenhagen.
    Beiträge
    4.639
    Danke
    377
    Erhielt 803 Danke für 644 Beiträge

    Standard

    Vergiess pointern ! Mit ST und arrays verwendet man indexe.
    Hier ist ein beispiel von ein 2-dimensionalen array:

    Code:
     
    FUNCTION FC10 : INT
    VAR_INPUT
      byteindex : INT ;
      boolindex : INT ;
      testvalue : BOOL ;
    END_VAR
     
    VAR_OUTPUT
      result : BOOL ;
    END_VAR
     
    VAR
      datas : ARRAY[0..100,0..7] OF BOOL ;
    END_VAR ;
     
    result:= (datas[byteindex,boolindex] = testvalue) ;
     
        FC10 := 100;
    END_FUNCTION
    Du siehst wo einfach es ist.
    Das durchschleifen kannst du schnell hinzufügen.
    "datas" kann auch ein extern definiertes block von variablen sein.
    Jesper M. Pedersen

  10. Folgender Benutzer sagt Danke zu JesperMP für den nützlichen Beitrag:

    Stussi (09.08.2007)

  11. #9
    Avatar von Stussi
    Stussi ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    18.03.2006
    Beiträge
    21
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hm,

    ok dann werde ich das mit den Array's mal versuchen, vielen Dank noch mal.
    Will aber irgendwann noch mal rausfinden, was man mit den Pointer sonst noch so machen kann.
    Wenn einer noch ne Idee hat bitte melden.
    Bis die Tage mal.
    Zitieren Zitieren Na dann eben doch mit Array's  

  12. #10
    Registriert seit
    07.03.2004
    Beiträge
    4.369
    Danke
    946
    Erhielt 1.158 Danke für 831 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Nun ja also in ST kann man auch viel machen.

    Also nicht flexibel da eine Konstante wäre z.B. myByte.0 := TRUE; würde das niederwertigste Bit in der Variable myByte auf True setzen (in der Hilfe Bit-Adressierung).

    Ich habe mal Funktionen gebaut um auf Einzelne Bits in (I,Q,M) Bytes zuzugreifen. Hier mal das Beispiel für Lesen von Input Bits:

    myBool := get_IX(iByte:=ByteNummer, iBit:=BitNummer);
    Code:
    FUNCTION get_IX : BOOL
    VAR_INPUT
        iByte        :INT;
        iBit        :INT;
    END_VAR
    VAR
        pStart    :POINTER TO BYTE ;
        pOffset   :POINTER TO BYTE ;
        pLese     :POINTER TO BYTE ;
        myByte    :BYTE ;
        forCount  :INT;
    END_VAR
    
    pStart := ADR(%IB0);
    pOffset:= 0;
    FOR forCount:=0 TO iByte - 1 DO
        pOffset:= pOffset +1;
    END_FOR;
    pStart := pStart + pOffset;
    pLese  := pStart;
    myByte := pLese^;
    myByte := SHR(myByte,iBit);
    get_IX := myByte.0;
    Hier für Ausgangs Bits:
    set_QX(iByte:=ByteNummer, iBit:=BitNummer, bValue:=BoolWert);
    Code:
    FUNCTION set_QX : BOOL
    VAR_INPUT
        iByte        :INT;
        iBit        :INT;
        bValue  :BOOL;
    END_VAR
    VAR
        pStart    :POINTER TO BYTE ;
        pOffset   :POINTER TO BYTE ;
        pLese     :POINTER TO BYTE ;
        myByte    :BYTE ;
        forCount  :INT;
    END_VAR
    
    pStart := ADR(%QB0);
    pOffset:= 0;
    FOR forCount:=0 TO iByte - 1 DO
        pOffset:= pOffset +1;
    END_FOR;
    pStart := pStart + pOffset;
    pLese  := pStart;
    myByte := 0;
    
    IF (bValue = TRUE) THEN
        myByte.0 := bValue;
        myByte := SHL(myByte,iBit);
        pLese^ := pLese^ OR myByte;
    ELSE
        myByte.0 := NOT bValue;
        myByte := SHL(myByte,iBit);
        myByte := NOT myByte;
        pLese^ := pLese^ AND myByte;
    END_IF
    If you open your Mind too much, your Brain will fall out.

Ähnliche Themen

  1. Abfrage Bool und Integer via FC mit Pointer
    Von Waelder im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 24.03.2011, 16:28
  2. C-Script aus Index in Variable schreiben
    Von WendeMarkus im Forum HMI
    Antworten: 0
    Letzter Beitrag: 23.08.2010, 05:34
  3. Bool-Variable zählen Wie ???
    Von Golf2 im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 23.09.2008, 15:18
  4. Bool-Variable setzen/rücksetzen
    Von Supervisor im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 18.07.2006, 12:29
  5. Antworten: 27
    Letzter Beitrag: 17.07.2006, 22:20

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •