# Mit Funktionbaustein unterschiedliche dOut schalten



## Ulf S. (7 Februar 2022)

Hallo und guten Tag,
nach einiger Probieren bräuchte ich als ziemlicher Anfänger Hilfe. Ist auch gut möglich dass meine Vorstellung in den Augen erfahrener Anwender Banane sind...

In FUP habe ich mir einen für mein Verhältnisse komplexen Funktionsbaustein mit 4 Bool Eingängen und 2 Bool Ausgängen erstellt. Dieser FB soll 4 programmierte Funktionen an 9 verschiedene identische Motoren (2xdOut) steuern. für jeden einzelnen Motor funktioniert das sauber. 
Steuerung erfolgt aktuell über eine Visualisierung,  die 9 Geräte mit den 4 Programmen sind mittels DUT deklariert und in der Visu über eine Template angelegt. das geht mit 9 Geräte/ 9 Instanzen des FBs eigentlich schön.  Mehrere Geräte gleichzeitig (Gruppen 0-4, 5-9, alle) zu steuern kriege ich nicht schön und nur sehr umständlich hin...

Wie könnte ich elegant und schlank abhängig vom Output der Visualisierung ( Input für den FB) festlegen, welches Gerät oder welche Gruppe schaltet (dOut der Motoren)?  
Vielen Dank und schöne Grüße....
Ulf


----------



## PN/DP (7 Februar 2022)

(Antwort wieder gelöscht, weil nicht richtig gelesen)


----------



## idtell (7 Februar 2022)

Die Seiten erzeugen doch für ihr jeweiliges Gerät ein Kommando ? dann brauchst du doch für grp x-y eh eine eigene Seite. Daraus holst du dann doch eine paralelle Kommandoverbindung ? (welche in jedem der Geräte pro gruppe reingeht)

Sollte das nicht so gedacht sein, dann muss in die Kommandostructur doch eine Bitmaske(z.b Grp 1-4 setzt die ersten 4 bits), welche Geräte jetzt aufs kommando reagieren sollen => das ist in der Anzeige dann ... aber auch machbar.

Oder hab ich das falsch verstanden ?


----------



## Oberchefe (7 Februar 2022)

Ich hoffe ich habe das richtig verstanden:
Mehrere Instanzen vom FB_Raff. Die Knöpfe für Auf/Ab alle auf den jeweils gleichen Visu-Knopf geben(ein und dieselbe Variable). Der FB_Raff bekommt einen zusätzlichen Freigabeeingang, welcher von der Visualisierung gesetzt wird(Checkboxen...). Der selektierte Freigabeeingang definiert welcher Rollo mitfährt.
Im FB mussen die entsprechenden Eingänge mit dem Freigabeeingang verriegelt werden.


----------



## Ulf S. (7 Februar 2022)

idtell schrieb:


> Die Seiten erzeugen doch für ihr jeweiliges Gerät ein Kommando ? dann brauchst du doch für grp x-y eh eine eigene Seite. Daraus holst du dann doch eine paralelle Kommandoverbindung ? (welche in jedem der Geräte pro gruppe reingeht)


so hab ich ich mir das in meinem nicht mehr jugendlichen Leichtsinn vorgestellt


----------



## Ulf S. (7 Februar 2022)

idtell schrieb:


> Sollte das nicht so gedacht sein, dann muss in die Kommandostructur doch eine Bitmaske(z.b Grp 1-4 setzt die ersten 4 bits), welche Geräte jetzt aufs kommando reagieren sollen => das ist in der Anzeige dann ... aber auch machbar.
> 
> Oder hab ich das falsch verstanden ?


Uff...Vielen Dank für die Antwort aber da muss ich noch eine Menge lesen....


----------



## Ulf S. (7 Februar 2022)

Oberchefe schrieb:


> Ich hoffe ich habe das richtig verstanden:
> Mehrere Instanzen vom FB_Raff. Die Knöpfe für Auf/Ab alle auf den jeweils gleichen Visu-Knopf geben(ein und dieselbe Variable). Der FB_Raff bekommt einen zusätzlichen Freigabeeingang, welcher von der Visualisierung gesetzt wird(Checkboxen...). Der selektierte Freigabeeingang definiert welcher Rollo mitfährt.
> Im FB mussen die entsprechenden Eingänge mit dem Freigabeeingang verriegelt werden.


Ursprünglich hatte ich alle Rollos in FUP einzeln angelegt in 8 Netzwerken je Rollo = 8x9 Netzwerke
in jedem Zimmer waren die Gruppeneingänge dann schon implementiert
Funktionierte, aber schlecht pflegbar/erweiterbar/unübersichtlich
Hatte ich schon mal hier gepostet:





						POU FUP mit unterschiedlichen Inputs und Outpus verwenden
					

Hallo und guten Abend, mit eine Wago/e!Cockpit PFC200 möchte ich meine Hausautomation realisieren. Was SPS und Codesys angeht bin ich Einsteiger, ebenso was Programmierung angeht. Ein erster Schritt war die Steuerung der Raffstores über eine WebVisu. Das Ergebnis der FUP für einen Raum habe ich...




					www.sps-forum.de
				






Bis jetzt arbeite ich ausschließlich mit Bool, so viel zu meinem Kenntnisstand!
Sorry wenn meine Problemstellung zu ungenau ist....
Vielen Dank für eure Antworten!


----------



## idtell (8 Februar 2022)

Ulf S. schrieb:


> Uff...Vielen Dank für die Antwort aber da muss ich noch eine Menge lesen....


dann würde ich mal so vorgehen wie Du dir selbst Dein Programm beschreibst : structur kommandos mit up,down, wasweißich plus ein Ziel:Word (Speichersparen kostet später). Diese Kommandos erstellst du dann aus den Eingängen und der Visu, wobei die Visu die einzelnen Zielbits ein und ausschaltet (wenn das Bedienfeld auch Selektionen oder lokal können soll, muss das halt auch parallel diese Ziele aktivieren/deaktivieren) das lässt du nun in deinen gemachten Code rein statt dort direkt mit deinen Eingängen reinzugehen. Dein Code braucht dann halt dort wo das jeweilige Bewegungskommando reingeht eine Und-Verknüpfung mit dem Zielbit ( Beispiel: FB4 : kommando.up & kommandoziel.4 )
 wichtig dabei ist halt das die Kommandos an einer Stelle(in einem FB) gemacht werden damit Du beim debuggen nicht in jeden FB/Programm reinschauen musst.


----------



## jensemann (9 Februar 2022)

Ich weis ja nicht, mit welcher Visu du arbeitest, aber mir kommt da spontan der Begriff Multiplex in den Sinn.
Damit schaltet man zB. ein Visuelement an ein Array und kann da die einzelnen Felder an immer die gleiche Visuseite anschliessen. Voraussetzung wäre dann natürlich ein 
Array[0..n] of StructvomRollo
...oder ich hab die Fragestellung nicht verstanden...


----------



## Ulf S. (9 Februar 2022)

Hallo Jensemann,
vielen Dank für deinen Antwort. Ihc glaube du hast das vollkommen richtig verstanden.
Interessanterweise hatte ich gestern Abend auch an Array gedacht. So ganz durchblicke ich das nicht, im Gegenteil ich fange gerade erst an, ansatzweise zu verstehen wie ich das nutzen könnte. Vor allem stelle ich mir gerade vor, dass ich mit einem Array "Szenen" gestalten kann, was dann auch für die Lichter wieder interessant werden wird.

Ich verwende e!Cockpit!
Den Funktionsblock habe ich geändert, der hat in der Deklaration jetzt die gleiche Struct als Eingangsvariable, im PLC-PRG schalte ich die Struct aus der Visu mit s= in die Instanzen, überblicke aber nicht,  ob man das machen darf... Vieles mache ich als trial and error....

Sturct in der Visu und als Eingang der FB-Instanzen sieht so aus:



In der Simulation funktioniert zumindest die erste Instanz schon


----------



## Ulf S. (10 Februar 2022)

idtell schrieb:


> dann würde ich mal so vorgehen wie Du dir selbst Dein Programm beschreibst : structur kommandos mit up,down, wasweißich plus ein Ziel:Word (Speichersparen kostet später). Diese Kommandos erstellst du dann aus den Eingängen und der Visu, wobei die Visu die einzelnen Zielbits ein und ausschaltet (wenn das Bedienfeld auch Selektionen oder lokal können soll, muss das halt auch parallel diese Ziele aktivieren/deaktivieren) das lässt du nun in deinen gemachten Code rein statt dort direkt mit deinen Eingängen reinzugehen. Dein Code braucht dann halt dort wo das jeweilige Bewegungskommando reingeht eine Und-Verknüpfung mit dem Zielbit ( Beispiel: FB4 : kommando.up & kommandoziel.4 )
> wichtig dabei ist halt das die Kommandos an einer Stelle(in einem FB) gemacht werden damit Du beim debuggen nicht in jeden FB/Programm reinschauen musst.


Danke für deine Antwort.
Sorry, das hatte ich noch nicht gelesen, aber macht es mir Kopfschmerzen....ich muss noch so viel lernen....


----------



## idtell (10 Februar 2022)

Ulf S. schrieb:


> aber macht es mir Kopfschmerzen


zuerst mal ein Tipp: Unteraufgaben in unter-FBs verpacken = im Programm kann man sich das anschauen, muss aber nicht.
Jeder Programmierer kann ein Programm so klein wie möglich schreiben, aber ein schlauer verpackt es so kleingestückelt und einfach, dass auch der Dümmste es nachher noch lesen und verstehen kann. Und wenns Kopfschmerzen bereitet => kleiner Stückeln, skizzieren etc
NICHT dran rumbasteln bis es geht aber keiner mehr versteht warum. (Ein Grund wieso ich graphische Sprachen nicht mag, da dort genau das zu oft gemacht wird )

Und das zweite : 


Ulf S. schrieb:


> im PLC-PRG schalte ich die Struct aus der Visu mit s= in die Instanzen


verstehe ich das richtig, dass du Konstanten (Texthäppchen wie z.B. "Wohnzimmer 1") mit der Kommando-String vergleichst und wenn true, dann mit einem Sel die Kommandos in den Block weitergibst ? Stringvergleiche gehen über alle Zeichen der String = mehrere Bytes und deshalb werden Vergleiche mit Bits, einer Nummer oder vor allem mit einer Enum vorgezogen. 

Da aber viele Wege zum Ziel führen und man sich schnell auf einen Lösungsvorschlag versteift, wenn man ihn mal irgendwo gesehen hat => weiß nicht ob ich mein Beispielprogramm dafür posten soll.


----------



## Ulf S. (10 Februar 2022)

idtell schrieb:


> zuerst mal ein Tipp: Unteraufgaben in unter-FBs verpacken = im Programm kann man sich das anschauen, muss aber nicht.
> Jeder Programmierer kann ein Programm so klein wie möglich schreiben, aber ein schlauer verpackt es so kleingestückelt und einfach, dass auch der Dümmste es nachher noch lesen und verstehen kann. Und wenns Kopfschmerzen bereitet => kleiner Stückeln, skizzieren etc
> NICHT dran rumbasteln bis es geht aber keiner mehr versteht warum. (Ein Grund wieso ich graphische Sprachen nicht mag, da dort genau das zu oft gemacht wird )


Meinst du ich hätte den großen FB in mehrere Funktionen zerlegen sollen? Ich möchte je auch in 5 Jahren möglichst leicht Anpassen/Warten können. Geschweige denn, wenn das mal anderer machen muss!
FUP habe ich gewählt, weil es mir als Anfänger ohne wirkliche Programmiererfahrung...ich glaube ich muss es nicht ausführen.


----------



## idtell (10 Februar 2022)

ok , ich lad mal doch n Schnipsel hoch. Außerdem muss ich ja nicht recht haben... war eher meine Meinung dazu.
sind alle 4 Möglichkeiten reingepackt, eine auswählen die anderen löschen.
die Zerteilung musst du halt eventuell zerkleinern bis Du beim Gesamtbild und bei einzelbildern keinen Kopfschmerz mehr hast


----------



## Ulf S. (10 Februar 2022)

idtell schrieb:


> Und das zweite :
> 
> verstehe ich das richtig, dass du Konstanten (Texthäppchen wie z.B. "Wohnzimmer 1") mit der Kommando-String vergleichst und wenn true, dann mit einem Sel die Kommandos in den Block weitergibst ? Stringvergleiche gehen über alle Zeichen der String = mehrere Bytes und deshalb werden Vergleiche mit Bits, einer Nummer oder vor allem mit einer Enum vorgezogen.
> 
> Da aber viele Wege zum Ziel führen und man sich schnell auf einen Lösungsvorschlag versteift, wenn man ihn mal irgendwo gesehen hat => weiß nicht ob ich mein Beispielprogramm dafür posten soll.


nein so mache ich das nicht, habe anders umgesetzt. Je Rolladen eine Instanz. In der Visu habe ich ein Template, die benutzt den String nur zur "Beschriftung" in der Visu. Bis jetzt nur Boolsche Algebra auf Anfängerniveau....


----------



## Ulf S. (10 Februar 2022)

idtell schrieb:


> ok , ich lad mal doch n Schnipsel hoch. Außerdem muss ich ja nicht recht haben... war eher meine Meinung dazu.
> 
> 
> 
> ...


oh Wow....Vielen Dank das werde ich mir zu Hause nach der Arbeit (vollkommen fachfremd zu SPS/Programmierung) an sehen
Aber das ist genau das, was ich an diesem Forum so mag. jedes mal lerne ich was dazu! Super!


----------



## idtell (10 Februar 2022)

sowas ? der Nachteil ist halt das Du so die anderen möglichen Lösungen nicht mehr wahrnimmst. Und kann auch mal sein, dass ich die Fragestellung falsch verstehe..


----------



## Ulf S. (10 Februar 2022)

idtell schrieb:


> sowas ? der Nachteil ist halt das Du so die anderen möglichen Lösungen nicht mehr wahrnimmst. Und kann auch mal sein, dass ich die Fragestellung falsch verstehe..


noch mal Danke, dass du dir die zeit genommen hast. Ich glaube, ich verstehe das Prinzip. Würde zum Verständnis noch gerne Fragen:
das sind in Netzwerk 3-5 verschiedene Wege, den Output zu selektieren?
der OR ist mir klar, schaltet bei einzelnem Raum  oder bei ALLE
das hatte ich so schon mal realisiert (KiZ, OG und All)



Könnte man die Mehrfachzuweisungen/Szenen so lösen, dass man ein definiertes Array abhängig von einer BOOL schreibt und das geschriebene Array steuert, welche Instanzen eine FBs aktiviert werden? oder ist das ein noGo oder Performance Killer?
das wäre halt eine dynamische Szenengestaltung....


----------



## idtell (11 Februar 2022)

Ulf S. schrieb:


> das sind in Netzwerk 3-5 verschiedene Wege, den Output zu selektieren


der erste Screenshot hat soll dies aufzeigen : das dein Baustein bei jeder Instanz andere Aktoren schaltet (ob das ein Motor/Ausgang/etc  oder x-Verschiedene Aktoren sind, ist dabei egal ). 


Ulf S. schrieb:


> Könnte man die Mehrfachzuweisungen/Szenen so lösen, dass man ein definiertes Array abhängig von einer BOOL schreibt


ein fixes Muster kann man ohne Probleme in die Kommandostruktur reinlegen um gleiche Bewegung zu erreichen.
auch Schritte können einfach hintereinander Verschiedene Kommando-Konstanten erhalten. 
Performance sollte in dieser Anwendung noch gar kein Thema sein.


----------

