Step 7 Bitmaske anlegen

Techm3ch

Level-2
Beiträge
65
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Tag,

es gibt für ein Produkt meiner Firma ein Register mit 16 Bits (0-15). Je nachdem welche Zahl ausgegeben wird z.B. 18203, muss man in eine Tabelle schauen oder mit einem Taschenrechner die gesetzten Bits ermitteln, für 18203 wäre das: 0100 0111 0001 1011 und dann hat man z.B. den Status einer Anlage. Mir ist das zu aufwändig und ich würde gerne über TIA Portal (da die Anlage auch über TIA Portal angesteuert wird) eine direkte Auflösung bereitstellen. Am besten soll man also direkt den Text angezeigt bekommen ohne in der Tabelle nachsehen zu müssen.

Ich steh voll auf dem Schlauch und finde irgendwie keinen Anfang, ich programmiere über FUP auf einer S7-1500 mit 15.1 , habe auch schon SCL probiert aber da hab ich ja garkeine Ahnung von. Kann mir irgendjemand bitte freundlicherweise einen groben Plan geben? Geht das überhaupt über FUP? Ich scheitere grad an der Bitweisen Auswertung da ich mit dem Slice Zugriff keine AND verknüpfung an einem WORD hinkriege...

Vllt hat ja einer von euch ne tolle Idee :)
besten dank und grüße,
Nate
 
Moin Techm3ch,

wie wird der Fehlercode denn angezeigt? Das war vielleicht früher die günstigste/beste Möglichkeit um viele Fehler auszuwerten.

Was hast Du aktuelle für Möglichkeiten?
Panel?

Vielleicht im Panel eine Textliste anlegen und einfach den Zahlenwert mit dieser Textliste verknüpfen?

VG
MFreiberger
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn du ein WORD bitweise auswerten möchtest, fallen mir spontan drei gute Möglichkeiten ein.

1. Slice-Zugriff
2. AT-Überlagerung
3. SCATTER-Befehl.

Mit den zweiten beiden kannst du dir ein Array of Bit erzeugen und das dann auswerten.

Was genau ist dein Problem mit dem Slice und der UND-Verknüpfung?
 
Moin Techm3ch,

wie wird der Fehlercode denn angezeigt? Das war vielleicht früher die günstigste/beste Möglichkeit um viele Fehler auszuwerten.

Was hast Du aktuelle für Möglichkeiten?
Panel?

Vielleicht im Panel eine Textliste anlegen und einfach den Zahlenwert mit dieser Textliste verknüpfen?

VG
MFreiberger
Hallo MFreiberger,

bei der AND Verknüpfung "Der Datentyp Word des Aktualparameters passt nicht zu dem Datentyp Bool des Formalparameters" ich verstehe das Problem aber weiss nicht wie ich das richtig machen sollte.

Ja das ganze ist noch von früher, einiges hat sich weiterentwickelt aber diese Liste nicht.

Tatsächlich habe ich momentan nur die SPS und das TIA Portal, ich könnte etwas simulieren da hier auch WinCC advanced installiert ist aber das wäre eine weitere Baustelle...

Grüße,
Nate

 
Wenn du ein WORD bitweise auswerten möchtest, fallen mir spontan drei gute Möglichkeiten ein.

1. Slice-Zugriff
2. AT-Überlagerung
3. SCATTER-Befehl.

Mit den zweiten beiden kannst du dir ein Array of Bit erzeugen und das dann auswerten.

Was genau ist dein Problem mit dem Slice und der UND-Verknüpfung
mein problem ist das ich nur boolche variablen verknüpfen kann mir das aber grad nichts bringt da mein word ein hex ist, vermutlich fehlt mir aber irgendein zwischenschritt. ich könnte vllt alle 16 bits einzeln auswerten und irgendwie dann zusammentragen.
 
Steht denn jedes einzelne Bit für einen separaten Fehler (16 mögliche Fehler) oder der Wert der 16bit-Zahl (65536 mögliche Fehler)?

mein problem ist das ich nur boolche variablen verknüpfen kann
Warum?

mir das aber grad nichts bringt da mein word ein hex ist,
Bitte nicht vermischen. Ein Word ist erstmal nur eine 16Bit-Variable. Hex ist eine Darstellungsart.

vermutlich fehlt mir aber irgendein zwischenschritt. ich könnte vllt alle 16 bits einzeln auswerten und irgendwie dann zusammentragen.
Zusammengetragen (in dem Word) sind sie ja schon...


ok damit müsste ich eine maske erzeugen können und mir die benötigten werte rausfiltern können um sie anschließend auszuwerten
Das ist EINE Möglichkeit. In Beitrag #3 hat @Januar ja schon die anderen Möglichkeiten aufgezählt.
Ich persönlich finde den SLICE-Zugriff am elegantesten, da Du dabei das Bit ja schon "in der Hand" hast und direkt damit arbeiten kannst (auch in FUP).
 
Steht denn jedes einzelne Bit für einen separaten Fehler (16 mögliche Fehler) oder der Wert der 16bit-Zahl (65536 mögliche Fehler)?
für 16 verschiedene, aber es können mehrere gleichzeitig aktiv sein

Warum?
gute frage, ich hab es nicht hinbekommen und dann recherchiert, das ganze dann so verstanden das es nicht geht

Bitte nicht vermischen. Ein Word ist erstmal nur eine 16Bit-Variable. Hex ist eine Darstellungsart. Verstehe, der stellt das bei mir in Hex dar, verwirrend, also müsste ich das umstellen können.


Zusammengetragen (in dem Word) sind sie ja schon...
ich meine das ich jeden einzelnen fehler der möglichen 16 überprüfe und am ende eine auswertung gebe welche alle aktuell gegeben sind


Das ist EINE Möglichkeit. In Beitrag #3 hat @Januar ja schon die anderen Möglichkeiten aufgezählt.
Ich persönlich finde den SLICE-Zugriff am elegantesten, da Du dabei das Bit ja schon "in der Hand" hast und direkt damit arbeiten kannst (auch in FUP).
den slice zugriff finde ich bis jetzt auch am besten, hoffentlich kriege ich das hin.

mich hat @Gleichstromer auf die Idee gebracht 16 x AND WORD Verknüpfung zu verwenden um die anderen bits weg zu maskieren, scheint mir die unkomplizierteste lösung zu sein, vllt geht das aber auch direkt über den SLICE
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn in einer 16 Bit Variable mehr als ein Bit = 1 sein kann, dann ist eine Textliste eher ungünstig, weil die müsste dann bis zu 65536 Einträge haben.

Abfrage eines Bit in einem Word geht prinzipell mit "Wordverknüpfung" mit einer Bitmaske:
Bit := (Word AND Bitmaske) <> 0;
Bit ist ein Bool, Bitmaske ist ein Wert, in dem nur 1 Bit = 1 ist, z.B. 16#0001, 16#0002, 16#0004 ... 16#4000, 16#8000
Das geht auch in FUP/KOP

Manche CPU haben dafür als Vereinfachung auch die Slice-Zugriffe Word.%x...
 
Warum nicht im HMI einfach eine Statusseite der Anlage mit allen 16 möglichen Fehlern, daneben je eine LED, die über die Bits des Wortes animiert werden? Kann man auch als Dialog machen, wenn man auf einen Übersichtsfehler klickt, der eben auf "Fehlerwort <>0" angezeigt wird.
 
Wenn in einer 16 Bit Variable mehr als ein Bit = 1 sein kann, dann ist eine Textliste eher ungünstig, weil die müsste dann bis zu 65536 Einträge haben.

Abfrage eines Bit in einem Word geht prinzipell mit "Wordverknüpfung" mit einer Bitmaske:
Bit := (Word AND Bitmaske) <> 0;
Bit ist ein Bool, Bitmaske ist ein Wert, in dem nur 1 Bit = 1 ist, z.B. 16#0001, 16#0002, 16#0004 ... 16#4000, 16#8000
Das geht auch in FUP/KOP

Manche CPU haben dafür als Vereinfachung auch die Slice-Zugriffe Word.%x...
1712656318876.pngdas ganze sieht so aus. die anlage gibt: 0100 0111 0001 1011 aus also ist AutomaticModeAllowed, Prod, Autoparm, AutoFill, FillOn, GraviOn, ControlOn und JobActive aktiv. daran kann man dann den Status der Anlage erkennen. sind nur 16 Einträge und diemit schwarzer schrift kann man auch verändern
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Warum nicht im HMI einfach eine Statusseite der Anlage mit allen 16 möglichen Fehlern, daneben je eine LED, die über die Bits des Wortes animiert werden? Kann man auch als Dialog machen, wenn man auf einen Übersichtsfehler klickt, der eben auf "Fehlerwort <>0" angezeigt wird.
weil mir keiner eine HMI kaufen will, das ganze läuft momentan versuchsweise. ich könnte es zwar visualisieren aber dann kann das niemand wirklich benutzen ausser mir.
 
Hallo Techm3ch,

ich verstehe das Problem nicht, Integerwert bzw. Bitmuster ist doch nur eine Darstellungsform.

Willst du sowas haben?
1712657958709.png
Das geht wohl bei deiner Steuerung am einfachsten mit so einem Slice-Zugriff.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dann weise den Wert der Bits an einzelne Bool-Variablen zu, etwa so:
Slice SCL
Code:
Locked := Statusword.%X13;
...
JobActive := Statusword.%X0;

oder Wordverknüpfung SCL
Code:
Locked := (Statusword AND 16#2000) <> 0;
...
JobActive := (Statusword AND 16#0001) <> 0;

oder Wordverknüpfung KOP
Code:
            +--------+       
            |  AND   |            #TempWord     Locked
           -|EN   ENO|--------------| <> |-------( )
Statusword--|IN1     |                0
   16#2000--|IN2  OUT|-#TempWord
            +--------+

oder Slice KOP
Code:
Statusword.%X13   Locked
------| |----------( )
...
 
Die Bits im DB anlegen mit den entsprechenden Kommentaren und das Wort draufkopieren?

Hallo Techm3ch,

ich verstehe das Problem nicht, Integerwert bzw. Bitmuster ist doch nur eine Darstellungsform.

Willst du sowas haben?
Anhang anzeigen 77036
Das geht wohl bei deiner Steuerung am einfachsten mit so einem Slice-Zugriff.

Dann weise den Wert der Bits an einzelne Bool-Variablen zu, etwa so:
Slice SCL
Code:
Locked := Statusword.%X13;
...
JobActive := Statusword.%X0;

oder Wordverknüpfung SCL
Code:
Locked := (Statusword AND 16#2000) <> 0;
...
JobActive := (Statusword AND 16#0001) <> 0;

oder Wordverknüpfung KOP
Code:
            +--------+      
            |  AND   |            #TempWord     Locked
           -|EN   ENO|--------------| <> |-------( )
Statusword--|IN1     |                0
   16#2000--|IN2  OUT|-#TempWord
            +--------+

oder Slice KOP
Code:
Statusword.%X13   Locked
------| |----------( )
...

Hinweis: Slice Zugriffe sollte man nicht auf Integer-Variablen anwenden. Bei IEC nicht erlaubt.
Vielen dank, ich hab da jetzt ne menge material mit dem ich mir etwas schönes zumsammenbasteln werde
 
Zurück
Oben