BIT nach BYTE in SCL

Tigerente1974

Level-3
Beiträge
1.826
Reaktionspunkte
293
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe folgende Aufgabenstellung:

Zu jedem Palettenplatz (100 Plätze) gibt es mehrere Binärinformationen. Z.B. die Belegung.
Für die VISU (macht jemand anderes) muss ich die Binärinformationen in ein Byte eintragen.
Byteaufbau: Bit0 = Belegung, Bit1 = Fehler, ...
Ich möchte das in SCL lösen, indem ich in einer Schleife die Binärinformationen abfrage und auf das Byte übertrage.
Folgender Code funktioniert, sieht aber nicht so elegant aus.
Gibt es da einen schöneren Weg?

Code:
FOR ii := 1 TO 100 DO
    "VISU".Info[ii] := B#16#00; // Infobyte initialisieren

// Belegungsbit abfragen
    IF "Platzdaten".NR[ii].Belegung THEN
        tmp := B#16#01;
    ELSE
        tmp := B#16#00;
    END_IF;
    "VISU".Info[ii] := "VISU".Info[ii] OR tmp;

// Fehlerbit abfragen
    IF "Platzdaten".NR[ii].Fehler THEN
        tmp := B#16#02;
    ELSE
        tmp := B#16#00;
    END_IF;
    "VISU".Info[ii] := "VISU".Info[ii] OR tmp;
END_FOR;
 
Hallo,
ja ... du könntest eine AT-Sicht erstellen, die das Array_of_Bool als Array_of_struct mit gleichem Aufbau darstellt.
Nun könntest du dann mit den Elementen der AT-Sicht arbeiten.

Weißt du, was ich meine ?

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
*
    FOR ii := 1 TO 100 DO
        "VISU".Info[ii] := B#16#00; // Infobyte initialisieren
    
    // Belegungsbit abfragen
        IF "Platzdaten".NR[ii].Belegung THEN
            "VISU".Info[ii] := INT_TO_BYTE(BYTE_TO_INT("VISU".Info[ii]) + 1);
        END_IF;
        
    // Fehlerbit abfragen
        IF "Platzdaten".NR[ii].Fehler THEN
            "VISU".Info[ii] := INT_TO_BYTE(BYTE_TO_INT("VISU".Info[ii]) + 2);
        END_IF;
        
    // Anderesbit abfragen
        IF "Platzdaten".NR[ii].AnderesBit THEN
            "VISU".Info[ii] := INT_TO_BYTE(BYTE_TO_INT("VISU".Info[ii]) + 4);
        END_IF;
    
    END_FOR;
 
Ich fürchte nicht...

Die AT-Sicht wollte ich zuerst auch nehmen, aber irgendwie fehlte mir dann die Idee wie ich das bewerkstelligen kann. Außerdem habe ich damit noch nicht gearbeitet.
 
Hallo 4L.

Deine Lösung gefällt mir auf jeden Fall schon besser als meine :rolleyes:
Hätte man ja selbst drauf kommen können...

Trotzdem würde ich auch gerne mal die Lösung mit der AT-Sicht probieren. Für weitere Tips dazu bin ich dankbar.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das geht in etwa so :
Code:
myArray : Array [1..100] of Byte ;
atArray AT myArray : Array [1..100] of struct
   Belegung : bool ;
   Fehler : bool ;
   anderes_Bit : bool ;
end_struct ;
Nun kannst du die Elemente mit z.B. "atArray[ii].Belegung := true" ansprechen ...

Gruß
Larry
 
Das wäre aber doch der Weg andersherum, oder nicht?

Es wird eine AT-Sicht auf das BYTE gelegt um die Bits auszulesen. Ich möchte ja die Bits auf das BYTE schreiben. Ich nehme diesen Ansatz aber trotzdem auf und versuche das mal so zuschreiben, wie ich es brauche.
 
Die AT-Sicht ist keine Einbahnstrasse - sie ist einfach eine andere Sicht- und/oder Darstellungsweise einer Variablen oder einer Variablen-Struktur - das heißt die Aktuialisierung geht in beide Richtungen, da ich ja immer noch die gleich Variable anfasse.
Sieh es vielleicht einfach wie bei den Merkern. Der M1.0 gehört ins MB1 und in das MW0 und in das MW1 usw. Änderst du seinen Zustand so ist er in den zusammenfassenden Bytes,Word,DWords auch gleich mitgeändert.
Oder Vielleicht eine Temp-Variable deines FC's. Die kannst du auch mit L #myVar oder genauso mit L LB0 oder L LD0 oder oder ansprechen - gleiches gilt auch für den Transfer ...

Aber die AT-Sicht ist eine interessante Sache - damit kann man in der SCL-Welt nützliche und aber auch böse Dinge anstellen.

Gruß
Larry
 
Zurück
Oben