Status lesen eines als Pointer übergebenen Eingangs in SCL

XAVIER

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

Ich schreibe gerade einen Baustein in SCL für die Auswertung eines Eingangs der als Pointer an den Baustein übergeben wird. Somit kann ich im Baustein auswerten welcher Eingang anparametriert wurde.
Leider weiß ich nicht wie ich jetzt auch noch den Status "0/1" des Eingangs aus dem Pointer herauslesen kann.

Hier ein Auzug des bisherigen Programmcodes:
Code:
FUNCTION_BLOCK FB109
TITLE = ''
VERSION : '1.0'
AUTHOR : BSM_MW

VAR_INPUT
    i_dwMeldeNr1 { S7_a_type := 'alarm_s'; S7_server := 'alarm_archiv' }:   DWORD ;    //Meldungsnummer

    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

VAR
    dwBegleitwert1          : DWORD;   //Begleitwert einer Meldung 
END_VAR

VAR_TEMP
    iRetvalue               : ARRAY[1..8] OF INT;           //Returnvariable
END_VAR

CONST
    constID                 := W#16#EEEE; 
    constIAdr               := DW#16#81000000;              
    constAAdr               := DW#16#82000000;             
    constMAdr               := DW#16#83000000;             
END_CONST


//Fehlernummer Berechnen für Textliste
dwBegleitwert1:=DINT_TO_DWORD(DWORD_TO_DINT(ibo1AST.Adr)-DWORD_TO_DINT(constIAdr)+10000);

iretvalue[1] := ALARM_SQ(
                   SIG    := M100.0,     
                   ID     := constID,
                   EV_ID  := i_dwMeldeNr1,
                   SD     := dwBegleitwert1);

//Status des Eingangs abfragen ???????????????

IF i_bo1AST THEN              //So geht es nicht, da keine boolsche Variable
    ;
ELSE
    ;
END_IF;

 
END_FUNCTION_BLOCK
 
Eigentlich müsste es dafür einen Dereferenzierungsoperator geben, welcher aber beim Siemens-SCL nicht vorhanden ist.
Ich weiß nicht ob das am Siemens SCL liegt oder ein genereller Pascal Sprachmangel war.

Das hier wäre eine Möglichkeit auf die Bits zuzugreifen:
Code:
VAR
    xTest : BOOL;
    byteAdr : INT;
    bitAdr : INT;
    Area : INT;  
END_VAR

    (* 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];
        16#82:
            xTest := A[byteAdr, bitAdr];
        16#83:
            xTest := M[byteAdr, bitAdr];
(* hier andere Fälle abfangen.... *)
    END_CASE;
 
Zurück
Oben