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