An deinem Programm. Simulation und Realität sind immer zwei Paar Schuhe.Woran könnte das liegen?
An deinem Programm. Simulation und Realität sind immer zwei Paar Schuhe.
Fehler suchen und daraus lernen...
Bedeutet das, dass es ein Programmfehler ist?Der Unterschied zwische Theorie und Praxis ist in der Theorie kleiner als in der Praxis.
Was glaubst du denn? Meinst du, du hast einen Firmwarefehler entdeckt oder vielleicht nicht eher dass es an deinen Bausteinen liegtBedeutet das, dass es ein Programmfehler ist?
Hahaha, aber wie kann es bei zwei Baugruppen funktionieren und bei einer nicht?Was glaubst du denn? Meinst du, du hast einen Firmwarefehler entdeckt oder vielleicht nicht eher dass es an deinen Bausteinen liegt
Natürlich liegt es an deinem Programm.
Wie soll man mit der Aussage eine Diagnose machen?aber wie kann es bei zwei Baugruppen funktionieren und bei einer nicht?
Fehler suchen und daraus lernen...
Debuggen gleich an der Anlage, also ich habe es nur mit Simulation bisher gemacht.Naja ... und pauschale Aussagen zu machen ist ohnehin sehr schwierig ... so ganz ohne Fakten.Es gibt aber ja die Möglichkeit, sich im Status anzuschauen was passiert oder eben nicht passiert (obwohl es schön wäre wenn es passiert) - nennt sich debuggen - wäre vielleicht ein Ansatz ...
Ansonsten (und das solltest du mittlerweile wissen)
solltest du Code liefern wenn du Hilfe erwartest ...
so sieht mein FB ausCode:Motor_EVG_AVG(); // Um zu wissen, bei welchem Schritt mein Automatikmodus ist Anzeige_iSchrittnummer := Automatik_iSchrittnummer; // Flanken deklarieren fStopp(CLK := GVL.tStop); fStart(CLK := GVL.tStart); fRueckgabe (CLK:= GVL.xRueckgabeWert_AN_Fertig); // Anlaufprogramm Var mAn_Fertig := GVL.xRueckgabeWert_AN_Fertig; // Wenn Stopp, dann muss gestoppt werden, bis wieder Start gedrückt wird IF fStopp.Q OR NOT mAn_Fertig OR GVL.xP_allgemein THEN mStopp := TRUE; END_IF (* Wenn Voll dann eingestelltezeit um Anlage komplett auszuschalten, wenn aus dann müssen alle Motoren ausgehen dann Quitieren durch Stop und wieder Starten mit Start*) fbTon_Stoermeldung ( PT := DWORD_TO_TIME (dwStoermeldung *1000)); IF (fbTonxS1.Q AND fbTonxS3.Q) OR (fbTonxS3.Q AND fbTonxS4.Q) THEN fbTon_Stoermeldung.IN := TRUE; ELSE fbTon_Stoermeldung.IN := FALSE; END_IF IF fbTon_Stoermeldung.Q THEN xStoermeldung_Sieb_Voll:= TRUE; END_IF IF xStoermeldung_Sieb_Voll AND fStopp.Q AND M1_SiebRL = FALSE AND M2_SiebRL = FALSE AND M3_SiebRL = FALSE AND MV1_Sieb = FALSE THEN xStoermeldung_Sieb_Voll := FALSE; END_IF // Alles stoppen, wenn alle Motoren aus sind, dann darf wieder gestartet werden IF mStopp and NOT GVL.xP_allgemein AND (NOT M1_SiebRL) AND (NOT M2_SiebRL) AND (NOT M3_SiebRL) AND (NOT MV1_Sieb) AND mAn_Fertig THEN mStopp := FALSE; END_IF // Start merker damit bei starten nicht nach S1 was hat nochmal Start gedrückt werden muss IF fStart.Q or fRueckgabe.Q THEN mStart:= TRUE; ELSIF mStopp OR mNot_Aus THEN mStart:= FALSE; END_IF // Not-Aus wurde gedrückt, dann muss zuerst mit Stopp quittiert werden IF NOT GVL.tNot_Aus THEN mNot_Aus := TRUE; ELSIF fStopp.Q AND GVL.tNot_Aus THEN mNot_Aus := FALSE; END_IF // Not-Aus ist gedrückt oder Wahlschalter nicht mehr auf Automatik IF mNot_Aus OR NOT mAutomatik THEN M1_SiebRL := FALSE; M2_SiebRL := FALSE; M3_SiebRL := FALSE; MV1_Sieb := FALSE; mAutomatik := FALSE; Automatik_iSchrittnummer := 40; Automatik_iNachvortrag := 0; END_IF // Hand- oder Automatikbetrieb wählen IF GVL.mAutomatik_AP1 AND mStart THEN mAutomatik := TRUE; ELSIF NOT GVL.xWahlschalter_Automatik THEN mAutomatik := FALSE; END_IF // Automatische Schrittkette CASE Automatik_iSchrittnummer OF 0: // Schrittkette starten nach Bedingungen IF mStart AND mAutomatik AND NOT mStopp AND NOT xStoermeldung_Sieb_Voll THEN Automatik_iSchrittnummer := 5; END_IF 5: // hat S1 was dann Startet IF mStopp OR xStoermeldung_Sieb_Voll THEN Automatik_iSchrittnummer := 30; ELSIF fbTonxS1.Q THEN Automatik_iSchrittnummer := 10; END_IF 10: // Zweite Schnecke an, dann Erste, also Auffüllbehälter leer IF mStopp OR xStoermeldung_Sieb_Voll THEN Automatik_iSchrittnummer := 30; ELSIF fbTonS1_AVG.Q THEN Automatik_iSchrittnummer := 5; ELSIF fbTonxS1.Q AND (fbTonS2_AVG.Q AND fbTonS3_AVG.Q) OR (fbTonS3_AVG.Q AND fbTonxS2.Q) THEN M2_SiebRL := TRUE; END_IF // 1 Sekunde Verzögerung, um M1 anzuschalten IF mStopp OR xStoermeldung_Sieb_Voll THEN Automatik_iSchrittnummer := 30; ELSIF fbTonS1_AVG.Q THEN Automatik_iSchrittnummer := 25; ELSE Automatik_iSchrittnummer := 15; END_IF 15: // wenn beide Schnecken an sind dann warten bis irgendwas passiert IF mStopp OR xStoermeldung_Sieb_Voll THEN Automatik_iSchrittnummer := 30; ELSIF fbTonS1_AVG.Q OR fbTonxS3.Q THEN Automatik_iSchrittnummer := 25; ELSIF M1_SiebRL AND M2_SiebRL THEN Automatik_iSchrittnummer := 20; END_IF 20: // Beide Schnecken laufen, bis der Behälter voll wird oder tStop wurde gedrückt IF mStopp OR xStoermeldung_Sieb_Voll THEN Automatik_iSchrittnummer := 30; ELSIF fbTonS1_AVG.Q OR fbTonxS3.Q THEN Automatik_iSchrittnummer := 25; END_IF 25: // Behälter voll oder keine Kohle da Fall..... M1_SiebRL := FALSE; IF M1_SiebRL = FALSE THEN fbTonM2_Aus_Verzogerung.IN := TRUE; END_IF IF fbTonM2_Aus_Verzogerung.Q THEN M2_SiebRL := FALSE; Automatik_iSchrittnummer := 27; END_IF 27: // Timern zurücksetzen in Behältervoll-Fall IF NOT M2_SiebRL AND NOT M1_SiebRL THEN fbTonM1_Ein_Verzogerung.IN := FALSE; fbTonM2_Aus_Verzogerung.IN := FALSE; Automatik_iSchrittnummer := 5; END_IF 30: // (Stopp-Fall) Schnecken nacheinander ausschalten, Timer zurücksetzen M1_SiebRL := FALSE; IF M1_SiebRL = FALSE THEN fbTonM2_Aus_Verzogerung.IN := TRUE; END_IF IF fbTonM2_Aus_Verzogerung.Q THEN M2_SiebRL := FALSE; Automatik_iSchrittnummer := 40; END_IF 40: // Timer zurücksetzen und zum Anfang springen beim tStop IF NOT M2_SiebRL AND NOT M1_SiebRL THEN fbTonM1_Ein_Verzogerung.IN := FALSE; fbTonM2_Aus_Verzogerung.IN := FALSE; Automatik_iSchrittnummer := 0; END_IF END_CASE // Zweite Schrittkette (Nachvortrag) CASE Automatik_iNachvortrag OF // Läuft in Abhängigkeit vom Vortagesbehälter 0: // Startbedingungen IF mAutomatik AND mStart THEN Automatik_iNachvortrag := 10; END_IF 10: // Behälter hat Inhalt, dann M3 und MV1 anschalten IF mStopp OR xStoermeldung_Sieb_Voll THEN Automatik_iNachvortrag := 20; ELSIF (fbTonxS3.Q AND fbTonxS2.Q) AND (fbTonS4_AVG.Q) THEN M3_SiebRL := TRUE; MV1_Sieb := TRUE; Automatik_iNachvortrag := 20; END_IF 20: // Stopp alles und zurück zur Anfang IF mStopp OR xStoermeldung_Sieb_Voll THEN M3_SiebRL := FALSE; MV1_Sieb := FALSE; Automatik_iNachvortrag := 0; ELSIF fbTonS2_AVG.Q OR fbTonxS4.Q THEN M3_SiebRL := FALSE; MV1_Sieb := FALSE; Automatik_iNachvortrag := 10; END_IF END_CASE
Moin, du hast Recht ich hatte mehrere IF Anweisung in einem Schritt was zu Konflikte führen kann!@der_NooB : Ich muss Harald hier Recht geben - so einen Baustein würde ich auch nicht haben wollen und auch keine Fehler drin suchen wollen. Mit einer (? vernünftigen ?) Schrittketten-Umsetzung hat das wenig zu tun. Ich würde dir mal folgenden Vorschlag machen - das bringt dich wahrscheinlich gleich 3 Schritte weiter : Mal dir den Ablauf deiner Schrittkette mal grafisch auf und schreib dann auch an jeden deiner Schritte was da passieren so und wie. Wenn du bei deinem Konstrukt das noch hingemalt bekommst UND da selber dann noch durchsteigst dann "Hut ab".
Vielleicht mal konstuktiv/destruktiv : was du innerhalb einer Schrittkette machen solltest (mit IF !!!) ist auf den nächsten Schritt, der kommen soll, umzuschalten. Was du nicht machen solltest ist dann innerhalb des Schrittes noch Verknüpfungen einzubauen, die dann vielleicht oder vielleicht auch nicht, irgebdwelche Aktionen auslösen. Ich denke mal, dass das dein Haupt-Problem überhaupt sein wird ... und möglicherweise ist das dann auch gleich der Unterschied zwischen Simulation und realem Lauf.
Und nochmals zur Simulation : die würde ich nur verwenden um syntaktische Fehler im Code zu finden.
// Automatische Schrittkette
CASE Automatik_iSchrittnummer OF
0: // Schrittkette starten nach Bedingungen
IF mStart AND mAutomatik AND NOT mStopp AND NOT xStoermeldung_Sieb_Voll THEN
Automatik_iSchrittnummer := 5;
END_IF
5: // hat S1 was dann Startet
IF mStopp OR xStoermeldung_Sieb_Voll THEN
Automatik_iSchrittnummer := 25;
ELSIF fbTonxS1.Q THEN
Automatik_iSchrittnummer := 10;
END_IF
10: // Zweite Schnecke an, dann Erste, also Auffüllbehälter leer
IF mStopp OR xStoermeldung_Sieb_Voll THEN
Automatik_iSchrittnummer := 25;
ELSIF fbTonS1_AVG.Q THEN
Automatik_iSchrittnummer := 5;
ELSIF fbTonxS1.Q AND fbTonS3_AVG.Q THEN
M2_SiebRL := TRUE;
Automatik_iSchrittnummer := 15;
END_IF
15: // wenn beide Schnecken an sind dann warten bis irgendwas passiert
IF mStopp OR xStoermeldung_Sieb_Voll THEN
Automatik_iSchrittnummer := 25;
ELSIF fbTonS1_AVG.Q OR fbTonxS3.Q THEN
Automatik_iSchrittnummer := 25;
ELSIF M1_SiebRL AND M2_SiebRL THEN
Automatik_iSchrittnummer := 20;
END_IF
20: // Beide Schnecken laufen, bis der Behälter voll wird oder tStop wurde gedrückt
IF mStopp OR xStoermeldung_Sieb_Voll OR
fbTonS1_AVG.Q OR fbTonxS3.Q THEN
Automatik_iSchrittnummer := 25;
END_IF
(*************** Hier fängt Ausschaltverfaheren***********)
25: // Behälter voll oder keine Kohle da Fall.....
IF NOT M1_SiebRL THEN
Automatik_iSchrittnummer := 27;
END_IF
27: // Timern zurücksetzen in Behältervoll-Fall
IF NOT M2_SiebRL AND NOT M1_SiebRL THEN
Automatik_iSchrittnummer := 30;
END_IF
30: // (Stopp-Fall) Schnecken nacheinander ausschalten, Timer zurücksetzen
IF mStopp OR xStoermeldung_Sieb_Voll THEN
Automatik_iSchrittnummer := 0;
ELSE
Automatik_iSchrittnummer := 5;
END_IF
END_CASE
// Zweite Schrittkette (Nachvortrag)
CASE Automatik_iNachvortrag OF
// Läuft in Abhängigkeit vom Vortagesbehälter
0: // Startbedingungen
IF mAutomatik AND mStart THEN
Automatik_iNachvortrag := 10;
END_IF
10: // Behälter hat Inhalt, dann M3 und MV1 anschalten
IF mStopp OR xStoermeldung_Sieb_Voll THEN
Automatik_iNachvortrag := 20;
ELSIF (fbTonxS3.Q AND fbTonxS2.Q) AND (fbTonS4_AVG.Q) THEN
M3_SiebRL := TRUE;
MV1_Sieb := TRUE;
Automatik_iNachvortrag := 20;
END_IF
20: // Stopp alles und zurück zur Anfang
IF mStopp OR xStoermeldung_Sieb_Voll THEN
M3_SiebRL := FALSE;
MV1_Sieb := FALSE;
Automatik_iNachvortrag := 0;
ELSIF fbTonS2_AVG.Q OR fbTonxS4.Q THEN
M3_SiebRL := FALSE;
MV1_Sieb := FALSE;
Automatik_iNachvortrag := 10;
END_IF
END_CASE
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?