Step 7 unterschiedliche Werte in einem Datenbaustein durchtakten

Markus15

Level-1
Beiträge
6
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen

ich bin an ein Problem gestoßen und komme mit meinem begrenzten Wissen nicht mehr weiter.
Folgende Aufgabenstellung:

in einen Datenbaustein werden über Bits Störungsnummern 1-16 eingetragen (z.B. 1= regen 2= wind).
soweit auch einfach -> wenn Bit 1 dann Lade 1
wenn Bit 2 dann Lade 2 usw.

wenn nun aber Bit1 und Bit2 gleichzeitig anstehen sehe ich nur die 2 im DB.
Nun würde ich gerne aber im Wechsel von z.B. 2 Sekunden den Wert 1 und dann den Wert 2 dann den Wert 1 etc. sehen.

Hoffe ihr versteht mich.

Über sie suche konnte ich leider nichts passendes finden

Gegeben ist eine cpu319 mit Step7
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Erarbeite dir Wissen! Wenn du schon 16 Bits hast....was sind das in der Boolschen Algebra?
Mann sollte schon wissen wie ein WORD oder DWORD aufgebaut ist und wie ich die einzelnen Bits darin herauslese oder schreibe...
Dir das alles hier zu erklären wäre jetzt bei Adam und Eva anfangen ;)
 
Das schreiben in den DB ist nicht das Problem.
Bit_Störung1 = Wert 1
Bit_Störung2 = Wert 2
etc.

An dem DB hängt eine Anzeige an der Störmeldungen dem jeweiligen Wert hinterlegt sind.
Wert 1 = z.B. Regen
Wert 2 = z.B. Wind


Stehen nun Bit 1 und 2 an wird ja nur der letzte Wert (also 2) geladen und somit angezeigt. Ich hätte aber gerne im Wechsel Wert 1 und 2 im DB stehen.
 
Was du mit Laden meinst, bzw. auch mit Wechsel 1 und 2 im DB.

Zeig mal den Code, wie du die Störmeldungen aktuell weiter verarbeitest und wo diese dann angezeigt werden sollen.
 
Was du mit Laden meinst, bzw. auch mit Wechsel 1 und 2 im DB.

Zeig mal den Code, wie du die Störmeldungen aktuell weiter verarbeitest und wo diese dann angezeigt werden sollen.
Ist ein übergeordnetes System zur Datenerfassung und Speicherung (Tebis) danach wird es weiter nach Grafana geleitet und soll als Text dargestellt werden. Klingt komisch ist aber so gewollt und kann ich nicht beeinflussen
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zeig doch mal konkret den Code, denn du verwendest um die Störmeldungen weiter zu verarbeiten.

Mal die nächste Frage? Was soll eigentlich passieren, wenn 4,5, ... 16 ... 200 Störungen gleichzeitig anstehen?
 
Das schreiben in den DB ist nicht das Problem.
Bit_Störung1 = Wert 1
Bit_Störung2 = Wert 2
etc.

An dem DB hängt eine Anzeige an der Störmeldungen dem jeweiligen Wert hinterlegt sind.
Wert 1 = z.B. Regen
Wert 2 = z.B. Wind


Stehen nun Bit 1 und 2 an wird ja nur der letzte Wert (also 2) geladen und somit angezeigt. Ich hätte aber gerne im Wechsel Wert 1 und 2 im DB stehen.

Wenn ich dich richtig verstehe, dann schreibst du bei Bit_Störung1 den Wert "1" als Ziffer in ein Word (o.ä.) und bei Bit_Störung2 den Wert "2" als Ziffer auf genau die selbe Adresse? Dann steht da nur noch die "2" drin, da die "1" ja überschrieben wurde.
Entweder du musst unterschiedliche Adressbereiche für deine "1", "2", etc nehmen oder du musst in dem Word die einzelnen Bits beschreiben und diese dann zur Auswertung adressieren. Dann steht da aber nicht "1" oder "2" in deinem Word, sondern im Fall von beiden anstehenden Störungen "3"... Damit kannst du aber wenig anfangen, da du dann nicht einfach weißt, ob Störung 1+2 anstehen oder Störung 3

Edit:
"Nun würde ich gerne aber im Wechsel von z.B. 2 Sekunden den Wert 1 und dann den Wert 2 dann den Wert 1 etc. sehen."
Gerade erst gesehen... wie gesagt, wenn das nur eine Adresse ist, kannst du das so nicht sehen. Dann musst du dir etwas bauen, was abwechselnd die Werte reinlädt
 
Ist ein übergeordnetes System zur Datenerfassung und Speicherung (Tebis) danach wird es weiter nach Grafana geleitet und soll als Text dargestellt werden. Klingt komisch ist aber so gewollt und kann ich nicht beeinflussen
Also Änderungen an der Schnittstelle werden nicht akzeptiert?

Und wie schon UDP gefragt hat, wie soll das Ganze aussehen, wenn mal zufällig eine menge Störungen anstehen?
Bei 16 Störungen braucht es dann schon mal eine gute halbe Minute bis alles übertragen ist....
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also Änderungen an der Schnittstelle werden nicht akzeptiert?

Und wie schon UDP gefragt hat, wie soll das Ganze aussehen, wenn mal zufällig eine menge Störungen anstehen?
Bei 16 Störungen braucht es dann schon mal eine gute halbe Minute bis alles übertragen ist....
Die halbe Minute würde mich gar nicht stören, da das systembedingt dann wohl so gewollt ist. Ich würde mich eher fragen, was ist mit kurz anstehenden Störungen, die innerhalb der halben Minute wieder weg gehen? Diese werden dann ja nicht erfasst oder visualisiert
 
Nun würde ich gerne aber im Wechsel von z.B. 2 Sekunden den Wert 1 und dann den Wert 2 dann den Wert 1 etc. sehen.
Hier im Forum gab es 2019 genau diese Aufgabenstellung:
Aufgabe (1)
Von einem 16-Bit-Word sollen im Abstand von 1 Sekunde zyklisch nacheinander die Nummern der gesetzten Bits (1-Bits) als Zahlen 1..16 ausgegeben werden, oder 0 wenn kein Bit gesetzt ist. Die Bit-Nummern sollen 1 (LSB) bis 16 (MSB) sein.

Beispiel:
16#6182 = 2#01100001_10000010 --> 2 8 9 14 15 2 8 9 ... soll ausgegeben werden

Während der Ausgabe kann sich der Inhalt/Wert des Word ändern, 1-Bits kommen dazu oder gehen.

Erstelle einen FB oder FC mit dem Störungsword als Eingang und dem Anzeigewert (INT oder BYTE) als Ausgang. Der Ausgabetakt (alle 1 Sekunde 1 Zyklus lang TRUE) liegt schon vor und kann dem Baustein als Eingang mitgegeben werden oder der Baustein wird nur im Takt aufgerufen.
Meine Lösung der Aufgabe (1)
in AWL (Codegröße 84 Byte)
Code:
FUNCTION "FC_ENCO_NEXT" : INT
TITLE =Nummer des nächsten 1-Bits (1..16) oder 0 ausgeben
VAR_INPUT
  IN_Word : WORD ;
END_VAR
VAR_IN_OUT
  lastBit : WORD ;
END_VAR

//nächstes 1-Bit ermitteln, dazu bereits ausgegebene niedrigere Bits ausblenden
      L     #IN_Word
      L     #lastBit            //zuletzt ausgegebenes Bit (Maske mit nur einem 1-Bit)
      NEGI                      //Bitmaske bis Bit 15 erweitern
      SLW   1                   //Maske höher schieben für zuletzt ausgegebenes Bit ausblenden
      UW                        //tiefere Bits ausmaskieren
      SPN   MLBO                //#IN_Word enthält höhere 1-Bits als #lastBit
//wenn da 0 rauskam, wieder alle Bits zulassen ("maskieren" volle Maske)
      POP                       //#IN_Word zurück in AKKU1
//niedrigstes 1-Bit isolieren (LeastBitOnly)
MLBO: PUSH 
      NEGI 
      UW                        //LeastBitOnly := (IN & -IN)
      SPZ   MBNO                //kein 1-Bit enthalten? --> 0 ausgeben
      T     #lastBit            //für nächste Ausgabe merken
//Nummer niedrigstes 1-Bit ausgeben
      DTR  
      SRD   23                  //REAL-Exponent holen
      +     -126                //Bias 127 abziehen, + 1 für Result 1..16
MBNO: T     #RET_VAL            //Ausgabe: 1..16, oder 0 bei Sprung
Den FC_ENCO_NEXT im Wechselrhytmus aufrufen (also z.B. alle 2 Sekunden).
Hinweis: Falls ein Bit kürzer als ein Ausgabeumlauf gesetzt ist, dann kann es passieren, daß dessen Nummer nicht ausgegeben wird. Falls das nicht passieren darf, dann müssen die Bits "gesammelt" werden (im Bitfeld gesetzt werden) und dürfen frühestens beim übernächsten Ausgabeumlauf wieder gehen (rückgesetzt werden).

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Aktuelle ist eine zweizeilige LED-Anzeige installiert, die wenn mehrere Störungen auflaufen im 2 Sek. Takt die Störungen anzeigt.
Diese Anzeige reagierte auf die Bit und machte die Umschaltung automatisch. Nun soll mittels Grafana an einem 55 Zoll die Störungen angezeigt werden. Hierzu muss ich, bei mehreren Störungen im Wechsel die Störungsnummer ausgeben.
Änderungen an der Schnittstelle sind leider nicht möglich.

Aktuell sind neun Störungen hinterlegt ich würde aber gerne dies auf 16 Meldungen vorbereiten

Die Zuweisung ist im moment noch recht einfach mit MOVE-Bausteinen gemacht.
 

Anhänge

  • Unbenannt.png
    Unbenannt.png
    19,7 KB · Aufrufe: 17
Hier im Forum gab es 2019 genau diese Aufgabenstellung:


Den FC_ENCO_NEXT im Wechselrhytmus aufrufen (also z.B. alle 2 Sekunden).
Hinweis: Falls ein Bit kürzer als ein Ausgabeumlauf gesetzt ist, dann kann es passieren, daß dessen Nummer nicht ausgegeben wird. Falls das nicht passieren darf, dann müssen die Bits "gesammelt" werden (im Bitfeld gesetzt werden) und dürfen frühestens beim übernächsten Ausgabeumlauf wieder gehen (rückgesetzt werden).

Harald

Hier werden aber die einzelnen Bits eines Wortes ausgewertet, nicht die Ziffer, die in dem Word steht.
Für letzteres muss er in der Steuerung das Laden handeln. Z.B. einen Zähler von 1-16 aller 2 sek. zählen lassen und diesen dann mit BIT_Störungx verknüpfen und damit dann den jeweiligen Wert eintragen
 
Diese Anzeige reagierte auf die Bit und machte die Umschaltung automatisch.
Du schreibst es ja selber schon...
Da darfst du in NW1 nicht die "1" in DB102.DBW130 moven, sondern musst das Bit DB102.DBX130.0 mittels "=" setzen


EDIT:
Andersrum... das mit dem Bit willst du ja weg programmieren....
Also brauchst du "Für letzteres muss er in der Steuerung das Laden handeln. Z.B. einen Zähler von 1-16 aller 2 sek. zählen lassen und diesen dann mit BIT_Störungx verknüpfen und damit dann den jeweiligen Wert eintragen"
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hier werden aber die einzelnen Bits eines Wortes ausgewertet, nicht die Ziffer, die in dem Word steht.
Es soll ja auch nicht eine Nummer/Zahl/Ziffer ausgewertet werden, die in einem Word steht. Sondern von bis zu 16 Bits (die idealerweise in einem Word vorliegen) sollen nacheinander dessen Nummern (1..16) in ein anderes Word eingetragen werden. Genau das macht der FC_ENCO_NEXT. Er sucht aufsteigend die Bits in dem Word ab, ob sie 1 sind, und von der nächsten gefundenen 1 wird deren Nummer ausgegeben. Dabei ist egal ob zwischen den 1-Bits Lücken sind oder nicht oder ob gar kein Bit gesetzt ist. Die Besonderheit meines FC_ENCO_NEXT ist, daß er effizient ohne Schleifen und ohne Test jedes einzelnen Bits direkt das zum vorherigen Aufruf nächsthöhere gesetzte Bit ermittelt.

Harald
 
Es soll ja auch nicht eine Nummer/Zahl/Ziffer ausgewertet werden, die in einem Word steht. Sondern von bis zu 16 Bits (die idealerweise in einem Word vorliegen) sollen nacheinander dessen Nummern (1..16) in ein anderes Word eingetragen werden. Genau das macht der FC_ENCO_NEXT. Er sucht aufsteigend die Bits in dem Word ab, ob sie 1 sind, und von der nächsten gefundenen 1 wird deren Nummer ausgegeben. Dabei ist egal ob zwischen den 1-Bits Lücken sind oder nicht oder ob gar kein Bit gesetzt ist. Die Besonderheit meines FC_ENCO_NEXT ist, daß er effizient ohne Schleifen und ohne Test jedes einzelnen Bits direkt das zum vorherigen Aufruf nächsthöhere gesetzte Bit ermittelt.

Harald

Sollte keine Kritik an deinem Baustein sein, aber er schreibt ja:
Bestand: "Aktuelle [...] zweizeilige LED-Anzeige [...] reagierte auf die Bit und machte die Umschaltung automatisch."
Neu: "Nun soll mittels Grafana [...] Hierzu muss ich, bei mehreren Störungen im Wechsel die Störungsnummer ausgeben."

Edit:
Ich sollte erst 3x lesen.... o_O
Da sollte der Baustein ja passen, aber ohne ihm zu Nahe treten zu wollen, denke ich, dass der Inhalt des FC_Enco_Next für ihn nicht verständlich sein wird
 
Neu: "Nun soll mittels Grafana [...] Hierzu muss ich, bei mehreren Störungen im Wechsel die Störungsnummer ausgeben."
Und die Störungsnummern will es nacheinander präsentiert bekommen.

ohne ihm zu Nahe treten zu wollen, denke ich, dass der Inhalt des FC_Enco_Next für ihn nicht verständlich sein wird
Das ist halt ein fertiger Baustein. Einbinden, beschalten, aufrufen, Ergebnis nehmen, funktioniert. :D Wie die Bausteine der Libs zu TIA, z.B. die LGF

In dem Thread zu der Aufgabe
sind auch Schleifen-Lösungen in SCL (z.B. in Beitrag #6 und #8) und etwas Diskussion zur Lösungsfindung/Optimierung.

Harald
 
Zurück
Oben