TIA Auslesen ANY Variable in SCL

timistgut

Member
Beiträge
7
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo,

ich suche nun schon 2 Tage das Internet nach meiner Antwort ab, bisher aber kein richtiger Erfolg. Folgendes:
Ich soll einen FB programmieren, der eine Störmeldung als ANY Parameter bekommt. Z.B. P#DB1.DBX0.0 DWORD 3
Nun soll ich diesen Eingang überprüfen; wenn dieser an einer Stelle eine 1 hat, soll ich eine Meldeleuchte ansteuern können und wieder quittieren.

Soweit ich weiß, muss man die Schnittstelle in diesem Fall wie folgt ersetellen um auf den Speicherbereich zugreifen zu können:
1622798735862.png
Ich glaube diesen Pointer muss man dann noch initialisieren:
#Ptr_Any.S7Code := 16#10;
#Ptr_Any.DataType := 16#02;
#Ptr_Any.Length := 76;
#Ptr_Any.DBNumber := 1;
#Ptr_Any.MemoryArea := 16#84;
#Ptr_Any.ByteAddressMSB := 0;
(ist das überhaupt notwendig?)

Und nun will ich gerne, z.B. auf den Speicher DB1.DBX0.0 eine 1 setzten über die Beobachtungstabelle und demnach die Meldeleuchte ansteuern.
Wie kann ich nun den Speicher auslesen aus dem Pointer? Wenn ich den SCL Code beobachte, die 1 setzte, dann ändern sich die Werte nicht.

Ich hab schon versucht per BLKMOV die Variable in ein VARIANT zu schieben:
#Ret_Val := BLKMOV(SRCBLK := #Ptr_Any, DSTBLK => #Intern_Stör);
VariantGet(SRC:=#Intern_Stör,
DST=>#Intern_Val);
Aber wenn ich das versuche zu kompelieren, dann fehlt mir eine Initialisierung des #Intern_Stör (ist eine Temp Variable).

Im Grunde will ich einfach nur die Bits mit dem Wert 0 vergleichen und wenn dies nicht der Fall ist, die Meldeleuchte werfen.

Kann mir da wer weiterhelfen?

Gruß Tim
 

FFx

New member
Beiträge
4
Punkte Reaktionen
0
Hallo,

Wert kann mit der PEEK_BOOL Funktion ausgelesen werden.
Code:
#FcBoolWert := PEEK_BOOL(area       := #IN_Struct.byMemoryArea,
                         dbNumber   := #IN_Struct.iDB_No,
                         byteOffset := #IN_Struct.iByteAdr,
                         bitOffset  := #IN_Struct.iBitAdr);
 

Blockmove

Moderator in der Ausbildung, User des Jahres 2019
Teammitglied
Beiträge
8.440
Punkte Reaktionen
2.110
Zuviel Werbung?
->Hier kostenlos registrieren
Wann hört eigentlich dieser Murks auf?
TIA bietet zig Möglichkeiten das Problem vollsymbolisch zu lösen.
 

DeltaMikeAir

User des Jahres 2018
Beiträge
8.239
Punkte Reaktionen
1.891
Wann hört eigentlich dieser Murks auf?
TIA bietet zig Möglichkeiten das Problem vollsymbolisch zu lösen.
Ich denke es liegt überwiegend an der Unwissenheit über die neuen "modernen" Möglichkeiten.
Dadurch wird halt häufig immer noch Code aus der S5 auf Teufel komm raus auf eine 1500ér hingebogen.
 

Blockmove

Moderator in der Ausbildung, User des Jahres 2019
Teammitglied
Beiträge
8.440
Punkte Reaktionen
2.110
Naja, ist für uns auch wieder ein Vorteil.
In Abwandlung des Ikea-Slogans:
"Plagst du dich noch mit Pointern rum oder nimmst du schon in Betrieb"
 

FFx

New member
Beiträge
4
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
Ich denke es liegt überwiegend an der Unwissenheit über die neuen "modernen" Möglichkeiten.
Dadurch wird halt häufig immer noch Code aus der S5 auf Teufel komm raus auf eine 1500ér hingebogen.
Was sind denn die "modernen" Möglichkeiten? Variant ist nicht wirklich eine alternative zu Any.
Ausserdem generien wir aus den E/A Adressen, HMI Textlisteneinträge welche den Symbolischen Namen und Kommentar beinhaltet zur Meldungsanzeige. Wie realisiert ihr denn mit modernen mitteln eine Endschalter Überwachung ohne Textlisten Handisch zu füllen?
 

Ralle

Supermoderator
Teammitglied
Beiträge
14.212
Punkte Reaktionen
3.282
Was sind denn die "modernen" Möglichkeiten? Variant ist nicht wirklich eine alternative zu Any.
Ausserdem generien wir aus den E/A Adressen, HMI Textlisteneinträge welche den Symbolischen Namen und Kommentar beinhaltet zur Meldungsanzeige. Wie realisiert ihr denn mit modernen mitteln eine Endschalter Überwachung ohne Textlisten Handisch zu füllen?
z.B. mit Program_Alarm und Beiwerten durch GetSymbolName ermitttelte Strings, wenns denn sein muß.
 

Peter Gedöns

Well-known member
Beiträge
567
Punkte Reaktionen
139
Was sind denn die "modernen" Möglichkeiten? Variant ist nicht wirklich eine alternative zu Any.
Ausserdem generien wir aus den E/A Adressen, HMI Textlisteneinträge welche den Symbolischen Namen und Kommentar beinhaltet zur Meldungsanzeige. Wie realisiert ihr denn mit modernen mitteln eine Endschalter Überwachung ohne Textlisten Handisch zu füllen?
Damit ich es auch verstehe ,
Ihr generiert aus der E/A Adresse , einen Textlisten Eintrag für die HMI die den Symbolischen Namen und den Kommentar enthält .
Die E/A Adresse bekommt ihr als Any
Das alles natürlich zur Laufzeit
Mit einer PLC 1500 bekommt ihr das nicht hin ?
 

TP-Inc

Well-known member
Beiträge
515
Punkte Reaktionen
98
Zuviel Werbung?
->Hier kostenlos registrieren
Was sind denn die "modernen" Möglichkeiten? Variant ist nicht wirklich eine alternative zu Any.
Ausserdem generien wir aus den E/A Adressen, HMI Textlisteneinträge welche den Symbolischen Namen und Kommentar beinhaltet zur Meldungsanzeige. Wie realisiert ihr denn mit modernen mitteln eine Endschalter Überwachung ohne Textlisten Handisch zu füllen?
ProDiag ist das Stichwort. Schneller bekommt man keine Meldungen projektiert 😎
 
OP
T

timistgut

Member
Beiträge
7
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
So,
also danke dafür, hat gut geklappt.
Hallo,

Wert kann mit der PEEK_BOOL Funktion ausgelesen werden.
Code:
#FcBoolWert := PEEK_BOOL(area       := #IN_Struct.byMemoryArea,
                         dbNumber   := #IN_Struct.iDB_No,
                         byteOffset := #IN_Struct.iByteAdr,
                         bitOffset  := #IN_Struct.iBitAdr);

Falls jemand auch noch dieses Problem in der Zukunft haben sollte, hier meine Lösung:
Idee: ich geh jedes Bit durch und schau, ob dieses eine 1 hat und gebe dann bei dem Fall einer 1 ein Error Signal aus.
Code:
VAR_INPUT DB_SPECIFIC
      Störbereich : Any;
      Ptr_Any AT Störbereich : Struct
           Any_id : Byte;
           DataType : Byte;
           Length : Int;
           DBNumber : Word;
           MemoryArea : Byte;
      END_STRUCT;
[...]
END_VAR

BEGIN
[...]
FOR #i_Byte := 0 TO #Ptr_Any.Length DO  // check in every byte
    FOR #i_Bit := 0 TO 7 DO // check every bit in the byte
        // check the current bit for a "1"
        #FcBoolWert := PEEK_BOOL(area := #Ptr_Any.MemoryArea,
                                 dbNumber := #Ptr_Any.DBNumber,
                                 byteOffset := #i_Byte,
                                 bitOffset := #i_Bit);
        // if there is a "1", save it
        IF #FcBoolWert THEN
            #temp_error := TRUE;
        END_IF;
    END_FOR;
END_FOR;
[...]
END_FUNCTION_BLOCK

@ die "andere" Diskussion
Es geht halt nicht vollsymbolisch in meinem Fall, wenn alle Standardbausteine in diesem Projekt bereits in AWL programmiert worden sind. Da hilft mir der Fakt nichts, dass dies völliger Murks sei und die rauffolgende Diskussion über diesen Murks hat mir jetzt auch keinen Mehrwert gegeben. Dankeschön.
 

m_w

Well-known member
Beiträge
71
Punkte Reaktionen
18
Du kannst anstelle des peek_bool auch ein peek_byte nehmen, dann musst du das nur durch eine schleife durchlassen.

und die Area ist aufgeschlüsselt 16#81 ist Eingang, 16#82 ist Ausgang (für Poke), 16#83 ist glaub merken und 16#84 ist DB zugriff.
Bei Merkel und DB kann ich mich vertun, aber wenn Du peek markierst und F1 drückt kommt Hilfe.

Normal kann man das so schreiben, dass der Any-Pointer überflüssig wird.
 
Oben