Bytenummer herausfinden von Bit?

vollmi

Level-3
Beiträge
5.435
Reaktionspunkte
1.409
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi

Ich würde gerne an einen SCL Baustein einen Eingang anhängen vom Format Bool. Hier wird dann z.B. DB10.dbx10.4 angeschlossen.

Ist es möglich das ich da irgendwie im Baustein herausfinden kann aus welchem Byte diese Adresse ist?

Also ich schliese db10.dbx 10.4 an und im Baustein kriege ich dann einen Int von 10.

mfG René
 
Rausgriegen kannst du es nur wenn der Eingang vom Typ Pointer ist und nicht Bool, das mich Ich auch in einem Projekt so (in AWL)

Ob es allerdings in SCL überhaupt möglich ist, weiss ich nicht, glaube es aber nicht!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
doch, doch...

Hallo, das geht auch in SCL. Ich habe neulich etwas ähnliches gemacht:

Als IN- Variable ein Pointer (an dem im Aufruf dann ein BOOL steht):
Code:
// Bausteinparameter
VAR_INPUT
    // Eingangsparameter
    i_bo1AST : POINTER;
    ibo1AST AT i_bo1AST :                //Pointer in seine Struktur auflösen.
        STRUCT
            DBNr: WORD;
            Adr: DWORD;                     //Adresse des Eingangs
        END_STRUCT;
END_VAR

und so bekommt man die Infos aus dem Zeiger:
Code:
(* Speicherbereich bestimmen *)
    Area := DWORD_TO_INT( SHR(IN := ibo1AST.Adr, N := 24) );
    (* Bits rausschieben, Speicherbereich wird durch DWORD_TO_INT ausmaskiert *)
    byteAdr := DWORD_TO_INT( SHR(IN := ibo1AST.Adr, N := 3) );
    bitAdr := DWORD_TO_INT (ibo1AST.Adr AND 16#00000007);
    CASE (Area) OF
        16#81:
            xTest := E[byteAdr, bitAdr];
            s_Adr := 'E';
        16#82:
            xTest := A[byteAdr, bitAdr];
            s_Adr := 'A';
        16#83:
            xTest := M[byteAdr, bitAdr];
            s_Adr := 'M';
    (* hier andere Fälle abfangen.... *)
    END_CASE;
Area ist ein INT.

Folgende Speicherbereiche können in "Area" auftauchen:

80: Peripherie
81: Eingänge
82: Ausgänge
83: Merker
84: Datenbaustein
85: Instanzdatenbaustein
86: Lokaldaten (L-Stack)
87: Vorherige Lokaldaten

Die eigentliche Kernfunktion habe ich übrigens hier im Forum gefunden.

Gruß
Stefan
 
Wenn Du nur das Byte willst, geht es auch kürzer:
Code:
// Bausteinparameter
VAR_INPUT
    // Eingangsparameter
    i_Eingang : POINTER;
    t_Eingang AT i_Eingang :          //Pointer in seine Struktur auflösen.
        STRUCT
            DBNr: WORD;
            Adr: DWORD;               //Byte Adresse des Eingangs
        END_STRUCT;
END_VAR
 
VAR_OUTPUT
   o_Byte : INT;
END_VAR
 
   Adr := DWORD_TO_INT(SHR(IN:=SHL(IN:=t_Eingang.Adr,N:=8),N:=11));
 
   o_Byte := Adr;
 
Zurück
Oben