Variablen werden nicht gesetzt/zurückgesetzt

Zuviel Werbung?
-> Hier kostenlos registrieren
Ganz ehrlich, dazu hat uns unser Professor nichts gesagt. Wir haben nur die Vorlagen bekommen und dürfen jetzt selber drunter leiden. Es geht ihm nur um den aussagenlogischen Aspekt, nicht dass wir das Programm beherrschen. Wir sollten im PLC einfach AS Blöcke verwenden und das irgendwie zum funktionieren bringen.
 
Nun komm ... ich kenne deinen Prof nun nicht - aber so schlimm wird es schon nicht sein.
Also :
wir hätten da z.B. IN.CALL_EG - das wäre für mich der Drucktaster aussen, der den Fahrstuhl im EG anfordert. Wie kommt da darn ein TRUE und noch wichtiger : wie wird er wieder FALSE ?
Das Gleiche für IN.POS_EG - das wäre für mich der Ini, der sagt, dass der Fahrstuhl im EG auf seiner Stop-Position steht. Wie wird der TRUE und genauso : wie und wann wird der wieder FALSE ?
Das solltest du schon beantworten können - sonst kannst du programmieren wie ein Weltmeister - eine Funktion hast du nie ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das hat er uns wirklich nicht erklärt :') Ich hab gerade, weil du mich stutzig gemacht hast, seine Folien durchgeforstet, und da steht absolut nichts. Alles was wir gelernt haben ist, wie wir auf die verschiedenen Arten und Weisen unsere Programme schreiben, also entweder als FUP, als ST oder eben als AS. Wir wissen welche Arten von Sensoren es gibt, wie Öffner und Schließer funktionieren, und wie sich die Adresse eines Sensors/Aktors zusammensetzt. Das war's dann auch. Er taucht nicht in die Thematik ein, sondern will nur, dass wir sowas programmieren könne. Beschalten sollen wir sowas nicht.
 
Naja ... aber wie willst du denn nun testen ob das funktioniert, was du dir da zusammenprogrammiert hast ?
So, wie ich das sehe, ist das ja genau der Punkt an dem du gerade stehst - du hast etwas programmiert und es arbeitet nicht wie gewünscht. Jetzt kann es natürlich sein, dass du selbst etwas falsch gemacht hast. Wie willst du das nun aber herausfinden wenn du die Bedingungen nicht zu aktivieren weißt ?
Also z.B. den Fahrstuhl im EG anfordern ?
Jetzt müßte dieser ja, vorausgesetzt er ist nicht schon da herunterfahren, kurz vorher langsam werden und dann stoppen und dann die Türen öffnen, sie nach einer Zeit wieder schliessen (außer es steht noch jemand darinnen).
All dies sind Signale, die du, wenn du simulieren möchtest, irgendwann einmal auf TRUE und irgendwann später mal auf FALSE bringen musst - außer du hast ein physikalisch vorhandenes Modell, das das für dich tut ...

Also ...?
 
ACH SO meinst du das! Ja, dazu gab es eine Simulation, VISU, des Projektes. Daher weiß ich auch, dass es im wesentlichen funktioniert, denn der Initialschritt wird ausgeführt. Der Fahrstuhl ist nach dem Kaltstart irgendwo zu finden, auf der Höhe von OG1. Im Initialschritt sollen alle Türen geschlossen und der Fahrstuhl in die Position EG gefahren werden, was er auch problemlos macht. Dort angekommen geht auch die Lampe an, welche dafür zuständig ist zu zeigen in welcher Etage der Fahrstuhl gerade ist. Der Initialschritt wird auch nicht konstant ausgeführt, den Fehler hab ich schon behoben. Ich komm aber von da an einfach nicht weiter.

PS: Die simulation gab es nur für das Corona Semester. Alle anderen Jahrgänge vor uns durften mit physikalischen Modellen hantieren. :(
 
Zuviel Werbung?
-> Hier kostenlos registrieren
na schaui mal ... ;)
dann beantworte mir doch auch noch mal meinen Beitrag #16 - der Punkt da ist auch auch nicht ganz unwichtig ...

So ... und dann kommt dann deine Schrittkette ... da musst du nun schon selber sehen, was du dir darin zusammengebastelt hast. Das kann man aber, gerade bei Codesys, eigentlich sehr schön beobachten ...
 
Hab ich, und ja, das weiß ich. Es wird immer nur im letzten Schritt einer Schrittkette einer dieser Werte gesetzt. Als Beispiel: In der AS Funktion "Moving_Lights" wird, wenn bspw. Die Taste CALL_OG2 gedrückt wird, wird das dazugehörige Licht gesetzt und die Variable OG2 auf TRUE gesetzt. Danach ist der Baustein zu Ende. In Elevator ist ja dann, dementsprechend, der Wert von OG2 TRUE, und er fährt los nach OG2. Dort angekommen wird die Variable DOOR auf TRUE gesetzt, welche dann in Door_Controle die Öffnung der Tür steuert. Nachdem die Tür nicht mehr zu ist, wird die Variable OG2 und die Lampe für OG2 auf false gesetzt, das Tür Öffnen läuft durch, und nachdem die Tür wieder zu ist wird DOOR wieder auf false gesetzt. Das ist meine Logik.
 
Schon OK ...
Du hast nun aber 2 Bausteine, die dieselbe Variable als OUT verwenden. Egal, was der Baustein_1 sagt, welchen Zustand (z.B.) OG1 haben soll, es wird immer das gemacht, was der Baustein_2 sagt - selbst dann, wenn er zum Ergebnis im Moment eigentlich nichts beitragen sollte. Es gibt nur 2 Zustände für einen OUT - TRUE oder FALSE - den Zustand "nicht zuständig" gibt es nicht ...
Dazu solltest du dir schon noch etwas anderes überlegen - möglicherweise ist das sogar schon dein Fehler. Aber auch das solltest du im Online-Status sehen können ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich verstehe langsam was du mir mitteilen willst. Wenn Baustein 1 den Wert auf False setzt, dann bleibt der da auch, egal was Baustein 2 damit anstellt, richtig? Das würde ja bedeuten dass jeder Baustein sein eigenes Set an Variablen benötigen würde... Technisch gesehen müsste ich also Bausteine die sich Variablen teilen mit einander kombinieren, um sicher zu stellen, dass sie im richtigen Moment den richtigen Wert haben...
 
Ließe sich sicher umsetzen, das werde ich Morgen gleich ausprobieren. Danke für deine Hilfe, ich mach aber für heute Schluss, ich sitz da seid um 10 dran und mir raucht der Kopf.
 
Nicht ganz ... es gilt die letzte Zuweisung in der Kette der Aufrufe ...
Du mußt dir überlegen, wie du sie verschalten willst. Oder ... wenn der 2. Baustein den Wert gerade nicht manipuliert hat und ihn einfach nur weiterreichen soll dann wäre das ein Fall für IN_OUT an Stelle von OUT.
Den Punkt hattest du aber in dem anderen Thread schon mal ... ;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also... Wenn ich im aller letzten Schritt von Block 1 den Wert einer Variable auf 0 Setze, dann ist der Wert auch in Block 2 auf 0, oder? Und wenn ich den Wert jetzt in Block 2 auf 1 Setze, wird er dann auch in Block 1 zu 1, oder? Das hab ich aber von Anfang an so gemacht.

Ich hab IN_OUT ehrlich gesagt nicht richtig verstanden. Ich hab keine Ahnung wie ich einen Bool Wert zuweise, andauernd wirft der Compiler Fehler. Außerdem hatte ich gelesen dass IN_OUT Variablen keine Bool Ausdrücke zugewiesen bekommen können und das hatte mich verunsichert. Aus der CODESYS Dokumentation wurde ich auch nicht schlauer. Wenn du, was das angeht, einen Hinweis für mich hast, wäre ich dir mehr als nur dankbar, weil das alles vereinfachen würde, denn im Grunde sind diese Variablen alles nur durchreichevariablen die Aktionen auslösen.
 
Da hast du mich wahrscheinlich falsch verstanden - wobei ich jetzt nicht weiß, was du mit Block meinst ...

Du hast einen Baustein 1
darin schreibst du OUT_Variable := TRUE ;
dann hast du einen Baustein 2
darin schreibst du OUT_Variable := FALSE ;
nun hat die OUT_Variable dann jeweils den zugewiesenen Wert. Davon, dass du sie in Baustein 2 auf FALSE setzt wird sie nicht automatisch im Baustein 1 dann auch FALSE. Dies könnte aber möglicherweise ein IN_OUT ermöglichen. Wenn das nun bei dir nicht funktioniert so hast du bei der Umsetzung etwas falsch gemacht. An dieser Stelle versagt aber nun meine Glaskugel komplett ... sorry ...

Noch besser ist es übrigens mit "echten" Ausgängen - also den Ausgangskarten. Hier kannst du deren zugewiesenen Zustand von mir aus 100mal im Programm ändern - die Karte nimmt dann nur den Zustand der letzten Zuweisung an ...

Gruß
Larry
 
Danke für deine Hilfe bis jetzt. Ich versuch das ganze jetzt mit IN_OUT. Ich habe das ganze auf folgende Art und Weise programmiert:

Ich habe im Function Block eine VAR_IN_OUT angelegt, welchen ich mit S und R bearbeite.

Elevator.png

Im Programm PLC_PROG, wo ich den Funktionsblock verwende, hab ich auf den VAR_IN_OUT Eingang eine INPUT Variable gelegt (Siehe Screenshot).
PLC_Input Variable.png
Der Wert wird aber noch nicht übergeben, und ich weiß nicht wie ich das anstellen soll. Ich hab das Gefühl ich bin kurz vor der Lösung meines Problems.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich hab verstanden, dass eine IO Variable eigentlich ein Pointer auf einen Speicherblock, in welchem der Wert der Variable liegt, ist. Wenn ich den Wert der Variable ändere, muss ich an eine Funktion den Pointer zu dieser Speicherzeile übergeben. Das würde bedeuten, dass ich eine Variable im FB ändern muss, dann die Adresse dieses Wertes an den Pointer übergeben muss, und Funktionen, die diese Adresse brauchen, den Pointer übergebe. Also müsste ich im FB Block den Pointer deklarieren, die Variable zuweisen, und diese nach außen zuweisen als Input, richtig?
 
Nur mal zur Definition in deinem Programm :
- alle Variablen, die im Block IN stehen sind von deinem Prof ganz sicher als Ersatz für die SPS-Eingänge gedacht. Das wären für deinen Baustein dann auch Variablen vom Typ IN. Im wirklichen Leben solltest du auch nicht versuchen, einem SPS-Eingang (also z.B. einem Drucktaster) einen anderen Wert zuzuweisen.
- zu IN_OUT's können aber z.B. Variablen aus dem Block OUT werden. Ob das bei Codesys Pointer sind vermag ich nicht zu sagen - glaube ich aber eher nicht. In jedem Fall sind es Variablen, deren vorheriger Wert im Baustein mit berücksichtigt wird - man nennt das dann auch Durchgangs-Variablen.

Da ich von deiner Schrittkette nur einen kleinen Teil sehe kann ich dazu wenig sagen.
An eine Transition allerdings TRUE als Weiterschaltbedingung zu schreiben ist jetzt kein guter Stil. Das heißt ja, je nachdem, wie die Schrittkette arbeitet, dass die Zuweisung des Schrittes möglicherweise gar nicht stattfindet ...

Gruß
Larry
 
Da hast du Recht. Aber tatsächlich erfolgt in der Transition keine Bedingung. Sie steht nur da weil Codesys sonst meckert. Ich könnte sicher als Transitionsbedingung schreiben, dass nur dann weiter geschaltet werden soll wenn die Zuweisung im vorherigen Schritt erfolgt ist. Kannst du mir ein konkretes Beispiel für die Verwendung einer IN_OUT Variable geben, ich verzweifle langsam echt, ich zeig dir auch gerne mehr schritte aus meiner Schrittkette.

Hier ein vollständiger Abschnitt aus der Fahrstuhlsteuerung

Step7.pngStepend.png
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... kann ich nicht ...
Aber wenn du die Variablen, die an mehreren Baustein als OUT-Variablen (also Ausgangs-Variablen) dran hängen zu IN_OUT's (von der Baustein-Schnittstelle her) machst dann bist du schon mal auf dem richtigen Weg.
Im Baustein werden die dann nicht anders behandelt als du es ohnehin schon tust - also Set und/oder Reset ...
 
Was ich in deinem Programm ein bisschen vermisse ist das CALL_EG (oder OG).
Der auslösende Fall sollte doch wohl die Anforderung sein ... und nicht die Ist-Position ... oder ...?
 
CALL_EG ist laut Definition ein Taster, also nicht speichernd. Drückt man CALL_EG, soll laut Aufgabenstellung die Leuchte LED_CALL_EG gesetzten werden. Ich möchte aber quasi speichern welche Etagen angesteuert werden sollen, damit, wenn die Tür zu ist, zustandsabhängig geprüft wird wo der Fahrstuhl gerade ist, welche Etagen gedrückt sind, und dementsprechend welcher der definierten Fälle zutrifft und welche Etage angesteuert werden soll. Vermutlich mach ich mir das ganze zu schwer, ich bemerke gerade dass ich das ganze vermutlich viel zu komplex angehe. Aber dann verstehe ich trotzdem nicht wie ich ohne externe Eingabe mehrere Eingaben verwalten kann. Laut Aufgabenstellung muss es möglich sein dass ALLE Knöpfe gedrückt wurden, und der Fahrstuhl dann fährt. Das ist so verwirrend.
 
Zuletzt bearbeitet:
Zurück
Oben