RS232 Datenkommunikation

demon2000

Level-1
Beiträge
26
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
bin am verzweifeln.
Habe ich Baustein mit der Zusammenfassung zur RS232 Kommunikation erstellt.

FB_COMMUNICATION
VAR_INPUT
Data_In : POINTER TO BYTE;
Length : UDINT;
bExecute : BOOL;
END_VAR

trig(CLK:=bExecute);
IF trig.Q THEN
SendD( pSendData:=Data_In,
Length:=Length,
TXBuffer:=TxBuffer1,
Busy=>SendBusy,
Error=>SendErrorId
);
END_IF
und wenn ich ihn in MAIN so aufrufe muss ich 3-4 mal auf bExecute drücken bis er was sendet.
MAIN
VAR
SND_NKE : ARRAY [0..4] OF BYTE := 16#10, 16#40, 16#00, 16#00, 16#16;
bExecute : BOOL;
END_VAR

r_trig(CLK:=bExecute);
IF r_trig.Q THEN
fbSendNKE( Data_In:=ADR(SND_NKE),
Length := SIZEOF(SND_NKE),
bExecute := TRUE);
END_IF

was kann ich dagegen machen?
 
... bei Siemens wäre es so, dass der Baustein immer bearbeitet werden wollte und du den Trigger auf den IN-Parameter legen müßtest. Vielleicht versuchst du es hier auch mal so ...
Code:
fbSendNKE( Data_In:=ADR(SND_NKE),
     Length := SIZEOF(SND_NKE),
     bExecute := myTrigger);
Gruß
Larry
 
Ich nehme an, dass "SendD" ein "SendData"-FB aus der TwinCat-RS232-Bibliothek ist. Wenn der beim ersten Aufruf nicht alle Sendebytes in TxBuffer eintragen kann, gibt er Busy=True zurück, und Du musst ihn in den nächsten Zyklen mit unveränderten Sendedaten erneut aufrufen, bis er Busy=False zurückgibt.

Ich bin mir aber nicht sicher, ob das Dein Problem wirklich löst. Ich habe mit etwas Ähnlichem zu kämpfen. Eigentlich muss ich 300 Bytes senden, dabei fehlen mir aber am Ende einige Bytes. Wenn ich dagegen 320 Bytes sende, werden diese vollständig übertragen. Ich vermute, dass der UART-Chip der Schnittstelle so eingestellt ist, dass er erst bei einem bestimmten Füllstand seines internen FIFO's die Daten sendet. Habe allerdings noch keine Zeit gefunden, mich darum zu kümmern.
 
Ich rufe ja den Baustein mit dem Trigger auf. Der Baustein wird also nur ein mal aufgerufen. Ich muss in 3-4 mal aufrufen bis er das richtige sendet.

Ja ... vielleicht ist das ja dein Problem.
Der Baustein wird ja nur bearbeitet solange der Trigger ansteht - danach nicht mehr. Vielleicht probierst du meinen Vorschlag einfach mal aus. Bedingte Bearbeitung ist immer so eine Sache ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich wollte die Sende und Empfangsfunktion in einer Schleife aufrufen um sicher zu stellen, dass alle Daten Empfangen bzw. gesendet wurden.
Dabei stürzt der System Manager ab.
WHILE NOT ReceiveD.DataReceived DO
Timer(IN:=TRUE, PT:=T#0.1s);
IF Timer.Q OR SendD.Busy THEN
SendD( pSendData:=ADR(SND_NKE),
Length:=SIZEOF(SND_NKE),
TXBuffer:=TxBuffer1,
Busy=>SendBusy,
Error=>SendErrorId
);
Timer(IN:=FALSE);
END_IF
(*==================================================================
Receive data
*)
ReceiveD( pReceiveData:=ADR(RSP_UD_DATA),
SizeReceiveData:=SIZEOF(RSP_UD_DATA),
Timeout:=t#5s,
RXbuffer:=RxBuffer1,
Error=> ReceiveErrorID);
DataReady:= NOT ReceiveD.DataReceived;
END_WHILE
 
Kann es sein, dass dein ReceiveD-Baustein nicht aktualisiert wird?

Füg mal folgende Zeile for deine while-Schleife:
Code:
ReceiveD();
 
Ich bekomme die Fehlermeldung "Kommunikationsfehler (#2), Es wird Ausgeloggt" und im System Manager"Type Server (Port) Timestamp Meldung
Warning TCIO (300) 31.03.2011 12:39:01 901 ms Watchdog des asynchronen Mapping 1 zwischen Prozeßabbild 1 und 2 hat zugeschlagen, da Prozeßabbild 1 keine neuen Daten lieferte.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du hast dir, wie ich schon vermutet hatte, eine Endlosschleife gebaut. Deshalb schlägt auch der Watch-Dog zu.

Muss es bei dir denn unbedingt eine while-Schleife sein? Kannst du das Ganze nicht auch mit IFs aufbauen?
 
Die Prozessdaten (Eingänge, Ausgänge, Serielle Dtaen etc.) werden immer vor bzw. nach einem SPS Zyklus aktualisiert. Wenn am Anfang eines Zykluses keine neuen Daten anstehen, dann läuft die While Schleife ewig. Da Daten, die während des Zykluses ankommen erst im nächsten Durchlauf dem Programm zur Verfügung gestellt werden.
Besser noch:
Wenn möglich die Serielle Kommunikation über eine zweite "schnelle" Task abwickeln, die nichts anders als die Serielle Kommunikation behandelt.
 
Zurück
Oben