TwinCAT 2 - EL6001 - Daten über RS232 senden/empfangen

AirHubi

Level-1
Beiträge
5
Reaktionspunkte
2
Zuviel Werbung?
-> 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):
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 );
Programm "MAIN":
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.
Globale Variablen:
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
 

Anhänge

  • UM-6560_6590-acsource-v1.4-112012.pdf
    2,5 MB · Aufrufe: 3
Hast Du es denn mal ganz simpel am Rechner mit einem Terminalprogramm getestet?
Das würd ich bei rs232 sofort als erstes testen, ob sich die Gegenstelle wie erwartet verhält.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das Erste was ich machen würde: Schau ob in den Eingängen (Data) alle Wert 0 sind.
Prinzipiel übermittelt die Klemme dem System die Daten und die Datenlänge (im StatusWord). Per Handshake (ControlWord) sagt die SPS dann das die Werte abgeholt wurden - die Klemme überschreibt mit neuen Daten (und Info wie viele Bytes im StatusWord).
Wenn die Werte alle 0 sind dann wurde noch nie etwas empfangen.
Wenn sie != 0 sind dann ruf nicht den Receive-Baustein auf sondern schaue in den ca 300 Byte Puffer des SerialLineControl-Bausteins (in der Annahme das du jetzt < 300 Byte empfängst) und überlege dir was geschickt wurde.
 
Hallo Plan_B, hallo Guga,
vielen Dank für eure Anmerkungen.

@Plan_B : Danke für den Hinweis. Werde ich testen. Bin gerade dabei mir einen Rechner zu besorgen, der noch einen COM-Port besitzt und auf dem zusätzlich noch ein Terminalprogramm (z.B. Hyperterminal) installiert ist.

@Guga : Die Eingänge (Data) sind alle Werte 0. Somit noch nie etwas empfangen. Das Seltsame ist einfach, dass ich zwar Befehle senden kann, die auch vom Netzteil ausgeführt werden, mir das Netzteil aber nie eine Rückmeldung liefert, wenn ich Befehle/Anfragen sende, die einen Rückgabewert liefern sollten.

Ich versuche, diese Woche mal die Remote-Ansteuerung anderer Elektronik/ Messgeräte zu implementieren, um zu bewerten, ob event. das RS232-Interface des Netzteils das Problem ist...
 
Hallo zusammen,

ich habe das Problem gefunden. CTS und RTS waren nicht verdrahtet, weshalb die Kommunikation bei den "Standard"-Einstellungen nicht funktioniert hat. Jetzt läuft alles :)

Viele Grüße und schönes Wochenende! :D
 
Zurück
Oben