TIA Indirekt auf mehrere DB`s zugreifen bei unterschiedlichen Array Längen

BattleBro

Level-2
Beiträge
9
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

Ich brauche für ein Projekt einen Indirekten Zugriff auf mehrere DB`s. Die DB`s haben einen Array of UDT, unterscheiden sich allerdings in der Arraylänge.
Mein Problem dabei ist das die Daten Remanent gespeichert werden sollen. Dadurch ist ein Zugriff über Array-DB`s leider ausgeschlossen, wodurch diese Situation eigentlich perfekt gelößt werden könnte.

Über GetVariant ist das leider nach meinen Tests und aktuellen Wissenstand auch nicht möglich. Da die Umwandlung in Variant leider nicht mit Global-DB`s funktioniert.
Theoretisch wurde es mit einer Ableitung vom UDT funktionieren allerdings brauche ich ja verschiedene Arraylängen...

Aktuell gehen mir die Ideen aus wie ich das in einer 1500 Steuerung umsetzen kann...
Habt ihr eventuell noch eine Möglichkeit die ich mal ausprobieren kann?
Vorzugsweise in SCL geht aber zur Not auch in allen anderen Sprachen hauptsache es funktioniert :)
 
Das wirst Du weiter ausführen müssen. Was ist denn genau das Problem?
Wir reden von optimierten DBs? Sind die UDT unterschiedlich lang oder die Anzahl der Array-Elemente unterschiedlich?
Warum ist remanent ein Problem?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das geht nur über eine Bausteinschnittstelle. z.B. InOut einfach DB[*] of UDT.

Dann die Grenzen des Arrays ermitteln und mit einer Variable am In den Speicherplatz des Array lesen/schreiben.
 
Das wirst Du weiter ausführen müssen. Was ist denn genau das Problem?
Wir reden von optimierten DBs? Sind die UDT unterschiedlich lang oder die Anzahl der Array-Elemente unterschiedlich?
Warum ist remanent ein Problem?

Problem an sich ist das ich gerne auf einen bestimmten DB zugreifen möchte zb. die Nummer 15 von diesem Typ.
An sich kann ich das durch aufaddieren und einer fixen DB-Nummer für jeden DB machen.
Aber mein Problem ist nun der Zugriff auf einen bestimmten Index.

Ja sind optimierte Dbs, UDT sind alle die gleichen es unterscheidet sich lediglich die Anzahl der Array Element.
remanent ist nur bei den Typ Array-DB ein Problem da man bei diesen die Remanenz nicht aktivieren kann...



Das geht nur über eine Bausteinschnittstelle. z.B. InOut einfach DB[*] of UDT.

Dann die Grenzen des Arrays ermitteln und mit einer Variable am In den Speicherplatz des Array lesen/schreiben.

Das würde ich gerne vermeiden da ich sonst über 50 InOut an diesem Baustein hätte :/
 
Ich mag mich jetzt hinsichtlich der Möglichkeiten von TIA täuschen - mir würde aber hierzu nur einfallen :
- nicht optimierte DB's
- Zugriff über einen ANY-Pointer
- einen kompletten UDT auf eine interne Variable desselben Typs kopieren und damit arbeiten
- falls hier auch geschrieben wird dann anschließend wieder zurück-kopieren

Aber hierzu dann doch eine Frage :
Warum unterschiedliche DB's mit Arrays of UDTx darin und alle haben denselben Typ des UDTs ?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Das würde ich gerne vermeiden da ich sonst über 50 InOut an diesem Baustein hätte :/
Somit würde aber jeder halbwegs erkennen was passiert, deine Bausteine könnten optimiert bleiben und die Nummern der DBs wären egal, das wäre dann auch dem Styleguide halbwegs entsprechend.

Was spricht denn dagegen, die Funktion als FB aufzusetzen und zB 5x aufzurufen.

Sind denn die UDTs immer gleich, oder hast du verschiedene UDTs, die aber mehrfach verwendet werden?

Dann würde ich die Funktionen nach UDT splitten.

remanent ist nur bei den Typ Array-DB ein Problem da man bei diesen die Remanenz nicht aktivieren kann...
Vielleicht verstehe ich das ja falsch, aber Remanenz ist bei Arrays auch kein Problem?
Screenshot 2023-10-24 090950.png
 
Ich mag mich jetzt hinsichtlich der Möglichkeiten von TIA täuschen - mir würde aber hierzu nur einfallen :
- nicht optimierte DB's
- Zugriff über einen ANY-Pointer
- einen kompletten UDT auf eine interne Variable desselben Typs kopieren und damit arbeiten
- falls hier auch geschrieben wird dann anschließend wieder zurück-kopieren

Aber hierzu dann doch eine Frage :
Warum unterschiedliche DB's mit Arrays of UDTx darin und alle haben denselben Typ des UDTs ?

Die unterschiedlichen DBs symbolisieren eigenltich einen "2 dimensionaler Array". Wollte damit eigentlich Übersicht reinbekommen.
Wenn ich jetzt bei einem normalen 2 dimensionalen Array Array[50,20] habe dann ist das halt brutall unübersichtlich da ich die 20 Pos nicht für jeden der 50 Geräte brauche... Deshalb wollte ich mir dadurch einen flexiblen "2 dimensionaler Array" bauen.

Das hat auch mit dem Typ Array-DB anstatt eines Global-DB super funktioniert bis es um das Thema remanent ging...

1698133505120.png

Hier kann man dann mit dem Read/WriteFromArrayDB sich die Daten holen oder beschreiben. Allerdings ist bei diesem Typ Stand heute eine Remanenz nicht möglich wieso auch immer...

Theoretisch wäre es natürlich auch möglich sich die Daten dann in einen Global DB zu ziehen der Remanent ist und bei CPU hochlauf die Daten wieder in die einzelnen Array-DB zu verteilen...


Somit würde aber jeder halbwegs erkennen was passiert, deine Bausteine könnten optimiert bleiben und die Nummern der DBs wären egal, das wäre dann auch dem Styleguide halbwegs entsprechend.

Was spricht denn dagegen, die Funktion als FB aufzusetzen und zB 5x aufzurufen.

Sind denn die UDTs immer gleich, oder hast du verschiedene UDTs, die aber mehrfach verwendet werden?

Dann würde ich die Funktionen nach UDT splitten.


Vielleicht verstehe ich das ja falsch, aber Remanenz ist bei Arrays auch kein Problem?
Anhang anzeigen 72381
Ich habe eine Handler der die Daten dann auf die verschiedenen Geräte flexibel verteilen soll je nachdem was gerade aktiv ist. Dadurch brauche ich einen Baustein der alle Daten der unterschiedlichen Geräte beschreiben kann.

Der UDT von den Geräten ist immer gleich allerdings ist der UDT vom Handler "unterschiedlich" da er nur einen Teil der Daten beschreiben soll.
Habe es aber so gemacht das der UDT im Gerät den UDT vom Handler beinhaltet. Somit ist der UDT wo die Daten abgespeichert sind der gleiche...

Siehe oben bei meinem Bild zu dem Thema Remanenz bei Arrays wie ich das gemeint habe :)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die unterschiedlichen DBs symbolisieren eigenltich einen "2 dimensionaler Array". Wollte damit eigentlich Übersicht reinbekommen.
Wenn ich jetzt bei einem normalen 2 dimensionalen Array Array[50,20] habe dann ist das halt brutall unübersichtlich da ich die 20 Pos nicht für jeden der 50 Geräte brauche... Deshalb wollte ich mir dadurch einen flexiblen "2 dimensionaler Array" bauen.
Ich kann jetzt an einen Array [50,20] so gar nichts unübersichtliches finden - eher im Gegenteil - auf das was du da vorhast trifft das viel eher zu ...
Außerdem ergibt das aus meiner Sicht keine Flexibilität ...
 
Die unterschiedlichen DBs symbolisieren eigenltich einen "2 dimensionaler Array". Wollte damit eigentlich Übersicht reinbekommen.
Wenn ich jetzt bei einem normalen 2 dimensionalen Array Array[50,20] habe dann ist das halt brutall unübersichtlich da ich die 20 Pos nicht für jeden der 50 Geräte brauche... Deshalb wollte ich mir dadurch einen flexiblen "2 dimensionaler Array" bauen.

Das hat auch mit dem Typ Array-DB anstatt eines Global-DB super funktioniert bis es um das Thema remanent ging...

Anhang anzeigen 72390

Hier kann man dann mit dem Read/WriteFromArrayDB sich die Daten holen oder beschreiben. Allerdings ist bei diesem Typ Stand heute eine Remanenz nicht möglich wieso auch immer...

Theoretisch wäre es natürlich auch möglich sich die Daten dann in einen Global DB zu ziehen der Remanent ist und bei CPU hochlauf die Daten wieder in die einzelnen Array-DB zu verteilen...



Ich habe eine Handler der die Daten dann auf die verschiedenen Geräte flexibel verteilen soll je nachdem was gerade aktiv ist. Dadurch brauche ich einen Baustein der alle Daten der unterschiedlichen Geräte beschreiben kann.

Der UDT von den Geräten ist immer gleich allerdings ist der UDT vom Handler "unterschiedlich" da er nur einen Teil der Daten beschreiben soll.
Habe es aber so gemacht das der UDT im Gerät den UDT vom Handler beinhaltet. Somit ist der UDT wo die Daten abgespeichert sind der gleiche...

Siehe oben bei meinem Bild zu dem Thema Remanenz bei Arrays wie ich das gemeint habe :)
Kannte ich noch gar nicht! Remanente Daten hatte ich eigentlich immer in einem globalen DB, dort dann eben für jedes Gerät einzeln. Ist zwar fleißige Arbeit, hält aber alles schön übersichtlich.
 
Es wäre hilfreich das du uns mal erklärst was das Ziel des Ganzen sein soll.
Bisher klingt das was du umsetzen willst massiv nach "Bad Practice".
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es wäre hilfreich das du uns mal erklärst was das Ziel des Ganzen sein soll.
Bisher klingt das was du umsetzen willst massiv nach "Bad Practice".
Ziel sollte eigentlich sein das ich für jedes Gerät einen DB habe der die Anzahl Datensätze beinhaltet die für das Gerät gebraucht werden.
Der Handler soll mit der Angabe der Geräte-Nummer und der Datensatz-Nummer die übergeben Daten verteilen.

Theoretisch klar ist das ohne Probleme mit einem Array[x,x] abzubilden.
Aber auch verschiedene Array-DBs funktionieren so, bis auf das Thema remanenz.
Oder ich bräuchte für jedes Gerät einen einzelnen FB/FC was es dann aber wieder nicht variabel macht, aktuell können wir einfach einen DB hinzufügen und es funktioniert.

Das mit den verschiedenen DB haben mir damals schon im Simatic Manager so gemacht. Heißt nicht das des so bleiben muss allerdings habe ich bisher in TIA noch nichts gefunden was es so übersichtlich macht...
Selbst Kunden haben schon gesagt das sie es so übersichtlich finden deshalb möchten wir wenn möglich gerne daran festhalten.
Idee dahinter ist: Ich möchte mir die Datensätze vom Gerät 43 anschauen im TIA drücke ich F7 und geben DBxx43 ein und habe meine Datensätze direkt zum anschauen muss nur noch die entsprechende Nummer wissen.
Wie gesagt das Feedback von den Instandhaltern war bisher immer positiv :)
Theoretisch könnte man es einfach aus dem Simatic Manager übernommen allerdings hätte man dann keine Symbolik...

Bin auch gerne für andere vorschläge offen wenn ihr noch eine Idee habt :)
 
Jetzt wird's klarer.

Vergiss was ihr im Classic gemacht habt, vergiss DB-Nummern und was die Kunden/Instandhalter meinen. Die können sich auch an was völlig neues anpassen.
Oder vergiss optimierte Bausteine und die Möglichkeiten die TIA für die 1500 bietet.

Im TIA gibt es Gruppen/Ordner. Da kann man vieles sehr übersichtlich sortieren. Z.B. alles was ein Gerät betrifft kommt in einen Ordner, der nur dafür ist. Der ist dann mit anderen Geräten im Ordner der Station,... usw.

Die Altlasten aus Classic sehe ich bei mir auch. Ein Global-DB mit Arrays von "Geräten" die Arrays von "Parametern" enthalten.
Im SCL greift man dann z.B. auf Achse[1].Parameter[3].Position zu. Was auch immer 1 und 3 sein mögen...

Dank Any-Pointern und Variant geht es auch ohne Arrays. Für die Instandhalter und Kunden gibt es Bildbausteine die man mit den UDT verbinden kann.
 
Jetzt wird's klarer.

Vergiss was ihr im Classic gemacht habt, vergiss DB-Nummern und was die Kunden/Instandhalter meinen. Die können sich auch an was völlig neues anpassen.
Oder vergiss optimierte Bausteine und die Möglichkeiten die TIA für die 1500 bietet.

Im TIA gibt es Gruppen/Ordner. Da kann man vieles sehr übersichtlich sortieren. Z.B. alles was ein Gerät betrifft kommt in einen Ordner, der nur dafür ist. Der ist dann mit anderen Geräten im Ordner der Station,... usw.

Die Altlasten aus Classic sehe ich bei mir auch. Ein Global-DB mit Arrays von "Geräten" die Arrays von "Parametern" enthalten.
Im SCL greift man dann z.B. auf Achse[1].Parameter[3].Position zu. Was auch immer 1 und 3 sein mögen...

Dank Any-Pointern und Variant geht es auch ohne Arrays. Für die Instandhalter und Kunden gibt es Bildbausteine die man mit den UDT verbinden kann.
Wie würdest du das dann umsetzten ohne einen Array mal als kurzes Beispiel, bin mir gerade nicht sicher wie du das genau meinst
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Jetzt wird's klarer.

Vergiss was ihr im Classic gemacht habt, vergiss DB-Nummern und was die Kunden/Instandhalter meinen. Die können sich auch an was völlig neues anpassen.
Oder vergiss optimierte Bausteine und die Möglichkeiten die TIA für die 1500 bietet.

Im TIA gibt es Gruppen/Ordner. Da kann man vieles sehr übersichtlich sortieren. Z.B. alles was ein Gerät betrifft kommt in einen Ordner, der nur dafür ist. Der ist dann mit anderen Geräten im Ordner der Station,... usw.

Die Altlasten aus Classic sehe ich bei mir auch. Ein Global-DB mit Arrays von "Geräten" die Arrays von "Parametern" enthalten.
Im SCL greift man dann z.B. auf Achse[1].Parameter[3].Position zu. Was auch immer 1 und 3 sein mögen...

Dank Any-Pointern und Variant geht es auch ohne Arrays. Für die Instandhalter und Kunden gibt es Bildbausteine die man mit den UDT verbinden kann.

An sich kann man ja auch Anwenderkonstanten anlegen und so dem Array-Index einen Namen geben um das ganze besser lessen zu können:

Würde dann in deinem Beispiel wie folgt aussehen Achse["X11"].Parameter["HOME"].Position.

So wäre es dann von mir auch vorgesehen gewesen nun hat man zu jedem Index eine klare zuordnung über eine Konstante.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
PLC-Variablen > Alle Variablen anzeigen > Rechts den Tab Anwenderkonstanten öffnen
Danke Dir, aber das ist mir schon bekannt. Ich wollte wissen , wie man die Konstanten als Array-Index verwendet. Da stehe ich gerade auf dem Schlauch... Also statt Achse[3].Parameter[5] --> Achse["X11"].Parameter["HOME"] verwende, da ich Arrayelement 3 mit der Konstanten "X11" belegt habe. oder habe ich das falsch verstanden?
 
Danke Dir, aber das ist mir schon bekannt. Ich wollte wissen , wie man die Konstanten als Array-Index verwendet. Da stehe ich gerade auf dem Schlauch... Also statt Achse[3].Parameter[5] --> Achse["X11"].Parameter["HOME"] verwende, da ich Arrayelement 3 mit der Konstanten "X11" belegt habe. oder habe ich das falsch verstanden?
Du schreibst anstatt der Zahl einfach die Konstante rein.. das funktioniert genauso auch mit temporären, statischen, Baustein-internen Konstanten und Datenbaustein Variablen.

Code:
"DB_Remanent".Portal.Y["DB_Axis".Y.Control.Position].InPosition

"DB_MqttData".JsonTreePublish[#tempCount].value

Code:
Achse[3].Parameter[5]

wird zu

Achse[ANWENDERKONSTANTE_ACHSE].Parameter[ANWENDERKONSTANTE_PARAMETER]
 
Zurück
Oben