DeviceNet Buskoppler emulieren mit DeviceNet-PC-Karte

  • Hallo,


    über eine Device-Net-Karte (Hilscher CIFX 50E-DN (M/S) PCIe) möchte ich binäre Steuersignale an eine Robotersteuerung (KUKA KRC2 ) übertragen, und zwar genau so, wie ein Buskoppler (z. B. http://www.beckhoff.de/default…ents/system_devicenet.htm) elektrische Steuersignale als Byte-Array auf den Feldbus wandelt. Wie muss denn das Datenpaket konkret aussehen? Wird zyklisch (objektorientierte Mail) oder azyklisch übertragen?
    Ich finde leider keine konkreten Protokollbeschreibungen diesbezüglich. Hat jemand von Euch noch eine Idee.


    Viele Grüße
    Daniel

  • ANZEIGE
  • Hallo Daniel,


    DeviceNet kennt die Modi "Poll", "Strobe", "CoS", und "Cyclic". Die KRC2-MFC als Scanner arbeitet immer im Modus ""Poll".


    Einfach deine Hilscher-Karte auf Poll-Modus parametrieren, die gewünschte Anzahl an Bytes mappen & die MAC-ID festlegen. Danach auf der KRC2 diese zwei Zahlen in den KRC2-Dateien devnet.ini (MAC-ID), sowie iosys.ini (BYTES) eintragen.


    Einige Devicenet-Slaves fügen noch selbständig ein Diagnosebyte in das Eingangsabbild (aus Sicht vom Scanner) ein, falls das deine Hilscher-Karte auch macht, musst du in der KRC2 halt ein Eingangsbyte mehr parametrieren.


    Grüsse, APT

    APT Techniques GmbH<br />Software-Entwicklung für Roboter &amp; SPS.

  • Hallo APT,


    vielen Dank für Deine hilfreiche Antwort. Dass die Übertragung funktioniert konnte ich per Telnet prüfen.


    In den Programmablauf habe ich eine Interuptroutine eingebaut, die, wenn $IN[0]== TRUE ist, ein BRAKE veranlassen soll. Leider tut sich nichts, wenn ich den Eingang während des Programmablauf schalte. Muss ich noch irgendetwas anderes einstellen, oder ist vielleicht $IN[0] schon irgendwie anderweitig belegt? Wie finde ich das heraus? Getestet habe ich im Automatik-Modus. Geht das evtl. nur im Automatik-Extern Modus?


    Viele Grüße
    Daniel

  • Hallo DanielK,


    Davon ausgehend, dass der Eingang funktioniert:


    - Ist dein Interrupt aktiv? (Menü Anzeige->Diagnose->Interrupts)
    ...der Menüeintrag ist nur in Benutzergruppe Experte anwählbar


    Die Betriebsart des Roboters spielt keine Rolle.


    Gruss, APT

    APT Techniques GmbH<br />Software-Entwicklung für Roboter &amp; SPS.

  • Hallo APT,


    in meinem Testfahrprogramm habe ich zum bestehenden Interupt 3 der auf das Signal $STOPMESS reagiert einen Interupt 4 definiert und aktiviert, der auf meinen Eingang $IN[0] reagieren soll. Seltsamer weise taucht dieser zur Laufzeit nicht in dem Diagnosefenster auf, sondern nur die 3. Dann habe ich testweise $STOPMESS durch meinen $IN[0] ersetzt, um damit das Signal wenigstens auf dem Interupt 3 zu testen. Aber auch hier tut sich nix. Im Programmierhandbuch steht was von einer E/A-Aktivierung durch die Variable $I_O_ACT, was aber nur im externen Modus funktioniert?


    Viele Grüße
    Daniel

  • Hallo Daniel,


    In solchen Fällen ist es hilfreich, wenn du deinen Code postest.


    Du hast unbeantwortet gelassen, ob du deinen Interrupt im Diagnosefenster siehst, und ob er aktiv ist.


    Ob der Eingang $IN[0] belegt ist musst du mit Verlaub selbst wissen, schliesslich wird ein Eingang von einer externen Steuerung beschrieben, oder kommt über ein Eingangsmodul rein. Bevor du dich um Interrupts kümmerst stelle ich daher doch mal die Frage in den Raum, ob deine E/A Schnittstelle überhaupt funktioniert. Hast du dir bevor du das BRAKE-Problem gemeldet hast angeschaut ob $IN[0] funktioniert? (Anzeige->Ein-/Ausgänge)


    Hier ein Beispiel, bei dem der Roboter mit sanfter Rampe stoppt, und die Bewegung fortsetzt sobald das Eingangssignal wieder 0 ist. Soll das nicht der Fall sein, ein RESUME ergänzen. Details dazu sind in der Doku beschrieben.


    INTERRUPT DECL 21 WHEN diBrake==TRUE DO InterruptBrake ( )
    INTERRUPT ON 21


    ...


    DEF InterruptBrake ( )
    INTERRUPT OFF 21
    BRAKE
    WAIT FOR NOT diBrake
    INTERRUPT ON 21
    END

    Gruss, APT

    APT Techniques GmbH<br />Software-Entwicklung für Roboter &amp; SPS.

  • Hallo APT,


    vielen Dank für das InterruptBrake-Beispiel. Das habe ich auch bei mir in den Code so eingebaut. Leider habe ich keine Möglichkeit, Daten aus dem Kuka-herauszubekommen (wegen Codebeispielen), da der USB-Anschluss nicht funktioniert und der Kuka auch nicht im Netzwerk ist.


    Die Eingänge (Anzeige->Ein-/Ausgänge) habe ich überprüft. Die Lämpchen schalten korrekt auf ROT um, wenn ich das Signal setze. Also das funktioniert.


    Was nicht funktioniert ist die Aktivierung des Interupts.
    In meinem Beispiel-Unterprogramm ist folgende Routine bereits implementiert gewesen (nicht von mir):


    ;FOLD INI
    ;FOLD BASISTECH INI
    GLOBAL INTERRUPT DECL 3 WHEN $STOPMESS==TRUE DO IR_STOPM ( )
    INTERRUPT ON 3
    BAS (#INITMOV,0 )
    ;ENDFOLD (BASISTECH INI)
    ;FOLD SPOTTECH INI


    Ich habe meinen Interupt auf folgende Weise ergänzt:
    ;FOLD INI
    ;FOLD BASISTECH INI
    GLOBAL INTERRUPT DECL 3 WHEN $STOPMESS==TRUE DO IR_STOPM ( )
    INTERRUPT ON 3
    INTERRUPT DECL 21 WHEN $IN[0]==TRUE DO IR_BRAKE ( )
    INTERRUPT ON 21
    BAS (#INITMOV,0 )
    ;ENDFOLD (BASISTECH INI)
    ;FOLD SPOTTECH INI


    auch mal mit/ohne GLOBAL - Schlüsselwort, ENABLE hat auch nix gebracht. Sie werden mir nie unter Menü Anzeige->Diagnose->Interrupts angezeigt. Da ist nur der GLOBALE INTERUPT 3 zu sehen. Komischerweise, selbst dann, wenn ich die Nummer in der oben genannten Zeile ändere. So als hätte diese Zeile überhaupt gar keine Bedeutung???


    Mein Unterprogramm wird von einem übergeordneten Programm cell.src aufgerufen. Auch da ist der Interupt 3, genauso wie im Beispiel deklariert.
    Ich habe meine Interupt-Deklaration dahin verschoben, doch auch hier funktioniert sie nicht. :nocheck:


    Viele Grüße
    Daniel.

    Einmal editiert, zuletzt von DanielK ()

  • Hm, was soll ich sagen. Ich habe noch ein bissl herumgewurschtelt und jetzt gehts. War wahrscheinlich nur ein Schreibfehler INTERUPT statt INTERRUPT und ich habe versucht auf Eingang 1 mit $IN[0] zuzugreifen anstatt mit $IN[1]. Komisch, dass keine Fehlermeldung beim compilieren kam. Jetzt hab ich es so wie es unten steht und so funktioniert es prima. Nochmal :danke: für die Tips APT.


    Gruß Daniel


    ...
    DEF PROG ()
    ;FOLD INI
    ;FOLD BASISTECH INI
    GLOBAL INTERRUPT DECL 3 WHEN $STOPMESS==TRUE DO IR_STOPM ( )
    INTERRUPT ON 3
    BAS (#INITMOV,0 )
    ;ENDFOLD (BASISTECH INI)
    ;FOLD USER INI
    ; Make your modification here
    WAIT FOR NOT $IN[1]
    INTERRUPT DECL 4 WHEN $IN[1]==TRUE DO IR_BRAKE ( )
    INTERRUPT ON 4
    ;ENDFOLD (USER INI)
    ;FOLD SPOTTECH INI
    ...
    LOOP
    ...
    ENDLOOP
    END
    DEF IR_BRAKE()
    INTERRUPT 4 OFF
    BRAKE
    WAIT FOR NOT $IN[1]
    INTERRUPT 4 ON
    END

Erstelle ein Benutzerkonto oder melde dich an um zu kommentieren

Du musst ein Benutzerkonto haben um einen Kommentar hinterlassen zu können

Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Geht einfach!
Neues Benutzerkonto erstellen
Anmelden
Du hast bereits ein Benutzerkonto? Melde dich hier an.
Jetzt anmelden