Nanotec-Schrittmotor über RS485 von Beckhoff CX betreiben

End.y

Member
Beiträge
16
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo zusammen,

ich habe Schwierigkeiten zwei Nanotec PD6 N89 Motoren über die serielle Schnittstelle RS485 zu betreiben.
Mit dem Nanotec USB Kabel ZK RS485 USB und der Nanotec Software kann ich die Motoren konfigurieren und drehen lassen. Dabei gibts ja 32 Fahrprofile, die ich mir vorher anlegen kann.
Als Befehl würde ich für den ersten Motor und das erste Fahrprofil schreiben: '#1y1\r'

Anschließend habe ich versucht die Motoren über die Beckhoff EL6022 zum Laufen zu bringen, jedoch erfolglos. Dabei tun sich für mich zwei Fehlerquellen auf. Zum einen bereitet mir die Pinbelegung des 9-poligen D-Sub-Steckers kopfzerbrechen, zum anderen weiß ich nicht genau ob mein Programm richtig funktioniert.
Ich hatte bisher keinen elektrotechnischen Bezug und tue mich schwer mit der Verkabelung von Rx und Tx. Mal ist es gekreuzt, mal nicht. Desweiteren dachte ich RS485 sei ein Standard. Bei Nanotec werden aber die Pins 2 (Rx+), 4 (Tx+) , 7 (Rx-) und 9 (Tx-) belegt, bei Beckhoff 2 (Tx+), 3 (Rx+), 7 (Tx-) und 8 (Rx-). Dazu kommt noch, dass in der Beckhoffdoku zur EL6022 unter Anschlüsse bei RS485 von halbduplex die Rede ist und ich mir nicht sicher bin, ob die Motoren damit überhaupt zum Laufen gebracht werden können. Im halb-duplex-Betrieb bräcuhte ich ja dann Verbindungen jeweils zwischen Rx+ und Tx+ sowie Rx- und Tx-. Für mich als Laie klingt das eher nach Kurzschluss :rolleyes:

Hier mal noch der bisherige Programmausschnitt, fall die Verpinnung dann mal passen sollte.
Ich habe mir folgendes Programm für die serielle Schnittstelle erstellt und teste alsBefehl für den ersten Motor und das erste Fahrprofil: '#1y1\r'.
Code:
PROGRAM Background_Serial
VAR
    fbEL6022_1 : SerialLineControl;        // Interface Controller für Hintergrund Kommunikation (22 Byte)
    bEL6022Error_1 : BOOL;                
    eEL6022ErrorID_1 : ComError_t;
    
    // I/O Variablen
    stInEL_1 AT%I* : EL6inData22B;
    stOutEL_1 AT%Q* : EL6inData22B;
    
END_VAR
Im Programmteil steht dann:
Code:
fbEL6022_1(
    Mode:= SERIALLINEMODE_EL6_22B, 
    pComIn:= ADR(stInEL_1), 
    pComOut:= ADR(stOutEL_1), 
    SizeComIn:= SIZEOF(stInEL_1), 
    Error=> , 
    ErrorID=> , 
    TxBuffer:= TxBufferEL_1, 
    RxBuffer:= RxBufferEL_1);
    
IF fbEL6022_1.Error THEN
    bEL6022Error_1 := TRUE;
    eEL6022ErrorID_1 := fbEL6022_1.ErrorID;
END_IF

Anschließend soll mit der FB_Serial die Kommunikation gewährleisten:
Deklarationsteil:
Code:
FUNCTION_BLOCK FB_Serial
VAR_INPUT
END_VAR
VAR_IN_OUT
    TxBuffer : ComBuffer;
    RxBuffer : ComBuffer;
END_VAR
VAR_OUTPUT
END_VAR
VAR
    fbSend : SendString;
    bSendBusy : BOOL;
    eSendErrorID : ComError_t;
    sCommand : STRING;
    bSend : BOOL;
    fbReceive : ReceiveString;
    sReceiveString : STRING;
    
    nstate: INT;
    bdrehen: BOOL;
END_VAR

Im Programmteil steht zum testen folgendes:
Code:
IF bSend THEN
    bsend := FALSE;

    fbSend(SendString:= sCommand, 
            Busy=> bSendBusy, 
            Error=> , 
            TXbuffer:= TxBuffer);
END_IF

IF fbSend.Error <> COMERROR_NOERROR THEN
    eSendErrorID := fbSend.Error;
END_IF

fbReceive(
    Prefix:= , 
    Suffix:= , 
    Timeout:= T#1S, 
    Reset:= , 
    StringReceived=> , 
    Busy=> , 
    Error=> , 
    RxTimeout=> , 
    ReceivedString:= sReceiveString, 
    RXbuffer:= RxBuffer);


Es wäre super, wenn mir jemand sagen könnte, wie ich die Motoren verpinnen muss, da ich mittlerweile schon einiges getestet habe und nicht mehr weiter weiß.

Viele Grüße
Yannik
 

oliver.tonn

Well-known member
Beiträge
4.389
Punkte Reaktionen
722
Hallo Yannik,
dann versuche ich mal etwas Licht ins Dunkel zu bringen. Bei RS485 ist nur der Pegel definiert, nicht aber die Steckerbelegung. Bei Deiner Anwendung müsstest Du bei Vollduplex deinen Motor folgendermaßen mit der EL6022 verbinden:

Motor
Beckhoff
2 (RX+)
2 (TX+)
4 (TX+)3 (RX+)
7 (RX-)7 (TX-)
9 (TX-)8 (RX-)

Beim Halbduplex Betrieb müssen auf beiden Seiten die RX und TX Leitungen mit dem gleichen Vorzeichen jeweils verbunden werden also 2/4 und 7/9 auf Motorseite und 2/3 und 7/8 auf Beckhoffseite. Einen Kurzschluss gibt s da nicht, aber es muss natürlich Halbduplex auf beiden Seiten aktiviert sein.
Dann machst Du in Deinem Programm den klassischen Anfängerfehler, Du rufst den Sendebaustein nur einen Zyklus lang auf und dann noch innerhalb einer If-Abfrage auf. Sowohl der Sende, als auch der Empfangs FB sollten immer (z.B. am Anfang) aufgerufen werden und in If-Abfragen oder Case-Anweisungen, setzt Du dann nur noch die jeweiligen Eingänge des FBs und fragst die Ausgänge ab.
 
Zuletzt bearbeitet:
OP
E

End.y

Member
Beiträge
16
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo Oliver,

danke für deine schnelle Antwort. Leider habe ich auch mit der nachfolgenden Case Anweisung im FB-Serial keinen Erfolg. Die Pins habe ich schon so belegt wie du es vorschlägst. In den Beckhoff Einstellungen kann ich auf Halbduplex umschalten, bei NanoPro finde ich solch eine Einstellung leider nicht. Ich kann zwischen den Anschlussarten seriell und parallel wählen, sonst habe ich bisher nichts passendes entdeckt.

Ist für die EL6022 zwingend der halbduplex-Betrieb notwendig, denn so lese ich das aus der Beckhoff Dokumentation?


Code:
CASE nstate OF
    0 :    (*Warten auf START*)
        IF bdrehen THEN
            nState := 10;
            sCommand := '#1y1\r';
            bSend := TRUE;
        END_IF
    
    10:    (*warten auf Empfang*)
        IF  sReceiveString ='#1y1' THEN
            nState := 20;
            sCommand := 'A';
            bSend := TRUE;
        END_IF
        
    20:    (*warten auf Stop*)
        IF  sReceiveString ='#1A\r' AND NOT bdrehen THEN
            nState := 30;
            sCommand := 'S';
            bSend := TRUE;
        END_IF
    
    30:    (*warten auf Empfang*)
        IF  sReceiveString ='S' THEN
            nState := 0;
            
        END_IF
    
END_CASE


IF bSend THEN
    bsend := FALSE;

    fbSend(SendString:= sCommand, 
            Busy=> bSendBusy, 
            Error=> , 
            TXbuffer:= TxBuffer);
END_IF

IF fbSend.Error <> COMERROR_NOERROR THEN
    eSendErrorID := fbSend.Error;
END_IF

fbReceive(
    Prefix:= , 
    Suffix:= , 
    Timeout:= T#1S, 
    Reset:= , 
    StringReceived=> , 
    Busy=> , 
    Error=> , 
    RxTimeout=> , 
    ReceivedString:= sReceiveString, 
    RXbuffer:= RxBuffer);


Viele Grüße
Yannik
 

oliver.tonn

Well-known member
Beiträge
4.389
Punkte Reaktionen
722
Das liegt eventuell daran, weil Du nicht umgesetzt hast, was ich Dir in #2 geraten habe. Der FB fbSend ist immer noch in einer If-Abfrage und wird immer noch nur einen Zyklus ausgeführt.
Vielleicht stört er sich auch daran, dass Du sCommand nicht auf 80 Zeichen begrenzt hast, denn SendString kann maximal 80 Zeichen verarbeiten.
Zum Motor habe ich kein Handbuch gefunden, darum kann ich nur Vermutungen anstellen. Ich vermute mal parallel heißt bei denen Vollduplex und Seriell Halbdublex. Könntest Du das Handbuch mal hier anhängen?
 
OP
E

End.y

Member
Beiträge
16
Punkte Reaktionen
0
Ich werde also versuchen den fbSend über mehrere Zyklen auszuführen und sehen was passiert. Vorsichtshalber begrenze ich auch den sCommand auf 80 Zeichen.

Das Handbuch zu den Motoren gibt es hier: https://de.nanotec.com/fileadmin/files/Handbuecher/Plug_Drive/PD6-N_Technisches-Handbuch_V1.5.pdf
Ein Programmierhandbuch zu den Motoren hier: https://de.nanotec.com/fileadmin/files/Handbuecher/Programmierung/Programmierhandbuch_V2.7.pdf

Gestern ist mir noch aufgefallen, dass sich die Dokumentation der "enable-half-duplex"-Einstellung in der Beckhoff EL6022 unter dem Index 80n0:06 widerspricht.
Dort steht auf Seite 46/47: Wenn "Enable half duplex" auf 0 und "enable point to point connection" auch auf 0 stehen, empfängt die Klemme ihre eigenen und die Daten anderer Teilnehmer.
Rein von der Logik gehe ich doch aber davon aus, dass sie ihre eigenen und Daten anderer empfängt, wenn "Enable half duplex" aktiviert, also auf 1 steht. Oder habe ich da einen Denkfehler.
Die Dokumenation gibt es hier: https://download.beckhoff.com/download/document/io/ethercat-terminals/el600x_el602xde.pdf

Schöne Grüße
Yannik
 

oliver.tonn

Well-known member
Beiträge
4.389
Punkte Reaktionen
722
Zuviel Werbung?
->Hier kostenlos registrieren
Soweit ich das richtig nachgelesen habe ist RS485 immer Halbdublex, also am besten auf beiden Seiten jeweils RX+ und TX+, sowie RX- und TX- verbinden. In der Konfiguration der EL6022 muss dann Halbduplex aktiviert sein, ansonsten würde die Schnittstelle ihre eigenen Daten empfangen, weil RX und TX ja gebrückt sind. Hast Du an den jeweiligen Bus-Enden auch 120Ohn Abschlusswiderstände montiert?
Ich hatte hier beim Kunden mal das Problem, dass eine Kommunikation mit einem Servo über einen USB/RS-485 Konverter funktionierte, an der EL6021 aber keine Kommunikation zustande kam. Der Grund waren die sogenannten Bias-Widerstände, die in der EL6021/22 verbaut sind. Diese sollen die Datenleitungen auf einen festen Pegel ziehen, allerdings waren sie mit 1kOhm zu niedrig, da der Servo auch welche verbaut hatte. Als ich dann die EL6021-0021 eingesetzt hatte funktionierte alles. Von der EL6022 gibt es derzeit leider keine Version mit einem größeren Bias-Widerstand.
 
OP
E

End.y

Member
Beiträge
16
Punkte Reaktionen
0
Hallo wieso,
ja es konnte gelöst werden. Vor welchem Problem stehst du genau?

Viele Grüße
Yannik
 
Oben