Step 7 Bits auslesen eines Peripherie -Eingang

Stephan25

Level-1
Beiträge
147
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich würde gerne einzelne Bit eines Statuswortes von einem Antrieb auswerten.
Das Statuswort hat die Peripherie Adresse 256, also sprich PEW 256.
Die Auswertung der einzelnen Bits würde ich gerne in einem FB realisieren weil wir insgesamt 21 gleiche Antriebe in der Maschine verbauen werden.

Wenn ich jetzt mit Hilfe einer Variablentabelle die einzelnen Bits des PEW ansehe und diese mit der Anzeige der Bits der Parametriersoftware vergleiche passt alles. Die Darstellungsart der Variablentabelle habe ich auf Binär gestellt. Ich wollte jetzt eigentlich so vorgehen, dass ich die entsprechende PEW Adresse mit einer WAND_W Wortverknüpfung und dann entsprechend für Bit 0 z.B. mit W#16#0 vergleiche. Das Ergebnis der Verknüpfung lege ich in einer Temporären Variable des Typ Word im FB ab. Anschließend wandle ich die Temp-Variable des Typ Word in eine Int-Variable ebenfalls im FB. Zum Schluss vergleiche ich jetzt noch die Int-Variable auf größer oder kleiner Null, ist diese Bedingung erfüllt wird der entsprechende Ausgang des FB gesetzt. Ich war mir eigentlich sicher das dies so funktionieren sollte, jetzt weiß ich es aber besser
icon9.png
. Jetzt werden mir nämlich die falschen Statusmeldungen angezeigt wenn ich diese mit den Bits in der Parametriersoftware vergleiche. Ich habe auch schon ein Merker-Wort angelegt und die Statusmeldungen dort hinein verschoben um die einzelnen Bits des MW mit den Bits der Parametriersoftware zu vergleichen uns sehe da genau der gleiche Fehler das mir hier andere Bits angezeigt werden wie in der Parametriersoftware!?

Meine Frage an euch ist jetzt, kann mir evtl. einer sagen woran dies liegt und wie ich das Problem angehen soll/muss?
Ich wäre euch sehr dankbar wenn mir hier weitergeholfen werden könnte.
 
Höchstwahrscheinlich ist das ein Problem der Byte-Reihenfolge.

Siemens S7 hat eine andere Byte-Reihenfolge als die meisten anderen Systeme, zu denen wahrscheinlich auch deine Parametriersoftware gehört.
Wenn deine Parametriersoftware z.B. von Bit 0 in einem Wort spricht, liegt das in der S7 Logik dann auf Bit 8.
Entweder du tauschst Hi- und Lo-Byte des eingelesenen PEWs, oder prüfst direkt auf das Bit im anderen Byte.
 
in dem Statuswort sind ja sämtliche Rückmeldungen des Servoverstärkers zu finden wie z.B. Referenzposition gesetzt.
Damit ich nicht für alle Antriebe die Auswertung der einzelnen Bits des Statuswort programmieren muss, möchte ich gern einen FB programmieren wo ich dann einfach die entsprechende PEW Adresse ändere am Eingang. Der FB soll dann sämtliche Meldungen des Servoverstärkers ausgeben.
 
In SCL mache ich sowas gerne mit einer AT-Sicht.
Prinzip:
Code:
VAR_INPUT
  EW_Statuswort : WORD;
END_VAR

VAR_OUTPUT
  Meldung0_0 : BOOL;
  Meldung0_1 : BOOL;
usw.
END_VAR

VAR_TEMP
  Statuswort : STRUCT
    Meldung0_0 : BOOL;
    Meldung0_1 : BOOL;
    Meldung0_2 : BOOL;
    Meldung0_3 : BOOL;
    Meldung0_4 : BOOL;
    Meldung0_5 : BOOL;
    Meldung0_6 : BOOL;
    Meldung0_7 : BOOL;

    Meldung1_0 : BOOL;
    Meldung1_1 : BOOL;
    Meldung1_2 : BOOL;
    Meldung1_3 : BOOL;
    Meldung1_4 : BOOL;
    Meldung1_5 : BOOL;
    Meldung1_6 : BOOL;
    Meldung1_7 : BOOL;
  END_STRUCT;
  atStatuswort AT Statuswort : WORD;
END_VAR

atStatusword := EW_Statuswort;
Meldung0_0 := Statuswort.Meldung0_0;
Meldung0_1 := Statuswort.Meldung0_1;
usw.

Wenn du nun die Bytes drehen willst, tauschst du die Reihenfolge der 8 Bits eines Bytes in der Statuswort-Struct.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Da musst ggf. mal nach Intel und Motorola Format schauen.

Step 7 nutzt das Motorola Format „Big Endian“ (im Prinzip Darstellung der Uhrzeit Stunde:Minute:Sekunde, also groß nach klein)
Aufbau [1000][1001][1002][1003]

Beim Intel Format „Little Endian“ (im Prinzip Darstellung des Datums Tag.Monat.Jahr, also klein nach groß)
Aufbau [1003][1002][1001][1000]

Hier stellt das S7 aber Befehle im AWL zur Verfügung um das entsprechend zu drehen!
Stichwort TAD und TAW


L DB119.DBD8
TAD
T "MD_Programm_Nummer"

Umkehr der Reihenfolge der Bytes in AKKU1.

Aus LL, LH, HL, HH
wird HH, HL, LH, LL


Um auf einzelne Bit's von einer Peripherie Adresse zu zugreifen, lädt man z.B das PEW und schreibt es in ein Merker-, Daten-, oder Lokalwort und kann dann auf das/die nötigen Bit's direkt zugreifen! Wenn Du es eh im FB auswerten tust, hast ja bestimmt eine STAT Variable wo Du zwischenspeicherst!

L PEW xxx
T DB_Hilf.DBW1

U DB_Hilf.DBXx.y
= M_FU_OK

...
 
Der AWL Befehl zum Tauschen von High-und Lowbyte eines Wortes heisst TAW

Wenn Du also
Code:
L PEW256
TAW
T MW 0
programierst, kannst du in M0.0 das Bit 0 des Steuerwortes auslesen.
 
Ich wollte jetzt eigentlich so vorgehen, dass ich die entsprechende PEW Adresse mit einer WAND_W Wortverknüpfung und dann entsprechend für Bit 0 z.B. mit W#16#0 vergleiche. Das Ergebnis der Verknüpfung lege ich in einer Temporären Variable des Typ Word im FB ab. Anschließend wandle ich die Temp-Variable des Typ Word in eine Int-Variable ebenfalls im FB. Zum Schluss vergleiche ich jetzt noch die Int-Variable auf größer oder kleiner Null, ist diese Bedingung erfüllt wird der entsprechende Ausgang des FB gesetzt.
Man braucht nicht das Ergebnis der Wortverknüpfung umständlich auf <>0 vergleichen, WAND_W liefert schon diese Information, die kann sofort nach dem WAND_W mit "<>0" abgefragt werden.
(btw: Dein W#16#0 ist nur ein Tippfehler?)

Noch einfacher: Wie bei Thomas in SCL kann man auch in AWL das Eingangswort auf eine Bits-Struktur in TEMP kopieren und dann direkt auf die einzelnen Bits zugreifen, ohne noch Bytes tauschen zu müssen.
AWL: Word in TEMP-Struktur kopieren und auf Bits zugreifen
Übrigens: In FUP/KOP kann man einzelne Netzwerke in AWL erstellen, also z.B. das Word-Kopier-Netzwerk vom Beispiel in AWL übernehmen und danach die Bits in FUP/KOP auswerten.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für eure Antworten.

@PN/DP. Wenn ich deinen AWL Code wo du den Link in deine Antwort eingefügt hast richtig verstehe, dann liest du das Word mit InWord ein. Legst 16 Bit im Temp Bereich ein. Danach kopierst du das InWord mit dem Befehl LAR1 in den Temp Bereich (hier bin ich mir jetzt nicht sicher ob hier dann das ganze Wort in den Temp Bereich kopiert wird oder das Low oder High). Danach liest du dann noch die einzelnen Bits aus. Hier hätte ich auch noch eine Frage und zwar, könnte jetzt z.B. deine Variabel MyBit auch eine Out-Variable sein, wie z.B. Sollpos. erreicht? Sollte dies alles so funktionieren wie ich mir dies denke, dann wäre das genau die Anwendung bzw. Code welchen ich benötige.

Wünsche euch allen frohe Ostern
 
Danach kopierst du das InWord mit dem Befehl LAR1 in den Temp Bereich (hier bin ich mir jetzt nicht sicher ob hier dann das ganze Wort in den Temp Bereich kopiert wird oder das Low oder High)

Genau er kopiert hier die Input Variable auf die Temp Struktur und zwar das komplette Word.

Code:
LAR1  P##tempWord ;  
L     #InWord ;  
T     [COLOR=#ff0000][B]W[/B][/COLOR] [AR1,P#0.0]

Hier hätte ich auch noch eine Frage und zwar, könnte jetzt z.B. deine
Variabel MyBit auch eine Out-Variable sein, wie z.B. Sollpos. erreicht?

Klar das kann auch eine OUT Variable sein. Du weisst ja hier dann quasi den Status deines Bits aus der Temp Struktur einer OUT Variablen zu.

Grüße Pico
 
@PN/DP. Wenn ich deinen AWL Code wo du den Link in deine Antwort eingefügt hast richtig verstehe, dann liest du das Word mit InWord ein. Legst 16 Bit im Temp Bereich ein. Danach kopierst du das InWord mit dem Befehl LAR1 in den Temp Bereich
Das ist korrekt so, bis auf das rot markierte.
Das "LAR1 P##tempWord" lädt die Anfangsadresse der Bits-Struktur "tempWord" in das Adressregister AR1, danach wird das InWord mit "T W [AR1,P#0.0]" dorthin kopiert, wohin AR1 zeigt - also in die Bits-Struktur. Der Weg über die indirekte Adressierung mit AR1 ist dafür, damit der Programmcode funktioniert, egal auf welcher absoluten L-Adresse die Struktur in TEMP liegt.

Danach liest du dann noch die einzelnen Bits aus. Hier hätte ich auch noch eine Frage und zwar, könnte jetzt z.B. deine Variabel MyBit auch eine Out-Variable sein, wie z.B. Sollpos. erreicht? Sollte dies alles so funktionieren wie ich mir dies denke, dann wäre das genau die Anwendung bzw. Code welchen ich benötige.
Genau, MyBit ist DeinBit ;) das kann auch eine Out-Variable sein:
Code:
      U     #tempWord.Bit15
      =     #Out_Sollpos_erreicht
      U     #tempWord.Bit14
      =     #Out_Drive_is_running
...

Harald
 
Zurück
Oben