Geber Absolutwert über RS-485 (X13) abfragen

Flip5

Level-1
Beiträge
4
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Tag Forum,

ich habe ein Problem, bei dem mir der Support nicht so richtig weiter geholfen hat.

Ich möchte mit einem National Instruments controller über eine RS-485 Schnittstelle den Absolutwert der Motorgeber auslesen (angeschlossen an X15). Es sind zwei MDX61B FU mit AG7W Geber verbaut. Den Controller (NI 9056+NI 9871) kann ich ziemlich frei über Labview programmieren, angeschlossen ist er über die RS-485 Schnittstelle an X13.

Ich habe bereits einige Handbücher von SEW zur seriellen Kommunikation gelesen und bin mit meinem Latein am Ende. Der Support hat mir ein kleines Ipos Programm geschrieben und meinte, dass der Wert jetzt über RS-485 zur Verfügung steht, hat aber sonst keine weiteren Details zur Abfrage preisgegeben.

Ich nehme an, dass ich ein Request-Telegramm schicken muss und habe mir das auch schon als Binärcode aufgeschrieben und das Blockprüfzeichen bestimmt.
Allerdings sehe ich mit Moviscan keine Telegramme und bekomme dementsprechend auch keine Antwort.

Habe ich etwas grundlegend falsch gemacht? Lassen sich die Absolutwerte auch auf einem einfacheren Wert auslesen?

Als Requesttelegramm habe ich folgendes in Binär konvertiert: 02hex Startbyte + FEhex Universaladresse + 86hex Parameterkanal + 5Ehex Blockprüfzeichen
Das Ipos Programm ist angehängt, die Dateiendung muss nur wieder auf ipc angepasst werden.

Vielen Dank im Voraus für eure Hilfe!

Flip5
 

Anhänge

  • RS485.txt
    1,5 KB · Aufrufe: 19
Da bisher niemand auf meinen Beitrag reagiert hat schätze ich, dass ich auf dem Holzweg bin. Ich wäre auch für alternative Lösungen offen! Oder Hinweise, wo ich komplett daneben liege :D
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Liegt es an der angehängten .txt Datei? :D Das Problem habe ich übrigens noch nicht gelöst und wäre nach wie vor über einen Tipp dankbar, auch wenn ich einen anderen Ansatz verfolgen sollte.
 
Moin,

was hast du im Umrichter eingestellt?
Hast du X13:10 und X13:11 bereits konfiguriert (P101, P750, P810......)?

Grüße
 
Ok, ich versuche es mal.

Du hast schon von serieller Kommunikation gesprochen, ich denke mal dass du auf das handbuch mit der Nr. 10531602/DE ansprichst (Ausgabestand 11/2001). Es ist das einzige mir bekannte Nachschlagewerk zu dem Thema und hat bis heute Gültigkeit, auch für das Movidrive B.

Es ist immer wieder vom MoviLink-Profil zu lesen. Dieses "Profil" setzt im Wesentlichen darauf auf, dass SEW versucht hat, ein Profil zu definieren, mit dem es über alle Kanäle (CAN, RS485, Profibus, ...) die gleiche Art und Menge an Daten übertragen kann. Das setzt fast immer auf 0-3 Wörter (á 16 Bit) zyklische Prozessdaten und einen azyklischen Parameterkanal (8 Byte) auf. Man wird daher in allen Beschreibungen immer wieder die ganzen Variante finden
  • 0 PD + Param
  • 1 PD + Param
  • 2 PD + Param
  • 3 PD + Param
  • 1 PD
  • 2 PD
  • 3 PD
Zum Teil gibts auch noch Varianten mit 4 PD, 6 PD und 10 PD. Nur so am Rande.

Du hast jetzt also prinzipiell 2 Möglichkeiten:
  1. Die Position auf den Prozessdatenkanal zu legen, so dass ihn dir der Umrichter quasi von sich aus ständig schickt
  2. Die Position azyklisch beim Umrichter anzufragen mit Request-Response
Ersteres ist schneller, aber auf 3 PD beschränkt und zudem musst es am Umrichter entsprechend einstellen, zweiteres ist langsamer, aber unendlich flexibel.

In weitere Folge musst du dich natürlich auch noch für eine Schnittstelle entscheiden. Da du RS485 verwenden möchtest gibts am Movidrive B immer noch 2 Möglichkeiten
  1. RS485 #1 über die Klemmen am Stecker X13
  2. RS485 #2 über den RJ10-Stecker (auch XT genennt)
Die Baudrate der Schnittstelle #1 wird mittels DIP-Schalter S13 eingestellt.

Nun ist es ander Zeit sich den IPOS-Code genauer anzusehen:
Code:
/*=============================================
              IPOS-Quelldatei
===============================================*/
#include <constb.h>
#include <iob.h>
#pragma globals    128 339
#pragma var        340 355

GSPODATA10 Podata;
SSPIDATA10 Pidata;
/*=============================================
                   Task2
===============================================*/
Task2()
  {
   _GetSys(Podata ,GS_PODATA  );


   Pidata.PI2 = ActPos_Mot >>16;
   Pidata.PI3 = ActPos_Mot & 0xFFFF;
   _SetSys( SS_PIDATA,Pidata );
  }
/*=============================================
                   Task3
===============================================*/
Task3()
  {


  }
/*=============================================
   Hauptfunktion (IPOS-Eintrittsfunktion)
===============================================*/
main()
  {

  /*-------------------------------------
             Initialisierung
  --------------------------------------*/
    Podata.BusType = 2;    //1 = S0 (RS485 #1)an  X13 ||  2 = S1 (RS485 #2)an  XT
    Podata.Len     = 3;
    Pidata.Len     = 3;
     /*
    0 = reserviert


    3 = Feldbus
    4 = reserviert
    5 = SBus
    8 = SBus 2  */

  // Task2 aktivieren
  _SetTask(ST2_START, Task2);

  // Task3 aktivieren
  _SetTask(ST3_START, Task3);

  /*-------------------------------------
        Hauptprogramm-Schleife
  --------------------------------------*/
  while(1)
    {


    }

  }

Ich fange am besten von hinten an.
Im Programm Task2() wird zuerst mit dem Kommando
Code:
_GetSys(Podata ,GS_PODATA  );
der Prozessdatenpuffer eingelesen, PoData ist dabei die "Zielvariable", GS_PODATA das Kommando für die Funktion _GetSys.
Anschließend wird die 32 bittige Istposition ActPos_Mot (=H511 = Istposition des Motorgebers an X15 mit der Auflösung 4096 Inkremente pro Motorumdrehung) in 2 x 16 Bit Wörter gesplittet und auf Elemente der Variable PiData geschrieben.
Zuletzt werden mit dem Kommando
Code:
_SetSys( SS_PIDATA,Pidata );
die Prozessdaten aus der Variable PiData raus geschrieben.

Wichtig dabei zu wissen ist:
  1. PI/PO-Data ist immer aus Sicht des Masters, das Movidrive sendet also die PI-Daten und empfängt PO-Daten
  2. in den Variable PiData und PoData sind nicht nur die Daten, sondern auch die Konfiguration mit drinnen

Diese Konfiguration wird zuvor bei der Initialisierung durchgeführt, und zwar im Programm main().
Ich beginne mit PoData:
Das Movidrive hat für jede Schnittstelle einen eigenen Eingangspuffer für die PO-Prozessdaten. D.h. man muss dem Befehl _GetSys irgendwie sagen, von welchem Puffer er lesen soll und wieviel. Das geschieht hier mit
Code:
    Podata.BusType = 2;    //1 = S0 (RS485 #1)an  X13 ||  2 = S1 (RS485 #2)an  XT
    Podata.Len     = 3;
Theoretisch könnte man damit auch von 4 seriellen Schnittstellen unterschiedliche Daten einlesen, das ist hier aber nicht relevant. Deine Anwendung braucht an sich gar keine PO-Daten, weshalb man das nicht weiter betrachten muss.

Bei den PiDaten ist es nicht ganz so kompliziert. Es gibt an sich nur einen PI-Datenspeicher, der aber auf alle seriellen Schnittstellen ausgegeben wird. Aber (und das ist wichtig) dort muss sie jemand abholen bzw. haben wollen. Und: es kann sein, dass die Firmware direkt in den PI-Datenspeicher rein spuckt.
Deswegen sollte man sich zuerst die Parameter P873, 874 und 875 ansehen. Steht da irgendetwas anderes als IPOS-PI-Data (dt: IPOS PE-Daten), dann wird dieses Prozessdatenwort direkt von der Firmware beschrieben und der Befehl _SetSys( SS_PIDATA, ...) verpufft im nichts. So wie dein IPOS-Programm geschrieben ist sollten zumindest P874 und P875 auf IPOS PE-Data eingestellt werden.


Zuletzt kommen wir noch zum Punkt, wo sich ein serieller Master die Daten abholen kommt. Im Prinzip läuft das immer nach dem Prinzip
  1. Master schickt Telegramm mit PO-Daten
  2. Movidrive antwortet sofort mit PI-Daten

Der genaue Aufbau des RS485-Telegramms ist dann im o.g. Handbuch in Kapitel 4 beschrieben. Der PDU-Typ wäre dann 5 (Seite 23), die Länge der PDU ist 6 Byte. Dein RS485-Master muss zyklisch Request-Telegramme senden.
Bzgl. Timeout und Adresse sei auf die Parameter 810 und 812 verweisen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für deine ausführliche Antwort, ich hatte das Thema schon abgeschrieben und fast vergessen. Morgen arbeite ich deine Antwort mal durch und berichte vom Ergebnis!

Vielen Dank!!!
 
Zurück
Oben