Step 7 Bit aus einem BYTE auslesen

mega_ohm

Level-2
Beiträge
695
Reaktionspunkte
52
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Forum,
ich habe ein MerkerBYTE (MB ), wo 8 Geräte ein "Störung"- Bit hinterlegen.

7 6 5 4 3 2 1 0
BYTE 1 1 1 1 1 1 1 1
| | | | | | | |
Gerät 8 / | | | | | | |
Gerät 7 ----/ | | | | | |
Gerät 6 --------/ | | | | |
Gerät 5 -----------/ | | | |
Gerät 4 --------------/ | | |
Gerät 3 ------------------/ | |
Gerät 2 ---------------------/ |
Gerät 1 -------------------------/

Ich möchte eine Zahl (1- 8 ) für das Gerät eingeben und prüfen, ob dieses Gerät eine Störung meldet (entsprechendes Bit= 1 [Störung ] oder =0 [Ok ] )

Wie kann ich das am Besten ( ohne z.B. SPL ) bewerkstelligen ?

Viele Grüße
mega_ohm
 
Ich möchte eine Zahl (1- 8 ) für das Gerät eingeben und prüfen, ob dieses Gerät eine Störung meldet (entsprechendes Bit= 1 [Störung ] oder =0 [Ok ] )
1. Schritt: benutze nicht die Zahlen 1..8 sondern 0..7 (also ggfs 1 subtrahieren)
2. Schritt: nimm die Zahl 1 und schiebe sie um 0..7 BitPositionen nach links (alternativ: multipliziere sie 0..7-mal mit 2)
3. Schritt: verknüpfe das MB mit der erhaltenen Zahl per UND
4. Schritt: prüfe, ob das Ergebnis <>0 (sprich, ob es TRUE) ist.

Sinngemäss:
Fehler := (MB AND SHL(1, BitNr - 1)) <> 0
 
Zuletzt bearbeitet:
Ich nehme an, dass du das Ganze in einem Baustein machst - hier könntest du eine AT-Sicht auf deine Variable legen - z.B. als Array[1..8] of BOOL
 
Oder man nimmt einfach das Merkerbit her,

FEHLER_GERRAET1 := M100.0;...
... oder die MerkerBits, also etwas ausführlicher geschrieben:
Code:
CASE BitNr OF
1 : Fehler := MBx.0 ;
2 : Fehler := MBx.1 ;
3 : Fehler := MBx.2 ;
4 : Fehler := MBx.3 ;
5 : Fehler := MBx.4 ;
6 : Fehler := MBx.5 ;
7 : Fehler := MBx.6 ;
8 : Fehler := MBx.7 ;
END_CASE ;
?
Aber: CASE ist Käse, weil ...
Wie kann ich das am Besten ( ohne z.B. SPL ) bewerkstelligen ?
... und meines Wissens ist SPL in AWL halbwegs bis ziemlich genau das, was in anderen Sprachen CASE ist.

... in einem Baustein ... könntest du eine AT-Sicht auf deine Variable legen - z.B. als Array[1..8] of BOOL
AT wäre mir
a) zu CPU-abhängig und
b) zu ungewiss, ob nicht ein Array[1..8] of BOOL als ein Array[1..8] of BOOL-Variablen interpretiert wird, die je 1 Byte belegen.
Alle Wege führen nach ROM, aber einige davon sind (mir) nicht allgemeingültig genug auf allen Systemen verfügbar, leider.
AT finde ich sehr schön, um 1 Variable unter verschiedenen DatenTypen ansprechen zu können, z.B. wahlweise als REAL und als DWORD, um sicher zu sein, dass ein gewolltes TypeCast nicht als irgendein unnützes/unerwartetes/schädliches TypeConvert ausgeführt wird.
Aber damit 1 Variable auf 8 Variablen umzusetzen bzw. umgekehrt?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
früher war das so geregelt:

Code:
#ERR1 := (#ErrByte AND 1) = 1;
#ERR2 := (#ErrByte AND 2) = 2;
#ERR3 := (#ErrByte AND 4) = 4;
#ERR4 := (#ErrByte AND 8) = 8;
#ERR5 := (#ErrByte AND 16) = 16;
#ERR6 := (#ErrByte AND 32) = 32;
#ERR7 := (#ErrByte AND 64) = 64;
#ERR8 := (#ErrByte AND 128) = 128;
 
früher war das so geregelt:

Code:
#ERR1 := (#ErrByte AND 1) = 1;
#ERR2 := (#ErrByte AND 2) = 2;
#ERR3 := (#ErrByte AND 4) = 4;
#ERR4 := (#ErrByte AND 8) = 8;
#ERR5 := (#ErrByte AND 16) = 16;
#ERR6 := (#ErrByte AND 32) = 32;
#ERR7 := (#ErrByte AND 64) = 64;
#ERR8 := (#ErrByte AND 128) = 128;
Das kenne ich auch noch, Dagobert.
Du wirst es nicht glauben, genauso (oder so ähnlich ;o) war auch mein erster Entwurf, aber
Code:
Fehler := MB AND SHL(1, BitNr - 1) = SHL(1, BitNr - 1) ;
oder
Code:
BitMuster := SHL(1, BitNr - 1) ;
Fehler := MB AND BitMuster = BitMuster ;
wäre dann doch umfangreicher als
Code:
Fehler := (MB AND SHL(1, BitNr - 1)) <> 0 ;
geworden.
In Deinem Vorschlag fehlt übrigens noch das BitNrn-abhängige "Umleiten" von einem der 8 Bits auf das ErgebnisBit.
 
Zuletzt bearbeitet:
AT wäre mir
a) zu CPU-abhängig und
b) zu ungewiss, ob nicht ein Array[1..8] of BOOL als ein Array[1..8] of BOOL-Variablen interpretiert wird, die je 1 Byte belegen.
AT ist nicht CPU-abhängig - was meinst du denn auf welcher CPU es nicht funktionieren würde ? (OK ... auf einer S5 würde es nicht gehen ...)
Und Ja : man kann damit ein Byte als Bool-Array darstellen ... UND ... umgekehrt ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
früher war das so geregelt:

Code:
#ERR1 := (#ErrByte AND 1) = 1;
#ERR2 := (#ErrByte AND 2) = 2;
#ERR3 := (#ErrByte AND 4) = 4;
#ERR4 := (#ErrByte AND 8) = 8;
#ERR5 := (#ErrByte AND 16) = 16;
#ERR6 := (#ErrByte AND 32) = 32;
#ERR7 := (#ErrByte AND 64) = 64;
#ERR8 := (#ErrByte AND 128) = 128;
Besser mit weniger Chancen auf Tippfehler (und erzeugt vermutlich effizienteren Code):
Code:
#ERR1 := (#ErrByte AND 1) <> 0;
#ERR2 := (#ErrByte AND 2) <> 0;
#ERR3 := (#ErrByte AND 4) <> 0;
#ERR4 := (#ErrByte AND 8) <> 0;
#ERR5 := (#ErrByte AND 16) <> 0;
#ERR6 := (#ErrByte AND 32) <> 0;
#ERR7 := (#ErrByte AND 64) <> 0;
#ERR8 := (#ErrByte AND 128) <> 0;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
AT ist nicht CPU-abhängig - was meinst du denn auf welcher CPU es nicht funktionieren würde ?
Die Frage muss ich leider zurückgeben ... ich kenne mich damit nicht im Detail aus ... aber ich meine hier im Forum schon öfter gelesen zu haben, dass es 'AT' bei dieser oder jener CPU nicht gibt. Ob's nun die 300er oder 400er oder 1200er war, habe ich mir nicht gemerkt (wozu auch?).
Ich glaube mich aber zu erinnern, dass die 1500er das 'AT' kennt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Definiere bitte "das Ergebnisbit".
Hier hat der TE doch gesagt, wie er sich die Abfrage vorstellt:
Ich möchte eine Zahl (1- 8 ) für das Gerät eingeben und prüfen, ob dieses Gerät eine Störung meldet (entsprechendes Bit= 1 [Störung ] oder =0 [Ok ] )
Er gibt eine Zahl 1..8 vor und erhält als Antwort, ob das entsprechende Bit TRUE ist.
Ein Multiplexer von 8 auf 1 ist also gefragt. Nicht etwa eine SammelMeldung, ob irgendeins der 8 Bits TRUE ist. Und auch nicht 8 einzelne BOOLs (#ERR1..#ERR8), die für jede der 8 Meldungen separat abgefragt werden müssten.
Nein, eine Definition ist das nicht, aber vielleicht hast Du trotzdem verstanden, was ich mit "ErgebnisBit" gemeint hatte?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hier hat der TE doch gesagt, wie er sich die Abfrage vorstellt:

Er gibt eine Zahl 1..8 vor und erhält als Antwort, ob das entsprechende Bit TRUE ist.
Ein Multiplexer von 8 auf 1 ist also gefragt. Nicht etwa eine SammelMeldung, ob irgendeins der 8 Bits TRUE ist. Und auch nicht 8 einzelne BOOLs (#ERR1..#ERR8), die für jede der 8 Meldungen separat abgefragt werden müssten.
Nein, eine Definition ist das nicht, aber vielleicht hast Du trotzdem verstanden, was ich mit "ErgebnisBit" gemeint hatte?
Wo will er die Zahl denn vorgeben und warum überhaupt?
Ich vermute, das wird wieder so ne verwinkelte von hinten durch die Brust ins Auge Aktion, die man auch auf normale Weise lösen würde können... z.B. 8 Bitmeldungen im HMI anzulegen.
Wofür soll der Code sein? SPS oder Panel?

Fragen über Fragen...
 
Wo will er die Zahl denn vorgeben
Weiss nicht. Ich hatte mir vorgestellt, als AufrufParameter eines FC.
und warum überhaupt?
Warum nicht? StörMeldungen sind doch etwas Feines.
Ich vermute, das wird wieder so ne verwinkelte von hinten durch die Brust ins Auge Aktion, die man auch auf normale Weise lösen würde können... z.B. 8 Bitmeldungen im HMI anzulegen.
Ich neige ja auch dazu, zunächst mal die Aufgabenstellung in Frage zu stellen und zu sagen "ist doch alles Mist und so oder so wäre es doch viel schöner" *). Aber in letzter Zeit habe ich öfter mal die Aufgabenstellung (sofern überhaupt eine erkennbar war ;o), respektiert und versucht, nicht unnötig davon abzuschweifen.
Was war an den bisher vorgestellten Lösungswegen auf nicht "normale Weise" gelöst? Geht es hier wieder um das leidige Thema Schieben und Maskieren? Ich kann darin und daran nichts Exotisches entdecken. Das ist doch SPS-isches Urgestein. ;)
Wenn wir glauben, hierfür immer wieder neue Schreibweisen erfinden zu müssen, dann geht doch wichtiges GrundlagenWissen einfach verloren.
Die SPS-Programmierung hat schon so viele Zugeständnisse an die sogenannte HochSprachenProgrammierung gemacht ... da muss doch auch ab und zu mal ein Zugeständnis in umgekehrter Richtung möglich und zu rechtfertigen sein.
Wofür soll der Code sein? SPS oder Panel?

Fragen über Fragen...
Diese Fragen möchte ich nicht wiederholen, denn normalerweise sollte es genügen, wenn einer sie stellt. ;)

*) Ich gebe auch gerne zu, früher habe ich oft die Anfragen von Kollegen mit der Gegenfrage "wofür brauchst Du das denn?" beantwortet.
Und oft war mein Verdacht, dass da vor dem falschen Loch gebellt wurde, durchaus berechtigt.
 
Zuletzt bearbeitet:
Hallo Forum,
erst einmal vielen Dank für die zahlreichen Antworten.

Ich hatte jetzt zum 1. Mal Zylinder - sowohl pneumatisch wie auch hydraulisch - mit integriertem Meßsytem in der Hand (ja, die gibt es schon lange, nur eben noch nicht bei uns ).
Da es an Anlagen meistens mehr wie einen Zylinder gibt, hatte ich mir eben mal einen FC gebastelt. Diesem FC übergebe ich die Gerätenummer, min. Stellung(falls die nicht 0 sein sollte ), max. Fahrweg, Typ des Meßsystems (0 .. 10V, 0 .. 20mA, 4 .. 20mA ), aktuellen Wert (PEW ). Im FC wird skaliert und als Rückgabe u.a. zwei Fehler-Bits ausgegeben (MinWert unterschritten bzw. Drahtbruch bei Strommessung ) bzw. MaxWert überschritten, falls der MaxWert nicht der absoluten Endlage entspricht.

Der SPL- Befehl ist nicht verboten, aber das konnte ich alleine lösen ( ähnlich dem, wie es PN/DP vorgeschlagen hatte ). Eine "coolere" Lösung fiel mir aber nicht ein. Deshalb habe ich mal die Spezialisten gefragt.
Heinileini's Idee
Fehler := (MB AND SHL(1, BitNr - 1)) <> 0
werde ich mal versuchen, für mich zu "übersetzen".

PS.: Es geht nur um eine Übung zu Hause am PC mit einer Simu- Software, um keine reale Maschine/ Anlage. Mir geht es darum, im Stoff zu bleiben, weil ich SPS (ob s5, s7, TIA ) mit einer Sprache vergleiche - man muss es ständig benutzen, sonst verlernt man es.

Mfg mega_ohm
 
Zurück
Oben