Hallo Leute,
der letzte Programmierwettbwerb ist schon wieder lange her... Heute habe ich mal zwei Aufgaben.
Der Preis einer kleinen Maschine ist schon sehr knapp kalkuliert und nun soll noch eine detaillierte Störungsausgabe erfolgen (nicht nur einfaches Blinken einer Störungsleuchte). An der Anzeigestelle herrschen sehr nasse Umgebungsbedingungen, daher soll da kein HMI-Panel verbaut werden. Da kommt die Idee, eine einfache Digital/Zahlenanzeige einzusetzen. Es gibt 16 verschiedene Störungs-Alarme (Bitmeldungen), die als Bits in einem Word liegen.
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.
Wie schon erwähnt: an der Anzeigestelle ist es sehr nass - das überlebt auch die einfache Digitalanzeige leider nicht lange.
Aufgabe (2)
Nun sollen die Bitnummern zyklisch als Blinkcode mit einer Störungsleuchte (LED) ausgegeben werden.
Code:
Nr Code Pulsfolge | Nr Code Pulsfolge | Nr Code Pulsfolge
--------------------+--------------------------+--------------------------
1 = 1 = 1 kurz | 6 = L1 = 1 lang 1 kurz | 11 = LL1 = 2 lang 1 kurz
2 = 2 = 2 kurz | 7 = L2 = 1 lang 2 kurz | 12 = LL2 = 2 lang 2 kurz
3 = 3 = 3 kurz | 8 = L3 = 1 lang 3 kurz | 13 = LL3 = 2 lang 3 kurz
4 = 4 = 4 kurz | 9 = L4 = 1 lang 4 kurz | 14 = LL4 = 2 lang 4 kurz
5 = 5 = 5 kurz | 10 = L5 = 1 lang 5 kurz | 15 = LL5 = 2 lang 5 kurz
16 = Dauerblinken 1 Hz, die anderen Codes nicht ausgeben
Die Störung 16 (MSB des Word) ist speziell, die soll ein Dauerblinken mit 1 Hz bewirken solange das Bit gesetzt ist.
Zur Erkennung, wann ein neuer Blinkcode anfängt, soll eine Pause von ca. 2 Sekunden sein.
Basistakt: 2 Hz (250 ms Ein + 250 ms Aus)
lang: 750 ms Ein + 250 ms Aus
kurz: 250 ms Ein + 250 ms Aus
Zwischenpause: >= 2 s Aus
Beispiel für Ausgabe der Blinkcodes L2 + LL3:
Code:
2Hz |*|_|*|_|*|_|*|_|*|_|*|_|*|_|*|_|*|_|*|_|*|_|*|_|*|_|*|_|*|_|*|..
OUT |*****|_|*|_|*|_________|*****|_|*****|_|*|_|*|_|*|_________|*...
Die Takte 1 Hz und 2 Hz liegen aus dem Taktmerkerbyte der CPU global vor und dürfen bei Bedarf direkt angesprochen werden:
M3.5 = 1 Hz, M3.3 = 2 Hz (Puls-Pausen-Verhältnis: 1:1) Achtung: die Bits im Taktmerkerbyte ändern sich asynchron zum OB1.
Viel Spaß bei der Lösungsfindung!
Harald