-> 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!
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: