-> Hier kostenlos registrieren
Hallo liebe Community,
beim Stöbern in diesem Forum habe ich schon öfters hilfreiche Tipps für das ein oder andere Problem bei der SPS-Programmierung gefunden.
Allerdings stehe ich gerade vor einem Problem, bei dem ich nicht mehr weiter weiß und auch die Hinweise in anderen Threads keine Abhilfe schaffen konnten, weshalb ich hiermit meine erste Frage in diesem Forum stellen möchte.
Ziel ist es, eine Remote-Ansteuerung über RS232 von einer EL6001 (TwinCAT 2) zu einem 115 VAC-Netzteil (Chroma 6590) zu realisieren.
Was ich bisher geschafft habe:
- Senden von Befehlen funktioniert (d.h. das Netzteil reagiert auf Befehle wie z.B. 'OUTPut ON | OFF')
Was ich bisher nicht geschafft habe:
- Empfangen von Daten/Rückmeldungen funktioniert nicht (d.h. mit meinem Empfangsbaustein vom Typ "ReceiveString" habe ich bisher nie Daten empfangen können, wenn ich Befehle/ Abfragen gesendet habe, die einen Rückgabewert liefern sollten.
Beispiel 1: '*IDN?' (sollte einfach die Kennung des Netzteils zurückgeben)
Beispiel 2: 'OUTPut?' (sollte einfach den Status zurückgeben, ob das Netzteil an oder aus ist)
Was ich bisher geprüft habe:
- Nullmodemkabel passt (3 Leitungen: 2 auf 3, 3 auf 2, 5 auf 5)
- Mapping im System Manager passt (sowohl bei den Daten-Variablen "D" als auch bei den Handshake-Variablen "Ctrl" und "Status")
- Umsetzung der Implementierung in PLC und im System Manager gemäß des Beispiels "11388462091"aus der Dokumentation zum Supplement "TS6340 - TwinCAT 2 PLC Serial Communication"
- Beachtung der Hinweise aus der Dokumentation zu der EL6001
- Beachtung der Hinweise aus der Dokumentation zum Chroma 6590 (siehe auch Anhang Kapitel 6)
- Folgende Parameter sind beim anzusteuernden Netzteil für RS232 eingestellt: Baudrate -> 9600, Parity -> none
Hat jemand eine Idee, warum ich nichts empfangen kann?
Muss ich event. im "CoE - Online" der EL6001 einige Standardparameter abändern?
Ist event. die Syntax meines gesendeten Strings falsch?
Vielen Dank im Voraus für eure Anmerkungen. Ich bin ab Dienstag wieder auf der Arbeit und werde dann auf event. Rückfragen reagieren bzw. Feedback zu euren Vorschlägen geben können.
Beste Grüße
AirHubi
Der Code basiert auf dem genannten Beispiel von Beckhoff und ist nur minimal für meine Rahmenbedingungen angepasst:
Programm "FAST" (Hintergrundkommunikation):
Programm "MAIN":
Programm "Sample_EL6001":
Globale Variablen:
beim Stöbern in diesem Forum habe ich schon öfters hilfreiche Tipps für das ein oder andere Problem bei der SPS-Programmierung gefunden.
Allerdings stehe ich gerade vor einem Problem, bei dem ich nicht mehr weiter weiß und auch die Hinweise in anderen Threads keine Abhilfe schaffen konnten, weshalb ich hiermit meine erste Frage in diesem Forum stellen möchte.
Ziel ist es, eine Remote-Ansteuerung über RS232 von einer EL6001 (TwinCAT 2) zu einem 115 VAC-Netzteil (Chroma 6590) zu realisieren.
Was ich bisher geschafft habe:
- Senden von Befehlen funktioniert (d.h. das Netzteil reagiert auf Befehle wie z.B. 'OUTPut ON | OFF')
Was ich bisher nicht geschafft habe:
- Empfangen von Daten/Rückmeldungen funktioniert nicht (d.h. mit meinem Empfangsbaustein vom Typ "ReceiveString" habe ich bisher nie Daten empfangen können, wenn ich Befehle/ Abfragen gesendet habe, die einen Rückgabewert liefern sollten.
Beispiel 1: '*IDN?' (sollte einfach die Kennung des Netzteils zurückgeben)
Beispiel 2: 'OUTPut?' (sollte einfach den Status zurückgeben, ob das Netzteil an oder aus ist)
Was ich bisher geprüft habe:
- Nullmodemkabel passt (3 Leitungen: 2 auf 3, 3 auf 2, 5 auf 5)
- Mapping im System Manager passt (sowohl bei den Daten-Variablen "D" als auch bei den Handshake-Variablen "Ctrl" und "Status")
- Umsetzung der Implementierung in PLC und im System Manager gemäß des Beispiels "11388462091"aus der Dokumentation zum Supplement "TS6340 - TwinCAT 2 PLC Serial Communication"
- Beachtung der Hinweise aus der Dokumentation zu der EL6001
- Beachtung der Hinweise aus der Dokumentation zum Chroma 6590 (siehe auch Anhang Kapitel 6)
- Folgende Parameter sind beim anzusteuernden Netzteil für RS232 eingestellt: Baudrate -> 9600, Parity -> none
Hat jemand eine Idee, warum ich nichts empfangen kann?
Muss ich event. im "CoE - Online" der EL6001 einige Standardparameter abändern?
Ist event. die Syntax meines gesendeten Strings falsch?
Vielen Dank im Voraus für eure Anmerkungen. Ich bin ab Dienstag wieder auf der Arbeit und werde dann auf event. Rückfragen reagieren bzw. Feedback zu euren Vorschlägen geben können.
Beste Grüße
AirHubi
Der Code basiert auf dem genannten Beispiel von Beckhoff und ist nur minimal für meine Rahmenbedingungen angepasst:
Programm "FAST" (Hintergrundkommunikation):
Code:
PROGRAM FAST
VAR
(* background communication with the EL6001 terminal *)
EL6001Control : SerialLineControl;
EL6001ControlError : BOOL;
EL6001ControlErrorID : ComError_t;
END_VAR
---------------------------------------------------------
(*==================================================================
Background communication with EL6001 terminal
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 or
with KL6001 terminals which have a small process image (3 or 5 data bytes only)
*)
EL6001Control(
Mode:= SERIALLINEMODE_EL6_22B,
pComIn:= ADR(COMin_EL6001), (* I/O data; see global variables *)
pComOut:= ADR(COMout_EL6001), (* I/O data; see global variables *)
SizeComIn:= SIZEOF(COMin_EL6001), (* I/O data; see global variables *)
TxBuffer:= TxBuffer, (* transmit buffer; see global variables *)
RxBuffer:= RxBuffer, (* receive buffer; see global variables *)
Error=> EL6001ControlError,
ErrorID=> EL6001ControlErrorID );
Code:
PROGRAM MAIN
VAR
END_VAR
--------------------------
Sample_EL6001;
Programm "Sample_EL6001":
Code:
PROGRAM Sample_EL6001
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;
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.
*)
a := a+1;
Timer(IN:=TRUE, PT:=T#1s);
IF Timer.Q OR Send.Busy THEN
Send( SendString:= '*IDN?$0A',
TXbuffer:= TxBuffer, (* see global variables *)
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:= '',
Suffix:= '',
Timeout:= T#1s,
ReceivedString:= ReceivedString,
RxBuffer:= RxBuffer,
StringReceived => StringReceived,
Busy => ReceiveBusy,
Error => ReceiveErrorID,
RxTimeout => ReceiveTimeout );
IF StringReceived THEN
ReceiveCounter := ReceiveCounter + 1;
LastReceivedString := ReceivedString;
END_IF
(*==================================================================
Background communication with the EL6001 terminal.
Please check the FAST program where the background communication with the
EL6001 terminal is processed in a separate fast task. A fast task is in this case
necessary to guarantee an acceptable transfer rate.
Code:
VAR_GLOBAL
(* I/O variables for an EL6001 terminal*)
COMin_EL6001 AT %I* : EL6InData22B; (* linked to the EL6001 in the TwinCAT System Manager *)
COMout_EL6001 AT %Q* : EL6OutData22B; (* linked to the EL6001 in the TwinCAT System Manager *)
RxBuffer : ComBuffer; (* Receive data buffer; used with all receive function blocks *)
TxBuffer : ComBuffer; (* Transmit data buffer; used with all receive function blocks *)
END_VAR