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-conte...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 );