Initialschritt richtig anlegen

MagCODESYSnicht

Level-1
Beiträge
38
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Halle an alle!

Nachdem ich mich lange mit CODESYS rumgeschlagen habe und größteneteils erreicht habe, was ich wollte, habe ich ein kleines Problem, was sich mir nicht ganz erschließt.

Ich programmiere einen Fahrstuhl, und soll einen Initialschritt haben, wo alle Türen geschlossen werden, der Fahrstuhl ins Erdgeschoss fährt, und die Anlage in ihren Ausgangszustand gesetzt werden soll. Das ganze soll mit Hilfe der Ablaufsprache umgesetzt werden.

Nun hab ich folgendes Problem: Auf Grund der Mehrfachbelegung von Motoren kann der Fahrstuhl, wenn er erstmal im Erdgeschoss ist, nicht mehr hoch fahren. Die Frage ist nun: Wie lege ich einen vernünftigen Initialschritt an, indem ich Akteure Setze und Zurücksetze, sie aber in anderen Programmteilen wieder verwenden kann, ohne dass sie sich gegenseitig blockieren? Meine Idee wäre es diesen Initialzustand vor die Steuerung des Fahrstuhles zu legen, damit die Ausgänge nur dort gesteuert werden können, aber ehrlich gesagt würde ich den auf Grund der Übersichtlichkeit gerne separiert halten. Im Anhang finden sich screenshots welche den Initialschritt zeigen. Für jede Hilfe wäre ich dankbar.
 

Anhänge

  • Init_PART_1.png
    Init_PART_1.png
    14,8 KB · Aufrufe: 37
  • Init_PART_2.png
    Init_PART_2.png
    19,6 KB · Aufrufe: 29
  • Init_PART_3.png
    Init_PART_3.png
    18,2 KB · Aufrufe: 23
Ich habe mir jetzt deine Schrittkette nicht näher angesehen - nur gelesen, was du schreibst.
Ein Initialschritt sollte gar keine Aktionen ausführen - wenn du deinen Fahrstuhl unbedingt ins EG haben willst so ist dies ein paralleler Zweig.
Du könntest deinem FB als z.B. als IN-Parameter sagen, dass du einen SPS-Neustart hast / hattest (als IN_OUT) und diesen dann in der Schrittkette auswerten.
Dein Zweig wäre dann, ausgehend vom Initialschritt : U #Neustart UN #IN_EG ... oder so ähnlich.
Nun machst du in dem Zweig alles, was dafür notwendig ist ... UND ... ganz wichtig : du setzt den Neustart-Merker zurück ...
Ich denke, das löst dein Problem ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich löse das ganze so dass ich die Akteure in den zuständigen Funktionsblöcken zurücksetze. Bedeutet, FB für die Türen werden die Türen am Anfang geschlossen, im FB für den Fahrstuhl wird der Fahrstuhl, sobald die Türen zu sind, in die Ausgangsposition gefahren. Ich denke dass das eine ganz elegante Lösung ist und ich mir so noch mehr IN_OUT Variablen spare, was meinen Prof sicher auch freuen wird, denn am Ende geht es nur darum dass es funktioniert. Ich bin dir zu Dank verpflichtet, du hast mir so viel geholfen, ich würde mich gerne revanchieren, aber ich weiß nicht wie.
 
... du hast mir so viel geholfen, ich würde mich gerne revanchieren, aber ich weiß nicht wie.
Na ... der Sinn dieses Forums ist es nun mal sich gegenseitig zu helfen ... lies mal oben den Wahlspruch des SPS-Forums.
Wenn ich dir wirklich helfen konnte so ist mir das schon Lohn genug ...

Aber zu deinem technischen Ansatz :
Das hätte ich tatsächlich so nicht gemacht - jedenfalls nicht ganz so.
Ich hätte einen kompletten FB für den Fahrstuhl gemacht - also für alles, was da dran hängt. Das das ggf. Sinn machen könnte siehst du da dran, dass in deinem jetzigen Konzept mehr als ein Baustein dieselben Ausgänge zu schalten hat.
Das heißt jetzt natürlich nicht, dass du nur mit einer Schrittkette arbeiten sollst. Die Anforderung, das Fahren, die Türen usw. können durchaus unterschiedliche Schrittketten sein. Aber beachte bitte die Abhängigkeit ... Du könntest jetzt ja z.B. die Türen, wenn das ein eigener Baustein sein soll, auch als Instanz in die Instanz des Haupt-Bausteins einlagern und aus dem heraus ansteuern.
Das spart dann auch WIRKLICH IN_OUT's ... und möglicherweise überrascht das dann sogar deinen Prof ...

Aber grundsätzlich : was machst du denn jetzt mit deiner Initialisierung ?

Gruß
Larry
 
Im FB "Door_control" Werden beim Start die Türen geschlossen. Im FB "Moving_Light" werden die Lampen abgeschaltet, und im FB "Elevator" wird der Fahrstuhl in das Erdgeschoss gefahren, wenn alle Türen zu sind. Das klappt zu mindest schon mal, und jeder FB bekommt nur die Ausgänge die für seine Funktionalität nötig sin. Allerdings hab ich mir grad irgendwie die IN_OUT Variablen zerschossen. Ich hab in den FB Blöcken IN_OUT variablen angelegt, und lege im PRG auf die IN_OUT Ausgänge INPUT Variablen. Klappt aber nicht so wie ich das möchte. Hat aber vorhin funktioniert. Das versteh ich jetzt so gar nicht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du hast scheinbar nicht verstanden, was ich dir vorgeschlagen habe ... oder es nicht gelesen ... oder ... schade ...
Ganz generell gehst du es aber, so glaube ich, ganz falsch an.
Mach dir doch mal ein Struktugramm aus dem zu ersehen ist, wer wem wann welche Befehle gibt. Dann wird vielleicht Einiges klarer ...

Fährt der FB Elevator den Fahrstuhl nur ins EG ? Falls Ja ... das ist absoluter Unsinn. Der FB Elevator macht nur Sinn wenn er die Kabine von überall nach überall fährt - und zwar gemäß des aussen anstehenden Kommandos, welches das Ziel definiert.

Noch mal zu der Doppel-Geschichte :
In dem anderen Thread von dir (Variablen werden nicht gesetzt/zurückgesetzt) hast du mindestens im Beitrag #11 in dem Bild die Variable OG an den Ausgängen von 2 Bausteinen hängen - genau das meinte ich in meinem Beitrag #4 dieses Threads wo du einen falschen Ansatz verfolgst.
Was machst du denn aktuell ? Hast du einen Baustein für "Fahre ins EG" und einen für "Fahre ins OG 1" und einen für "Fahre ins OG 2" usw. ...?

Denk da bitte mal drüber nach ...

Gruß
Larry
 
Nein, ich habe einen FB für die Fahrten. Wenn alle Türen geschlossen sind, wird die Position ermittelt und Anhand dieser wird der restliche Code ausgeführt. Der Fahrstuhl akzeptiert die Variablen EG, OG1 und OG2, UPRIDE und DOWNRIDE. Danach betrachtet er welche der Variablen aktuell TRUE sind. Wenn er bspw. im EG ist, gibt es folgende Möglichkeiten wie er sich bewegen kann: Wenn EG gedrückt ist, weil von außen noch jemand rein wollte, dann macht er die Tür wieder auf. Danach gehen die Türen wieder zu und er schaut wieder wohin er fahren soll. Wenn OG1 und OG2 und NICHT EG gesetzt sind, fährt er zu erst ins OG1 und setzt das Flag UPRIDE, damit, wenn er im OG1 angekommen ist und jemand im EG gedrückt hat, zu erst ins OG2 fährt. Die Beibehaltung der Fahrtrichtung war Teil der Aufgabenstellung. Dort angekommen geht der Prozess von Vorne los.
 
Nein, ich habe einen FB für die Fahrten.
... und das ist der, dessen Bild du im Beitrag #1 gepostet hast ?
Falls Ja ... denk noch mal drüber nach.
Vor Allem : was für einen Sinn hat die Simultanverzweigung ganz am Anfang ?

Du hast mich zwar eingangs gelobt ... ich muss dich nun aber fragen : Wofür ? Ich habe ja nur mit dir geschrieben - geholfen habe ich dir ganz augenscheinlich nicht ... sonst hättest du ja mal das Eine oder Andere von dem, was ich geschrieben habe, erwogen umzusetzen ...

Griß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nein, das war der Initialschritt den ich richtig machen wollte. Ich zeige dir gerne nochmal meinen Elevator FB, quasi mit seinem Part des Initalblockes kombiniert.

Man sieht in den Screenshots die Bedingungen Wenn der Fahrstuhl im Erdgeschoss ist, mehr hat nicht ins Bild gepasst, leider.

Elevator_1.jpgElevator_2.jpgElevator_3.jpg
 
Es fällt mir leider nichts mehr zu schreiben ein - sorry.
Beschreib mir doch mal (in Worten) wie der Ablauf sein müßte damit der Fahrstuhl ins EG fährt (egal wo er gerade ist), dann wie der Ablauf sein müßte um ins OG1 zu fahren (egal wo er gerade ist) und schlußendlich wie der Ablauf für das OG2 sein müßte (egal wo er gerade ist).
Dann : was ist überhaupt die Bedingung um zu fahren ?

Nachsatz : orientiere dich bei alle dem vielleicht mal daran wie ein Fahrstuhl im wirklichen Leben funktioniert - ich denke, du hast schon mal einen benutzt ...
 
Okay, im Initialzustand fährt der Fahrstuhl so oder so ins EG. Um dann von einer anderen Etage ins EG zu fahren muss folgende Bedingung bestehen:

EG:
Bedingung(BD) um von EG in EG zu fahren: CALL_EG
BD von OG1 nach EG: (CALL_EG AND NOT CALL_OG1 AND NOT CALL_OG2) OR (CALL_EG AND CALL_OG2 AND DOWNRIDE AND NOT CALL_OG1)
BD von OG2 nach EG: (CALL_EG AND NOT CALL_OG1 AND NOT CALL_OG2)

OG1:
BD von EG nach OG1: (CALL_OG1 AND NOT CALL_EG) OR (CALL_OG1 AND NOT CALL_EG AND CALL_OG2)
BD von OG1 nach OG1: CALL_OG1
BD von OG2 nach OG1: (CALL_OG1 AND NOT CALL_OG2)

OG2:
BD von EG nach OG2: (CALL_OG2 AND NOT CALL_OG1 AND NOT CALL_EG)
BD von OG1 nach OG2: (CALL_OG2 AND NOT CALL_OG1 AND NOT CALL_EG) OR (CALL_OG2 AND NOT CALL_OG1 AND UPRIDE AND CALL_EG)
BD von OG2 nach OG2: CALL_OG2


Hab ich hier irgendeinen Logikfehler drin? UPRIDE und DOWNRIDE speichern die letzte Fahrtrichtung.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Siehst du ... und da liegen wir beide schon auseinander ...
Bei mir sähe das so aus :

Initialschritt : der macht nichts !!!

Fahrbefehl "EG" :
- Türen schliessen + Sicherheitscheck natürlich
--- wenn bereits im EG
- Melden EG erreicht
--- warten bis Fahrbefehl weggenommen
- wenn Fahrbefehl weg nach Init-Schritt
--- sonst
- Fahren abwärts
--- wenn Pos. EG erreicht
- Melden EG erreicht
--- warten bis Fahrbefehl weggenommen
- wenn Fahrbefehl weg nach Init-Schritt

Fahrbefehl "OG2" :
- Türen schliessen + Sicherheitscheck natürlich
--- wenn bereits im OG2
- Melden OG2erreicht
--- warten bis Fahrbefehl weggenommen
- wenn Fahrbefehl weg nach Init-Schritt
--- sonst
- Fahren aufwärts
--- wenn Pos. OG2 erreicht
- Melden OG2 erreicht
--- warten bis Fahrbefehl weggenommen
- wenn Fahrbefehl weg nach Init-Schritt

Fahrbefehl "OG1" :
- Türen schliessen + Sicherheitscheck natürlich
--- wenn bereits im OG1
- Melden OG1 erreicht
--- warten bis Fahrbefehl weggenommen
- wenn Fahrbefehl weg nach Init-Schritt
--- wenn im OG2
- Fahren abwärts
--- wenn Pos. OG1 erreicht
- Melden OG1 erreicht
--- warten bis Fahrbefehl weggenommen
- wenn Fahrbefehl weg nach Init-Schritt
--- wenn im EG
- Fahren aufwärts
--- wenn Pos. OG1 erreicht
- Melden OG1 erreicht
--- warten bis Fahrbefehl weggenommen
- wenn Fahrbefehl weg nach Init-Schritt

Das Fahren selbst inkl. Geschwindigkeits-Umschaltung wäre für mich ein Unterprogramm.

Wenn du möchtest, dass der Fahrstuhl beim Neustart der SPS erstmal ins EG fährt dann wäre das ein neuer Zweig.
Was noch fehlt ist, dass der Fahrstuhl nach einer Zeit x die Türen wieder schließt - ich würde ihn aber da stehen lassen wo er steht - ist im wirklichen Leben auch so ...

Gruß
Larry
 
Die Türen gehen nach 5 Sekunden wieder zu, das steht in Door Control schon drin, das ist erledigt, und er bleibt auch stehen wo er bleiben soll. Und ich verstehe deine Logik... Da ist aber das Problem dass die Fahrtrichtung nicht beibehalten werden würde. Wenn ich von EG nach OG1 fahre, und dann, während bspw. die Türen aufgehen, jemand wieder auf EG drückt, aber auch auf OG2, dann soll er erst nach OG2 fahren, dann nach EG. Andersrum genau so, wenn ich von OG2 nach OG1 fahre, und während der Fahrt jemand im EG und in OG2 den Fahrstuhl ruft, dann soll er erst ins Erdgeschoss fahren, dann hoch, und das ist leider eine Pflichtfunktion die ich nicht vernachlässigen kann
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie ich schon geschrieben habe : ich würde die Verwaltung des Fahrprogramms ausserhalb dieser Schrittkette machen.
Denk immer dran :
Es steigt jemand im EG ein und will ins OG1. Dann fährt er dahin.
Jetzt kommt dann erstmal keine weitere Anforderung mehr - warum soll er dann zum OG2 ?
Vielleicht kommt als Nächstes wieder eine Anforderung aus dem EG ...?
 
Hallo Larry,

Du solltest einen Teilbetrag des Gehalts vom Prof kriegen ;)
Ich glaube, wenn Du hier fertig bist, ändert der TE noch seinen Benutzernamen... :-P
 
@Jens:
Du wirst lachen ... aber so ein bisschen hatte ich auch schon gedacht, dass der Prof unseren TE nun auch ganz schön "ins kalte Wasser" geworfen hat. Ich weiß nun nicht, wie das an den Hochschulen so läuft - aber ein ganz bisschen mehr Betreuung und Background sollte man schon erwarten dürfen ...

@TE:
Versteh das bitte nicht falsch - das ist nicht gegen dich ...
Aber das mit deinem Nick solltest du dir wirklich noch überlegen. Wie ich schon mal geschrieben habe : wie sprechen hier nicht über ein Codesys-Problem - im Gegenteil - ich denke mal, das das unter Graph7 nicht einfacher gewesen wäre ...

Gruß
Larry
 
Zurück
Oben