-> Hier kostenlos registrieren
Hallo,
ich frage für eine Kommunikationsanwendung in Twincat 3 eine Property ab.
Die Property "isLogMsg" eines Pufferobjekts mit x Einträgen sieht wie folgt aus:
"getHead()" ist eine Methode des FB und gibt die Nachricht aus dem ersten Pufferplatz zurück.
Wenn ich nun irgendwo
mache, einen Breakpoint in die Zeile "doStuff()" setze, wird die Ausführung gestoppt, sobald die If-Abfrage zum ersten Mal durchgeführt wird. Das heist, es muss ein FALSE zurückgekommen sein.
Schaue ich mir nun online den String im Speicher an, den die Property prüfen soll, so steht dort 'LOGG' drin, wie es sein soll.
Wenn ich den Breakpoint vor die Abfrage selber setze und die Property durchtippe, bekomme ich wie erwartet ein TRUE zurück.
Kann sich das jemand erklären?
Vielen Dank im Voraus
Gruß
Jochen
EDIT:
Ich habe gerade etwas herumgespielt und mal spaßeshalber die lokalen Variablen der Property im FB-Kopf angelegt. Und siehe da, damit arbeitet die Property auch im zyklischen Betrieb so wie sie soll.
Allein das Warum erschließt sich mir nicht. Diese Variablen werden doch nur lokal gebraucht und sollten dann doch dort funktionieren.... Wird ja nichts über mehrere Zyklen mitgeschleift.....
EDIT2: Ich konnte das Problem auf den Stringvergleich einschränken. Wenn ich eine Stringvariable "sBuf: STRING(255)" im FB-Kopf anlege und dann meine Property umschreibe:
Dann funktioniert es.
Interessant dabei ist, dass die Zuweisung an sich ja funktioniert, also muss in sMessageID ja definitiv das Richtige drin stehen....
ich frage für eine Kommunikationsanwendung in Twincat 3 eine Property ab.
Die Property "isLogMsg" eines Pufferobjekts mit x Einträgen sieht wie folgt aus:
Code:
VAR
stWorkingMsg : UN_StMsgArrBytes;
sMessageID : STRING[4];
iIndex : INT;
END_VAR
stWorkingMsg := GetHead();
//check the Message ID
FOR iIndex := 1 TO 4 DO
sMessageID[iIndex-1] := stWorkingMsg.structure.HeaderData.sDataID[iIndex];
END_FOR
IF sMessageID = 'LOGG' THEN //True
isLogMsg := TRUE;
ELSE
isLogMsg := FALSE;
END_IF
"getHead()" ist eine Methode des FB und gibt die Nachricht aus dem ersten Pufferplatz zurück.
Wenn ich nun irgendwo
Code:
IF BufferFB.isLogMessage THEN
doStuff();
END_IF
mache, einen Breakpoint in die Zeile "doStuff()" setze, wird die Ausführung gestoppt, sobald die If-Abfrage zum ersten Mal durchgeführt wird. Das heist, es muss ein FALSE zurückgekommen sein.
Schaue ich mir nun online den String im Speicher an, den die Property prüfen soll, so steht dort 'LOGG' drin, wie es sein soll.
Wenn ich den Breakpoint vor die Abfrage selber setze und die Property durchtippe, bekomme ich wie erwartet ein TRUE zurück.
Kann sich das jemand erklären?
Vielen Dank im Voraus
Gruß
Jochen
EDIT:
Ich habe gerade etwas herumgespielt und mal spaßeshalber die lokalen Variablen der Property im FB-Kopf angelegt. Und siehe da, damit arbeitet die Property auch im zyklischen Betrieb so wie sie soll.
Allein das Warum erschließt sich mir nicht. Diese Variablen werden doch nur lokal gebraucht und sollten dann doch dort funktionieren.... Wird ja nichts über mehrere Zyklen mitgeschleift.....
EDIT2: Ich konnte das Problem auf den Stringvergleich einschränken. Wenn ich eine Stringvariable "sBuf: STRING(255)" im FB-Kopf anlege und dann meine Property umschreibe:
Code:
VAR
stWorkingMsg : UN_StMsgArrBytes;
sMessageID : STRING[4];
iIndex : INT;
END_VAR
stWorkingMsg := GetHead();
//check the Message ID
FOR iIndex := 1 TO 4 DO
sMessageID[iIndex-1] := stWorkingMsg.structure.HeaderData.sDataID[iIndex];
END_FOR
sBuf := sMessageID;
IF sBuf = 'LOGG' THEN //True
isLogMsg := TRUE;
ELSE
isLogMsg := FALSE;
END_IF
sBuf:='';
Dann funktioniert es.
Interessant dabei ist, dass die Zuweisung an sich ja funktioniert, also muss in sMessageID ja definitiv das Richtige drin stehen....
Zuletzt bearbeitet: