Sinamics S110 CU305 PN Control Unit Positionsvorgabe

Zuviel Werbung?
-> Hier kostenlos registrieren
das ist so etwas von frustrierend


immer zwischen der 10 & 15 Klemmung bleibt es stehen
vielleicht kann ja mit dem Trace jemand was anfangen, ich sehe da keinen Fehler

Offen klemmt nicht 5 Trace.jpg
 
... ich tippe da auch auf ein Timing Problem. Ich habe jetzt Deine Schrittkette nicht komplett überblickt, aber wenn das EXCECUTE nur einen Zyklus ansteht und z.B. dein OB schneller als z.B. 4ms rennt, dann wäre das eine Erklärung.

Ich würde da immer ein Handshake programmieren. D.h. wenn das EXECUTE gesendet wird, dieses mit dem Signal Achse fährt vorwärts (oder rückwärts) oder (Sollwert steht "nicht mehr") erst wieder zurücksetzen.
Für einen schnellen Test kannst Du den Code ggf. in einen Zeit- OB (z.B. 10ms) hängen oder eine Mindestzykluszeit programmiern.
Außerdem wäre ein Trace auf dem Antrieb hier auch zielführender. Ggf. kommt ja Dein EXCEUTE unten im Antrieb wirklich nicht an ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... ich tippe da auch auf ein Timing Problem. Ich habe jetzt Deine Schrittkette nicht komplett überblickt, aber wenn das EXCECUTE nur einen Zyklus ansteht und z.B. dein OB schneller als z.B. 4ms rennt, dann wäre das eine Erklärung.

Ich würde da immer ein Handshake programmieren. D.h. wenn das EXECUTE gesendet wird, dieses mit dem Signal Achse fährt vorwärts (oder rückwärts) oder (Sollwert steht "nicht mehr") erst wieder zurücksetzen.
Für einen schnellen Test kannst Du den Code ggf. in einen Zeit- OB (z.B. 10ms) hängen oder eine Mindestzykluszeit programmiern.
Außerdem wäre ein Trace auf dem Antrieb hier auch zielführender. Ggf. kommt ja Dein EXCEUTE unten im Antrieb wirklich nicht an ...

Hallo Zanko,


das hab ich mir für heute auf die ToDo Liste geschrieben und gleich heute Morgen realisiert.
Mit einer Ausschaltverzögerten Flanke, läuf seitdem ohne Unterbrechung.
Die zeit habe ich versuchsweise auf 1ms gestzt, läuft wunderbar.
D.H. für diesen fall ist die Flanke nicht geeignet.
Wieder mal eine Erfahrung mehr gemacht.


VG Roland
 
Moin Roland,
Kopf hoch - Rom wurde auch nicht an einem Tag gebaut ;)
Zako könnte gut recht haben - ich habe den Sina_Pos mal überflogen und ehrlich gesagt bildet Siemens dort zwar selbst eine Flanke mit dem ExecuteMode-Eingang, verwendet diese aber nicht weiter (Bausteine korrekt zu dokumentieren ist nicht gerade eine Stärke von Siemens). Heißt der Execute sollte vielleicht doch länger anstehen. Dafür ist Zakos Vorschlag sehr gut - du startest den Antrieb mit Execute und nimmst das Execute bspw. mit dem Bit 13 vom Zustandswort 1 (= Stillstandsüberwachung) zurück. So würdest du dann solange starten, bis die Achse wirklich angefahren ist.
Grundsätzlich kannst du aber auch immer schauen, warum dein Antrieb nicht fährt. Dafür kannst du zum Einen in die Onlinediagnose des FUs schauen und zum anderen die Diagnose-Ausgänge vom Sina_Pos nutzen.
PS: Eine fertige Schrittkette kann ich dir leider nicht geben, da ich sowas nie im FUP machen würde - am ehesten noch in SCL oder aber gleich in Graph (was wohl auf einer 1200er nicht geht).
 
jetzt habe gleich die nächste Frage


ich messe meine klemmkraft mit einem Messumformer / Messdose die über 2 Punkte zusammengedrückt wird und dementsprechend KN ausgibt (optisch).
Aber für den Dauertest ca 50000 möchte ich diese nicht benützen, wegen Verschleiß.
Daher mit einem Metallstück, deshalb sollte ich mit Drehmoment fahren um den entsprechenden Moment herauszufinden.
Hat dies schon jemand gemacht, laut S-Support nur über Verfahrsätze möglich?
Ist irgendwo ein Drehmomentwert oder Stromwert hinterlegt, bei der Siemens Doko werde ich nicht fündig.
Im Starter gibt es ein Fenster mit Regelungsart Drehmomentregler mit Geber, hat da jemand schon was gemacht?


VG Roland
Drehmomentregelung.png
 
Ja und hier Drehzahl und Lageregelung gemischt - Sinamics S120 mit CU320 diskutieren wir noch weiter, ich glaube ich hab dann hier noch Fragen zum Moment diskutiert, was eher im falschen Thread war.

@Roland

Du gehst da ganz schön ans Eingemachte. ;-)

Ich mache es gerade so und arbeite an einem Baustein:

Nutzung von SinaPos Servo S120 mit CU310 und Telegramm 111, EPOS und MDI

Du kannst mit dem SinaPos folgende Betriebsarten nutzen:

// 1 = Positionieren Relativ
// 2 = Positionieren Absolut
// 3 = Positionieren als Einrichten
// 4 = Referenzpunktfahrt
// 5 = Referenzpunkt setzen
// 6 = Verfahrsatz 0 – 15/63 (G120/S120)
// 7 = Tippen
// 8 = inkrementell Tippen


Mit 2 fahre ich ganz normale Positionierung.
Mit 3 fahre ich Geschwindigkeitsbetrieb ohne Position, umschaltbar auf Positionierung (Rundachse mit Modulo)
Mit 6 fahre ich dann Verfahrsatz 0 "Fahren auf Festanschlag"

Dazu im Servo Verfahrsatz 0 anlegen, dort "Fahren auf Festanschlag" ans Betriebsart eintragen.
Die nötigen Daten, Position, Geschwindigkeit, Moment übertrage ich per Parameter-Transfer (Sina_Para_S).
Zusätzlich habe ich, wie im o.g. Thread besprochen noch eine Momentenbegrenzung, über einen prozentualen Wert.

Hier mal, wie ich die Parametertransfer mache (Jedesmal, vor einem Start):

Code:
REGION Parameter_Verfahr-Satz0_Set


(* --- Schrittkette Verfahr-Satz 0 setzen und in Servo laden --- *)


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    := #I_nMaxTorqueTravelToFixedStop;
    #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
    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
    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 = #I_nMaxTorqueTravelToFixedStop) THEN
        #nSchrittketteParaSatz0 := 11;
        #nSetSatz0_ok := 1;
    ELSE
        #nSchrittketteParaSatz0 := 4; 
    END_IF; 


  11:  // Startwerte Position setzen
    IF #O_bTarget_forward THEN
        #TorquePos := #SetPos + #I_nPositionAdd_TravelToFixedStop;
    ELSE IF #O_bTarget_forward THEN
            #TorquePos := #SetPos + #I_nPositionAdd_TravelToFixedStop;
         ELSE 
            #TorquePos := #SetPos;                                        //Das ergibt ziemlich sicher einen Fehler, also nochmal testen und besser machen
         END_IF;
    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
    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
    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
    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
    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();

Im Beispiel werden 3 Parameter geschrieben und auch zurückgelesen und kontrolliert. Die Kontrolle kann man evtl. auch weglassen.
1. Moment (Das muß ich auch noch testen, ich weiß nicht genau, was der Servo damit macht, evtl. Klemmmoment???
2. Position die angefahren soll. Diese muß hinter dem Klemmpunkt liegen und zwar sogar noch vor dem Beginn der Bremsrampe, sonst Störung!
3. Geschwindigkeit

Das nur mal als Beispiel, falls du das variabel gestalten willst/mußt.

Zum Beginn kannst du auch erst einmal 2 Verfahrsätze anlegen, einen zum Öffnen, einen zum Schließen.
Im Mode 6 übergibst statt der Position die Nummer des Parametersatzes an den Baustein SinaPos.
Dann fährst du immer diese beiden Verfahrsätze.

Wenn du die Positionen ändern willst könntest du diesen einen Parameter jeweils vorher in der Servo senden (s. Beispiel oben)
Durch die Begrenzung des Momentes des Servos, kannst du einfach schließen und der klemmt dann mit dem als Begrenzung eingestellten Moment.
Ich bin noch am Testen, ob das im Verfahrsatz übergebene Moment das Klemmmoment ist, und dann genau vom Servo eingestellt wird, ich denke mal ja.
 
Zuletzt bearbeitet:
Ja und hier Drehzahl und Lageregelung gemischt - Sinamics S120 mit CU320 diskutieren wir noch weiter, ich glaube ich hab dann hier noch Fragen zum Moment diskutiert, was eher im falschen Thread war.

@Roland

Du gehst da ganz schön ans Eingemachte. ;-)

Ich mache es gerade so und arbeite an einem Baustein:

Nutzung von SinaPos Servo S120 mit CU310 und Telegramm 111, EPOS und MDI

Du kannst mit dem SinaPos folgende Betriebsarten nutzen:

// 1 = Positionieren Relativ
// 2 = Positionieren Absolut
// 3 = Positionieren als Einrichten
// 4 = Referenzpunktfahrt
// 5 = Referenzpunkt setzen
// 6 = Verfahrsatz 0 – 15/63 (G120/S120)
// 7 = Tippen
// 8 = inkrementell Tippen


Mit 2 fahre ich ganz normale Positionierung.
Mit 3 fahre ich Geschwindigkeitsbetrieb ohne Position, umschaltbar auf Positionierung (Rundachse mit Modulo)
Mit 6 fahre ich dann Verfahrsatz 0 "Fahren auf Festanschlag"

Dazu im Servo Verfahrsatz 0 anlegen, dort "Fahren auf Festanschlag" ans Betriebsart eintragen.
Die nötigen Daten, Position, Geschwindigkeit, Moment übertrage ich per Parameter-Transfer (Sina_Para_S).
Zusätzlich habe ich, wie im o.g. Thread besprochen noch eine Momentenbegrenzung, über einen prozentualen Wert.

Hier mal, wie ich die Parametertransfer mache (Jedesmal, vor einem Start):

Code:
REGION Parameter_Verfahr-Satz0_Set


(* --- Schrittkette Verfahr-Satz 0 setzen und in Servo laden --- *)


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    := #I_nMaxTorqueTravelToFixedStop;
    #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
    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
    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 = #I_nMaxTorqueTravelToFixedStop) THEN
        #nSchrittketteParaSatz0 := 11;
        #nSetSatz0_ok := 1;
    ELSE
        #nSchrittketteParaSatz0 := 4; 
    END_IF; 


  11:  // Startwerte Position setzen
    IF #O_bTarget_forward THEN
        #TorquePos := #SetPos + #I_nPositionAdd_TravelToFixedStop;
    ELSE IF #O_bTarget_forward THEN
            #TorquePos := #SetPos + #I_nPositionAdd_TravelToFixedStop;
         ELSE 
            #TorquePos := #SetPos;                                        //Das ergibt ziemlich sicher einen Fehler, also nochmal testen und besser machen
         END_IF;
    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
    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
    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
    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
    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();

Im Beispiel werden 3 Parameter geschrieben und auch zurückgelesen und kontrolliert. Die Kontrolle kann man evtl. auch weglassen.
1. Moment (Das muß ich auch noch testen, ich weiß nicht genau, was der Servo damit macht, evtl. Klemmmoment???
2. Position die angefahren soll. Diese muß hinter dem Klemmpunkt liegen und zwar sogar noch vor dem Beginn der Bremsrampe, sonst Störung!
3. Geschwindigkeit

Das nur mal als Beispiel, falls du das variabel gestalten willst/mußt.

Zum Beginn kannst du auch erst einmal 2 Verfahrsätze anlegen, einen zum Öffnen, einen zum Schließen.
Im Mode 6 übergibst statt der Position die Nummer des Parametersatzes an den Baustein SinaPos.
Dann fährst du immer diese beiden Verfahrsätze.

Wenn du die Positionen ändern willst könntest du diesen einen Parameter jeweils vorher in der Servo senden (s. Beispiel oben)
Durch die Begrenzung des Momentes des Servos, kannst du einfach schließen und der klemmt dann mit dem als Begrenzung eingestellten Moment.
Ich bin noch am Testen, ob das im Verfahrsatz übergebene Moment das Klemmmoment ist, und dann genau vom Servo eingestellt wird, ich denke mal ja.

Hallo Ralle,


erstmal vielen Dank für die ausführliche Doku.
Ich habe die Schn..... ziemlich voll von dem Siem... Kram.
:oops:
Ich habe eine ziemlich neue Kraftmessdose, die Nutze ich in dem Fall als Dauertest, ob diese auch geeignet ist.
Für die Momentenregelung brauch ich erste ein paar Tage Abstand, da ich eh nur 2-3 mal im Jahr was programmiere.


VG Roland
 
Zurück
Oben