Jemand Erfahrung mit EL6021 von Beckhoff??

Cerberus

Level-1
Beiträge
2.839
Reaktionspunkte
269
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

habe eine EL6021 von Beckhoff und möchte diese aus dem PLC-Programm heraus wie folgt konfigurieren:

- Datenrahmen soll wie folgt aussehen: 8 Datenbit, 1 Startbit, 1 Stoppbit, Even-Parity
- Baudrate soll auf 9,6 kBaud eingestellt werden
- Datenübertragung soll halbduplex funktionieren, kein XON/XOFF-Protokoll, Nutzung der Klemme in einer Busstruktur, Zwischenspeicherung der Daten im Sende-FIFO, Status-Byte und Daten gemeinsam senden
- Nutzung des kleinen Prozessabbilds: Control-Byte + 3 Daten-Bytes bzw. Status-Byte + 3 Datenbytes

Hat jemand Erfahrung mit sowas und kann mir damit weiterhelfen?

Gruß Cerberus
 
Die EL6021 ist ja eine EtherCat Klemme. Diese kann man im Systemmanager Konfigurieren. Du musst diese Klemme im Systemmanager finden. Dort hat es ein Menü zum verändern der Parameter. Welche Parameter du verändern musst, findest du im Manuel der Klemme.

Gruss

Thomas
 
Das weiß ich. Aber genau solche Änderungen möchte ich aus einem Programm heraus ausführen, da ich in meinem Programm eine Initialisierung habe und die Änderungen dort auch ausführen möchte.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ahh :rolleyes: Ok dann würde ich es mal mit dem Baustein FB_EcCoeSdoWrite aus der EtherCat Bibliothek ausprobieren. Ich habe es selbst nur beim K-Bus gemacht. Da geht es ja über die Registerprogrammierung.

Da der Karteireiter CoE-Online heisst, sollte mit dem Baustein

FB_EcCoeSdoWrite
---- -----

darauf geschrieben werden können, oder ?

Gruss

Thomas
 
Hi,

hat schon jemand die KL6021 erfolgreich mittels FB_EcCoeSdoWrite konfiguriert?
Ich arbeite jetzt auch damit, und kann im Moment nur Daten der Klemme mittels FB_EcCoeSdoRead auslsesen, verändern kann ich im Run-Modus mit der Funktion aber nichts.
Erhalte im Moment im PLC-Programm den ADS Error #4: Insert mailbox error. Wie kann ich das beheben.

Hat jemand einen Tipp für mich?

Gruß
mcs
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also ich habe die KL 6021 schon erfolgreich eingesetzt. Allerdings habe ich die SDO-Funktionen nicht benutzt. Ich habe mich an die Konfigurationsanleitung gehalten, die man zu dieser Klemme auf der Beckhoff-Seite findet. Um Daten zu senden habe ich Output-Leitungen (Ctrl, SerCtrl, DataOut0..2) beschrieben.
 
@Cerberus:

Meinst Du die Konfiguration mittels Control- und Status-Wort?
Das habe ich jetzt auch probiert. Das Senden über RS422 an ein ext. Gerät scheint zu funktionieren. Es kommen aber keine Daten (DataIn0...) zurück,
Status toggelt zwischen 0 und 1. Und das obwohl ich am Oszi Datenpakete auf der Empfangsleitung sehe. Eine Variable namens SerCtrl gibt es hier nicht.

Wie hast Du den Empfang von Daten umgesetzt?

Gruß
mcs
 
@Cerberus:
Meinst Du die Konfiguration mittels Control- und Status-Wort?

Die Konfiguration über Control- und Status-Wort geht nur beim K-Bus. Oder?

Beim E-Bus werden Control- und Status-Wort für das Versenden und Empfangen von Daten verwendet.

@Cerberus:
Das habe ich jetzt auch probiert. Das Senden über RS422 an ein ext. Gerät scheint zu funktionieren. Es kommen aber keine Daten (DataIn0...) zurück,
Status toggelt zwischen 0 und 1. Und das obwohl ich am Oszi Datenpakete auf der Empfangsleitung sehe. Eine Variable namens SerCtrl gibt es hier nicht.

Welches Status Bit toggelt? Bit0 oder Bit1 ? Bit0 bestätigt das Senden und Bit1 wird getoggelt wenn Daten empfangen wurden.

Gruss

Thomas
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Stimmt, ich versuche den Versand und Empfang von Daten auf dem E-Bus.

Im Moment toggelt Bit 0 des Status-Worts.

Kurz was ich bisher versuche:

Ich initialisiere die Klemme indem ich 0x0004 in Crtl schreibe, dann Status auf 0x0004 abfrage, danach 0x0000 in Ctrl schreibe und Status auf 0x0000 abfrage. Das scheint zu klappen.

Danach habe jeweils ein Byte in DataOut0 bis DataOut4 geschrieben und Ctrl auf 0x0201 gesetzt. Dann frage ich Status auf >= 0x0001 ab und schreibe anschließend 0x1000 in Ctrl. Danach frage ich Status auf >= 0x000 ab. Die Daten sehe ich auch auf dem Oszi.

Zum Abfgragen der empfangenen Daten gehe nach Beschreibung vor. Es erscheinen aber keine Daten in DataIn0..., nur Status wechselt immer von 0x030B nach 0x030A. Ich sehe aber einen Datenstrom auf dem Oszi.

Habe 9600 Baud und 8N1 eingestellt. Intervall des Tasks liegt bei 1ms.

Vielleicht falsches timing zwischen Versand und Empfang? Oder falsche Abfrage von Ctrl?

Gruß
mcs
 
Das Empfangen funktioniert ja du holst die Daten einfach nicht ab.

Status: 0x030B

Das 3 bedeutet 3 Byte empfangen.

Das B sieht binär 1011 aus.
1011 -> Ist dieses Bit 1 läuft der Buffer über.
^

1011 -> Sobald dieses bit ändert müssen die Daten ausgelesen werden.
__^ Nach dem Auslesen muss das Bit Control.1 getoggelt werden,
damit die nächsten Daten vom empfangsbuffer übertragen werden.

Ablauf empfang:
-Status.1 wird TRUE dann Daten auslesen und Control.1 auf TRUE setzten.
-Status.1 wird FALSE dann Daten auslesen und Control.1 auf FALSE setzten.
-Status.1 wird TRUE dann Daten auslesen und Control.1 auf TRUE setzten.
- und so weiter ....


Ablauf senden:
-Daten schreiben Control.0 auf TRUE.
-Status.0 wird TRUE neue Daten in Buffer schreiben Control.0 auf FALSE setzten
-Status.0 wird FALSE neue Daten in Buffer schreiben Control.0 auf TRUE setzten
-Status.0 wird TRUE neue Daten in Buffer schreiben Control.0 auf FALSE setzten
- und so weiter ....

Gruss
Thomas
 
Zuletzt bearbeitet:
Danke für den Tipp.

Habe das versucht umzusetzen, ging aber immer noch nicht.
Nun habe ich nochmal versucht genau die Bitfolgen des Control-
und Status-Wortes von der Hilfe-Seite abzufragen.

Sieht so aus:

Initialisierung (1x): (STATUS_WORD und CONTROL_WORD sind jeweils mit Ctrl und Status verlinkt)

Zaehler := 0;

IF Zaehler = 0 THEN

CONTROL_WORD := 16#0004;
IF STATUS_WORD = 16#0004 THEN
CONTROL_WORD := 16#0000;
END_IF
IF STATUS_WORD = 16#0000 THEN
RTS := TRUE;
Zaehler := 1;
END_IF
END_IF

Daten senden: (D0...D4 sind mit den Ausgängen verlinkt)

D0 : BYTE := 16#0041; (* A *)
D1 : BYTE := 16#0044; (* D *)
D2 : BYTE := 16#0052; (* R *)
D3 : BYTE := 16#003F; (* ? *)
D4 : BYTE := 16#003B; (* ; *)

IF RTS = TRUE THEN
CONTROL_WORD := 16#0201;
IF (STATUS_WORD AND 16#0001) = 16#0001 THEN
CONTROL_WORD := 16#1000;
END_IF
IF (STATUS_WORD AND 16#0000) = 16#0000 THEN
RTS := TRUE;
END_IF
Zaehler := Zaehler + 1;
IF Zaehler = 4 THEN
Zaehler := 0;
RTS := FALSE;
RTR := TRUE;
END_IF
END_IF

Daten empfangen: (Din0...Din10 sind mit den Eingängen verlinkt)

Din0 : BYTE;
.
.
.
Din10 : BYTE;

IF RTR = TRUE THEN
IF (STATUS_WORD AND 16#0302) = 16#0302 THEN
CONTROL_WORD := CONTROL_WORD AND 16#0002;
END_IF
IF (STATUS_WORD AND 16#1600) = 16#1600 THEN
CONTROL_WORD := CONTROL_WORD AND 16#0000;
END_IF
Zaehler := Zaehler + 1;
IF Zaehler = 2 THEN
Zaehler := 0;
RTS := TRUE;
RTR := FALSE;
END_IF
END_IF

Ergebnis, Daten werden noch versandt, die Klemme zeigt aber keine empfangenen Daten mehr an.

Gruß
mcs
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Daten senden: (D0...D4 sind mit den Ausgängen verlinkt)

D0 : BYTE := 16#0041; (* A *)
D1 : BYTE := 16#0044; (* D *)
D2 : BYTE := 16#0052; (* R *)
D3 : BYTE := 16#003F; (* ? *)
D4 : BYTE := 16#003B; (* ; *)

IF RTS = TRUE THEN
CONTROL_WORD := 16#0201;
IF (STATUS_WORD AND 16#0001) = 16#0001 THEN
CONTROL_WORD := 16#1000;
END_IF
IF (STATUS_WORD AND 16#0000) = 16#0000 THEN
RTS := TRUE;
END_IF
Zaehler := Zaehler + 1;
IF Zaehler = 4 THEN
Zaehler := 0;
RTS := FALSE;
RTR := TRUE;
END_IF
END_IF

Ist das Senden wirklich korrekt? So wie es für mich aussieht werden nur 2 Byte gesendet:

CONTROL_WORD := 16#0201;
_____________________^_______Das sind die Anzahl Bytes, welche gesendet werden. Wenn du willst das alles gesendet wird, muss hier 5 stehen.

Daten empfangen: (Din0...Din10 sind mit den Eingängen verlinkt)

Din0 : BYTE;
.
.
.
Din10 : BYTE;

IF RTR = TRUE THEN
IF (STATUS_WORD AND 16#0302) = 16#0302 THEN
CONTROL_WORD := CONTROL_WORD AND 16#0002;
END_IF
IF (STATUS_WORD AND 16#1600) = 16#1600 THEN
CONTROL_WORD := CONTROL_WORD AND 16#0000;
END_IF
Zaehler := Zaehler + 1;
IF Zaehler = 2 THEN
Zaehler := 0;
RTS := TRUE;
RTR := FALSE;
END_IF
END_IF

(STATUS_WORD AND 16#0302) = 16#0302 sollte so sein (STATUS_WORD AND 16#0002) = 16#0002

3 ist die Anzahl empfangenen Bytes, die kennst du aber gar nicht, oder? Falls du 4 Byte empfängst funktioniert deine Abfrage nicht mehr.

Gruss

Thomas
 
@Bührer:

Dein Beitrag von gestern hat mein Problem gelöst!
Die Kommunikation mit dem externen Gerät läuft jetzt.

Auf die Anzahl der empfangenen und gesendeten Byte habe ich vorher
nicht wirklich geachtet. Und wieviele Bytes zurückkommen, ist jedesmal unterschiedlich.

Mcs bedankt sich...bis zur nächsten Frage. :D

Gruß
mcs
 
Zurück
Oben