Twincat 3: Property gibt nur Einzelschrittbetrieb korrekten wert zurück

Jochen

Level-1
Beiträge
131
Reaktionspunkte
3
Zuviel Werbung?
-> 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:

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:
Zurück
Oben