Step 7 Arrays im OB und FB

Techm3ch

Level-2
Beiträge
65
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo miteinander,
ich bin relativ neu und unerfahren im Geschäft der SPS aber habe eine relativ umfangreiche Aufgabe in meiner Firma bekommen und komme jetzt an einer Stelle nicht weiter und könnte Hilfe gebrauchen.

Ich arbeite nebenbei den Programmierleitfaden von Siemens durch und habe dabei den Array of Struct entdeckt.
Da die Anlage aus mehreren Teilanlagen besteht die immer wieder die gleichen Ein und Ausgänge haben, dachte ich mir das es eigentlich sehr nützlich ist ein Array zu verwenden. Ich habe 2 Datentypen aufgesetzt, einen für die Eingänge und einen für die Ausgänge, in diesen Datentypen sind 2 Arrays ineinander verschachtelt, relativ unkompliziert. Diese Arraydatentypen habe ich jetzt an mehreren Stellen im Programm eingesetzt und es funktioniert soweit eigentlich auch ganz wunderbar wobei es vermutlich sehr viel einfacher über AWL oder SCL gelöst werden könnte (Ich programmiere in FUP).

Mein Problem ist jetzt folgender: Ich habe einen FB, in diesem habe ich sämtliche Eingänge und Ausgänge einzeln angelegt und den FB dann in einen OB reingeschoben, damit wird ja ein großer Block im OB erstellt wo sämtliche Ein und Ausgänge dargestellt werden. An dieser Stelle habe ich es nicht geschafft den Array einzubinden (siehe Bild) der Arraydatentyp ist auch drin aber es wird nur ein Eingang dargestellt obwohl in dem Array ca. 15 Einträge sind. Wie kann ich die einzelnen Einträge einsparen und auf das Array zurückgreifen?

Beste Grüße und vielen Dank
Nate
 
Ich versteh es nicht.
Wirklich nicht.

Dein FB hat als Input kein Array, sondern einen UDT in dem es ein Array of Struct gibt.
Du musst dann eben deinen UDT so bearbeiten, dass dieser deiner Wunschstruktur entspricht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ok ich verstehe, die Struktur ist durch das Array gegeben, ich könnte das UDT ohne Array anlegen und dann hätte es die Struktur, allerdings ohne Array. gibts da keine andere möglichkeit?
 
Da ich die Frage auch nicht wirklich verstehe ... fang doch noch einmal von vorne an - vielleicht etwas simpler.
Es macht absolut Sinn, wenn mehrere Bausteine dieselben Daten verwenden, eine UDT anzulegen, die irgendwo zu befüllen und die dann den entsprechenden Bausteinen als IN-Parameter oder ggf. als INOUT-Parameter zu übergeben. Soweit bin ich dabei.
Nun hast du in deiner UDT aber ein Array mit der Dimension 0..0 angegeben - was ist hier der Sinn ?
So ... und finally ... was ist deine Frage ?
 
Was willst du genau erreichen?
Einen "schmalen" Bausteinaufruf, weniger Kopier-/ Anpassarbeit bei mehrmaligem Aufrufen?

Einfach nur einen UDT übergeben macht es nicht zwingend schöner, sieht zwar aufgeräumter aus, ist aber beim beobachten nicht zwingend vorteilhaft.

Grundsätzlich bietet sich ein Array bei wiederholenden Sachen an.
Man kann aber auch den FB mit vordefinierten Dummy-Variablen belegen, bei denen nur noch der Index des Array ausgetauscht werden muss bzw. bereits eine entsprechende Indexvariable enthält, die man eben vor dem Aufruf entsprechend beschaltet.

Noch so nebenbei.
Ich würde versuchen die Variablennamen simpler zu gestalten und ggf. Infos wie deren Einheit in die Kommentare schieben.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mein Problem ist jetzt folgender: Ich habe einen FB, in diesem habe ich sämtliche Eingänge und Ausgänge einzeln angelegt und den FB dann in einen OB reingeschoben, damit wird ja ein großer Block im OB erstellt wo sämtliche Ein und Ausgänge dargestellt werden. An dieser Stelle habe ich es nicht geschafft den Array einzubinden (siehe Bild) der Arraydatentyp ist auch drin aber es wird nur ein Eingang dargestellt obwohl in dem Array ca. 15 Einträge sind. Wie kann ich die einzelnen Einträge einsparen und auf das Array zurückgreifen?

Beste Grüße und vielen Dank
Nate
Dein Array[0..0] ist quasi überflüssig, warum brauchst du ein Array, wenn du nur einmal die Struktur brauchst?

Screenshot 2024-04-05 082039.png

Meinst du das hier?
Das ist richtig so, da du ja einmal deinen Datentyp "PPM-InputData" aufrufst.. somit wird der Datentyp als ganzes übergeben.

Und bitte schaut euch mal Themen wie Nomenklatur an, die Variablennamen sind ja wirklich nicht schön gewählt. (Sonderzeichen)
 
Was willst du genau erreichen?
Einen "schmalen" Bausteinaufruf, weniger Kopier-/ Anpassarbeit bei mehrmaligem Aufrufen?

Einfach nur einen UDT übergeben macht es nicht zwingend schöner, sieht zwar aufgeräumter aus, ist aber beim beobachten nicht zwingend vorteilhaft.

Grundsätzlich bietet sich ein Array bei wiederholenden Sachen an.
Man kann aber auch den FB mit vordefinierten Dummy-Variablen belegen, bei denen nur noch der Index des Array ausgetauscht werden muss bzw. bereits eine entsprechende Indexvariable enthält, die man eben vor dem Aufruf entsprechend beschaltet.

Noch so nebenbei.
Ich würde versuchen die Variablennamen simpler zu gestalten und ggf. Infos wie deren Einheit in die Kommentare schieben.

Die Ansteuerung der Anlage soll an Kunden Weitergegeben werden können, am besten sollen sie einfach eine Bibliothek erhalten und in ihr Projekt einbinden und praktisch direkt loslegen können. ich habe ein array of struct gewählt da sich die datentypen untereinander unterscheiden, ich habe UDint, Uint, USint, Dint ... Ich möchte ein Gerät anlegen und dieses dann mehrmals kopieren können und wenig anpassen müssen.

Danke für den Tipp, am anfang fand ich es noch in Ordnung aber so langsam wirds überfüllt weshalb ich die Variablennamen nochmal überarbeiten werde.

Das mit dem Dummy FB sagt mir garnichts, werde ich mich informieren müssen , hast du vllt ein stichwort?

Da ich die Frage auch nicht wirklich verstehe ... fang doch noch einmal von vorne an - vielleicht etwas simpler.
Es macht absolut Sinn, wenn mehrere Bausteine dieselben Daten verwenden, eine UDT anzulegen, die irgendwo zu befüllen und die dann den entsprechenden Bausteinen als IN-Parameter oder ggf. als INOUT-Parameter zu übergeben. Soweit bin ich dabei.
Nun hast du in deiner UDT aber ein Array mit der Dimension 0..0 angegeben - was ist hier der Sinn ?
So ... und finally ... was ist deine Frage ?

Ich wollte ein Array verwenden, mir ist aufgefallen ein Array nimmt nur die gleichen Datentypen auf, in irgendeinem Tutorial habe ich gesehen man kann einen Array of Struct anlegen um einen array mit unterschiedlichen Datentypen zu haben.
Mein Ziel war es sobald ich SCL beherrsche auf das Array zugreifen zu können. Außerdem das kopieren zu erleichtern, indem ich bei der nächsten anlage nur das array als variable anlege und eine startadresse vergebe und der rest sich automatisch einstellt.

zu meinem Problem: ich habe gelernt den FB in ein Netzwerk des OB reinzuziehen, dann wird ein Baustein mit den Ein- & Ausgängen erstellt. Dort kann ich dann Variablen verknüpfen, der Baustein hat aber nur einen Eingang für mein Array und für meinen UDT, in diesem UDT sind aber 13 Eingänge, wie kann ich z.B. den 5. Eintrag meines UDT in dem OB mit einer Variable versehen wenn es nur einen Eingang für den UDT gibt? Ich habe erwartet das sämtliche Einträge aus dem UDT als Eingänge angelegt werden. wenn ich die ganzen eingänge löschen würde hätte mein MainOB nur einen einzigen aus und eingang an dem ich meine Variablen nicht anknüpfen kann
 
Zuletzt bearbeitet:
Dein Array[0..0] ist quasi überflüssig, warum brauchst du ein Array, wenn du nur einmal die Struktur brauchst?

Anhang anzeigen 76941

Meinst du das hier?
Das ist richtig so, da du ja einmal deinen Datentyp "PPM-InputData" aufrufst.. somit wird der Datentyp als ganzes übergeben.

Und bitte schaut euch mal Themen wie Nomenklatur an, die Variablennamen sind ja wirklich nicht schön gewählt. (Sonderzeichen)
ok ich verstehe, das Array ist überflüssig und wurde kopiert ohne zu verstehen mit der Hoffnung das mit dem Verständnis sich noch einstellt. Gut, also das UDT wird auf einmal übergeben, dann passe ich das mal an und schaue ob ich es zum laufen kriege. Die Namen werden angepasst und werden momentan nur verwendet da ich eine Tabelle zur Verfügung gestellt bekommen habe und die namen einfach 1zu1 mit bisschen extrainfos übernommen habe :)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Da du einen UDT als IN-Parameter gewählt hast wird dieser auch nur als Ganzes, also quasi als Pointer, angezeigt.
Das UDT hast du ja als Variable irgendwo hinterlegt - im OB selbst ist eher unschön - besser wäre z.B. in einem DB (Datenbaustein).
An irgendeiner Stelle in deinem Programm mußt du nun alle Elemente deines UDT zuweisen - und zwar Einzeln ! Ich denke mal, dass du dir das anders vorgestellt hast (sagt meine Glaskugel).
Ich glaube auch, dass du mit dem Vorhaben, so wie gestartet nicht wirklich in die Richtung kommst wie von dir angedacht. Diese Struktur macht so nur dann Sinn wenn sie, einmal zugewiesen, von unterschiedlichen Bausteinen verwendet wird / werden kann.

Um hier weiterzukommen empfehle ich dir, dass du mal genau dein Vorhaben beschreibst (also auch mit angedachter Funktion) - dann kommen die Vorschläge ggf. etwas gezielter ...
 
wie kann ich z.B. den 5. Eintrag meines UDT in dem OB mit einer Variable versehen wenn es nur einen Eingang für den UDT gibt? Ich habe erwartet das sämtliche Einträge aus dem UDT als Eingänge angelegt werden. wenn ich die ganzen eingänge löschen würde hätte mein MainOB nur einen einzigen aus und eingang an dem ich meine Variablen nicht anknüpfen kannAnhang anzeigen 76943
Du hast die ja schon für die interne Verwendung.

Wieso möchtest du eine Variable anbinden die nicht existiert?
 
Da du einen UDT als IN-Parameter gewählt hast wird dieser auch nur als Ganzes, also quasi als Pointer, angezeigt.
Das UDT hast du ja als Variable irgendwo hinterlegt - im OB selbst ist eher unschön - besser wäre z.B. in einem DB (Datenbaustein).
An irgendeiner Stelle in deinem Programm mußt du nun alle Elemente deines UDT zuweisen - und zwar Einzeln ! Ich denke mal, dass du dir das anders vorgestellt hast (sagt meine Glaskugel).
Ich glaube auch, dass du mit dem Vorhaben, so wie gestartet nicht wirklich in die Richtung kommst wie von dir angedacht. Diese Struktur macht so nur dann Sinn wenn sie, einmal zugewiesen, von unterschiedlichen Bausteinen verwendet wird / werden kann.

Um hier weiterzukommen empfehle ich dir, dass du mal genau dein Vorhaben beschreibst (also auch mit angedachter Funktion) - dann kommen die Vorschläge ggf. etwas gezielter ...
ok ich verstehe. ich dachte ich muss beim OB sämtliche Eingänge für die Datenübertragung definieren.

das UDT wird in einer PLC-Variablen Tabelle mit einer Startadresse versehen und sämtliche Einträge sollen dann automatisch eine Adresse zugewiesen bekommen. Das funktioniert schonmal.
1712302225715.png
Mein Ziel ist es Kopierfähige Lösungen zu programmieren, denn es werden bis zu 6 Anlagenteile zu einer größeren Anlage zusammengebaut und diese haben bis auf eine Anlage (Gerät 0) alle die selbe Struktur der Ein- und Ausgänge. Wenn ein Kunde eine Anlage mit nur 3 Anlagenteilen bestellt, dann möchte ich 3x copy paste machen bzw. der Kunde soll dann einfach wie aus einem Baukasten seine Anlage zur Ansteuerung zusammen basteln.

Das sind Misch- und Dosieranlagen, angesteuert über PROFINET/TIA Portal. Bisher haben ein paar unserer Kunden Schwierigkeiten mit der Anbindung der Anlage, es gab negatives Feedback. Deshalb wurde ich beauftragt, sämtliche Probleme ausfindig zu machen die ein Kunde haben könnte, damit wir unsere "Anleitung" anpassen können. Außerdem wurde ich gebeten einen Baustein zu programmieren den wir bei Auslieferung der Anlage mitliefern können um den ganzen Prozess zu erleichtern.

Mein Ziel ist es 2 Bausteine zu programmieren (Gerät 0 hat eine andere Ein- & Ausgangsstruktur als Gerät 1-5), der Kunde soll eine Bibliothek erhalten und z.B. bei einer 4-fach Mischanlage einfach 4x diesen Block in sein TIA Programm einfügen und an einer zentralen Stelle die verwendeten Ein- und Ausgänge eintippen (Ich weiss ja nicht welche Adressen beim Kunden frei sind) und dann soll es am besten direkt laufen.

Ich habe schon gesehen das man für so ein globales Unterfangen nicht auf Merker sondern auf einen Datenbaustein zurückgreifen soll.
#
Insgesamt denke ich das dieses Projekt meinen Skill bei weitem übersteigt da ich mit praktisch 0 Vorwissen angefangen habe und es hier(auf Arbeit) niemanden gibt den ich fragen kann, allerdings komme ich auch jeden Tag ein Stück weiter und lerne viel. (auch viel Blödsinn)

Falls du eine Struktur oder Idee hast wäre ich dir dankbar
Besten Gruß,
Natee
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Kommen denn alle diese Daten, die du da zuordnest, aus SPS-Eingängen ?
Wenn ich mir die vergebenen Variablen-Namen so ansehe kann ich mir das nicht so recht vorstellen ... Ist es nicht vielmehr so, dass da Einiges aus der HMI kommt ? Oder als Rückinfo von den anderen Stationen ?
 
Noch eine andere Frage : sind diese Anlagenteile ( 1 bis 5) auch in ihrer Funktion identisch ?
Und : ist deine Station 0 sowas wie der Master / Jobverteiler ?
 
Kommen denn alle diese Daten, die du da zuordnest, aus SPS-Eingängen ?
Wenn ich mir die vergebenen Variablen-Namen so ansehe kann ich mir das nicht so recht vorstellen ... Ist es nicht vielmehr so, dass da Einiges aus der HMI kommt ? Oder als Rückinfo von den anderen Stationen ?
tatsächlich werden bis jetzt keine SPS Ein oder Ausgänge verwendet. Sämtliche Daten kommen von einer Testanlage über CANBus werden dann von einem Konverter in irgendwas anderes umgewandelt und dann von einem weiteren Protokollkonverter in PROFINET an die TIA übergeben. HMI gibts auch keinen. Diese Testanlage die ich verwende ist eine von der Firma entwickelte Steuerung/Controller der momentan eine 4fachAnlage simuliert. Der eine Konverter ist auch von der Firma entwickelt worden und ermöglicht mir über CANBus Befehle zu schicken aber auch über einen Webbrowser auf die Anlage zugreifen zu können
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Noch eine andere Frage : sind diese Anlagenteile ( 1 bis 5) auch in ihrer Funktion identisch ?
Und : ist deine Station 0 sowas wie der Master / Jobverteiler ?
ja die 0 ist sowas wie der master, die anlagenteile 1-5 sind in der funktion identisch, alle tun das gleiche aber zu unterschiedlichen leistungen. wenn ich an der anlage 3 was ändere, wie z.b. das mischverhältnis wird diese das dem Gerät 0 melden und der wird dann den anderen einen neuen anteil zuordnen.
 
Bisher haben ein paar unserer Kunden Schwierigkeiten mit der Anbindung der Anlage, es gab negatives Feedback. Deshalb wurde ich beauftragt, sämtliche Probleme ausfindig zu machen die ein Kunde haben könnte, damit wir unsere "Anleitung" anpassen können.
Es ist wichtig das negative Feedback als auch den Bedarf zu analysieren. Es macht keinen Sinn jetzt alle Fälle die dir einfallen abzudecken, wenn diese nicht mit dem Bedarf eurer Kunden gedeckt sind => leere Arbeitszeit. Das wäre Aufgabe vom Vertrieb, schätze ich mal.

Hier sollte erstmal analysiert werden, was denn genau dieses Feedback verursacht hat und wie sich diese Probleme konkret beheben lassen können.

Wieso bist du denn der einzige, der sich damit "auskennt", wenn ihr doch ein Hersteller von Maschinenlösungen seid? Was ist denn mit der Entwicklung und allem drum und dran.. du kannst ja nicht die einzige Person sein, welche sich dem Thema jemals angenommen hat.. oder?
 
Es ist wichtig das negative Feedback als auch den Bedarf zu analysieren. Es macht keinen Sinn jetzt alle Fälle die dir einfallen abzudecken, wenn diese nicht mit dem Bedarf eurer Kunden gedeckt sind => leere Arbeitszeit. Das wäre Aufgabe vom Vertrieb, schätze ich mal.

Hier sollte erstmal analysiert werden, was denn genau dieses Feedback verursacht hat und wie sich diese Probleme konkret beheben lassen können.

Wieso bist du denn der einzige, der sich damit "auskennt", wenn ihr doch ein Hersteller von Maschinenlösungen seid? Was ist denn mit der Entwicklung und allem drum und dran.. du kannst ja nicht die einzige Person sein, welche sich dem Thema jemals angenommen hat.. oder?
bis jetzt lief alles über eigen entwickelte steuerungen, allerdings wird immer öfter eine SPS anbindung gewünscht, meine kollegen arbeiten alle in anderen bereichen, ich wurde neu eingestellt um die SPS schnittstelle praktisch aus dem boden zu stampfen. mein chef hat sich jemanden gewünscht der die anlagen die wir verkaufen nicht kennt, jemand der an die anlagen so rangeht wie ein möglicher kunde. da komme ich ins spiel, ich kenne die anlagen nicht und soll mögliche schwierigkeiten erkennen und gleichzeitig lösungen entwickeln. ich hab praktisch freie hand. aufjedenfall kümmert mich das ganze zeug um vertrieb und kunden eher weniger, ich versuche einfach nur eine klasse steuerung zu entwickeln. (ich bin nicht der einzige, es gab einen der hier nicht mehr arbeitet und einen anderen der sich jetzt einer anderen sache annimt, ich bin mittlerweile weiter als er war und somit ist seine hilfe bedingt nützlich)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Sämtliche Daten kommen von einer Testanlage über CANBus werden dann von einem Konverter in irgendwas anderes umgewandelt und dann von einem weiteren Protokollkonverter in PROFINET an die TIA übergeben. HMI gibts auch keinen. Diese Testanlage die ich verwende ist eine von der Firma entwickelte Steuerung/Controller der momentan eine 4fachAnlage simuliert. Der eine Konverter ist auch von der Firma entwickelt worden und ermöglicht mir über CANBus Befehle zu schicken aber auch über einen Webbrowser auf die Anlage zugreifen zu können
Das hört sich für mich schon ZIEMLICH diffus - um nicht zu sagen plockig - an ...

Dein Projekt verstehe ich also so, dass dein Gerät 0 der Mischer selbst ist und die Geräte 1 bis 5 die Komponenten-Waagen (oder ähnlich).
Von irgendwoher bekommst du den Wunsch mitgeteilt, dass etwas zu mischen ist, das aus bestimmten Bestandteilen, die in den Geräten 1 bis 5 vorbereitet werden, zusammengesetzt ist. Wenn aber eines der Geräte nicht ganz passend dosiert dann müssen die anderen Geräte ggf. nachdosieren.
Habe ich das so in etwas richtig ge-Glaskugel-t ?
 
Das hört sich für mich schon ZIEMLICH diffus - um nicht zu sagen plockig - an ...

Dein Projekt verstehe ich also so, dass dein Gerät 0 der Mischer selbst ist und die Geräte 1 bis 5 die Komponenten-Waagen (oder ähnlich).
Von irgendwoher bekommst du den Wunsch mitgeteilt, dass etwas zu mischen ist, das aus bestimmten Bestandteilen, die in den Geräten 1 bis 5 vorbereitet werden, zusammengesetzt ist. Wenn aber eines der Geräte nicht ganz passend dosiert dann müssen die anderen Geräte ggf. nachdosieren.
Habe ich das so in etwas richtig ge-Glaskugel-t ?
Gerät 0 ist der Master, Gerät 1-5 steuern jeweils eine Anlage und greifen Messwerte ab. Die gesteuerten Anlagenteile stellen im gesamten eine Mischanlage dar, diese Anlagenteile arbeiten identisch und sind auch identisch. Das einzige was sie unterscheidet ist das sie zu unterschiedlichen Mengen Substanzen fördern, das ganze ergibt ein bestimmtes Mischverhältnis, ein Rezept das am Ende zu einer Masse zusammengeführt wird. Da es sich um ein Rezept handelt müssen die einzelnen Module miteinander kommunizieren und im Falle einer Änderung übernimmt der Master (Gerät0) die Aufgabe das Verhältnis bei den anderen Anlagen so anzupassen wie gewünscht, ansonsten müsste man bei jeder Anlage einzeln diese Änderung vornehmen. Eine einzelne Anlage wird einfach nur eine bestimmte Menge Material pro z.B. Stunde fördern, mit 2 Anlagen (z.B. Gerät1+2) kann man dann zu verschiedenen Verhältnissen oder Mengen mischen. Da alle möglichen Arten von Mischanlagen gebaut und verkauft werden soll meine Lösung modular sein und am besten einfach in der Anwendung.
 
Okay ... das heißt aber für mich, dass du "nur" die Schnittstelle zu den Geräten definieren musst - das kann natürlich eine Struktur sein ...
Diese Schnittstelle hat allerdings 2 Richtungen - zum Gerät hin und vom Gerät zurück.
Sind die Geräte denn eigenständige Steuerungen oder dezentrale Perepherie des Mischers (Gerät 0) ?
In jedem Fall müssen die Geräte dann ja "nur" tun, was ihnen gesagt wird. Da sehe ich jetzt weniger das Problem - eher im Zentrum wo alles zusammenkommt. Aber dieses Zentrum ist ja, so wie ich es verstanden habe, nicht dein Gerät 0 sondern dein CAN-Bus mit irgendwas und Protokoll-Konverter ... :cool: :unsure:
 
Zurück
Oben