-> Hier kostenlos registrieren
ne eigentlich ganz simple aufgabe, die mich gerade überfordert:
der Zustand eines Maschinenablaufs/einer Arbeitsstation einer Maschine o.ä. kann wahlweise als Integer oder in einer Folge von Bits gespeichert werden.
dabei ist jedem Bit fest eine Zustandsnummer zugeordnet.
also als integer
oder als Bits
ich will nun ein programm schreiben, was variante 2 in variante 1 überführt.
es soll auch möglich sein, dass eine gewisse anzahl bits/zustände gleichzeitig aktiv sind
wenn also 5 zustandsbits gleichzeitig aktiv sind, will ich deren zugeordneten zustand in 5 Ints abspeichern
mir fällt zu dieser simplen Aufgabe gerade nix besseres ein, als
umständlich und verbrät vermutlich zuviel Rechenzeit durch die Loopschleife mit unzähligen Durchläufen
hat vielleicht jemand ne elegantere idee?
der Zustand eines Maschinenablaufs/einer Arbeitsstation einer Maschine o.ä. kann wahlweise als Integer oder in einer Folge von Bits gespeichert werden.
dabei ist jedem Bit fest eine Zustandsnummer zugeordnet.
also als integer
Code:
Zst INT 5
oder als Bits
Code:
Zst1 Bool FALSE
Zst2 Bool FALSE
Zst3 Bool FALSE
Zst4 Bool FALSE
Zst5 Bool TRUE
ich will nun ein programm schreiben, was variante 2 in variante 1 überführt.
es soll auch möglich sein, dass eine gewisse anzahl bits/zustände gleichzeitig aktiv sind
wenn also 5 zustandsbits gleichzeitig aktiv sind, will ich deren zugeordneten zustand in 5 Ints abspeichern
mir fällt zu dieser simplen Aufgabe gerade nix besseres ein, als
Code:
//IN nach TEMP
L #QuellDB //IN-Var... DB-Nummer Quelle
T #QDB //TEMP-Var... DB-Nummer Quelle
L #ZielDB //IN-Var... DB-Nummer Ziel
T #ZDB //TEMP-Var... DB-Nummer Ziel
// --- initialisieren ---
//Pointer erstellen
L #QuellAnfang //Byteposition erstes Bit
SLD 3
L #HoechsterZustand //Anzahl Bits
+D //Pointer auf die Zustandsbits zeigt an
T #Bitpointer //dieser Stelle noch auf das letzte Bit
//Zaehler/Merker initialisieren
L 0
T #GefundeneZst
// --- Pruefschleife ---
//geht Bit fuer Bit durch. sollte eins der Bits true sein, steht im Schleifenzaehler die Nummer des Zustands
L #HoechsterZustand //Anzahl Bits
nw1b: T #Schleifenzaehler
AUF DB [#QDB]
LAR1 #Bitpointer
SET
U [AR1,P#0.0]
SPBN nw1c
//wenn das Bit, auf das Bitpointer gerade zeigt, gesetzt ist
//Zielposition im Ziel-DB laden
AUF DB [#ZDB]
L #GefundeneZst //Anzahl gefundener Zustaende
SLD //*2 um 2 Bytes bzw 1 Int weiterzuspringen
L #ZielAnfang //IN-Var... Byteposition des ersten Zst-Ints im Ziel-DB
+D //im akku 1 steht die Byte-Nummer des Ints, in das der Zustand gespeichert wird
SLD 3
LAR1
//gefundenen Zustand abspeichern
L #Schleifenzaehler
T W [AR1,P#0.0]
//Zaehler erhoehen
L #GefundeneZst
+ 1
T #GefundeneZst
//Abbruchbedingung: speicherplatz fuer Zustandsnummern ist voll
L #GefundeneZst
L #AnzahlInteger //IN-Var... Vorgabe der maximal gleichzeitig gesetzten Zst bzw die Anzahl Speicherplaetze
==I
BEB
nw1c: L #Bitpointer //Pointer auf die Zustandsbits um 1 verringern
+ -1
T #Bitpointer
L #Schleifenzaehler
LOOP nw1b
umständlich und verbrät vermutlich zuviel Rechenzeit durch die Loopschleife mit unzähligen Durchläufen
hat vielleicht jemand ne elegantere idee?