Beckhoff RS232/ KL6001 senden / empfängen

aleksandra

Level-1
Beiträge
14
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich habe folgendes Problem und zwar: Ich habe eine CX9000-0001 CPU mit einer integrierten Cx9000-N030 Klemme (2x RS232). Die N030 muss man als "Serielle Schnittstelle" im Manager manuell einfügen und als eine KL6001 emulieren. Um zu schauen, ob ich was senden und empfangen kann, habe ich RxD und TxD miteinander verbunden, quasi kurzgeschlossen. Dann habe ich einen Counter hochzählen und senden lassen. Diesen habe ich dann auch einwandfrei empfangen können.

Anschließend habe ich versuch von meinem PC aus (über HTerm und auch PuTTy) mit der Steuerung über RS232 zu kommunizieren. Ich habe dazu ein USB-DSUB (RS232) kabel an meinem PC angeschlossen - alles z.B. im HTerm eingestellt, wie ich es auch im Manager konfiguriert habe. Dann habe ich die Steuerung mit dem PC verbunden. Sobald ich aber dem PC was schicken/empfangen möchte funktioniert nichts. Zuerst dachte ich ,dass es an dem Kabel liegt also habe ich denselben Trick angewendet wie zuvor( RxD und TxD miteinander kurschließen), da hat es auch dann funktioniert. Ich habe auch stets darauf geachtet, dass ich entsprechende Suffixe/Präfixe verwende, so wie es mein Programm verlangt (STX/ETX). Folgende Einstellungen habe ich gewählt:

- Baudrate 9600
- Stopbit 1
- Parität ungerade
- Datenbits 8
- Extended CTR/Status (On/Off ausprobiert)

Als nächstes habe ich versucht mit einer TTL/USB Adapter (Sowas hier: http://s4.electrodragon.com/wp-content/uploads/2015/04/CH340G-USB-TTL-01.jpg) alternativ zum Kabel mit der Steuerung zu kommunizieren. Mit diesem Adapter konnte ich komischerweise nur empfangen was die Steurung geschickt hat, jedoch konnte ich nie etwas senden.

EDIT: Mir ist aufgefallen, dass mein Programm immer empfängt was die Steuerung selbst schickt. (Auch wenn kein Kurzschluss zwischen RxD und TxD ist). Ich lese das was ich empfange immer aus der Variable ReceivedString (im Programm unten) aus. Wenn ich etwas über die USB/TTL an die Steuerung schicke, dann steht nachwievor immer nur das drinnen was die Steuerung an die USB/TTL Schnittstelle sendet. Man hat das Gefühl, dass Empfangen und Senden in der Steurung der gleiche Puffer ist. Wenn ich dann eins der beiden Kabel (RxD oder TxD) entferne wird selbstverständlich auch nichts mehr geschickt was ich im HTerm beobachten kann, aber es wird auch nichts mehr empfangen. Ganz unten findet ihr mein Programm.

Weiß jemand an was es liegen kann?

grüße Aleksandra

PROGRAM Sample_PC_COM_Port
VAR
Timer: TON;
Send: SendString;
SendBusy: BOOL;
SendErrorID: ComError_t;


Receive: ReceiveString;
ReceivedString: STRING;
LastReceivedString: STRING;
StringReceived: BOOL;
ReceiveBusy: BOOL;
ReceiveError: BOOL;
ReceiveErrorID: ComError_t;
ReceiveTimeout: BOOL;
ReceiveCounter: UDINT;


(* background communication with the COM port device *)
COMportControl: SerialLineControl;
COMportControlError: BOOL;
COMportControlErrorID: ComError_t;


(*COMportFlori: KL6configuration;*)
Counter: LREAL := 0;


END_VAR

(*==================================================================
Call the send block every second to repeat the transmission.
Also call the block as long as it is busy to finish a transmission.
*)


Timer(IN:=TRUE, PT:=T#1s);
IF Timer.Q OR Send.Busy THEN
Counter := Counter +1;
Send( SendString:= CONCAT(CONCAT('$02 Test - ',LREAL_TO_STRING(Counter )), '$03'),
TXbuffer:= TxBuffer1,
Busy=> SendBusy,
Error=> SendErrorID);


Timer(IN:=FALSE); (* reset timer *)
END_IF


(*==================================================================
Receive string data
The block receives any data strings beginning with a STX ($02) character and
ending with an ETX ($03) character.
*)
Receive(
Prefix:= '$02',
Suffix:= '$03',
Timeout:= T#0s,
ReceivedString:= ReceivedString,
RXbuffer:= RxBuffer1,
StringReceived=> StringReceived,
Busy=> ReceiveBusy,
Error=> ReceiveErrorID,
RxTimeout=> ReceiveTimeout );
IF StringReceived THEN
ReceiveCounter := ReceiveCounter + 1;
LastReceivedString := ReceivedString;
END_IF






(*==================================================================
Background communication with the COM port device.
The SerialLineControl function block is supposed to be called in every PLC cycle.
It communicates with the serial line hardware device and transmits or receives data.
The SerialLineControl can be called in the standard task or in a separate fast task as well.
A fast separate task will be necessary at high baud rates.
*)
COMportControl(
Mode:= SERIALLINEMODE_PC_COM_PORT,
pComIn:= ADR(COMin_COMport), (* I/O data; see global variables *)
pComOut:= ADR(COMout_COMport), (* I/O data; see global variables *)
SizeComIn:= SIZEOF(COMin_COMport), (* I/O data; see global variables *)
TxBuffer:= TxBuffer1, (* transmit buffer; see global variables *)
RxBuffer:= RxBuffer1, (* receive buffer; see global variables *)
Error=> COMportControlError,
ErrorID=> COMportControlErrorID );
 
Zuletzt bearbeitet:
Hi,
wenn du RXD und TXD miteinander verbindest, kannst du natürlich nur die Sachen aus der SPS empfangen. Man kann aber RXD mit CTS und TXD mit RTS zu verbinden....
Gruß
Holger
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,
Als ich die Sachen von der SPS empfangen habe,die ich auch mit der SPS geschickte, waren TxD und RxD nicht verbunden, deswegen verstehe ich es nicht.
Im HTerm konnte ich den durch die SPS gesendeten String beobachten, sowie im PLC Programm als RecivedString.
Als ich mit dem HTerm der SPS etwas schicken wollte, hat sich RecivedString nicht verändert, es war nach wie vor das ,was die SPS selber an HTerm sendete.
Grüße
Aleksandra
 
Versuch mal anstatt SERIALLINEMODE_PC_COM_PORT die Option SERIALLINEMODE_DEFAULT bei SerialLineControl zu verwenden. Hier beim Kunden wird mit vielen Geräten via RS232 kommuniziert und bei allen Programmen wird diese Option genutzt und es läuft.
Das Du für den Anschluss der CX9000-N030 an einen PC ein sogenanntes Nullmodem Kabel brauchst ist Dir bekannt? Da muss nämlich Pin 2 auf Pin 3 und umgekehrt angeschlossen werden.
@Holger: Ich mag mich irren, aber ist da was bei Dir durcheinander geraten? RX(D) mit CTS und TX(D) mit RTS verbinden darf man nicht machen, wenn schon dann RTS und CTS, also Pin 7 + 8.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Sorry, da hast du wohl recht. War irgendwie bei RS485.
"irgendwie": wahrscheinlich. "bei RS485": wohl kaum.
Über TxD und RxD werden die Daten übertragen - über CTS und RTS jedoch definitiv nicht.
CTS und RTS gehören zu den "handshake"-Signalen, über die gesteuert wird, ob, wann und wer empfangsbereit bzw. "dran ist" mit Senden.
Diese Leitungen sind oft gar nicht vorhanden/verdrahtet und dann wird der Verkehr über "X-ON"- / "X-OFF"- Zeichen über die DatenLeitungen (TxD und RxD) geregelt.
RS232 und RS485 dürften sich da identisch verhalten. Allerdings hat es bei RS232 im Laufe etlicher Jahre Änderungen gegeben.

Ich habe im letzten JahrTausend häufig mit folgendem zu kämpfen gehabt:

1) Viele Geräte liessen sich klaglos für 8 DatenBits plus Parity konfigurieren, konnten aber diese BetriebsArt nicht realisieren, weil sie maximal 8 Bit konnten.
D.h.: entweder 7 DatenBits plus Parity oder 8 DatenBits mit ohne Parity.

2) Es liessen sich Geräte verschiedenster Hersteller problemlos miteinander verbinden. Ausnahme: Siemens-Geräte. Siemens hat sich sehr viele verschiedene SteckerBelegungen einfallen lassen (zum Teil kombiniert mit TTY- alias 20mA-Signalen). Diese waren zwar gut dokumentiert, führten aber dazu, dass man ständig einen Koffer voll ausführlich beschrifteter Kabel und/oder Adapter dabei haben musste (oder eine oder zwei "StöpselBoxen", mit denen man an die speziellen SteckerBelegungen anpassen konnte).

Mit USB-/RS232-Konvertern habe ich (bisher) kaum eigene Erfahrungen gemacht, jedoch habe ich im Hinterkopf, dass nur die USB-Seite die aktive Seite sein kann, die sendet bzw. die die Gegenseite auffordern muss, etwas zu senden. Sie ist nicht empfangsbereit, wenn von der RS232-Seite Daten kommen, die sie nicht erwartet.

Gruss, Heinileini
 
Mit USB-/RS232-Konvertern habe ich (bisher) kaum eigene Erfahrungen gemacht, jedoch habe ich im Hinterkopf, dass nur die USB-Seite die aktive Seite sein kann, die sendet bzw. die die Gegenseite auffordern muss, etwas zu senden. Sie ist nicht empfangsbereit, wenn von der RS232-Seite Daten kommen, die sie nicht erwartet.
Ist nicht so, die RS232 Seite kann auch von sich aus senden und es kommt an. Ist ja kein Router.



Von irgendwas mit Internetzugang gesendet
 
Zuletzt bearbeitet:
Hi Jungs,

es lag an dem Nullmodem Kabel. Ich habe gestern einen Adapter gekauft und jetzt funktioniert alles einwandfrei.

Vielen Dank
Aleksandra
 
Zurück
Oben