# Sinamics S110 CU305 PN Control Unit Positionsvorgabe



## Roland15 (7 Mai 2019)

Hallo zusammen,

ist mein erstes Projekt mit Sinamics 110

Power Module PM240‑2
Sinamics S110 CU305 PN Control Unit
SIMATIC S7-1200 CPU 1215C
Basic Panel KTP-700
Kommunikation über Profinet

Einrichten (Tippbetrieb) & Hand (Positionswert Vorgabe) funktioniert soweit.
Das Problem ist ich weiß nicht wie ich die Eingabe vom SP".Position realisiere wenn ich verschiedene Positionen habe.
Da ich diese nicht mehrmals verwenden kann.


Ich bin für jeden Vorschlag Dankbar.
Evtl. hat jemand ein Vorlage Projekt, bei Siemens gibt es nichts bzw.(Support)


VG Roland


----------



## Roland15 (7 Mai 2019)

*FB284 Position*

Fürs Verständnis


Mit SP".Position (7000) meine ich den FB284 SINA_POS Positions Sollwert,
dem ich im Automatikbetrieb in verschiedene Schritten mehrere Positionen vorgeben möchte


VG Roland


----------



## Howard (8 Mai 2019)

Moin,
ich verstehe deine Frage nicht so ganz. An den FB_SinaPos.Position schreibst du einfach eine Variable, in der die gewünschte Position drin steht.


----------



## Roland15 (8 Mai 2019)

Guten Morgen Howard,


Sorry, ich versuche es mal etwas verständlicher zu machen.
Bei mir gibt es 3 Betriebsarten
Einrichten ModePos 8 = Tippbetrieb, Antrieb verfährt so lange man auf der Taste bleibt mit langsamer Geschwindigkeit.
Handbetrieb ModePos 2 = fährt auf die eingestellte Position
Automatik ModePos 2 = Dauerbetrieb mit einer vorgegebenen Stückzahl.
Dem FB284 habe ich den DB30 zugewiesen.
Wenn ich es richtig verstanden habe muss ich am FB284 bei Position z.B. den Wert (7000) vorgeben um auf die gewünschte Position zu fahren.
D.h. z.B. im Handbetrieb schreibe ich einen Wert auf Position, im Auto-Betrieb einen Wert klemmen, zweiter Wert öffnen.
Es wird im Programm der Reihe nach abgearbeitet und immer den letzten Wert der Anweisung, d.h. es steht immer der letzte Wert drin.
Das ist mein Problem, ich weiß nich wie ich das genau realisieren soll.
Ich habe das auch schon mit den Verfahrsätzen gelesen, aber die 16 Sätze werden in Zukunft nicht ausreichen weil es mehrere Anwendungen gibt für den Antrieb.


VG Roland


----------



## Howard (8 Mai 2019)

also grundsätzlich schreibst du an den Parameter Position deine Sollposition in LU-Einheiten (außer halt in der Betriebsart 6).


> Siemens Hilfe:
> Positionssollwert in [LU] für Betriebsart Sollwertdirektvorgabe/MDI ODER Verfahrsatznummer für Betriebsart Verfahrsatz


So, und deine Aufgabe ist es jetzt, dass jedes mal, wenn der Antrieb eine neue Position anfahren soll, auch eine neue Position in deinen DB30_ST5_2G_SP.Position geschrieben wird.
Das könnte man ganz klassisch mit einer Schrittkette machen. Nach dem Motto:
1. Schritt - Lade Sollposition für Klemmen
2. Schritt - Warte auf Klemmposition erreicht
3. Schritt - Lade Sollposition für öffnen
4. Schritt - Warte auf Öffnenposition erreicht


----------



## Ralle (8 Mai 2019)

@Roland

Sag mal, wenn ich klemmen lese, willst du das motorisch mit Moment klemmen oder ist das nur eine Position, in der dann z.B. pneumatiwch geklemmt wird?


----------



## Roland15 (8 Mai 2019)

Hallo Howard

Danke für den Tipp, mit der Schrittkette habe ich schon angefangen, für jede Position mit Move den Wert in die "SP .Position zu schreiben.
Geht dies auch einfacher, nach jedem Schritt muss der ExecuteMode eine pos. Flanke bekommen.
Hat jemand evtl. ein Beispiel das ich mir dies besser vorstellen kann.

VG Roland


----------



## Ralle (8 Mai 2019)

@Roland

Was meinst du mit einfacher?

1. Variante
Du schreibnst Position, Vel und Acc in die entsprechenden Variabken und startest denn Servo.
Wenn er angekommen ist, dann meldet er dir das und du kannst die nächste Aktion starten.
Das ganze handelst du in einer Schrittkette ab.

2. Variante
Du kannst auch Statteiner Position eine Satznummer übergeben (Mode 6).
Dann kannst du im Servo Verfahrsätze anlegen und diese mit Satzweiterschaltung verketten.
Damit kannst du eine ganze Abfolge von Bewegungen starten, bist aber nicht ganz so flexibel mit der Übergabe der Positionen.
Willst du die in den Verfahrsätzen von der SPS aus ändern können, mußt das das dann extra z.B. per Parametertransfer machen.


----------



## Howard (8 Mai 2019)

Roland15 schrieb:


> Geht dies auch einfacher, nach jedem Schritt muss der ExecuteMode eine pos. Flanke bekommen.
> Hat jemand evtl. ein Beispiel das ich mir dies besser vorstellen kann.


Um die Flanke die der Baustein braucht kommt man leider nicht herum. Aber optimieren kann man natürlich immer.
Wenn man bei diesem Beispiel bleibt kann man es so beispielsweise erweitern:1. Schritt - Lade Sollposition für Klemmen UND setze ExecuteMode auf True
2. Schritt - Warte auf Klemmposition erreicht UND setze ExecuteMode auf False
3. Schritt - Lade Sollposition für öffnen UND setze ExecuteMode auf True
4. Schritt - Warte auf Öffnenposition erreicht UND setze ExecuteMode auf False
​so wäre bei gleicher Anzahl Schritten auch das Execute berücksichtigt.
Je nachdem wie man seine Schrittkette ausführt, gibt es auch unterschiedliche Möglichkeiten und Optimierungen - man sollte aber nicht aus Faulheit auf die Lesbarkeit des Codes verzichten.


----------



## Roland15 (8 Mai 2019)

Hallo Ralle,

ich stehe total auf dem Schlauch, dies ist mein erster Antrieb.
Was meinst Du mit Vel & Acc?

VG Roland


----------



## Ralle (8 Mai 2019)

Geschwindigkeit und Beschleunigung, bzw. bei MDI und Sina-Pos-Baustein Override Beschleunigung in 0-100 %


----------



## Roland15 (8 Mai 2019)

Ralle schrieb:


> @Roland
> 
> Sag mal, wenn ich klemmen lese, willst du das motorisch mit Moment klemmen oder ist das nur eine Position, in der dann z.B. pneumatiwch geklemmt wird?



Hallo Ralle,

ja es wird motorisch geklemmt, ich klemme mit kleinen Schritten und messe die Kraft mit einem Messumformer bis ich die gewünschte Kraft habe, die Position nehme ich als Bezugspunkt.
ich hatte mit dem Siemens Support Kontakt, es geht angeblich mit Drehmoment nur über die Verfahrsätze?
VG Roland


----------



## Roland15 (8 Mai 2019)

es klappt einfach nicht

hat evtl. jemand ein Projekt mit dem Antrieb der verschiedene Positionen anfährt, am liebsten mit Schrittketten.
Damit ich dies verstehen kann.
VG Roland


----------



## Howard (9 Mai 2019)

was klappt denn genau nicht? Poste doch mal deinen Code und dann schauen wir mal drauf. Fehler in deinem Programm zu finden und erklärt zu bekommen wird dir mehr helfen, als etwas fertiges abzutippen


----------



## Roland15 (9 Mai 2019)

Howard schrieb:


> was klappt denn genau nicht? Poste doch mal deinen Code und dann schauen wir mal drauf. Fehler in deinem Programm zu finden und erklärt zu bekommen wird dir mehr helfen, als etwas fertiges abzutippen



Hallo Howard,


wenn man keinen schimmer hat ist es sehr schwierig es verständlich vernünftig hinzubekommen.
Heute hat es zum ersten mal geklappt, mehr schlecht als recht, ich kann die Pos. abgefragten Flanken nicht sehen ob diese vernünftig kmmen.
Es bleibt auch ständig hängen, einmal in Offener Position Netzwerk 3.
Und in geklemmter Position öffnet es manchmal nicht NW5.
Wenn ich den "DB30 ST5 2G_SP".ExecuteMode auf eins steuere läuft es wieder weiter.


VG Roland


----------



## Howard (9 Mai 2019)

> wenn man keinen schimmer hat ist es sehr schwierig es verständlich vernünftig hinzubekommen.


das ging uns allen mal so 



> Heute hat es zum ersten mal geklappt, mehr schlecht als recht, ich kann die Pos. abgefragten Flanken nicht sehen ob diese vernünftig kommen.
> Es bleibt auch ständig hängen, einmal in Offener Position Netzwerk 3.


Du könntest dafür ein Trace anlegen, mit dem kann man alle global verfügbaren Variablen zyklusgenau aufzeichnen. Das hilf oft ungemein um Abläufe besser nachzuvollziehen:
Links im Projektbaum -> Traces -> neues Trace anlegen -> Konfigurieren und in die Steuerung laden -> Aufzeichnung starten



> Und in geklemmter Position öffnet es manchmal nicht NW5.
> Wenn ich den "DB30 ST5 2G_SP".ExecuteMode auf eins steuere läuft es wieder weiter.



Grundsätzlich sieht das vom Konzept her erstmal ganz ordentlich aus. Deine Probleme hören sich danach an, dass du entweder nicht im richtigen Schritt bist, oder aber bei den Flanken was falsch gemacht hast. Versuche mal den Trick mit dem Trace, dass sollte dir genau zeigen, wann du in welchem Schritt bist und ob die Schrittwechsel sowie die Flanken richtig kommen.

Ich kann dir zudem auch noch Graph als Erstellsprache empfehlen, die ist genau für Schrittketten gemacht, allerdings muss man sich da mal kurz einarbeiten.


----------



## Howard (9 Mai 2019)

zu deinen Bildern: Ist es gewollt das in Netzwerk 5 "Auto Schritt 4 öffnen", am SR-Glied etwas von "Auto Schritt 5 WST" steht, oder ist das ein Tippfehler?

außerdem nutzt du zwei unterschiedliche Konzepte in deinen Netzwerken, um dir die Flanken zu generieren. Einmal entsteht die Flanke hinter dem SR-Glied, das andere mal hinter dem UND/vor dem SR-Glied?!


----------



## Roland15 (9 Mai 2019)

Hallo Howard,


ja das mit dem SR-Glied etwas von "Auto Schritt 5 WST" ist gewollt, es fährt nur eine min Pos auf Wartestellung.
Am Anfang waren die Konzepte gleich die Flanken zu generieren. war nur ein Versuch ob es ein Unterschied macht.
Aber trotzdem bleibt es beim klemmen manchmal beim öffnen stehen???
Was ich auch nicht verstehe, das klemmen nicht zurückgesetzt wird, obwohl dies mit der Flanke P.IMP Schritt 2 geklemmt geschehen sollte.
Aber diese sind so kurz dass mann diese nicht erkennt?


VG Roland


----------



## Howard (9 Mai 2019)

naja, eine Flanke ist genau einen einzigen Zyklus da - das ist ja der Sinn einer Flanke 
Wenn die Flanke zum Rücksetzen nicht reicht, dann heißt das eigentlich, dass deine Flanke den Schritt möglicherweise einen Zyklus lang zurücksetzt und im folgenden Zyklus der Schritt wohl wieder direkt erneut gesetzt wird.
So wie es aussieht wird in deinem Beispiel nach dem Rücksetzen ja das UND zum setzen wieder wahr.


----------



## Roland15 (9 Mai 2019)

Ich kann dir zudem auch noch Graph als Erstellsprache empfehlen, die ist genau für Schrittketten gemacht, allerdings muss man sich da mal kurz einarbeiten.[/QUOTE]

nach meiner Info geht das mit der 1200 nicht nur mit der 1500

wenn ich kann nur nicht verstehen dass es 15 mal durchläuft klemmt und öffnet klemmt.... dann bleibt es stehen.

daher wäre es als Neuling ganz nützlich so einen Schrittkette zu sehen


----------



## Roland15 (9 Mai 2019)

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


----------



## zako (9 Mai 2019)

... 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 ...


----------



## Roland15 (10 Mai 2019)

zako schrieb:


> ... 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


----------



## Howard (10 Mai 2019)

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).


----------



## Roland15 (10 Mai 2019)

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


----------



## Howard (10 Mai 2019)

hu, Momentengeregelt habe ich noch keinen FU genutzt. Aber ich glaube hier: S110 MDI-Betrieb Momenten-Begrenzung
wurde vor kurzen viel darüber diskutiert.


----------



## Ralle (10 Mai 2019)

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):


```
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.


----------



## Roland15 (10 Mai 2019)

Ralle schrieb:


> 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
> 
> ...



Hallo Ralle,


erstmal vielen Dank für die ausführliche Doku.
Ich habe die Schn..... ziemlich voll von dem Siem... Kram.

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


----------

