Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched.
Close
d.t.m hat geschrieben:
Hallo,
ich habe folgendes Problem:
Ich schalte Lichtquellen über Relais. Das An-/Ausschalten geschieht entweder per Taster oder über eine Automatisierungssoftware anhand von Merkern.
Die Relaisspule benötigt eine konstante Spannungsversorgung - ist die Spannung weg, geht das Licht aus. Soweit klar.
Schalte ich über einen Taster das Licht an ( -> ), brennt das Licht.
Möchte ich das Licht über den Merker ausschalten geht das nicht, da am Tasterbaustein (welcher auch immer) ja immer noch die (steigende?) Flanke von anliegt.
Ich habe über Toggle, Trigger, Fb_Stromstoss (und viele mehr) alles probiert, aber da ich keinen passenden Thread zu dem Thema finde scheint das Problem definitiv ein Verständnisproblem meinerseits zu sein.
Kann mir bitte jemand erklären wie das funktioniert?
Ich habe auch versucht auf den Ausgang des Funktionsblocks direkt einen Merker zu legen
(also Lampe1 )
und dem Merker den entsprechenden Ausgang (DO_1------%QX4.0) zugewiesen. Es klappt so nicht
Hallo dtm,
gebe Dir mal ein Proggi mit einer Funktion wo Du über einen Tastereingang den Ausgang ein.-bzw ausschalten kannst.
Du hast zusätzlich die Möglichkeit den Aus Retain zu setzen.Desweitern
gibt es ein Reseteingang wo Du im Bedarfsfall den Ausgang sofort zurücksetzen kannst.
Schau es Dir mal an ob es für Dich intresannt ist.
vielen dank für deinen Beitrag - sorry, war sehr beschäftigt und überhaupt nicht an der SPS zugange und auch nicht im Forum bis heute. Ich lade mir dein Prog jetzt mal runter und teste mal.. melde mich!
Grüße
dtm
edit: ich kann die Datei nicht mehr runterladen. Wärst Du so nett sie nochmal anzuhängen?
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
vielen Dank Dir - habe es mal runtergeladen. Ich stehe auf dem Schlauch.
- input_Button(...) ist klar. Hier wird der DI zugewiesen.
Dann geht´s schon los...
Kommt der Merker (m1), der bei TRUE den selben DO schaltet, ebenfalls an input_Button(...) - falls nein, wohin kommt er? - retain_or_no_retain
der Sinn wird mir nicht ganz klar. Ich dachte Var Retain Persistant ist nur wichtig für den Fall, dass der Variablenwert nach Neustart der Steuerung erhalten bleibt.
- reset: BOOL
Soll wohl normalerweise den Ausgang auf 0 setzen.
Habe ein paar Variationen durchprobiert, aber bisher habe ich es nicht geschafft, dass der (aktive) Merker bei setzen eines DI am selben Eingang auf FALSE zurückgesetzt wird.
Entweder das ganze ist wirklich kompliziert und ich versuche etwas aussergewöhnliches zu erreichen - oder mir fehlt das Verständnis. Ich tippe auf letzteres - wo hakt´s?
Danke für die Mühe!
Grüße
dtm
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
habe die Lib noch erweitert.Es ist noch ein zusätzlicher Eingang dabei mit dem Du mit einem Merker(z.B. M1)
den Ausgang deaktivieren kannst.
Die Erklärung steht im Lib-Kommentar.
Schaue es Dir an ob Du damit jetzt was anfangen kannst.
erstmal vielen Dank für deine Antwort und deine Hilfe.
Ich habe mir dein Beispielprojekt angesehen und entsprechend in meinem Projekt den Baustein integriert.
Irgendwie macht es aber nicht das was es soll. Habe viel rumprobiert.
Nochmal die Problemstellung:
wird von einem DI getriggert und schaltet das Licht ein / aus.
wird per Modbus von einem anderen Programm (IPS) getriggert, auch er soll das Licht ein / ausschalten. Für an / aus wird also nur 1 Merker verwendet. Der Merker dient auch als Statusanzeige des Schaltzustands. Schalte ich also mit dem Lichttaster das Licht an, soll die Merkervariable auch auf TRUE sein. Schalte ich mit dem Lichttaster das Licht aus, soll auch der Merker auf FALSE sein. Schalte ich das Licht über den Merker ein, muss es auch per Taster auszuschalten sein.
Und das bekomme ich nicht hin. Wieviel Zeit ich mit dem Versuch zugetan habe - will gar nicht drüber nachdenken.
Ist dein Baustein für genau diese Problemstellung geeignet? Wo stehe ich auf dem Schlauch?
Danke nochmal.
Grüße
dtm
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
d.t.m hat geschrieben:
Hallo Speicherzelle,
erstmal vielen Dank für deine Antwort und deine Hilfe.
Ich habe mir dein Beispielprojekt angesehen und entsprechend in meinem Projekt den Baustein integriert.
Irgendwie macht es aber nicht das was es soll. Habe viel rumprobiert.
wird von einem DI getriggert und schaltet das Licht ein / aus.
wird per Modbus von einem anderen Programm (IPS) getriggert, auch er soll das Licht ein ausschalten. Für an / aus wird also nur 1 Merker verwendet. Der Merker dient auch als Statusanzeige des Schaltzustands. Schalte ich also mit dem Lichttaster das Licht an, soll die Merkervariable auch auf TRUE sein. Schalte ich mit dem Lichttaster das Licht aus, soll auch der Merker auf FALSE sein. Schalte ich das Licht über den Merker ein, muss es auch per Taster auszuschalten sein.
Und das bekomme ich nicht hin. Wieviel Zeit ich mit dem Versuch zugetan habe - will gar nicht drüber nachdenken.
Ist dein Baustein für genau diese Problemstellung geeignet? Wo stehe ich auf dem Schlauch?
Danke nochmal.
Grüße
dtm
Hallo mein Freund,
wir werden das Kind schon schaukeln was.
nachfolgend einige Erklärungen.
alle Eingange zum aktivieren und deaktivieren werden in der Function in Taktimpulse umgewandelt
damit werden aus statische Signale ein Impuls generiert.
wenn Eingang 1 high wird so wird der Ausgang(wenn er low ist) eingeschaltet.
wenn Eingang 1 von high auf low wechselt und wieder high wird dann wird der Ausgang(wenn er high ist) ausgeschaltet.
wenn Eingang 2 high wird so wird der Ausgang(wenn er low ist) eingeschaltet.
wenn Eingang 2 von high auf low wechselt und wieder high wird dann wird der Ausgang(wenn er high ist) ausgeschaltet.
wenn der Eingang 1 high ist und der Ausgang(high ist) und der Eingang 2 high wird dann wird der Ausgang
ausgeschaltet(low)
wenn der Eingang 1 high ist und der Ausgang(low ist) und der Eingang 2 high wird dann wird der Ausgang
eingeschaltet(high)
wenn der Eingang 2 high ist und der Ausgang(high ist) und der Eingang 1 high wird dann wird der Ausgang
ausgeschaltet(low)
wenn der Eingang 2 high ist und der Ausgang(low ist) und der Eingang 1 high wird dann wird der Ausgang
eingeschaltet(high)
der Reseteingang high ist dann werden keine Aktionen von Eingan 1 oder 2 eingeleitet und der Ausgang
bleibt low.
So das sind einige Erklärungen damit Du ungefähr weißt was los ist.Solltes Du noch Fragen oder eine Erweiterung wünschen dann melde Dich einfach.
Probiere das neue Demo_eintasbetrieb bitte aus.Und Versuche alle Möglichkeiten.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Anonymous
-
2010-07-22
Originally created by: ebt'ler
Hallo,
müsste der Merker nicht als var_in_out delariert sein? Du kannst auch mal mein Programmentwurf testen.
Das Licht (bzw. die Variable "out") wird durch den Taster an / aus geschalten (also bei jeder ansteigenden Flanke wechselt es den Zustand) oder es bekommt den den Wert vom Merker zugewiesen, wenn dieser auserhalb des FB verändert wird (Visu).
So wie ich das verstanden habe ist das dein Ziel, wenn nicht kapier ich die Aufgabenstellung nicht.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
ebt'ler hat geschrieben:
Hallo,
müsste der Merker nicht als var_in_out delariert sein? Du kannst auch mal mein Programmentwurf testen.
Das Licht (bzw. die Variable "out") wird durch den Taster an / aus geschalten (also bei jeder ansteigenden Flanke wechselt es den Zustand) oder es bekommt den den Wert vom Merker zugewiesen, wenn dieser auserhalb des FB verändert wird (Visu).
So wie ich das verstanden habe ist das dein Ziel, wenn nicht kapier ich die Aufgabenstellung nicht.
Hi
es ist schwer seine Aufgabenstellung nachzuvollziehen.
habe es mal auf diesen Weg versucht.
im Prinzip very Simple oda
MFG
Speicherzelle
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Anonymous
-
2010-07-22
Originally created by: ebt'ler
Bei deinen Beispiel fehlt mir iwie ne Lib. oder sie is hier iwo in einen anderen Beitrag enthalten.
Na egal.
So wie ich das verstanden habe soll der Merker in der Visu als Statusanzeige dienen aber auch zum schalten verwendet werden.
Bei dir fungiert er aber "nur" als Input.
Wobei man bei meinen Bsp. dann auch in der Visu darauf achten muss den Merker nicht dauerhaft einen festen Wert zuzuweisen. Sonst funktioniert es nicht.
EDIT: hab meine ZIP ja garnicht oben angehängt.
Aber jetzt:
EDIT_2: jetzt hab ich mal ne Visu zugefügt, wie ich mir die Funktion vorstelle:
Du hast mein Problem genau erfasst. In der Simulation klappt genau das, was ich nie hinbekommen habe.
Habe es in mein Programm aufgenommen - hänge aber nun erstmal fest:
Bekomme die Meldung:
Fehler 4060: VAR_IN_OUT Parameter 'merker' von 'LICHT_FB' benötigt Variable mit Schreibzugriff als Eingabe.
Eine Verständnisfrage:
Den Licht_FB verwende ich als Baustein im PLC_PRG und muss bzw. sollte nichts daran ändern, wenn´s so funktionieren soll!
Deklariert habe ich folgende Variablen in PLC_PRG:
in_Esszi_re_oben_li AT %IX9.15 -> auf Eingang 'taster'
out23 AT %QX3.7 -> 'out'
Testmerker AT %MX41.0 -> auf Eingang 'merker'
Dies führt zur besagten Fehlermeldung.
Muss ich bestimmte Deklarationen aus Licht_FB in PLC_PROG übernehmen (var_in_out)?
Ich scheine damit kurz vor dem Ziel zu stehen... das wäre klasse!
edit: ich habe keine Taskkonfiguration - das hat aber mit der Fehlermeldung oben ja nichts zu tun..
@Speicherzelle
Vielen Dank für die Erklärung des Bausteins. Habe es versucht nachzuvollziehen und werde es nochmals anhand deiner Ausführungen verfolgen. Da raucht einem ja fast schon ein bisschen der Kopf wenn man sowas nicht alltäglich macht
Euch beiden ganz herzlichen Dank für Eure Mühe!
Grüße
dtm
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Anonymous
-
2010-07-22
Originally created by: ebt'ler
An der deklaration in Licht_FB musst du nichts mehr ändern.
Aber warum es jetzt keinen Merker als var_in_out akzeptiert weiß ich nicht. Normalerweise hat man auf Merker schreib und lesezugriff.
Du könntest jetzt mal versuchten im Netzwerk zuvor einer Variablen den Merker zuzuweisen, an den FB die Variable verwenden und im Netzwerk danach den Merker dann die Variable zuweisen.
Ob das funktioniert kann ich jetzt nicht genau sagen. Alternativ müsste ich mir mal was anderes überelgen.
Wenn du die Bezeichnungen im PCL_PRG änderst wird mein Visu-Beispiel nicht mehr richtig funktionieren. Da es ja noch die alten Bezeichnungen verwendet. Nicht das du dich dann davon täuschen läst.
Wenn es nicht funktioniert melde dich nochmal. Heute bin ich aber sicher nicht mehr online.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Anonymous
-
2010-07-22
Originally created by: ebt'ler
Mich hat das Problem jetzt aus Eigeninteresse nicht in Ruhe gelassen. ^^
Codesys kann offenbar aus den bitadressierten Merker keinen Pointer erzeugen, was aber erforderlich wäre um damit ein var_in_out zu belegen.
Wenn man sonst Pointer in Verbindung mit Bitzugriffen einsetzt muss man auch einen Umweg (Bitoffset usw.) gehen.
Somit müsste es dann aber funktionieren, wenn man wie im letzten Post beschrieben vorgeht.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Vielen Dank dass du dir nochmal Gedanken gemacht hast.
Ich habe eine Variable Testmerker_v erstellt, diese in Var_in_out als boolesche Variable deklariert und dieser Variablen den Merker (Testmerker) zugewiesen.
Es kommt zu folgender Fehlermeldung:
Fehler 3705: VAR_IN_OUT in Top-Level-Baustein nicht erlaubt, wenn keine Task-Konfiguration vorhanden ist.
Bisher lief alles ohne Taskkonfig., und mit Tasks habe ich noch nie gearbeitet - habe keinen Plan davon und weiß auch nicht inwiefern sich das dann im Programmablauf (negativ?) bemerkbar macht...
Ich probier noch ein bisschen rum - vielleicht hast du ja noch eine Idee!
EDIT:
Habe die Variable Testmerker_v nicht als Var_in_out deklariert sondern einfach als Bool in der Variablendeklaration in PLC_PRG.
Es scheint so zu klappen!!! Ich habe es jetzt nur mit dem Forcen der Variablen versucht, das klappt! Ich teste mal ob´s auch über die Visu über Modbus klappt - dann ist es endlich geschafft!
Schöne Grüße
dtm
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Anonymous
-
2010-07-23
Originally created by: ebt'ler
Guten Morgen,
Den Licht_FB brauchtest du nicht zu verändern. Und meine letzte Idee hab ich im Anhang nochmal als Bild hinzugefügt. Dann sollte es nichtmehr zu Missverständnissen kommen.
Ich hoffe es funktioniert wie von dir beabsichtigt.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Ich hätte nicht gedacht dass das tatsächlich mal klappen würde, nachdem ich so vieles ausprobiert habe!
Der Ausgang lässt sich nun via Taster einschalten, via Merker ausschalten und vice versa.
Ganz ganz herzlichen Dank dafür, freue mich riesig! Das hätte ich alleine vermutlich nie hinbekommen.
Viele Grüße
dtm
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Gibt es grundsätzlich die Möglichkeit, in den FB noch einen Reset-Eingang einzubauen?
Kann ich Code aus fertigen FB in den Licht_FB einfügen, um zusätzliche Funktionalität wie z.B. max. Leuchtdauer (also autom. ausschalten nach 3 Std. z.B.) zu erhalten?
Ich habe meine ganzen Schaltvorgänge bisher über den FB Switch_I (OSCAT) gemacht und möchte diese auf die Möglichkeit der Steuerung über Merker umstellen.
Wenn ich mir z.B. den FB Switch_I aus der Oscat Bib in der Bibliotheksverwaltung ansehe, sehe ich nur die Variablendeklarationen, aber nicht den eigentlichen Code für die Funktionalität... wie kann ich darauf zugreifen?
Grüße
dtm
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
schaut euch mal mein Demo an so werdet Ihr sehen das meine Lib auch funktioniert.
Habe zur Veranschaulichung ein Visu beigepackt.
Übrigens ist da auch ein Reset intregriert.
Schaut es Euch an und sagt was dazu
MFG
Speicherzelle.
PS. Übrigens ist in der Demo immer die Lib dabei gewesen
danke nochmal für deine Mühe. Also ich habe es getestet. Über die von dir erstellte Visu klappt es definitiv, wenn ich aber direkt im PLC_PRG 'input_Button(...)' auf TRUE setze und der Ausgang TRUE wird, kann ich über das Forcen von 'input_Merker(...)' den Ausgang nicht auf FALSE setzen. Komisch warum es in der Visu klappt, anders aber nicht... vielleicht mach ich was falsch...
Schöne Grüße
dtm
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
d.t.m hat geschrieben:
Hallo Speicherzelle,
danke nochmal für deine Mühe. Also ich habe es getestet. Über die von dir erstellte Visu klappt es definitiv, wenn ich aber direkt im PLC_PRG 'input_Button(...)' auf TRUE setze und der Ausgang TRUE wird, kann ich über das Forcen von 'input_Merker(...)' den Ausgang nicht auf FALSE setzen. Komisch warum es in der Visu klappt, anders aber nicht... vielleicht mach ich was falsch...
Schöne Grüße
dtm
nur mal so aus neugierde poste mal das programm von dir mit der lib von mir.
da sage ich dir was du vielleicht falsch machst.
den in meiner CPU (teste immer mit cpu) klappt das einwandfrei
MFG
Speicherzelle
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Anonymous
-
2010-07-25
Originally created by: ebt'ler
Hallo,
ich habe meinen Lösungsvorschlag nochmal mit einen Reset-Eingang erweitert und eine Möglichkeit hinzugefügt nach einer bestimmten Einschlatzeit wieder automatisch auszuschlaten.
Aber da Codesys als var_in_out keine Bitadressen akzeptier finde ich die Lösung nicht mehr so gut. Andernfals wäre es sicher recht übersichtlich, da man nur einen Baustein aufrufen muss. Mit der umständlichen Merkerverarbeitung ist der Vorteil aber schnell wieder weg.
Normalerweise verzichte ich zwar auf oscat, aber da du sowieso eher auf "SWITCH_I" stehst habe ich dazu auch mal ein Beispiel im Anhang. Das gefällt dich sicher viel besser.
Du musst aber noch die Schaltzeiten anpassen.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Anonymous
-
2010-07-25
Originally created by: ebt'ler
@ Speicherzelle,
d.t.m will den Status des Ausgangs auch am Merker ablesen können. Das ist dann sicher der Teil deines Programms welches ihn nicht gefällt / was bei ihn nicht funktioniert. Da du den Merker ja nicht noch den Wert von "licht_ein_aus" zuweist.
EDIT (Ergänzung): Weiterhin möchte er nicht den Ausgang über die positive Flanke des Merkers toggeln, sondern den Zustand direkt weiter geben.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Hallo dtm,
gebe Dir mal ein Proggi mit einer Funktion wo Du über einen Tastereingang den Ausgang ein.-bzw ausschalten kannst.
Du hast zusätzlich die Möglichkeit den Aus Retain zu setzen.Desweitern
gibt es ein Reseteingang wo Du im Bedarfsfall den Ausgang sofort zurücksetzen kannst.
Schau es Dir mal an ob es für Dich intresannt ist.
mfg
speicherzelle
demo_eintasterbetrieb.zip [510.04 KiB]
Hallo Speicherzelle,
vielen dank für deinen Beitrag - sorry, war sehr beschäftigt und überhaupt nicht an der SPS zugange und auch nicht im Forum bis heute. Ich lade mir dein Prog jetzt mal runter und teste mal.. melde mich!
Grüße
dtm
edit: ich kann die Datei nicht mehr runterladen. Wärst Du so nett sie nochmal anzuhängen?
@nym 3x1,5 an deiner Lösung wäre ich auch sehr interessiert..
Grüße
dtm
Hallo zusammen,
hier nochmal das Demoprogramm mit Lib.
Viel Spaß dabei
mfg
Speicherzelle
demo_eintasterbetrieb.zip [510.04 KiB]
Hallo Speicherzelle,
vielen Dank Dir - habe es mal runtergeladen. Ich stehe auf dem Schlauch.
- input_Button(...) ist klar. Hier wird der DI zugewiesen.
Dann geht´s schon los...
Kommt der Merker (m1), der bei TRUE den selben DO schaltet, ebenfalls an input_Button(...) - falls nein, wohin kommt er?
- retain_or_no_retain
der Sinn wird mir nicht ganz klar. Ich dachte Var Retain Persistant ist nur wichtig für den Fall, dass der Variablenwert nach Neustart der Steuerung erhalten bleibt.
- reset: BOOL
Soll wohl normalerweise den Ausgang auf 0 setzen.
Habe ein paar Variationen durchprobiert, aber bisher habe ich es nicht geschafft, dass der (aktive) Merker bei setzen eines DI am selben Eingang auf FALSE zurückgesetzt wird.
Entweder das ganze ist wirklich kompliziert und ich versuche etwas aussergewöhnliches zu erreichen - oder mir fehlt das Verständnis. Ich tippe auf letzteres - wo hakt´s?
Danke für die Mühe!
Grüße
dtm
Hallo d.t.m
habe die Lib noch erweitert.Es ist noch ein zusätzlicher Eingang dabei mit dem Du mit einem Merker(z.B. M1)
den Ausgang deaktivieren kannst.
Die Erklärung steht im Lib-Kommentar.
Schaue es Dir an ob Du damit jetzt was anfangen kannst.
MFG
Speicherzelle
demo_eintasterbetrieb.zip [611.63 KiB]
Hallo Speicherzelle,
erstmal vielen Dank für deine Antwort und deine Hilfe.
Ich habe mir dein Beispielprojekt angesehen und entsprechend in meinem Projekt den Baustein integriert.
Irgendwie macht es aber nicht das was es soll. Habe viel rumprobiert.
Nochmal die Problemstellung:
wird von einem DI getriggert und schaltet das Licht ein / aus.
wird per Modbus von einem anderen Programm (IPS) getriggert, auch er soll das Licht ein / ausschalten. Für an / aus wird also nur 1 Merker verwendet. Der Merker dient auch als Statusanzeige des Schaltzustands. Schalte ich also mit dem Lichttaster das Licht an, soll die Merkervariable auch auf TRUE sein. Schalte ich mit dem Lichttaster das Licht aus, soll auch der Merker auf FALSE sein. Schalte ich das Licht über den Merker ein, muss es auch per Taster auszuschalten sein.
Und das bekomme ich nicht hin. Wieviel Zeit ich mit dem Versuch zugetan habe - will gar nicht drüber nachdenken.
Ist dein Baustein für genau diese Problemstellung geeignet? Wo stehe ich auf dem Schlauch?
Danke nochmal.
Grüße
dtm
Hallo mein Freund,
wir werden das Kind schon schaukeln was.
nachfolgend einige Erklärungen.
alle Eingange zum aktivieren und deaktivieren werden in der Function in Taktimpulse umgewandelt
damit werden aus statische Signale ein Impuls generiert.
wenn Eingang 1 high wird so wird der Ausgang(wenn er low ist) eingeschaltet.
ausgeschaltet(low)
eingeschaltet(high)
ausgeschaltet(low)
eingeschaltet(high)
bleibt low.
So das sind einige Erklärungen damit Du ungefähr weißt was los ist.Solltes Du noch Fragen oder eine Erweiterung wünschen dann melde Dich einfach.
Probiere das neue Demo_eintasbetrieb bitte aus.Und Versuche alle Möglichkeiten.
Good Luck
MFG
Speicherzelle
see you http://wagobuero,dyndns.org m
demo_eintasterbetrieb.zip [638.78 KiB]
Originally created by: ebt'ler
Hallo,
müsste der Merker nicht als var_in_out delariert sein? Du kannst auch mal mein Programmentwurf testen.
Das Licht (bzw. die Variable "out") wird durch den Taster an / aus geschalten (also bei jeder ansteigenden Flanke wechselt es den Zustand) oder es bekommt den den Wert vom Merker zugewiesen, wenn dieser auserhalb des FB verändert wird (Visu).
So wie ich das verstanden habe ist das dein Ziel, wenn nicht kapier ich die Aufgabenstellung nicht.
Hi
es ist schwer seine Aufgabenstellung nachzuvollziehen.
habe es mal auf diesen Weg versucht.
im Prinzip very Simple oda
MFG
Speicherzelle
Originally created by: ebt'ler
Bei deinen Beispiel fehlt mir iwie ne Lib. oder sie is hier iwo in einen anderen Beitrag enthalten.
Na egal.
So wie ich das verstanden habe soll der Merker in der Visu als Statusanzeige dienen aber auch zum schalten verwendet werden.
Bei dir fungiert er aber "nur" als Input.
Wobei man bei meinen Bsp. dann auch in der Visu darauf achten muss den Merker nicht dauerhaft einen festen Wert zuzuweisen. Sonst funktioniert es nicht.
EDIT: hab meine ZIP ja garnicht oben angehängt.
Aber jetzt:
EDIT_2: jetzt hab ich mal ne Visu zugefügt, wie ich mir die Funktion vorstelle:
licht.zip [4.27 KiB]
@ebt´ler
Du hast mein Problem genau erfasst. In der Simulation klappt genau das, was ich nie hinbekommen habe.
Habe es in mein Programm aufgenommen - hänge aber nun erstmal fest:
Bekomme die Meldung:
Fehler 4060: VAR_IN_OUT Parameter 'merker' von 'LICHT_FB' benötigt Variable mit Schreibzugriff als Eingabe.
Eine Verständnisfrage:
Den Licht_FB verwende ich als Baustein im PLC_PRG und muss bzw. sollte nichts daran ändern, wenn´s so funktionieren soll!
Deklariert habe ich folgende Variablen in PLC_PRG:
in_Esszi_re_oben_li AT %IX9.15 -> auf Eingang 'taster'
out23 AT %QX3.7 -> 'out'
Testmerker AT %MX41.0 -> auf Eingang 'merker'
Dies führt zur besagten Fehlermeldung.
Muss ich bestimmte Deklarationen aus Licht_FB in PLC_PROG übernehmen (var_in_out)?
Ich scheine damit kurz vor dem Ziel zu stehen... das wäre klasse!
edit: ich habe keine Taskkonfiguration - das hat aber mit der Fehlermeldung oben ja nichts zu tun..
@Speicherzelle
Vielen Dank für die Erklärung des Bausteins. Habe es versucht nachzuvollziehen und werde es nochmals anhand deiner Ausführungen verfolgen. Da raucht einem ja fast schon ein bisschen der Kopf wenn man sowas nicht alltäglich macht
Euch beiden ganz herzlichen Dank für Eure Mühe!
Grüße
dtm
Originally created by: ebt'ler
An der deklaration in Licht_FB musst du nichts mehr ändern.
Aber warum es jetzt keinen Merker als var_in_out akzeptiert weiß ich nicht. Normalerweise hat man auf Merker schreib und lesezugriff.
Du könntest jetzt mal versuchten im Netzwerk zuvor einer Variablen den Merker zuzuweisen, an den FB die Variable verwenden und im Netzwerk danach den Merker dann die Variable zuweisen.
Ob das funktioniert kann ich jetzt nicht genau sagen. Alternativ müsste ich mir mal was anderes überelgen.
Wenn du die Bezeichnungen im PCL_PRG änderst wird mein Visu-Beispiel nicht mehr richtig funktionieren. Da es ja noch die alten Bezeichnungen verwendet. Nicht das du dich dann davon täuschen läst.
Wenn es nicht funktioniert melde dich nochmal. Heute bin ich aber sicher nicht mehr online.
Originally created by: ebt'ler
Mich hat das Problem jetzt aus Eigeninteresse nicht in Ruhe gelassen. ^^
Codesys kann offenbar aus den bitadressierten Merker keinen Pointer erzeugen, was aber erforderlich wäre um damit ein var_in_out zu belegen.
Wenn man sonst Pointer in Verbindung mit Bitzugriffen einsetzt muss man auch einen Umweg (Bitoffset usw.) gehen.
Somit müsste es dann aber funktionieren, wenn man wie im letzten Post beschrieben vorgeht.
Vielen Dank dass du dir nochmal Gedanken gemacht hast.
Ich habe eine Variable Testmerker_v erstellt, diese in Var_in_out als boolesche Variable deklariert und dieser Variablen den Merker (Testmerker) zugewiesen.
Es kommt zu folgender Fehlermeldung:
Fehler 3705: VAR_IN_OUT in Top-Level-Baustein nicht erlaubt, wenn keine Task-Konfiguration vorhanden ist.
Bisher lief alles ohne Taskkonfig., und mit Tasks habe ich noch nie gearbeitet - habe keinen Plan davon und weiß auch nicht inwiefern sich das dann im Programmablauf (negativ?) bemerkbar macht...
Ich probier noch ein bisschen rum - vielleicht hast du ja noch eine Idee!
EDIT:
Habe die Variable Testmerker_v nicht als Var_in_out deklariert sondern einfach als Bool in der Variablendeklaration in PLC_PRG.
Es scheint so zu klappen!!! Ich habe es jetzt nur mit dem Forcen der Variablen versucht, das klappt! Ich teste mal ob´s auch über die Visu über Modbus klappt - dann ist es endlich geschafft!
Schöne Grüße
dtm
Originally created by: ebt'ler
Guten Morgen,
Den Licht_FB brauchtest du nicht zu verändern. Und meine letzte Idee hab ich im Anhang nochmal als Bild hinzugefügt. Dann sollte es nichtmehr zu Missverständnissen kommen.
Ich hoffe es funktioniert wie von dir beabsichtigt.
ES FUNKTIONIERT!!!!!
Ich hätte nicht gedacht dass das tatsächlich mal klappen würde, nachdem ich so vieles ausprobiert habe!
Der Ausgang lässt sich nun via Taster einschalten, via Merker ausschalten und vice versa.
Ganz ganz herzlichen Dank dafür, freue mich riesig! Das hätte ich alleine vermutlich nie hinbekommen.
Viele Grüße
dtm
Gibt es grundsätzlich die Möglichkeit, in den FB noch einen Reset-Eingang einzubauen?
Kann ich Code aus fertigen FB in den Licht_FB einfügen, um zusätzliche Funktionalität wie z.B. max. Leuchtdauer (also autom. ausschalten nach 3 Std. z.B.) zu erhalten?
Ich habe meine ganzen Schaltvorgänge bisher über den FB Switch_I (OSCAT) gemacht und möchte diese auf die Möglichkeit der Steuerung über Merker umstellen.
Wenn ich mir z.B. den FB Switch_I aus der Oscat Bib in der Bibliotheksverwaltung ansehe, sehe ich nur die Variablendeklarationen, aber nicht den eigentlichen Code für die Funktionalität... wie kann ich darauf zugreifen?
Grüße
dtm
Hallo meine Herren,
schaut euch mal mein Demo an so werdet Ihr sehen das meine Lib auch funktioniert.
Habe zur Veranschaulichung ein Visu beigepackt.
Übrigens ist da auch ein Reset intregriert.
Schaut es Euch an und sagt was dazu
MFG
Speicherzelle.
PS. Übrigens ist in der Demo immer die Lib dabei gewesen
guckst Du
demo_eintasterbetrieb.zip [33.48 KiB]
Hallo Speicherzelle,
danke nochmal für deine Mühe. Also ich habe es getestet. Über die von dir erstellte Visu klappt es definitiv, wenn ich aber direkt im PLC_PRG 'input_Button(...)' auf TRUE setze und der Ausgang TRUE wird, kann ich über das Forcen von 'input_Merker(...)' den Ausgang nicht auf FALSE setzen. Komisch warum es in der Visu klappt, anders aber nicht... vielleicht mach ich was falsch...
Schöne Grüße
dtm
nur mal so aus neugierde poste mal das programm von dir mit der lib von mir.
da sage ich dir was du vielleicht falsch machst.
den in meiner CPU (teste immer mit cpu) klappt das einwandfrei
MFG
Speicherzelle
Originally created by: ebt'ler
Hallo,
ich habe meinen Lösungsvorschlag nochmal mit einen Reset-Eingang erweitert und eine Möglichkeit hinzugefügt nach einer bestimmten Einschlatzeit wieder automatisch auszuschlaten.
Aber da Codesys als var_in_out keine Bitadressen akzeptier finde ich die Lösung nicht mehr so gut. Andernfals wäre es sicher recht übersichtlich, da man nur einen Baustein aufrufen muss. Mit der umständlichen Merkerverarbeitung ist der Vorteil aber schnell wieder weg.
Normalerweise verzichte ich zwar auf oscat, aber da du sowieso eher auf "SWITCH_I" stehst habe ich dazu auch mal ein Beispiel im Anhang. Das gefällt dich sicher viel besser.
Du musst aber noch die Schaltzeiten anpassen.
licht_oscat.zip [42.96 KiB]
licht.zip [4.53 KiB]
Originally created by: ebt'ler
@ Speicherzelle,
d.t.m will den Status des Ausgangs auch am Merker ablesen können. Das ist dann sicher der Teil deines Programms welches ihn nicht gefällt / was bei ihn nicht funktioniert. Da du den Merker ja nicht noch den Wert von "licht_ein_aus" zuweist.
EDIT (Ergänzung): Weiterhin möchte er nicht den Ausgang über die positive Flanke des Merkers toggeln, sondern den Zustand direkt weiter geben.
Ja, genau so ist es. Vielen Dank für die Ergänzung, probiere ich gleich morgen früh aus!
Grüße
dtm
@ebt'ler
Habe das mal ausprobiert.
Also deine Oscat Variante soll den 'Licht_FB' komplett ersetzen? Hilfsvariablen sind auch nicht mehr nötig?
Habe unter obige Annahme schon einiges versucht, aber so klappt´s nicht bei mir. Dannst mir ja mal sagen ob ich das so richtig verstanden habe..
Grüße
dtm