Serielle Schnittstelle mehrfach senden und Antwort auswerten

Begonnen von cali, 31. Dezember 2008, 11:28:30

Vorheriges Thema - Nächstes Thema

0 Mitglieder und 2 Gäste betrachten dieses Thema.

cali

Hallo,

Folgendes Problem. Mein Sensor möchte initialisiert werden, dabei sendet er mir alle Informationen wobei jedoch mein RingBuffer überläuft. Ich suche daher nach einer Möglichkeit mehr als 255 Zeichen zu empfangen, oder nach dem Initialisieren die Informationen abzufragen. Wie muß ich die Struktur ändern um den "SendString" zu überschreiben, wie kann ich neu senden (xStartSend) und die Antwort auswerten. Wahrscheinlich mit einem Zustandsautomaten... nur wie starte ich mehrfach COM1 und empfange dannn?


Hier ist was ich habe und was auch für eine Abfrage funktioniert:

(*---- Solange eine Anforderung gesendet wird -> den Empfangsbuffer löschen *)
IF xSendActive3 THEN  (* neue Anforderung wird gesendet *)
FOR i:= 0 TO 255 DO
ReceiveBuffer.Data[i] := 0; (* Empfangsbuffer löschen*)
END_FOR
ReceiveBuffer.Index := 0; (* Empfangsbuffer löschen*)
END_IF

(*--- Auffuf der Schnittstelle -----------------------------------------------------*)
(* Send and Receive for COM1 *)
COM1( bCOM_PORT_NR := 1,
cbBAUDRATE := BAUD_9600,
cbsBYTESIZE := BS_8,
cpPARITY := PARITY_NO,
csSTOPBITS := STOPBITS_1,
cfFLOW_CONTROL := NO_FLOW_CONTROL,
utRECEIVE_BUFFER := ReceiveBuffer,
ptSEND_BUFFER := ADR(SendString),
xINIT := xInitPort,
      xOPEN_COM_PORT := xOpenPort,
iBYTES_TO_SEND := LEN(SendString) +1,
xSTART_SEND := xSendActive3 );

(*---- Empfangsdaten in String kopieren ---------------------------------------------------------------------------------------*)
ptString := ADR(ReceiveBuffer.Data); (* Stringzeiger auf den Anfang des Empfangsbuffers *)
ReceiveBuffer.Data[ ReceiveBuffer.Index ] := 0; (* String terminieren *)
ReceiveString := ptString^;    (* String kopieren *)
(*-------------------------------------------------------------------------------------------------------------------------------------------*)
temp2:=STRING_TO_REAL(LIST_GET(44,1,ReceiveString));*)

temp:=LIST_GET(44,0,ReceiveString); (*Sensor*)
TEMPIST:=STRING_TO_REAL(LIST_GET(44,1,ReceiveString)); (*Temperatur in Real*)


Bin für jeden Tipp dankbar.
Cali

gravieren

Hi

Welches System hast du  ?


Versuche doch mal die besseren Portablen Funktionen von CoDeSys:
- SysComOpen
- SysComSetSetting
- SysComRead
- SysComWrite
- SysComClose

cali

Hallo gravieren,

ich habe eine WAGO 750-841. Hast Du ein Beispiel dafür in ST? Man kann zwar bei Wago und im Programm einiges finden, aber ein richtiges ST Tutorial habe ich noch nicht gefunden. Wie bekomme ich denn mit, wenn Daten empfangen wurden und einen Timeout brauche ich ja auch...

Danke
Cali

gravieren

Hi

>ich habe eine WAGO 750-841.
O.K.  Geht mit diesem Controller.


>Hast Du ein Beispiel dafür in ST?
Schau doch mal in ca. 2 Wochen in meinem Forum vorbei.
Möglicherweise werden dor Informationen zu finden sein.
(Ich arbeite momentan am Filesystem und am M-Bus)
(Sollte es meine "Freizeit" zulassen, findest du ein Example)




>Man kann zwar bei Wago und im Programm einiges finden,
>aber ein richtiges ST Tutorial habe ich noch nicht gefunden.
Such doch mal auf deinem Rechner nach der Datei "SysLibCom.pdf"



>Wie bekomme ich denn mit, wenn Daten empfangen wurden
Lese die o.g. Dokumentation durch.

>und einen Timeout brauche ich ja auch...
Lese die o.g. Dokumentation durch.


Nach dem durchlesen der Dokumentation werde ich dir die offenen Fragen beantworten.



cali

Hier meine Lösung:

Mit
COM1( bCOM_PORT_NR := 1,
cbBAUDRATE := BAUD_9600,
cbsBYTESIZE := BS_8,
cpPARITY := PARITY_NO,
csSTOPBITS := STOPBITS_1,
cfFLOW_CONTROL := NO_FLOW_CONTROL,
utRECEIVE_BUFFER := ReceiveBuffer,
ptSEND_BUFFER := ADR(SendString),
xINIT := xInitPort,
      xOPEN_COM_PORT := xOpenPort,
iBYTES_TO_SEND := LEN(SendString) +1,
xSTART_SEND := xSendActive3 );
wird gesendet was unter SendString steht. Diesen ändere ich bei jedem Durchlauf mit Hilfe eines Zustandsautomaten. Die die Antwort werte ich jedes mal aus. Thats it!

WenDeLuxe

Kann mir jemand Erklären, weshalb bei der Anzahl zu sendenden Zeichen (iBYTES_TO_SEND   := LEN) ein Byte dazuaddiert wird?