Frage zur zyklischen Abarbeitung bei der seriellen Kommunikation

Pneumatik

Level-2
Beiträge
46
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich selber programmiere jetzt mehr oder weniger häufig schon seit etwas über einem Jahr mit Twincat 3.

Ich arbeite gerade mit einem Beispielbaustein von Beckhoff für die serielle Communikation. (https://infosys.beckhoff.com/englis.../html/TcPlcLibSerCom_PLC_Installation.htm&id=)

Was mich dabei etwas wundert ist, dass wenn in Zeile1 über den Bool bSend die nTxDataLen gesetzt wird. Und dann im nächsten Zyklus dann in den fbSend übertragen wird dann doch eigentlich im selben Zyklus fbSend.Busy noch False ist wodurch nTxDataLen gleich wieder null gesetzt wird. Oder?

Ich hätte durch ne State machine sichergestellt dass die abfrag von fbSend.Busy erst im nächsten Zyklus abgefragt wird. Da dadurch aber wieder andere Probleme entstehen würde ich gerne wissen warum dass hier bei dem Beispiel funktioniert bzw. ob ich einen Denkfehler mache.

vielen Dank!

Code:
IF bSend THEN    nTxDataLen        := nTxDataSend;
    nTxDataBlockLen    := nTxDataSend;
    FOR I:=0 TO nTxDataBlockLen-1 DO
        CASE stSerialCfg.DataBits OF
        8:
            arrTxDataBlock[I]    := arrTxData[I];
        7:
            arrTxDataBlock[I]    := arrTxData[I] AND 2#01111111;
        6:
            arrTxDataBlock[I]    := arrTxData[I] AND 2#00111111;
        5:
            arrTxDataBlock[I]    := arrTxData[I] AND 2#00011111;
        END_CASE
    END_FOR
    nSendCounter := nSendCounter + 1;
    TimerTelWait(IN:=FALSE);
    TimerTelWait(IN:=TRUE, PT:=MAX(tTelWait, tSendDelay));
    IF bCompareMode THEN
        bCompareDone := FALSE;
    END_IF
    bSend := FALSE;
END_IF
(* Write Data from arrTxBuffer(user code) in ComBuffer *)
fbSend(
    pSendData    := ADR(arrTxData),
    Length        := nTxDataLen,
    TXbuffer    := TxBuffer,
);
IF NOT fbSend.Busy THEN
    nTxDataSum := nTxDataSum + nTxDataLen;
    nTxDataLen := 0;        (* to avoid a second sending afters successfully sent the telegram *)
END_IF
 
Zuletzt bearbeitet:
Der fbSend wird doch noch im gleichen Zyklus aufgerufen, in dem bSend true wird. Und nach dem Aufruf von fbSend ist fbSend.Busy auch true. Funktionieren sollte das, aber ich halte eine State machine auch für die sauberere Lösung.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der fbSend wird doch noch im gleichen Zyklus aufgerufen, in dem bSend true wird. Und nach dem Aufruf von fbSend ist fbSend.Busy auch true. Funktionieren sollte das, aber ich halte eine State machine auch für die sauberere Lösung.

Danke für deine Antwort. Aber ist es nicht so, dass die Eingänge und Ausgänge nur am Zyklus Anfang bzw. ende gelesen bzw. geschrieben werden?
So dass nach Aufruf des fbSend der fbSend.Busy erst am Ende des Zyklusses gesetzt wird.
Die Abarbeitung der "if NOT fbSend.Busy" Anweisung aber noch im selben Zyklus stattfindet?

Anscheinend ist es ja nicht so, sodass ich eine grundlegend falsche Annahme habe die unbedingt korrigiert werden muss.
 
Der Unterschied war mir ehrlich gesagt so nicht bewusst. Habe das immer durch State Machines umgangen, was teilweise ziemlich aufwendig war. Danke dir für die Aufklärung!
 
Zurück
Oben