Sinamics S120 Umschaltung Drehzahl-/ Drehmomentregelung

peterdausk

Level-2
Beiträge
22
Reaktionspunkte
6
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

zu meinem System:
TIA V14
CPU 1513F
Sinamics S120 CU320 (Projektierung über STARTER) Telegramm 111
Linearmotor von Schunk

Folgende Applikation:
Auf dem Linearmotor ist ein Schrauber, der einen Anschlussnippel mit Mutter auf ein anderes feststehendes Teil aufschrauben soll. Der Schrauber wird von einem Roboter beladen.
Ich fahre also insgesamt 3 Positionen an. Beladen des Schraubers, Vorposition Schrauben, Position fertig verschraubt.
Aktuell benutze ich den SINA_POS. Das funktioniert auch soweit recht gut, aber nicht 100 prozentig. Deshalb möchte ich jetzt die Position "fertig verschraubt" über Drehmoment anfahren, damit der Schrauber immer satt anliegt (Was sowieso richtiger wäre).
Dazu habe ich jetzt mal den Baustein SINA_PARA_S getestet, um den Parameter 1501 umzuschalten. Mit dem Baustein schaffe ich es allerdings nicht einmal einen Parameter auszulesen. Ich bekomme nur eine Errormeldung. Ich bin mir auch nicht ganz Sicher, ob meine HWID stimmt.

Geht das so mit dem Baustein wie ich mir das vorstelle?

Gäbe es eine andere Variante für die Umschaltung?

Grüße
 
Ich denke, du brauchst dann eher "Fahren auf Festanschlag".
Das haben wir hier mal diskutiert: S110 MDI-Betrieb Momenten-Begrenzung

Ich habe ebenfalls SinaPos genutzt, um auf Positionen zu fahren, dann aber eine Umschaltung eingebaut, um auf Festanschlag fahren zu können.
Dazu mußte ich aber einen Verfahrsatz nutzen und die Werte dazu habe ich vor Start berechnet und an den Servo übertragen.

Normalerweise tragt man beim Sinapos ja die Position an, wenn man aber einen Verfahrsatz fahren will, dann trägt man dort dir Verfahrsatznummer ein.

Code:
        IF #TravelToFixedStopStart THEN
            #Position := 0;             //Bei FixStop Verfahrsatz 0 anwählen! Posiiton (SetPos) wird als Parameter in den Verfahrsatz geschrieben
        ELSE
            #Position := #SetPos;
        END_IF;

Außerdem ist Modepos = 6 (beim Positionieren wäre er 1 oder 2)

Das Übertragen mache ich vor dem Start, also Start_Travel_to_Fixstop von außen, dann Parameter in einer Schrittkette übertragen, Mode anwählen, Position = 0 für Verfahrsatz 0 und Bewegung starten. Wichtig ist, dass man das Ziel der Bewegung bei "Travel_to_Fixstop" in das Werkstück hinein verlegt, also 10-20 mm weiter. Der Servo darf noch nicht in der Bremsphase auf sein Ziel sein, wenn der Festanschlag kommt, sonst bekommt man eine Störung.

Hier mal die Schrittkette für das Übertragen der Parameter. Das kann dir als Anhaltspunkt dienen. Das Bit "Travel_to_Fixstop", dass im MDI-Parametersatz existiert hat keine Wirkung gehabt, weiß nicht genau, wozu Siemens das mal vorgesehen hatte. Die Parameterübertragung ist rel. ausführlich, inkl. Rücklesen zur Kontrolle. Es geht sicher auch kürzer.

Code:
REGION Parameter_Verfahr-Satz0_Set


(* --- Schrittkette Verfahr-Satz 0 setzen und remanent im Servo abspeichern --- *)


CASE #nSchrittketteParaSatz0 OF
  1:  // Startwerte Moment setzen


    #FB_SINA_PARA_S_Instance.Start          := False;   
    #FB_SINA_PARA_S_Instance.ReadWrite      := 1; //schreiben
    #FB_SINA_PARA_S_Instance.AxisNo         := #I_AxisNo_Starter;
    #FB_SINA_PARA_S_Instance.hardwareId     := #I_HWID_Sollwert_Slot;
    #FB_SINA_PARA_S_Instance.Parameter      := 2622;
    #FB_SINA_PARA_S_Instance.Index          := 0;
    #FB_SINA_PARA_S_Instance.ValueWrite2    := #TorqueTravelToFixedStop;
    #nSetSatz0_ok := 0;
 
    #nSchrittketteParaSatz0 := 2;
    
  2:  // Auftrag starten
    #FB_SINA_PARA_S_Instance.Start  := True; 


    IF #FB_SINA_PARA_S_Instance.Busy
        AND NOT #FB_SINA_PARA_S_Instance.Done
        AND NOT #FB_SINA_PARA_S_Instance.Error
    THEN 
        #nSchrittketteParaSatz0 := 3;
    END_IF;
 
  3:  // Auftrag fertig
    #FB_SINA_PARA_S_Instance.Start  := True; 


    IF NOT #FB_SINA_PARA_S_Instance.Busy
        AND #FB_SINA_PARA_S_Instance.Done
    THEN 
        #nSchrittketteParaSatz0 := 4; 
        #FB_SINA_PARA_S_Instance.Start  := False; 
    END_IF;


  4:  // Rückmeldung auslesen
    #FB_SINA_PARA_S_Instance.ReadWrite      := 0; //lesen
    #nSchrittketteParaSatz0 := 5;


  5:  // Rückmeldung auslesen starten
    #FB_SINA_PARA_S_Instance.Start  := True;


    IF #FB_SINA_PARA_S_Instance.Busy
        AND NOT #FB_SINA_PARA_S_Instance.Done
        AND NOT #FB_SINA_PARA_S_Instance.Error
    THEN 
        #nSchrittketteParaSatz0 := 6;
    END_IF;
 
  6:  // Auftrag fertig
    #FB_SINA_PARA_S_Instance.Start  := True; 


    IF NOT #FB_SINA_PARA_S_Instance.Busy
        AND #FB_SINA_PARA_S_Instance.Done
    THEN 
        #nSchrittketteParaSatz0 := 11; 
        #FB_SINA_PARA_S_Instance.Start  := False; 
    END_IF;


  7: //Korrekter Wert zurückgelesen?
    IF (#FB_SINA_PARA_S_Instance.ValueRead2 = #TorqueTravelToFixedStop) THEN
        #nSchrittketteParaSatz0 := 11;
        #nSetSatz0_ok := 1;
    ELSE
        #nSchrittketteParaSatz0 := 4; 
    END_IF; 


  11:  // Startwerte Position setzen
    IF #O_bTargetForward THEN
        #TorquePos := #SetPos + #I_nPositionAdd_TravelToFixedStop;
    ELSE
        #TorquePos := #SetPos - #I_nPositionAdd_TravelToFixedStop;
    END_IF;


    #FB_SINA_PARA_S_Instance.ReadWrite      := 1; //schreiben
    #FB_SINA_PARA_S_Instance.AxisNo         := #I_AxisNo_Starter;
    #FB_SINA_PARA_S_Instance.hardwareId     := #I_HWID_Sollwert_Slot;
    #FB_SINA_PARA_S_Instance.Parameter      := 2617;
    #FB_SINA_PARA_S_Instance.Index          := 0;
    #FB_SINA_PARA_S_Instance.ValueWrite2    := #TorquePos;
 
    #nSchrittketteParaSatz0 := 12;
    
  12:  // Auftrag starten
    #FB_SINA_PARA_S_Instance.Start  := True; 


    IF #FB_SINA_PARA_S_Instance.Busy
        AND NOT #FB_SINA_PARA_S_Instance.Done
        AND NOT #FB_SINA_PARA_S_Instance.Error
    THEN 
        #nSchrittketteParaSatz0 := 13;
    END_IF;
 
  13:  // Auftrag fertig
    #FB_SINA_PARA_S_Instance.Start  := True; 


    IF NOT #FB_SINA_PARA_S_Instance.Busy
        AND #FB_SINA_PARA_S_Instance.Done
    THEN 
        #nSchrittketteParaSatz0 := 14; 
        #FB_SINA_PARA_S_Instance.Start  := False; 
    END_IF;


  14:  // Rückmeldung auslesen
    #FB_SINA_PARA_S_Instance.ReadWrite      := 0; //lesen
    #nSchrittketteParaSatz0 := 15;


  15:  // Rückmeldung auslesen starten
    #FB_SINA_PARA_S_Instance.Start  := True;


    IF #FB_SINA_PARA_S_Instance.Busy
        AND NOT #FB_SINA_PARA_S_Instance.Done
        AND NOT #FB_SINA_PARA_S_Instance.Error
    THEN 
        #nSchrittketteParaSatz0 := 16;
    END_IF;
 
  16:  // Auftrag fertig
    #FB_SINA_PARA_S_Instance.Start  := True; 


    IF NOT #FB_SINA_PARA_S_Instance.Busy
        AND #FB_SINA_PARA_S_Instance.Done
    THEN 
        #nSchrittketteParaSatz0 := 21; 
        #FB_SINA_PARA_S_Instance.Start  := False; 
    END_IF;


  17: //Korrekter Wert zurückgelesen?
    IF (#FB_SINA_PARA_S_Instance.ValueRead2 =  #TorquePos) THEN
        #nSchrittketteParaSatz0 := 21;
        #nSetSatz0_ok := 2;
    ELSE
        #nSchrittketteParaSatz0 := 14; 
    END_IF; 


  21:  // Startwerte Geschwindigkeit setzen
    #FB_SINA_PARA_S_Instance.ReadWrite      := 1; //schreiben
    #FB_SINA_PARA_S_Instance.AxisNo         := #I_AxisNo_Starter;
    #FB_SINA_PARA_S_Instance.hardwareId     := #I_HWID_Sollwert_Slot;
    #FB_SINA_PARA_S_Instance.Parameter      := 2618;
    #FB_SINA_PARA_S_Instance.Index          := 0;
    #FB_SINA_PARA_S_Instance.ValueWrite2    := #SetVel * #I_Velocity_numerator / #I_Velocity_denominator;
 
    #nSchrittketteParaSatz0 := 22;
    
  22:  // Auftrag starten
    #FB_SINA_PARA_S_Instance.Start  := True; 


    IF #FB_SINA_PARA_S_Instance.Busy
        AND NOT #FB_SINA_PARA_S_Instance.Done
        AND NOT #FB_SINA_PARA_S_Instance.Error
    THEN 
        #nSchrittketteParaSatz0 := 23;
    END_IF;
 
  23:  // Auftrag fertig
    #FB_SINA_PARA_S_Instance.Start  := True; 


    IF NOT #FB_SINA_PARA_S_Instance.Busy
        AND #FB_SINA_PARA_S_Instance.Done
    THEN 
        #nSchrittketteParaSatz0 := 24; 
        #FB_SINA_PARA_S_Instance.Start  := False; 
    END_IF;


  24:  // Rückmeldung auslesen
    #FB_SINA_PARA_S_Instance.ReadWrite      := 0; //lesen
    #nSchrittketteParaSatz0 := 25;


  25:  // Rückmeldung auslesen starten
    #FB_SINA_PARA_S_Instance.Start  := True;


    IF #FB_SINA_PARA_S_Instance.Busy
        AND NOT #FB_SINA_PARA_S_Instance.Done
        AND NOT #FB_SINA_PARA_S_Instance.Error
    THEN 
        #nSchrittketteParaSatz0 := 26;
    END_IF;
 
  26:  // Auftrag fertig
    #FB_SINA_PARA_S_Instance.Start  := True; 


    IF NOT #FB_SINA_PARA_S_Instance.Busy
        AND #FB_SINA_PARA_S_Instance.Done
    THEN 
        #nSchrittketteParaSatz0 := 27; 
        #FB_SINA_PARA_S_Instance.Start := False;         
    END_IF;


27: //Korrekter Wert zurückgelese?
    IF (#FB_SINA_PARA_S_Instance.ValueRead2 = (#SetVel * #I_Velocity_numerator / #I_Velocity_denominator)) THEN
        #nSchrittketteParaSatz0 := 31;
         #nSetSatz0_ok := 3;
    ELSE
        #nSchrittketteParaSatz0 := 24; 
    END_IF; 


  31:  // Ende
    #nSchrittketteParaSatz0 := 0;
    #TravelToFixedStopLoad_ok := True;
    #TravelToFixedStopStart := True;
 
ELSE  // Statement section ELSE
    ;
END_CASE;




(* --- Aufruf Parametrierung Siemens -- *)
#FB_SINA_PARA_S_Instance();


(* --- Timeout Parameter übertragen --- *)
#TON_ParameterTimeout(IN:=#CMD_SetAbsoulut 
                                OR (#TravelToFixedStopLoad_Start AND
                                    NOT #TravelToFixedStopLoad_ok),
                            PT:=t#10s);
END_REGION

Hoffe, das hilft dir ein wenig weiter.

PS: Wenn die Schraubtiefen und Momente konstant sind, könnte man auch einfach feste Verfahrsätze anlegen und damit auf Festanschlag fahren. Bei mir mußte das leider alles variabel sein und auch noch ein Messergebnis (Festanschlag erreicht) ermittelt werden.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Ralle,

vielen Dank erstmal für deine schnelle Antwort. Ich bin leider die Woche nicht dazu gekommen mich darum zu kümmern. (Die Anlage läuft im Moment auch, aber halt nicht optimal).

Ich denk der Ansatz mit der Verfahrsätzen wird der Richtige Weg für mich sein. Das bringt mich allerdings trotzdem wieder zu meinem ersten Problem: Die Kommunikation mit SINA_PARA_S.
Mit dem wollte ich im laufenden Betrieb einfach mal einen Parameter auslesen. Ich bekomme aber ständig nur einen Error. Vermutlich habe ich die falschen Adressen für AxisNo, und HardwareID. Welche Adresse muss ich denn da angeben?

Grüße
Peter
 
Hallo Ralle,

vielen Dank erstmal für deine schnelle Antwort. Ich bin leider die Woche nicht dazu gekommen mich darum zu kümmern. (Die Anlage läuft im Moment auch, aber halt nicht optimal).

Ich denk der Ansatz mit der Verfahrsätzen wird der Richtige Weg für mich sein. Das bringt mich allerdings trotzdem wieder zu meinem ersten Problem: Die Kommunikation mit SINA_PARA_S.
Mit dem wollte ich im laufenden Betrieb einfach mal einen Parameter auslesen. Ich bekomme aber ständig nur einen Error. Vermutlich habe ich die falschen Adressen für AxisNo, und HardwareID. Welche Adresse muss ich denn da angeben?

Grüße
Peter

Am Ende der gezeigten Schrittkette rufe ich den FB_Sina_Para_S auf, in der Schrittkette wird eigentlich gezeigt, wie man Parameter schreiben und lesen kann.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

@zako. Vielen dank für die Antwort, die Doku habe ich mir schon angeschaut, und hoffentlich auch nichts überlesen ;)
@Ralle. Ich hab schon verstanden, wie der Baustein aufgerufen wird. Leider funktioniert es bei mir nicht mit dem Datenaustausch, und ich bin mir nicht sicher, ob ich die richtigen Adressen am Baustein habe.

AxisNo --> Achsnummer / AchsID bei Mehrachssystem. --> Wo finde ich die Achsnummer? In der Starter Software? Oder ist es die Nummer 1 weil ich nur eine Achse habe?

hardwareId --> Hardware ID des Modul Acces Points / Istwerttelegrammslots der Achse bzw. Antrieb. --> Hier habe ich die Adresse 440 eingetragen (siehe Bild HardwareID). Ist das die richtige?

Hardware ID.jpg

Hoffe Ihr versteht mein Problem :confused:

Grüße
Peter
 
Bei mir sieht das so aus:

Screenshot 2020-03-27 um 11.23.42.jpg

Ok, ich hab noch die CU und ein paar Zusatzdaten drin, aber die Hardware-ID, die ich sowohl an Sina_Pso, als auch an Sina_Para_S übergebe ist die im Bild gezeigte.
Damit funktioniert das ohne Probleme.
 
Jetzt hab ich es hinbekommen.

Bei der AxisNo. muss 2 drin stehen.
Ist das dann weil die Cu die Adresse 1 hat?

Egal, es geht. Danke!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Jetzt hab ich es hinbekommen.

Bei der AxisNo. muss 2 drin stehen.
Ist das dann weil die Cu die Adresse 1 hat?

Egal, es geht. Danke!

Richtig, Du musst die DriveObjektnummer angeben. Wenn Du z.B. eine CU320-2 mit mehreren Achsen hast, dann können da 6 Achsen drauf sein und noch die Einspeisung, Terminalmodule usw. . Jede hat dann eine eigene DriveObjektnummer.

Weitere Anmerkung:
Wenn Du ohnehin schon ein S7-1500 hast, dann könntest Du auch die Technologieobjekte dort nutzen. Da gibt es dann PLC-Open Bausteine wie MC_Torquelimiting womit man dann drehmomentbegrenzt verfahren kann (z.B. auch für Greifer usw. einsetzbar) oder Kollissionsüberwachung usw.
 
Hallo zusammen,

hier noch eine kurze Rückmeldung.

Die Anlage läuft jetzt so wie ich mir das vorgestellt habe.
Meine Lösung war der Ansatz von Ralle --> Fahren auf Festanschlag. Die Werte sind fest im Antrieb hinterlegt, da ich immer die gleiche Position anfahren kann.

Verfahrsatz 1: Fahren auf Festanschlag. --> Erkennen des Festanschlags mit externem Signal (Bei mir des Signal von meinem Schrauber, Drehmoment erreicht). WEITER MIT HALT
Verfahrsatz 2: Relativbewegung ins Minus, weg vom Bauteil. (1mm) --> Danach öffne ich meinen Greifer vom Bauteil. ENDE

Vielen Dank nochmals für die Hilfe.

Grüße
 
Zurück
Oben