TIA S7-1200 mit Dryve D1 Steuerung über Modbus TCP verbinden

SPS'ler

Level-2
Beiträge
154
Reaktionspunkte
4
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Ihr Lieben,

Ich habe im Moment ein Problem mit einem DC Motor von Igus der an einer Dryve D1 Steuerung angeschlossen ist. Diesen Motor möchte über den Modbus TCP mit einer S7-1200 steuern.

Diese Befehle bräuchte ich für meinen Ablauf:

- Tipp positiv entlang der Achse
- Tipp negativ entlang der Achse
- Aktuelle Position
- Zielposition zum eingeben
- Rückmeldung Ziel erreicht
- Start der Bewegung
- Stopp der Bewegung

Leider bin ich mir nicht sicher wie ich diese Befehle ändern bzw. überschreiben kann. Ich habe ein Beispielprogramm bekommen wo eine Verbindung hergestellt wird und eine Schwenkbewegung ausgeführt wird (s. Anhang). Leider kann ich nicht wirklich herausfiltern was ich löschen muss (was ich nicht brauche) und wie ich meine Befehle übergeben kann.

Ich hoffe ihr könnt mir helfen.

Vielen Dank und schönes Wochenende, wenn es bald soweit ist.

Grüße
 

Anhänge

Das kack Beispiel von Siemens brauchst du dir nicht ansehen..... RTU und TCP sind anders. V20 und Deine Dryve D1 haben auch nichts gemeinsam.
Hast du die
Dryve D1 Steuerung zum Testen zur Verfügung ??? oder soll das eine Trockenübung werden ?

Erstmal solltest du das Handbuch zur
Dryve D1 Steuerung 2-3 lesen bevor Du versuchst in einem Fremden Beispiel Projekt etwas zu ändern.
 
Hallo,

Ja leider konnte ich mit dem Beispiel von Siemens nichts anfangen.

Das Handbuch der Dryve D1have ich gelesen und die Befehle generell auch verstanden. Die sind ja die gleichen wie in der Anleitung unter Can-Bus beschrieben. Ich glaube ich komme mit der Anbindung an meine Schrittkette nicht klar, also wie ich diese Befehle sauber steuere und auslese. Außerdem ist ja in dem Beispielprojekt ein anderer Anwendungsfall gegeben und ich möchte nicht zu viel löschen.

Ich habe eine Steuerung mit Motor auf der Linearachse zur Verfügung.

Vielen Dank für die Mühe und ich hoffe ich kann noch eine Erklärung finden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der Dryve D1 ist wirklich interessant. Da demnächst ein Projekt kommt mit kleinen DC-Motoren spiele ich mit dem Gedanken
so eine Steuerung über unseren Einkauf für einen Test zu bestellen.
Weiß nicht wie schnell Du ein paar Infos brauchst.... aber wenn es bei Dir nicht so eilig ist dann könnten wir uns etwas Austauschen.
Das Beispiel von Dir würde ich nicht benutzen sonder lieber was eigenes machen. Da weiß man dann auch wo man suchen muß wenn etwas nicht so funktioniert.


 
Hallo,

Ja leider ist es eilig (ca. 3 Wochen) bis dahin wollte ich eigentlich damit soweit durch sein :)

Ja über das selber machen habe ich auch schon nachgedacht, habe dann nur noch weniger Übersicht über die Möglichkeit zur Ansteuerung. Leider finde ich auch keine Anleitung wo das beschrieben ist, sondern immer nur welche Befehle es gibt.
 
Diese Befehle bräuchte ich für meinen Ablauf:

- Tipp positiv entlang der Achse
- Tipp negativ entlang der Achse
- Aktuelle Position
- Zielposition zum eingeben
- Rückmeldung Ziel erreicht
- Start der Bewegung
- Stopp der Bewegung
Sie muste Anfangen mit Einschalten von die Dryve
Steps im Automatik NW 2 bis NW 6 SDO OperationEnabled.
Die Homing verfahren NW 11bis NW 15
Mode of Operation auf 1 schalten (NW16)

Tipbetrieb : steht im Hand.
Aktuelle Position : OB1 NW 4
Rückmeldung Ziel erreicht : Statusword.bit 10 (OB1 NW9)
Start der Bewegung : Controlword bit 04 (NewSetpoint1) Oder 16#00_1F und wenn SW. bit12 wieder auf 16#00_0F.
Stopp der Bewegung : Controlword 16# 00_8F

Im SDO_Read1 und SDO_Write1 ist auch ein kleines problem, In NW 4 wurde zuruck gesprongen nach NW 3 wenn DB_Modudbus.SDO_READ_REQ1 TRUE ist.
Wenn die netwerk verbinding unterbrochen wurde oder die 24V spanning an Dryve ist nicht da geht die SPS in Stop wegen zykluszeit überscheidung. Ich habe ein FB geschrieben mit ein CASE wobei in jede Step die auftrag fúr meine X und Y Achse geschrieben oder gelesen wurde. in die SDO_Read"s und SDOPWrite"s habe ich die JMP in NW 4 gelöst, Die Zyklus zeit ist heute viel konstanter wie mit das Igus Beispiel. In das beispiel finden Sie im SDO Read-Write-User auch codes fúr weitere befehlen.

Code:
    Input                                
    Reset    Bool    false    Nicht remanent    True    True    True    False    
    HomingSpeed    UDInt    0    Nicht remanent    True    True    True    False    
    Homing_Acc    UDInt    0    Nicht remanent    True    True    True    False    
    SollPosition    "X_Y DINT"        Nicht remanent    True    True    True    False    
    X    DInt    0    Nicht remanent    True    True    True    False    
    Y    DInt    0    Nicht remanent    True    True    True    False    
    Velo    "X_Y UDINT"        Nicht remanent    True    True    True    False    
    X    UDInt    0    Nicht remanent    True    True    True    False    
    Y    UDInt    0    Nicht remanent    True    True    True    False    
    Acc    "X_Y UDINT"        Nicht remanent    True    True    True    False    
    Output                                
    SW_1    Word    16#0    Nicht remanent    True    True    True    False    
    SW_2    Word    16#0    Nicht remanent    True    True    True    False    
    PosActualValue    "X_Y DINT"        Nicht remanent    True    True    True    False    
    VeloActualValue    "X_Y DINT"        Nicht remanent    True    True    True    False    
    Mode_of_operationdisplay    "X_Y_SINT"        Nicht remanent    True    True    True    False    
    InOut                                
    Nr    Int    0    Nicht remanent    False    False    False    False    
    CW1    Word    16#0    Nicht remanent    True    True    True    False    
    CW2    Word    16#0    Nicht remanent    True    True    True    False    
    Static                                
    StepNr    Int    0    Nicht remanent    True    True    True    False    
    StepNr_Next    Int    3    Nicht remanent    True    True    True    False    
    hm    Array[0..199] of Bool        Nicht remanent    True    True    True    False    
    READ_OK    Bool    false    Nicht remanent    False    False    False    False    
    WRITE_OK    Bool    false    Nicht remanent    False    False    False    False    
    READ_ERROR    Bool    false    Nicht remanent    True    True    True    False    
    WRITE_ERROR    Bool    false    Nicht remanent    True    True    True    False    
    Temp                                
    i    Int                            
    Temp_Word_1    Word                            
    Temp_Word_2    Word                            
    Temp_DWord_1    DWord                            
    Temp_DWord_2    DWord                            
    Constant                                

//NW2  // Reset Steps
IF #Reset AND NOT #hm[0] THEN
    #StepNr := 0;
    #StepNr_Next := 4;
END_IF;
#hm[0] := #Reset;

// NW3 Modbus TCP

CASE #StepNr OF
    0: //init
        #StepNr := 1;
        #StepNr_Next := 4;
        #hm[1] := #hm[2] := #hm[3] := #hm[4] := #hm[5] := #hm[6] := FALSE;
        
    1: //Read Status Word  X
        IF "DB_Igus"."TCON-1-2-3-OK" AND NOT #hm[1] THEN
            "SDO_READ1"(SDO_OBJECT := 16#6041,
                        SDO_INDEX := 0,
                        SDO_BYTANZ := 2,
                        SDO_READ_OK => #READ_OK,
                        SDO_READ_ERROR => #READ_ERROR,
                        SDO_DATA_1 => #Temp_DWord_1);
            
            
            IF #READ_OK THEN
                #SW_1 := #Temp_DWord_1;
                #hm[1] := TRUE;
            END_IF;
        END_IF;
        
         //Read Status Word Y
        IF "DB_Igus"."TCON-1-2-3-OK" AND NOT #hm[2] THEN
            "SDO_READ2"(SDO_OBJECT := 16#6041,
                        SDO_INDEX := 0,
                        SDO_BYTANZ := 2,
                        SDO_READ_OK => #READ_OK,
                        SDO_READ_ERROR => #READ_ERROR,
                        SDO_DATA_1 => #Temp_DWord_2);
            
            
            IF #READ_OK THEN
                #SW_2 := #Temp_DWord_2;
                #hm[2] := TRUE;
            END_IF;
            
        END_IF;
        
        IF #hm[1] AND #hm[2] THEN
            #StepNr := 3;
            #hm[1] := #hm[2] := FALSE;
        END_IF;
        
    3: // Nach read/Write ablauf
        IF "DB_Igus"."TCON-1-2-3-OK" THEN
            IF #Nr <> 0 THEN  // Nr = InOut wrde in Ablauf programm beschrieben und wenn auftrag in diese FB abgelaufen ist auf 0 gesetzt.
                #StepNr := #Nr;
            ELSIF #StepNr_Next < 4 THEN
                #StepNr_Next := 4;
            ELSE
                #StepNr := #StepNr_Next;
            END_IF;
        END_IF;
        
    4://X SDO READ Position Actual Value h6064
        IF "DB_Igus"."TCON-1-2-3-OK" AND NOT #hm[1] THEN
            "SDO_READ1"(SDO_OBJECT := 16#6064,
                        SDO_INDEX := 0,
                        SDO_BYTANZ := 4,
                        SDO_READ_OK => #READ_OK,
                        SDO_READ_ERROR => #READ_ERROR,
                        SDO_DATA_1 => #Temp_DWord_1);
            
            IF #READ_OK THEN
                #PosActualValue.X := #Temp_DWord_1;
                #hm[1] := TRUE;
                #StepNr_Next := 6;
            END_IF;
        END_IF;
        
        //Y SDO READ Position Actual Value h6064
        IF "DB_Igus"."TCON-1-2-3-OK" AND NOT #hm[2] THEN
            "SDO_READ2"(SDO_OBJECT := 16#6064,
                        SDO_INDEX := 0,
                        SDO_BYTANZ := 4,
                        SDO_READ_OK => #READ_OK,
                        SDO_READ_ERROR => #READ_ERROR,
                        SDO_DATA_1 => #Temp_DWord_2);
            
            IF #READ_OK THEN
                #PosActualValue.Y := #Temp_DWord_2;
                #hm[2] := TRUE;
                #StepNr_Next := 6;
            END_IF;
        END_IF;
        IF #hm[1] AND #hm[2] THEN
            #StepNr := 1;
            #hm[1] := #hm[2] := FALSE;
        END_IF;
        
    6://X  SDO READ Velocity Actual Value h606C
        IF "DB_Igus"."TCON-1-2-3-OK" AND NOT #hm[1] THEN
            "SDO_READ1"(SDO_OBJECT := 16#606C,
                        SDO_INDEX := 0,
                        SDO_BYTANZ := 4,
                        SDO_READ_OK => #READ_OK,
                        SDO_READ_ERROR => #READ_ERROR,
                        SDO_DATA_1 => #Temp_DWord_1);
            
            IF #READ_OK THEN
                #VeloActualValue.X := #Temp_DWord_1;
                #hm[1] := TRUE;
                #StepNr_Next := 4;
            END_IF;
        END_IF;
        
        //Y  SDO READ Velocity Actual Value h606C
        IF "DB_Igus"."TCON-1-2-3-OK" AND NOT #hm[2] THEN
            "SDO_READ2"(SDO_OBJECT := 16#606C,
                        SDO_INDEX := 0,
                        SDO_BYTANZ := 4,
                        SDO_READ_OK => #READ_OK,
                        SDO_READ_ERROR => #READ_ERROR,
                        SDO_DATA_1 => #Temp_DWord_2);
            
            IF #READ_OK THEN
                #VeloActualValue.Y := #Temp_DWord_2;
                #hm[2] := TRUE;
                // #StepNr := 1;
                #StepNr_Next := 4;
            END_IF;
        END_IF;
        
        IF #hm[1] AND #hm[2] THEN
            #StepNr := 1;
            #hm[1] := #hm[2] := FALSE;
        END_IF;
        
    10://X Reset Fehler
        IF NOT #hm[1] THEN
            #CW1 := 16#00_80;
            "SDO_WRITE1"(SDO_OBJECT := 16#6040,
                         SDO_INDEX := 0,
                         SDO_BYTANZ := 2,
                         SDO_DATA_1 := #CW1,
                         SDO_WRITE_OK => #WRITE_OK,
                         SDO_WRITE_ERROR => #WRITE_ERROR);
            
            IF #WRITE_OK THEN
                #hm[1] := TRUE;
            END_IF;
        END_IF;
        
        //  Y Reset Fehler
        IF NOT #hm[1] THEN
            #CW2 := 16#00_80;
            "SDO_WRITE2"(SDO_OBJECT := 16#6040,
                         SDO_INDEX := 0,
                         SDO_BYTANZ := 2,
                         SDO_DATA_1 := #CW2,
                         SDO_WRITE_OK => #WRITE_OK,
                         SDO_WRITE_ERROR => #WRITE_ERROR);
            
            IF #WRITE_OK THEN
                #hm[2] := TRUE;
            END_IF;
        END_IF;
        
        IF #hm[1] AND #hm[2] THEN
            #Nr := 0;
            #StepNr := 1;
            #hm[1] := #hm[2] := FALSE;
        END_IF;
        
    20://X SDO SwitchOnDisabled
        IF NOT #hm[1] THEN
            #CW1 := 16#00_01;
            "SDO_WRITE1"(SDO_OBJECT := 16#6040,
                         SDO_INDEX := 0,
                         SDO_BYTANZ := 2,
                         SDO_DATA_1 := #CW1,
                         SDO_WRITE_OK => #WRITE_OK,
                         SDO_WRITE_ERROR => #WRITE_ERROR);
            IF #WRITE_OK THEN
                #hm[1] := TRUE;
            END_IF;
        END_IF;
        
        //Y SDO SwitchOnDisabled
        
        IF NOT #hm[2] THEN
            #CW2 := 16#00_01;
            "SDO_WRITE2"(SDO_OBJECT := 16#6040,
                         SDO_INDEX := 0,
                         SDO_BYTANZ := 2,
                         SDO_DATA_1 := #CW2,
                         SDO_WRITE_OK => #WRITE_OK,
                         SDO_WRITE_ERROR => #WRITE_ERROR);
            IF #WRITE_OK THEN
                #hm[2] := TRUE;
            END_IF;
        END_IF;
        
        IF #hm[1] AND #hm[2] THEN
            #Nr := 0;
            #StepNr := 1;
            #hm[1] := #hm[2] := FALSE;
        END_IF;
        
    30://X SDO ReadyToSwitchOn
        IF NOT #hm[1] THEN
            #CW1 := 16#00_06;
            "SDO_WRITE1"(SDO_OBJECT := 16#6040,
                         SDO_INDEX := 0,
                         SDO_BYTANZ := 2,
                         SDO_DATA_1 := #CW1,
                         SDO_WRITE_OK => #WRITE_OK,
                         SDO_WRITE_ERROR => #WRITE_ERROR);
            IF #WRITE_OK THEN
                #hm[1] := TRUE;
            END_IF;
        END_IF;
        
        //Y  SDO ReadyToSwitchOn
        IF NOT #hm[2] THEN
            #CW2 := 16#00_06;
            "SDO_WRITE2"(SDO_OBJECT := 16#6040,
                         SDO_INDEX := 0,
                         SDO_BYTANZ := 2,
                         SDO_DATA_1 := #CW2,
                         SDO_WRITE_OK => #WRITE_OK,
                         SDO_WRITE_ERROR => #WRITE_ERROR);
            IF #WRITE_OK THEN
                #hm[2] := TRUE;
            END_IF;
        END_IF;
        
        IF #hm[1] AND #hm[2] THEN
            #Nr := 0;
            #StepNr := 1;
            #hm[1] := #hm[2] := FALSE;
        END_IF;
        
    40://SDO SwitchedOn
        IF NOT #hm[1] THEN
            #CW1 := 16#00_07;
            "SDO_WRITE1"(SDO_OBJECT := 16#6040,
                         SDO_INDEX := 0,
                         SDO_BYTANZ := 2,
                         SDO_DATA_1 := #CW1,
                         SDO_WRITE_OK => #WRITE_OK,
                         SDO_WRITE_ERROR => #WRITE_ERROR);
            IF #WRITE_OK THEN
                #hm[1] := TRUE;
            END_IF;
        END_IF;
        //SDO SwitchedOn
        IF NOT #hm[2] THEN
            #CW2 := 16#00_07;
            "SDO_WRITE2"(SDO_OBJECT := 16#6040,
                         SDO_INDEX := 0,
                         SDO_BYTANZ := 2,
                         SDO_DATA_1 := #CW2,
                         SDO_WRITE_OK => #WRITE_OK,
                         SDO_WRITE_ERROR => #WRITE_ERROR);
            IF #WRITE_OK THEN
                #hm[2] := TRUE;
            END_IF;
        END_IF;
        
        IF #hm[1] AND #hm[2] THEN
            #Nr := 0;
            #StepNr := 1;
            #hm[1] := #hm[2] := FALSE;
        END_IF;
        
    50://SDO OperationEnabled
        IF NOT #hm[1] THEN
            #CW1 := 16#00_0F;
            "SDO_WRITE1"(SDO_OBJECT := 16#6040,
                         SDO_INDEX := 0,
                         SDO_BYTANZ := 2,
                         SDO_DATA_1 := #CW1,
                         SDO_WRITE_OK => #WRITE_OK,
                         SDO_WRITE_ERROR => #WRITE_ERROR);
            IF #WRITE_OK THEN
                #hm[1] := TRUE;
            END_IF;
        END_IF;
        
        // 51://SDO OperationEnabled
        IF NOT #hm[2] THEN
            #CW2 := 16#00_0F;
            "SDO_WRITE2"(SDO_OBJECT := 16#6040,
                         SDO_INDEX := 0,
                         SDO_BYTANZ := 2,
                         SDO_DATA_1 := #CW2,
                         SDO_WRITE_OK => #WRITE_OK,
                         SDO_WRITE_ERROR => #WRITE_ERROR);
            IF #WRITE_OK THEN
                #hm[2] := TRUE;
            END_IF;
        END_IF;
        
        IF #hm[1] AND #hm[2] THEN
            #Nr := 0;
            #StepNr := 1;
            #hm[1] := #hm[2] := FALSE;
        END_IF;
        
    60:// SDO 6092h: Feed constant  Sub 1 Feed (z.B 70mm = 7.000 = 1B58)
        IF NOT #hm[1] THEN
            "SDO_WRITE1"(SDO_OBJECT := 16#6092,
                         SDO_INDEX := 1,
                         SDO_BYTANZ := 4,
                         SDO_DATA_1 := "DB_MBDATA-1"."Feed constant  Sub 1 Feed SDO 6092h",
                         SDO_WRITE_OK => #WRITE_OK,
                         SDO_WRITE_ERROR => #WRITE_ERROR);
            IF #WRITE_OK THEN
                #hm[1] := TRUE;
            END_IF;
        END_IF;
        
        // SDO 6092h: Feed constant  Sub 1 Feed (z.B 70mm = 7.000 = 1B58)
        IF NOT #hm[2] THEN
            "SDO_WRITE2"(SDO_OBJECT := 16#6092,
                         SDO_INDEX := 1,
                         SDO_BYTANZ := 4,
                         SDO_DATA_1 := "DB_MBDATA-2"."Feed constant  Sub 1 Feed SDO 6092h",
                         SDO_WRITE_OK => #WRITE_OK,
                         SDO_WRITE_ERROR => #WRITE_ERROR);
            IF #WRITE_OK THEN
                #hm[2] := TRUE;
                //  #Nr := #Nr;
                // #StepNr := 62;
            END_IF;
        END_IF;
        
   //SDO 6092h: Feed constant  Sub 2 Shaft Revolutions (Wert = 1)
        IF #hm[1] AND NOT #hm[3] THEN
            "SDO_WRITE1"(SDO_OBJECT := 16#6092,
                         SDO_INDEX := 2,
                         SDO_BYTANZ := 4,
                         SDO_DATA_1 := 1,
                         SDO_WRITE_OK => #WRITE_OK,
                         SDO_WRITE_ERROR => #WRITE_ERROR);
            IF #WRITE_OK THEN
                #hm[3] := TRUE;
                //   #Nr := #Nr;
                //   #StepNr := 63;
            END_IF;
        END_IF;
        
        //SDO 6092h: Feed constant  Sub 2 Shaft Revolutions (Wert = 1)
        IF #hm[2] AND NOT #hm[4] THEN
            "SDO_WRITE2"(SDO_OBJECT := 16#6092,
                         SDO_INDEX := 2,
                         SDO_BYTANZ := 4,
                         SDO_DATA_1 := 1,
                         SDO_WRITE_OK => #WRITE_OK,
                         SDO_WRITE_ERROR => #WRITE_ERROR);
            IF #WRITE_OK THEN
                #hm[4] := TRUE;
            END_IF;
            
        END_IF;
        
        IF #hm[1] AND #hm[2] AND #hm[3] AND #hm[4] THEN
            #Nr := 0;
            #StepNr := 1;
            #hm[1] := #hm[2] := #hm[3] := #hm[4] := FALSE;
        END_IF;
        
    70://SDO 6099sub1: Homing_speeds_Speed_during_search_for_switch (z.B. HEX1000 = 4096DEZ = 40,96mm/s bei 70mm Vorschub)
        IF NOT #hm[1] THEN
            "SDO_WRITE1"(SDO_OBJECT := 16#6099,
                         SDO_INDEX := 1,
                         SDO_BYTANZ := 4,
                         SDO_DATA_1 := #HomingSpeed,
                         SDO_WRITE_OK => #WRITE_OK,
                         SDO_WRITE_ERROR => #WRITE_ERROR);
            IF #WRITE_OK THEN
                "DB_Panel".VELO.X := #HomingSpeed;
                #hm[1] := TRUE;
            END_IF;
        END_IF;
        
        //SDO 609Ah: Homing acceleration (z.B HEXFF00 = 65280DEZ = 652,80mm/s² bei 70mm Vorschub)
        IF #hm[1] AND NOT #hm[2] THEN
            "SDO_WRITE1"(SDO_OBJECT := 16#609A,
                         SDO_INDEX := 0,
                         SDO_BYTANZ := 4,
                         SDO_DATA_1 := #Homing_Acc,
                         SDO_WRITE_OK => #WRITE_OK,
                         SDO_WRITE_ERROR => #WRITE_ERROR);
            IF #WRITE_OK THEN
                "DB_Panel".ACC.X := #Homing_Acc;
                 #hm[2] := TRUE;
             END_IF;
        END_IF;
        //SDO 6099sub1: Homing_speeds_Speed_during_search_for_switch (z.B. HEX1000 = 4096DEZ = 40,96mm/s bei 70mm Vorschub)
        IF NOT #hm[3] THEN
            "SDO_WRITE2"(SDO_OBJECT := 16#6099,
                         SDO_INDEX := 1,
                         SDO_BYTANZ := 4,
                         SDO_DATA_1 := #HomingSpeed,
                         SDO_WRITE_OK => #WRITE_OK,
                         SDO_WRITE_ERROR => #WRITE_ERROR);
            IF #WRITE_OK THEN
                "DB_Panel".VELO.Y := #HomingSpeed;
                #hm[3] := TRUE;
            END_IF;
        END_IF;
        //SDO 609Ah: Homing acceleration (z.B HEXFF00 = 65280DEZ = 652,80mm/s² bei 70mm Vorschub)
        IF #hm[3] AND NOT #hm[4] THEN
            "SDO_WRITE2"(SDO_OBJECT := 16#609A,
                         SDO_INDEX := 0,
                         SDO_BYTANZ := 4,
                         SDO_DATA_1 := #Homing_Acc,
                         SDO_WRITE_OK => #WRITE_OK,
                         SDO_WRITE_ERROR => #WRITE_ERROR);
            IF #WRITE_OK THEN
                "DB_Panel".ACC.Y := #Homing_Acc;
                #hm[4] := TRUE;
                // #Nr := 0;
                // #StepNr := 1;
            END_IF;
        END_IF;
        IF #hm[1] AND #hm[2] AND #hm[3] AND #hm[4] THEN
            #Nr := 0;
            #StepNr := 1;
            #hm[1] := #hm[2] := #hm[3] := #hm[4] := FALSE;
        END_IF;
        
    80://SDO 6060h: Modes of operation / 6=Homing
        IF NOT #hm[1] THEN
            "SDO_WRITE1"(SDO_OBJECT := 16#6060,
                         SDO_INDEX := 0,
                         SDO_BYTANZ := 1,
                         SDO_DATA_1 := 6,
                         SDO_WRITE_OK => #WRITE_OK,
                         SDO_WRITE_ERROR => #WRITE_ERROR);
            IF #WRITE_OK THEN
                #hm[1] := TRUE;
            END_IF;
        END_IF;
        
        // 81://SDO 6060h: Modes of operation / 6=Homing
        IF #hm[1] AND NOT #hm[2] THEN
            "SDO_READ1"(SDO_OBJECT := 16#6061,
                        SDO_INDEX := 0,
                        SDO_BYTANZ := 1,
                        SDO_READ_OK => #READ_OK,
                        SDO_READ_ERROR => #READ_ERROR,
                        SDO_DATA_1 => "DB_MBDATA-1".Mode_of_operationdisplay);
            
            IF #READ_OK THEN
                IF "DB_MBDATA-1".#Mode_of_operationdisplay <> 6 THEN
                    #hm[1] := FALSE;
                ELSE
                    #hm[2] := TRUE;
                END_IF;
            END_IF;
        END_IF;
       //SDO 6060h: Modes of operation / 6=Homing
        IF NOT #hm[3] THEN
            "SDO_WRITE2"(SDO_OBJECT := 16#6060,
                         SDO_INDEX := 0,
                         SDO_BYTANZ := 1,
                         SDO_DATA_1 := 6,
                         SDO_WRITE_OK => #WRITE_OK,
                         SDO_WRITE_ERROR => #WRITE_ERROR);
            IF #WRITE_OK THEN
                #hm[3] := TRUE;
                // #Nr := #Nr;
                // #StepNr := 83;
            END_IF;
        END_IF;
        //SDO 6060h: Modes of operation / 6=Homing
        IF #hm[3] AND NOT #hm[4] THEN
            "SDO_READ2"(SDO_OBJECT := 16#6061,
                        SDO_INDEX := 0,
                        SDO_BYTANZ := 1,
                        SDO_READ_OK => #READ_OK,
                        SDO_READ_ERROR => #READ_ERROR,
                        SDO_DATA_1 => "DB_MBDATA-2".Mode_of_operationdisplay);
            
            IF #READ_OK THEN
                IF "DB_MBDATA-2".#Mode_of_operationdisplay <> 6 THEN
                    #hm[3] := FALSE;
                ELSE
                    #hm[4] := TRUE;
                END_IF;
            END_IF;
        END_IF;
        IF #hm[1] AND #hm[2] AND #hm[3] AND #hm[4] THEN
            #Nr := 0;
            #StepNr := 1;
            #hm[1] := #hm[2] := #hm[3] := #hm[4] := FALSE;
        END_IF;
        
    90://SDO Start Movement (Homing)
        IF NOT #hm[1] THEN
            #CW1 := 16#00_1F;
            "SDO_WRITE1"(SDO_OBJECT := 16#6040,
                         SDO_INDEX := 0,
                         SDO_BYTANZ := 1,
                         SDO_DATA_1 := #CW1,
                         SDO_WRITE_OK => #WRITE_OK,
                         SDO_WRITE_ERROR => #WRITE_ERROR);
            IF #WRITE_OK THEN
                #hm[1] := TRUE;
            END_IF;
        END_IF;
        //SDO Start Movement (Homing)
        IF NOT #hm[2] THEN
            #CW2 := 16#00_1F;
            "SDO_WRITE2"(SDO_OBJECT := 16#6040,
                         SDO_INDEX := 0,
                         SDO_BYTANZ := 1,
                         SDO_DATA_1 := #CW2,
                         SDO_WRITE_OK => #WRITE_OK,
                         SDO_WRITE_ERROR => #WRITE_ERROR);
            IF #WRITE_OK THEN
                #hm[2] := TRUE;
            END_IF;
        END_IF;
        IF #hm[1] AND #hm[2] THEN
            #Nr := 0;
            #StepNr := 1;
            #hm[1] := #hm[2] := FALSE;
        END_IF;
        
    100:// SDO Reset Movement (Homing)
        IF NOT #hm[1] THEN
            #CW1 := 16#1100 AND #CW1;
            #CW1 := 16#000F OR #CW1;
            
            "SDO_WRITE1"(SDO_OBJECT := 16#6040,
                         SDO_INDEX := 0,
                         SDO_BYTANZ := 1,
                         SDO_DATA_1 := #CW1,
                         SDO_WRITE_OK => #WRITE_OK,
                         SDO_WRITE_ERROR => #WRITE_ERROR);
            IF #WRITE_OK THEN
                #hm[1] := TRUE;
            END_IF;
        END_IF;
        
        // SDO #Reset Movement (Homing)
        IF #hm[1] AND NOT #hm[2] THEN
            #CW2 := 16#1100 AND #CW2;
            #CW2 := 16#000F OR #CW2;
            
            "SDO_WRITE2"(SDO_OBJECT := 16#6040,
                         SDO_INDEX := 0,
                         SDO_BYTANZ := 1,
                         SDO_DATA_1 := #CW2,
                         SDO_WRITE_OK => #WRITE_OK,
                         SDO_WRITE_ERROR => #WRITE_ERROR);
            IF #WRITE_OK THEN
                #hm[2] := TRUE;
            END_IF;
        END_IF;
        IF #hm[1] AND #hm[2] THEN
            #Nr := 0;
            #StepNr := 1;
            #hm[1] := #hm[2] := FALSE;
        END_IF;
        
    110://SDO 6060h: Modes of operation / 1=PPM ProfilePositionMode
        IF NOT #hm[1] THEN
            "SDO_WRITE1"(SDO_OBJECT := 16#6060,
                         SDO_INDEX := 0,
                         SDO_BYTANZ := 1,
                         SDO_DATA_1 := 1,
                         SDO_WRITE_OK => #WRITE_OK,
                         SDO_WRITE_ERROR => #WRITE_ERROR);
            IF #WRITE_OK THEN
                #hm[1] := TRUE;
            END_IF;
        END_IF;
        
        //SDO 6060h: Modes of operation / 1=PPM ProfilePositionMode
        IF #hm[1] AND NOT #hm[2] THEN
            "SDO_READ1"(SDO_OBJECT := 16#6061,
                        SDO_INDEX := 0,
                        SDO_BYTANZ := 1,
                        SDO_READ_OK => #READ_OK,
                        SDO_READ_ERROR => #READ_ERROR,
                        SDO_DATA_1 => "DB_MBDATA-1".Mode_of_operationdisplay);
            
            IF #READ_OK THEN
                IF "DB_MBDATA-1".#Mode_of_operationdisplay <> 1 THEN
                    #hm[1] := FALSE;
                ELSE
                    #hm[2] := TRUE;
                END_IF;
            END_IF;
        END_IF;
        
        //SDO 6060h: Modes of operation / 1=PPM ProfilePositionMode
        IF NOT #hm[3] THEN
            "SDO_WRITE2"(SDO_OBJECT := 16#6060,
                         SDO_INDEX := 0,
                         SDO_BYTANZ := 1,
                         SDO_DATA_1 := 1,
                         SDO_WRITE_OK => #WRITE_OK,
                         SDO_WRITE_ERROR => #WRITE_ERROR);
            IF #WRITE_OK THEN
                #hm[3] := TRUE;
            END_IF;
        END_IF;
        
        //SDO 6060h: Modes of operation / 1=PPM ProfilePositionMode
        IF #hm[3] AND NOT #hm[4] THEN
            "SDO_READ2"(SDO_OBJECT := 16#6061,
                        SDO_INDEX := 0,
                        SDO_BYTANZ := 1,
                        SDO_READ_OK => #READ_OK,
                        SDO_READ_ERROR => #READ_ERROR,
                        SDO_DATA_1 => "DB_MBDATA-2".Mode_of_operationdisplay);
            
            IF #READ_OK THEN
                IF "DB_MBDATA-2".#Mode_of_operationdisplay <> 1 THEN
                    #hm[3] := FALSE;
                ELSE
                    #hm[4] := TRUE;
                END_IF;
            END_IF;
        END_IF;
        
        IF #hm[1] AND #hm[2] AND #hm[3] AND #hm[4] THEN
            #Nr := 0;
            #StepNr := 1;
            #hm[1] := #hm[2] := #hm[3] := #hm[4] := FALSE;
        END_IF;
        
    120://SDO New Position 1 & ACC & VEL  / position
        IF NOT #hm[1] THEN
            "SDO_WRITE1"(SDO_OBJECT := 16#607A,
                         SDO_INDEX := 0,
                         SDO_BYTANZ := 4,
                         SDO_DATA_1 := #SollPosition.X,
                         SDO_WRITE_OK => #WRITE_OK,
                         SDO_WRITE_ERROR => #WRITE_ERROR);
            IF #WRITE_OK THEN
                #hm[1] := TRUE;
            END_IF;
        END_IF;
   //SDO New Position 1 & ACC & VEL  / Velo
        IF NOT #hm[2] AND #hm[1] THEN
            "SDO_WRITE1"(SDO_OBJECT := 16#6081,
                         SDO_INDEX := 0,
                         SDO_BYTANZ := 4,
                         SDO_DATA_1 := #Velo.X,
                         SDO_WRITE_OK => #WRITE_OK,
                         SDO_WRITE_ERROR => #WRITE_ERROR);
            IF #WRITE_OK THEN
                "DB_Panel".VELO.X := #Velo.X;
                #hm[2] := TRUE;
            END_IF;
        END_IF;
    //SDO New Position 1 & ACC & VEL  / Acc
        IF NOT #hm[3] AND #hm[1] AND #hm[2] THEN
            "SDO_WRITE1"(SDO_OBJECT := 16#6083,
                         SDO_INDEX := 0,
                         SDO_BYTANZ := 4,
                         SDO_DATA_1 := #Acc.X,
                         SDO_WRITE_OK => #WRITE_OK,
                         SDO_WRITE_ERROR => #WRITE_ERROR);
            IF #WRITE_OK THEN
                "DB_Panel".ACC.X := #Acc.X;
                #hm[3] := TRUE;
            END_IF;
        END_IF;
        //SDO New Position 2 & ACC & VEL  / position
        IF NOT #hm[4] THEN
            "SDO_WRITE2"(SDO_OBJECT := 16#607A,
                         SDO_INDEX := 0,
                         SDO_BYTANZ := 4,
                         SDO_DATA_1 := #SollPosition.Y,
                         SDO_WRITE_OK => #WRITE_OK,
                         SDO_WRITE_ERROR => #WRITE_ERROR);
            IF #WRITE_OK THEN
                #hm[4] := TRUE;
            END_IF;
        END_IF;
        
        // 124://SDO New Position 2 & ACC & VEL  / Velo
        IF NOT #hm[5] AND #hm[4] THEN
            "SDO_WRITE2"(SDO_OBJECT := 16#6081,
                         SDO_INDEX := 0,
                         SDO_BYTANZ := 4,
                         SDO_DATA_1 := #Velo.Y,
                         SDO_WRITE_OK => #WRITE_OK,
                         SDO_WRITE_ERROR => #WRITE_ERROR);
            IF #WRITE_OK THEN
                "DB_Panel".VELO.Y := #Velo.Y;
                #hm[5] := TRUE;
            END_IF;
        END_IF;
        // 125://SDO New Position 2 & ACC & VEL  / Acc
        IF NOT #hm[6] AND #hm[4] AND #hm[5] THEN
            "SDO_WRITE2"(SDO_OBJECT := 16#6083,
                         SDO_INDEX := 0,
                         SDO_BYTANZ := 4,
                         SDO_DATA_1 := #Acc.Y,
                         SDO_WRITE_OK => #WRITE_OK,
                         SDO_WRITE_ERROR => #WRITE_ERROR);
            IF #WRITE_OK THEN
                "DB_Panel".ACC.Y := #Acc.Y;
                #hm[6] := TRUE;
            END_IF;
        END_IF;
        
        IF #hm[1] AND #hm[2] AND #hm[3] AND #hm[4] AND #hm[5] AND #hm[6] THEN
            #Nr := 0;
            #StepNr := 1;
            #hm[1] := #hm[2] := #hm[3] := #hm[4] := #hm[5] := #hm[6] := FALSE;
        END_IF;
        
    130://DO Start Signal setzen / Bewegung 1 (New Set Point)
        IF NOT #hm[1] THEN
            #CW1 := 16#00_1F;
            "SDO_WRITE1"(SDO_OBJECT := 16#6040,
                         SDO_INDEX := 0,
                         SDO_BYTANZ := 1,
                         SDO_DATA_1 := #CW1,
                         SDO_WRITE_OK => #WRITE_OK,
                         SDO_WRITE_ERROR => #WRITE_ERROR);
            IF #WRITE_OK THEN
                #hm[1] := TRUE;
            END_IF;
        END_IF;
        //DO Start Signal setzen / Bewegung 1 (New Set Point)
        IF NOT #hm[2] THEN
            #CW2 := 16#00_1F;
            "SDO_WRITE2"(SDO_OBJECT := 16#6040,
                         SDO_INDEX := 0,
                         SDO_BYTANZ := 1,
                         SDO_DATA_1 := #CW2,
                         SDO_WRITE_OK => #WRITE_OK,
                         SDO_WRITE_ERROR => #WRITE_ERROR);
            IF #WRITE_OK THEN
                #hm[2] := TRUE;
            END_IF;
        END_IF;
        IF #hm[1] AND #hm[2] THEN
            #Nr := 0;
            #StepNr := 1;
            #hm[1] := #hm[2] := FALSE;
        END_IF;
        
        
    140://SDO Start Signal übnernommen / Reset Startsignal Bewegung 1 (Reset "New Set Point")
        IF NOT #hm[1] THEN
            #CW1 := 16#1100 AND #CW1;
            #CW1 := 16#000F OR #CW1;
            
            "SDO_WRITE1"(SDO_OBJECT := 16#6040,
                         SDO_INDEX := 0,
                         SDO_BYTANZ := 1,
                         SDO_DATA_1 := #CW1,
                         SDO_WRITE_OK => #WRITE_OK,
                         SDO_WRITE_ERROR => #WRITE_ERROR);
            IF #WRITE_OK THEN
                #hm[1] := TRUE;
            END_IF;
        END_IF;
        //SDO Start Signal übnernommen / Reset Startsignal Bewegung 1 (Reset "New Set Point")
        IF NOT #hm[2] THEN
            #CW2 := 16#1100 AND #CW2;
            #CW2 := 16#000F OR #CW2;
            "SDO_WRITE2"(SDO_OBJECT := 16#6040,
                         SDO_INDEX := 0,
                         SDO_BYTANZ := 1,
                         SDO_DATA_1 := #CW2,
                         SDO_WRITE_OK => #WRITE_OK,
                         SDO_WRITE_ERROR => #WRITE_ERROR);
            IF #WRITE_OK THEN
                #hm[2] := TRUE;
            END_IF;
        END_IF;
        IF #hm[1] AND #hm[2] THEN
            #Nr := 0;
            #StepNr := 1;
            #hm[1] := #hm[2] := FALSE;
        END_IF;
        
    ELSE // False StepNr
        #StepNr := 0;
        "DB_READ_WRITE".test_Joop[39] := #Nr;
END_CASE;
  
//NW 4
#Mode_of_operationdisplay.X := "DB_MBDATA-1".Mode_of_operationdisplay;
#Mode_of_operationdisplay.Y := "DB_MBDATA-2".#Mode_of_operationdisplay;

Hier ein abschnitt aus meine auto ablauf von diese 2 Achsen ( Com_Step = InOut = Nr im NW3 Modbus TCPs)

Code:
    20: // SDO SwitchONDisabled;
        IF #"ST-Gesamt".SWITCH_ON_DISABLED THEN
            #StepNr := 21;
            
            #Timer_1(IN := NOT #"ST-Gesamt".SWITCH_ON_DISABLED,
                     PT := T#500ms);
        END_IF;
        IF #Timer_1.Q AND #Com_step = 0 THEN
            #Com_step := 20;
            #StepNr := 21;
        END_IF;
        
    21: //  Warten auf Befehl ausgeführt
        IF #Com_step = 0 AND #"ST-Gesamt".SWITCH_ON_DISABLED THEN
            #StepNr := 30;
        END_IF;
        
    30: // SDO ReadyToSwitchOn
        IF #"ST-Gesamt".READY_TO_SWITCH_ON THEN
            #StepNr := 40;
        ELSIF #Com_step = 0 THEN
            #Com_step := 30;
            #StepNr := 31;
        END_IF;
        
    31: //  Warten auf Befehl ausgeführt
        IF #Com_step = 0 AND #"ST-Gesamt".READY_TO_SWITCH_ON THEN
            #StepNr := 40;
        END_IF;
        
    40:// SDO SwitchedOn
        IF #"ST-Gesamt".SWITCHED_ON THEN
            #StepNr := 50;
        ELSIF #Com_step = 0 THEN
            #Com_step := 40;
            #StepNr := 41;
        END_IF;
    41: //  Warten auf Befehl ausgeführt
        IF #Com_step = 0 AND #"ST-Gesamt".SWITCHED_ON THEN
            #StepNr := 50;
        END_IF;
        
    50: //SDO OperationEnabled
        IF #"ST-Gesamt".OPERATION_ENABELD THEN
            #StepNr := 60;
        ELSIF #Com_step = 0 THEN
            #Com_step := 50;
            #StepNr := 51;
        END_IF;
    51: //  Warten auf Befehl ausgeführt
        IF #Com_step = 0 AND #"ST-Gesamt".OPERATION_ENABELD THEN
            #StepNr := 60;
        END_IF;

Gruss,

Joop
 
Zuletzt bearbeitet:
Zurück
Oben