Variablen in mehreren PRG,s sinnvoll verarbeiten

Beiträge
433
Reaktionspunkte
18
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich bin gerade dabei die Automatisierung für einen Kumpel zurealsieren. System Wago 750 881, Dali, Analog, Weterstation und DI und DO, alles mit Codesys V2.3.

Die Struktur ist folgende.
PLC_PRG
Dieses ruft alle PRG,s auf z.B. für Rolladen EG, Steckdosen EG usw.
Ein seperates PRG mit Task für Dali.

Nun mache ich mir Gedanken wie ich die Abhängigkeiten zwischen den PRG über Variablen am besten strukturiere. Ich sage immer: Wenn es funktioniert heisst es nicht das es gut ist.

Ich habe Globale Variablen, da bin ich aber der Meinung das man diese nur Taskübergreifend verwenden sollte, stimmt das?

Dann könnte ich in PRGs VAR Inputs definieren, dann habe ich aber an den PRG Blöcken (arbeite mit CFC) lauter Eingänge und Ausgänge, auch nicht schön.
Eine Alternative wäre noch für jeden Raum einen FB zu erstellen und alles ausser Dali mit einem PRG zu erschlagen, aber da bekommen FB Bausteine mit massig Inputs und Outputs.


Wie macht man das am besten???

Wäre um Tipps echt dankbar, weil ich da eine saubere Struktur einbringen will.


Vielen Dank.
 
Hi,
mal ne wilde Idee:
Einen "fetten" Struct erstellen der alle Dinge eines Raumes enthält, sowohl Soll als auch Ist-Werte.
Nun nur noch diesen übergeben (ggf. InOut) und in den verschiedenen PRG´s nur die gewünschten Daten verarbeiten.
Dabei noch viele Enums verwenden um die Lesbarkeit drastisch zu erhöhen...

Nur so ne Idee...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi shrimps,

danke für deine Antwort.

Was ein Struct ist weiß ich, habe aber noch keinen verwendet, warum ist das wild? Wie würde das aussehen? Struct im z.B. PRG Dali erstellen im Bereich VAR Output und im PRG Rollo das Struct in VAR Input einlesen??

Jetzt hast du mich erwischt: Was ist ein Enum??

Vielen Dank.
 
Brauchst dir jetzt nicht extra den Aufwand machen, suche zwar gerade hoffnungsvoll nach Beispielen.:D

Warum kann man das Eigentlich nicht mit Globalen Variablen machen, Das verstehe ich noch nicht ganz?
Diese Variabeln sind ja so lange true oder false bis sich nach einer Änderung in dem PRG Task in dem Sie generiert werden wieder was ändert.

Die andere Variante wäre noch diese: PRG1.Präsenzmelder1 ind PRG2 lesend auf irgendwas zu verarbeiten. Z.B Rolladen hochfahren.

Danke.
 
Hi,

also habs mal getestet, so ganz dahinter bin ich noch nicht gekommen. Aber wenn ich das was du mir vorschlägst richtig verstehe, ist die Lösung gut.
Ich werde evtl. morgen falls Zeit ist auch ein Beispielprojekt basteln und zippen, dann kannst du hoffentlich erkennen was ich falsch mache.

Danke.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die andere Variante wäre noch diese: PRG1.Präsenzmelder1 ind PRG2 lesend auf irgendwas zu verarbeiten. Z.B Rolladen hochfahren.

Noch eine andere Variante wäre schlichtweg die Funktionen in ein einziges PRG zu packen.
Du hast bei einem Haus so eine enge Verzahnung zwischen den Funktionen, dass es - meines Erachtens - schlichtweg keinen Sinn macht Rollladen, Licht, Wetter, ... in einzelne PRGs zu packen.
PRGs verwende ich nur, wenn es Baugruppen oder spezielle Aufgaben erfordern.
 
Hi blockmove,

danke für deine Antwort.
Wäre auch eine Idee, bloß mir fehlt dann die Übersichtlichkeit. Mann könnte dann noch FB.s für Räume machen aber daran gefällt mir nicht das ich dann riesen Blöcke habe mit 40 Iputs var und usw. Mache alles in Fup und CFC evtl. ist die Variante in ST viel eleganter.

Warum sollte man Globale Variablen nur Taskubergreifend verwenden? Mein Vorhaben würde da genau so funktionieren. Ist das blos wegen dem Aufwand und dem Chaos an unübersichtlichkeit oder hat das noch andere Gründe?

@ shrimps
Ich habe deine Variante mal getestet, jedoch noch erfolglos. Ich versuche es weiter, falls nicht klappt hänge ich mein codesys pro das ich gebastelt habe mal an.

Danke.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,
so wie Blockmove schon andeutete:
Die komplexe Verzahnung zwischen allen I/Os muss nicht unbedingt in zig PRGs ausgelagert werden.
Ich habe als Bsp. meine Pelletanlage/Heizungssteuerung so, das ich die wesentlichen Funktionen im MIAN als Action aufrufe.
Alle notwendigen VARs sind im Main deklariert, nur die I/Os sind im GLOBAL definiert, wie auch die Memorys.

Durch die in verschiedenen Sprachen ausgeführten Actions ist die Lesbarkeit sehr hoch !

HtH
Shrimps
 
Hi shrimps,

ich glaube ich muss erst selbst durch Erfahrung noch die Varinaten finden welche für den jeweiligen Anwendungsfall passen.
Ich habe mich mit dem Struct und Enum nochmal ein bisschen gespielt und bekomms einfach nciht gebacken.
Hab mein Test Pro angehängt, in der Simulation hats nicht funktioniert.

Ich bekomme im Lampen PRG die Variable nicht auf True. Woran kann das liegen.

Vielen Dank.
 

Anhänge

Hi Shrimps,

ich habs jetzt hinbekommen, hab noch was abgeändert dann ohne Simulation auf der PLC getestet und es funktioniert. Find die Lösung gut, da es strukturiert aussieht.
Eine Frage hätte ich aber noch.
Das Enum brauche ich aber nur einmal anlegen z.B für alles PRG,s in denen ich Variablen übergeben möchte, im gleichen Wortlaut ins Enum schreiben.
Das Struct brauche ich im Prinzip auch nur einmal, wenn ich hier vom Wohzimmer und vom Esszimmer Variablen auf zwei PRG,s übergebe die eigentlich die gleiche Bezeichnung haben, muss ich die halt ändern wegen Verschattung z.B. Roll_Wohnzimmer_Auf und Rollo_Esszimmer_Auf.

Habe ich das richtig verstanden??

Vielen Dank.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Richtig !
Deswegen ja auch als Global.
Bei dir reicht ein enumblock.
Ich hatte Mal was mit Motoren gemacht, da hatte ich viele enumblöcke.
Für die Motortypen und für die Schrittketten. Wird alles deutlich lesbarer und bei der Schrittkette ist das numerieren dann plötzlich egal !
HtH Shrimps

Gesendet von meinem ONEPLUS A3003 mit Tapatalk
 
Welche Übergabe ?
Zu einem FB klar, aber Actions nicht. Actions dienen nur der Übersicht.
Sofern wir beide das gleiche meinen.

Gesendet von meinem ONEPLUS A3003 mit Tapatalk
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die Übergabe vom PRG_Wohnzimmer zum PRG_Küche. Da habe ich jetzt im PRG_Wohnzimmer eine variable über eine Aktion mit Move übergeben. Die Aktion wird im PRG_Wohnzimmer aufgerufen.
Dient das nur der übersichtlichkeit oder könnte ich auch im PRG_Wohnzimmer die Übergabe mit Move machen?
Solange mein code keinen Speicher braucht ist die Aktion ja das richtige.

Danke.
 
Hmm, blicke nicht durch. Sende das Projekt nochmals. Ich kann nach 12 reinschauen. Hab dann Rechner ...

Gesendet von meinem ONEPLUS A3003 mit Tapatalk
 
Hi,

ich habe mal die 2 Varianten angehängt. Die mit der Nummer 2 ist die Version ohne Aktion.
Ausserdem bekomme ich eine Fehlermeldung wenn ich in der Aktion in einem Ausgang die globale Variable stBereichsdata mit F2 einfüge. Die Fehlermeldung kommt nur einmal, ich klicke dann auf ignorieren und dann funktionierts. Hab leider keinen Screenshot gemacht.
Ich denke das Codesys im CFC diese Schreibweise im Ausgangsblock nicht mag.
Das Programm funktioniert aber und lässt sich Fehlerfrei übersetzen.
 

Anhänge

Zurück
Oben