FESTO EMCA Controller StartTask wird nicht immer ausgeführt

Beiträge
35
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Forum :)

Ich schlage mich seit einiger Zeit mit einem Thema rum was sicher der ein oder andere mit Leichtigkeit lösen kann

Also.
1215 SPS
FESTO Antrieb EMCA auf einer ELGA Achse.
In einem Array mit 2000 Werten haben ich Koordinaten für die Positionierung der Achse.
Die Achse wird referenziert, freigeschaltet und über die Beobachtungstabelle kann ich munter fahren.

In einer einfache IF Anweisung habe ich in einem cyclic interrupt - damit ich das besser sehen kann folgenden FB eingebunden.
Die Achse ist natürlich enabled.

Warum erhalte ich nicht sauber immer Treu and false um entsprechend hier den nächsten Wert laden zu können.
Vorweg, ja ich hätte auch eine For Schleife nehmen können... Aber bis zum Ende komm ich gar nicht, denn der
Antrieb ist zwar auf MC = True oder DriveMoving = False ....

Es ist irgendwie so, dass die Flanken nicht am Contoller ankommen, besser gesagt nicht immer.

Was mach ich falsch???

Danke

Thomas




"FHPP_CTRL_DB".Brake := TRUE;
"FHPP_CTRL_DB".Halt := TRUE;
"FHPP_CTRL_DB".Stop := TRUE;


IF #StartAuslesen = TRUE THEN
IF "FHPP_CTRL_DB".DriveMoving = FALSE THEN
"FHPP_CTRL_DB".StartTask := FALSE;
#AktuellePosition := #AktuellePosition + 1;
#YAchse := ("CAD_SQL_Data".Pos[#AktuellePosition].Y) * (1000);
"FHPP_CTRL_DB".SetValuePosition := #YAchse;
"FHPP_CTRL_DB".StartTask := TRUE;
ELSE
"FHPP_CTRL_DB".StartTask := FALSE;
#YAchse := ("CAD_SQL_Data".Pos[#AktuellePosition].Y) * (1000);
"FHPP_CTRL_DB".SetValuePosition := #YAchse;
"FHPP_CTRL_DB".StartTask := TRUE;
;
END_IF;

"FHPP_CTRL_DB".StartTask := FAlSE;



IF #AktuellePosition = 1999 THEN
#StartAuslesen := FALSE;
#AktuellePosition := -1;
;

END_IF;

;

END_IF;
 
"FHPP_CTRL_DB".StartTask := FAlSE;

Wird sofort wieder zurückgesetzt. Es sollte mal mindestens einen Zyklus lang aktiv sein.
(Besser länger, ich meine mit dem FHPP Protokoll ging ein richtig schöner Handshake)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke Matze. Wie kann ich das machen... bin echt grün hinter den Ohren...

Ich hab mir so was schon gedacht und hab daher mit den Zeiten gespielt und die auch auf 3 sek. hochgedreht ... denke
aber da liege ich falsch
 
Hallo Forum :)

Ich schlage mich seit einiger Zeit mit einem Thema rum was sicher der ein oder andere mit Leichtigkeit lösen kann

Also.
1215 SPS
FESTO Antrieb EMCA auf einer ELGA Achse.
In einem Array mit 2000 Werten haben ich Koordinaten für die Positionierung der Achse.
Die Achse wird referenziert, freigeschaltet und über die Beobachtungstabelle kann ich munter fahren.

In einer einfache IF Anweisung habe ich in einem cyclic interrupt - damit ich das besser sehen kann folgenden FB eingebunden.
Die Achse ist natürlich enabled.

Warum erhalte ich nicht sauber immer Treu and false um entsprechend hier den nächsten Wert laden zu können.
Vorweg, ja ich hätte auch eine For Schleife nehmen können... Aber bis zum Ende komm ich gar nicht, denn der
Antrieb ist zwar auf MC = True oder DriveMoving = False ....

Es ist irgendwie so, dass die Flanken nicht am Contoller ankommen, besser gesagt nicht immer.

Was mach ich falsch???

Danke

Thomas




"FHPP_CTRL_DB".Brake := TRUE;
"FHPP_CTRL_DB".Halt := TRUE;
"FHPP_CTRL_DB".Stop := TRUE;


IF #StartAuslesen = TRUE THEN
IF "FHPP_CTRL_DB".DriveMoving = FALSE THEN
"FHPP_CTRL_DB".StartTask := FALSE;
#AktuellePosition := #AktuellePosition + 1;
#YAchse := ("CAD_SQL_Data".Pos[#AktuellePosition].Y) * (1000);
"FHPP_CTRL_DB".SetValuePosition := #YAchse;
"FHPP_CTRL_DB".StartTask := TRUE;
ELSE
"FHPP_CTRL_DB".StartTask := FALSE;
#YAchse := ("CAD_SQL_Data".Pos[#AktuellePosition].Y) * (1000);
"FHPP_CTRL_DB".SetValuePosition := #YAchse;
"FHPP_CTRL_DB".StartTask := TRUE;
;
END_IF;

"FHPP_CTRL_DB".StartTask := FAlSE;



IF #AktuellePosition = 1999 THEN
#StartAuslesen := FALSE;
#AktuellePosition := -1;
;

END_IF;

;

END_IF;
Mal unabhängig von deinem Problem, du kannst den SCL Code auch etwas "eleganter" schreiben:

statt
Code:
IF #StartAuslesen = TRUE THEN
....
IF "FHPP_CTRL_DB".DriveMoving = FALSE THEN
....
usw...

kann man das auch so machen:
Code:
IF #StartAuslesen THEN
....
IF NOT "FHPP_CTRL_DB".DriveMoving THEN
....
usw...
 
Mal unabhängig von deinem Problem, du kannst den SCL Code auch etwas "eleganter" schreiben:

statt
Code:
IF #StartAuslesen = TRUE THEN
....
IF "FHPP_CTRL_DB".DriveMoving = FALSE THEN
....
usw...

kann man das auch so machen:
Code:
IF #StartAuslesen THEN
....
IF NOT "FHPP_CTRL_DB".DriveMoving THEN
....
usw...
Ja das stimmt. Weißt, wenn man am suchen ist, dann dann dann ... und weißt ja wie so ein Code dann aussieht... Sche.... :)
Evtl habe ich gerade einen Idee. Ich versuche es mit MC = TRUE und READY = TRUE wobei das sicher nur das Thema Referenzieren angeht
 
Das stimmt.
Mike eine Frage. Wie kann ich einen Zeitverzögerung einbauen, dass der nachfolgende Code erst .. sagen wir 200 ms später ausgeführt wird.

Ich vermute, dass es einfach ein Timing Thema ist und die Drive ist nicht bereit das Signal aufzunehmen
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das ist erst einmal schlecht, ich würde den CODE immer ausführen aber evtl. musst du einzelne Bits verzögert anlegen.
Ich muss dazu sagen, ich weiß nicht so genau was du genau machst.

Eine Zeitverzögerung realisierst du per TON
O.k.

Ich lade mir aus eine Array die Verfahrpositionen (Kommen aus der CAD über SQL Kopplung).
Dann möchte ich diese einzeln positionieren.
Dazu bringe ich den Regler per Definiton enable usw auf Ready (nach referenzieren)

Nun soll er mit Starttask den ersten Punkt anfahren. Das klappt eben "fast" immer. Er reagiert ja auf steigende Flanke
und die bekommt er wohl nicht immer durchgereicht :-(
 
Zeig doch einmal mehr von deinem Code ( und benutze bitte das Code TAG, sonst kann man das schier nicht lesen )

Anhang anzeigen 58728

Code:
//"FHPP_CTRL_DB".EnableDrive := True;
"FHPP_CTRL_DB".Brake := TRUE;
"FHPP_CTRL_DB".Halt := TRUE;
"FHPP_CTRL_DB".Stop := TRUE;


IF #StartAuslesen = TRUE  THEN

    IF "FHPP_CTRL_DB".MC = TRUE AND  "FHPP_CTRL_DB".Ready = TRUE THEN
            #AktuellePosition := #AktuellePosition + 1;
            #YAchse := ("CAD_SQL_Data".Pos[#AktuellePosition].Y) * (1000);
            "FHPP_CTRL_DB".SetValuePosition := #YAchse;
            "FHPP_CTRL_DB".StartTask := TRUE;
        END_IF;
        
        IF "FHPP_CTRL_DB".DriveMoving = TRUE THEN
            "FHPP_CTRL_DB".StartTask := FALSE;

        END_IF;
    
    IF #AktuellePosition = 1999 THEN
        #StartAuslesen := FALSE;
        #AktuellePosition := -1;
                ;
    END_IF;
    ;
END_IF;
 
Ja. Es kann sein 8x läuft das positionieren prima, dann nix. dann kann es sein, dass die Maschine einfach los läuft.
Das Array wird ja zyklisch abgearbeitet und dann auf einmal greift die True / False logik
Kurz um das Steuersiglan FALSE wird nicht immer gesetzt - daher wollte ich mit einem Timer warten.

Ach ja - ich lass die in einem Cycle laufen
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich würde mal testweise hier noch folgendes hineinschreiben:

IF "FHPP_CTRL_DB".MC = TRUE AND "FHPP_CTRL_DB".Ready = TRUE AND NOT "FHPP_CTRL_DB".DriveMoving THEN
 
Du könntest:
Aber mit Vorbehalt, das mit dem Timer ist deine Idee. Ich würde es nicht so machen sondern
ein vernünftiges Handshake.

Code:
VAR
....
    deinTonTimer : TON;
....
VAR_END;


//"FHPP_CTRL_DB".EnableDrive := True;
"FHPP_CTRL_DB".Brake := TRUE;
"FHPP_CTRL_DB".Halt := TRUE;
"FHPP_CTRL_DB".Stop := TRUE;

deinTonTimer(IN:= #StartAuslesen, PT:= t#100ms);

IF deinTonTimer.q = TRUE  THEN

    IF "FHPP_CTRL_DB".MC = TRUE AND  "FHPP_CTRL_DB".Ready = TRUE THEN
            #AktuellePosition := #AktuellePosition + 1;
            #YAchse := ("CAD_SQL_Data".Pos[#AktuellePosition].Y) * (1000);
 .......
 
Du könntest:
Aber mit Vorbehalt, das mit dem Timer ist deine Idee. Ich würde es nicht so machen sondern
ein vernünftiges Handshake.

Code:
VAR
....
    deinTonTimer : TON;
....
VAR_END;


//"FHPP_CTRL_DB".EnableDrive := True;
"FHPP_CTRL_DB".Brake := TRUE;
"FHPP_CTRL_DB".Halt := TRUE;
"FHPP_CTRL_DB".Stop := TRUE;

deinTonTimer(IN:= #StartAuslesen, PT:= t#100ms);

IF deinTonTimer.q = TRUE  THEN

    IF "FHPP_CTRL_DB".MC = TRUE AND  "FHPP_CTRL_DB".Ready = TRUE THEN
            #AktuellePosition := #AktuellePosition + 1;
            #YAchse := ("CAD_SQL_Data".Pos[#AktuellePosition].Y) * (1000);
 .......
Leider hat es nichts geholfen .... weder das ein noch das andere :-(


Code:
"FHPP_CTRL_DB".Brake := TRUE;
"FHPP_CTRL_DB".Halt := TRUE;
"FHPP_CTRL_DB".Stop := TRUE;


"IEC_Timer_0_DB".TON(IN:= #StartAuslesen,PT:= "IEC_Timer_0_DB".PT);

IF #AktuellePosition = 0 THEN
    "FHPP_CTRL_DB".StartTask := FALSE;
END_IF;

IF #StartAuslesen = TRUE  THEN

    IF "FHPP_CTRL_DB".MC = TRUE AND "FHPP_CTRL_DB".Ready = TRUE AND NOT "FHPP_CTRL_DB".DriveMoving THEN
            #AktuellePosition := #AktuellePosition + 1;
            #YAchse := ("CAD_SQL_Data".Pos[#AktuellePosition].Y) * (1000);
            "FHPP_CTRL_DB".SetValuePosition := #YAchse;
            "FHPP_CTRL_DB".StartTask := TRUE;
        END_IF;
        
        IF "FHPP_CTRL_DB".DriveMoving = TRUE THEN
            "FHPP_CTRL_DB".StartTask := FALSE;

        END_IF;
    
    IF #AktuellePosition = 1999 THEN
        #StartAuslesen := FALSE;
        #AktuellePosition := -1;
                ;
    END_IF;
    ;
END_IF;
 
Zurück
Oben