TIA Sina_Pos: Sollposition wird nach ExecuteMode nicht geändert

PEit

Level-1
Beiträge
20
Reaktionspunkte
5
Zuviel Werbung?
-> Hier kostenlos registrieren
Festo CMMT AS erhält keine neuen Sollwerte

Hallo Zusammen,

ich habe ein Problem beim Ansteuern eines CMMT-AS-C4-3A-PN-S1 Controllers von Festo.
Zur Ansteuerung verwende ich den Sina_Pos Baustein.

Hardware:
CPU 1512SP F-1 PN
CMMT-AS-C4-3A-PN-S1

Software:
Tia Portal V16 Update 3
Sinapos V2.1

Mein Problem ist, dass der CMMT Controller bei schnell aufeinander folgenden Positionsänderungen keine neuen Sollwerte erhält.
Trace.PNG

In rot ist die Soll Position zu sehen und in Braun die Ist Position.
In Blau kann man die Executes sehen.
Jedoch wird beim letzten Execute die Sollposition nicht an den Controller übergeben.

Cmmt.PNG

Zwischen den beiden Signalen liegen mehr als 100ms Sekunden. Ich geh mal davon aus das der Baustein die Signale so schnell verarbeiten kann.
Die Zykluszeit liegt etwa bei 13ms.
Der Mode, Cancel und Stop sind dauerhaft angewählt und der ConfigEPos steht auf 3h.

Kann sich einer Vorstellen warum die Werte nicht an den Controller übergeben werden?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Da ich noch garnicht auf meine Programmierung eingegangen bin will ich das nochmal tun.

Ich gebe aus einer Schrittkette eine Positionsnummer vor.
Diese Nummer wird mit einer Case anweisung ausgewertet.
Jede Position kann noch unterpositionen haben, die dann mit der Variable #Count unterteilt werden.


Code:
        CASE #Bits.FahrBefehl OF
                    #EAchse_GS:
                        #"E-Achse".In.SollPos := #Positionen.GSPos;
                        #Count := 1;
                        IF (#"E-Achse".Out.IstPos <= #Positionen.GSPos + #Positionen.Toleranz_Pos AND
                            #"E-Achse".Out.IstPos >= #Positionen.GSPos - #Positionen.Toleranz_Pos)
                        THEN
                            #Bits.InPos := True;
                        END_IF;
                        
                    #"EAchse_AS":
                        IF // Wenn Achse nicht in VPos 
                            NOT (#"E-Achse".Out.IstPos >= #tmpVorpos - #Positionen.Toleranz_Schleifen)
                        THEN // Dann Achse zu VPos 
                            #"E-Achse".In.SollPos := #tmpVorpos;
                            #Count := 1;
                            
                        ELSIF // Wenn Achse in VPos 
                            (#"E-Achse".Out.IstPos >= #tmpVorpos - #Positionen.Toleranz_Schleifen) AND
                            // und Achse nicht in EinpressPos 
                            NOT (#"E-Achse".Out.IstPos >= #tmpEinpresstiefe - #Positionen.Toleranz_Pos AND
                            #"E-Achse".Out.IstPos <= #tmpEinpresstiefe + #Positionen.Toleranz_Pos)
                        THEN // Achse zu EinpressPos
                            #"E-Achse".In.SollPos := #tmpEinpresstiefe;
                            #Count := 2;
                            
                        ELSIF  // Wenn Achse in VPos 
                            (#"E-Achse".Out.IstPos >= #tmpVorpos - #Positionen.Toleranz_Schleifen) AND
                            // und Achse in EinpressPos 
                            (#"E-Achse".Out.IstPos >= #tmpEinpresstiefe - #Positionen.Toleranz_Pos AND
                            #"E-Achse".Out.IstPos <= #tmpEinpresstiefe + #Positionen.Toleranz_Pos)
                        THEN
                            #Bits.InPos := True;
                        END_IF;
                END_CASE;

            
            IF (#Bits.FahrBefehl <> #LastBef) THEN
                #Count := 0;
            END_IF;
            
            #LastBef := #Bits.FahrBefehl;
            
            
            IF (#Count <> #LastCount) THEN
                #"E-Achse".In.ExecuteMode := True;
            ELSE
                #"E-Achse".In.ExecuteMode := False;
            END_IF;
            #LastCount := #Count;

Das Execute Signal Trigger ich mit dem Count.
Somit sollte bei jeder Positionsänderung die Sollposition und der Execute gleichzeitig anstehen.

Die Daten werden, zumindest nach Anleitung, bei einer Positiven Flanke am Execute an den Controller übermittelt.
Dieser liest die Daten aus, ich glaube nicht das ich da noch aktiv was auslesen kann.

Was ich leider nicht weiß, ist ob ich irgendwo die zuletzt gesendeten Daten auslesen kann.
Die müssten ja eigentlich irgendwo auf dem Telegram(111) stehen, oder?
 
Zuletzt bearbeitet:
Gab es da nicht noch extra Bits für Wertübernahme bei laufender Fahrt ohne STOP?
Ich kann leider gerade nicht nachsehen.
Dein Trace sieht so aus, als hätte der Servolenkung die erste Position einfach zu Ende gefahren, dann gestoppt und dann erst den neuen Wert übernommen.
 
Das Bit 8 im ConfigEPos ermöglicht eine Stetige Sollwertübernahme.
Aber das sollte für mich ja eigentlich keine Rolle spielen da ich eh immer einen Execute gebe, oder?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das Bit 8 im ConfigEPos ermöglicht eine Stetige Sollwertübernahme.
Aber das sollte für mich ja eigentlich keine Rolle spielen da ich eh immer einen Execute gebe, oder?

Ich glaube, das Bit mußt du setzen. Einen Versuch ist es allemal wert.
 
Ich hab mich Ende letzter Woche nochmal mit dem Problem beschäftigt und eine Lösung gefunden.

Und zwar gibt es im Zustandswort 1 im Telegramm 111 das Bit 12, welches den Start eines Verfahrsatzes quittiert.

Ich lass also mein Execute solange anstehen bis die Quittierung kommt.

Code:
                IF (#Bits.FahrBefehl <> #LastBef) THEN
                    #Count := 0;
                    #LastCount := 0;
                    #"E-Achse".In.ExecuteMode := False;
                END_IF;
                
                #LastBef := #Bits.FahrBefehl;
                
                IF (#Count <> #LastCount) AND #Count <> 0
                    AND NOT #"E-Achse".In.ExecuteMode AND NOT #Quittierung
                THEN
                    
                        #"E-Achse".In.ExecuteMode := True;
                        #LastCount := #Count;
                       
                END_IF;
                
                #P_TRIG_ExecuteQuitt(CLK := #Quittierung);
                
                IF #P_TRIG_ExecuteQuitt.Q THEN
                    #"E-Achse".In.ExecuteMode := False;
                END_IF;
 
Hallo,
hast du das Problem gelöst?
Execute und gleichzeitig Sollwert vorgeben hat bei mir noch nie funktioniert. Ich musste immer zu erst den Sollwert vorgeben und erst nach einer Weile (50-100ms) das exe auslösen.
Der Umrichter muss quasi den neuen Sollwert zu erst verarbeiten sonst fährt er den alten.
Mit der stätigen Wert Übernahme kannst du dir das Execute sparen. Der Umrichter folgt sofort deinem Sollwert. Funktioniert gut, jedenfalls mit Sinamics.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Die ständige Sollwertübergabe hat bei mir leider nicht so wirklich funktioniert, ist jedoch auch ein Festo Controller.

Das gleichzeitige Übergeben der Sollwerte und des Executes funktioniert jedoch sehr gut.
 
das gleiche Problem hatte ich auch

Der Siemens Sinapos nimmt "schnell" aufeinander folgende ExecuteMode Befehle nicht an.
Wenn ich eine Pause eingebaut habe oder den ExecuteMode noch einmal ausgelöst habe hat es immer funktioniert

Darauf habe ich mir den Sinapos einmal genauer angeschaut
ExecuteMode möchte eine Flanke
Die Flanke wird aber intern aber nur über einen Zyklus Zähler zurückgesetzt !!

Code:
// Betriebsart aktivieren erkennen (RQ 3901129, RQ 4094299)
IF #ExecuteMode AND NOT #sbExecuteEdge THEN
  #sbExecute := True;
  #siExecuteCyc := 0;
ELSIF #ActMode <> #ModePos THEN
  #sbExecute := FALSE;
ELSIF #siExecuteCyc > (2 * #siCycWait) THEN   // <<<<<<<<<<  siCycWait = 5
  IF #ModePos <> 4 THEN
    #sbExecute := FALSE;
  ELSE
    IF #sxRecvBuf.ZSW1.%X11 OR NOT #ExecuteMode THEN
      #sbExecute := FALSE;
    END_IF;
  END_IF;
ELSE
  ; // not used
END_IF;

Kommt ExecuteMode also schneller als 10 SPS Zyklen, wird keine Flanke im Baustein erkannt.
Hat man jetzt noch eine langsame SPS .... sind das gleich mal >= 400ms

Das ist doch pfusch von Siemens das so zu lösen ???
Gibt es dafür einen guten Grund, oder verstehe ich das falsch ?

Ich habe jetzt das "ELSIF #siExecuteCyc > (2 * #siCycWait) THEN" auf "ELSIF #siExecuteCyc > (#siCycWait) THEN" geändert
Und gebe den Baustein internen Status von #sbExecute als Out Parameter aus und frage dies in meinem MC_Move Baustein ab bevor ich ein neues Execute gebe.


P.S Von Festo gibt es mittlerweile einen eigenen "Sinapos" -> "Festo_PtP_Drives_PN"
 
... dafür ist er ja auch offen. 😉
Aber wenn Du permanent neue Positionssollwerte vorgeben willst, könnte man (parametriert im Antrieb)mit stetiger Sollwertübnahme arbeiten.

Falls Du nur das Geschwindigkeitsprofil stetig ändern möchtest, geht das über dem Override.

Oder mit Technologieobjekten in der S7-1500 arbeiten - da kannst Du im Pre-Servo OB in jedem Zyklus einen neuen Auftrag absetzen.
 
Zurück
Oben