TIA die 1500 und das IO Mapping vorteile und nachteile der untersch. Herangehensweise

vollmi

Level-3
Beiträge
5.423
Reaktionspunkte
1.403
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi zusammen

Ich bin grade wiedermal dran eine neue CPU für Dubai zu normieren.

Neu habe ich die abgesetzten Schaltränke komplett auf RemoteIOs umgerüstet. Da es die Fehlerquote beim Verkabeln enorm einschränkt wenn man keine 20 paralellen Drähte von Schrank zu schrank anschliessen lassen muss.

Also bekommt jeder Schrank ein ET200sp IO mit exakt der gleichen belegung. Also 32DI, 16DO, 2AO und eine 480VAC Energiemesskarte (zum ersten mal).

Jetzt wollte ich das erst wie gehab mit Strukturen in der Symbolik aufbauen.
screenshot.1.jpg

und dann so zuweisen
screenshot.2.jpg


Aber die 1500er bietet ja jetzt z.B. einen Symbolischen Zugriff auf die Module an mit dem man gleich die Länge und Adresse rauskriegt und ummappen kann.
Code:
#statErrInfo := RD_ADDR(LADDR := "Local~DI_8x24VDC_BA_1_1",
                        PIADDR => #statAddrInIO,
                        PICount => #statLenIn,
                        PQADDR => #statAddrOutIO,
                        PQCount => #statLenOut);


//read inputs from Energy Meter 480VAC
#GETIO_PART_Instance(ID:="Local~DI_8x24VDC_BA_1_1",
                     OFFSET:=0,
                     LEN:=UDINT_TO_INT(#statLenIn),
                     STATUS=>#statStatusGetIOPart,
                     ERROR=>#statErrGetIOPart,
                     INPUTS:=#ldb_SL1);


"IO_DB".LDB1.CabinTempAlert := NOT #ldb_SL1.CabinTempAlert;
"IO_DB".LDB1.CB230VAC := NOT #ldb_SL1.CB230VAC;

Man könnte also z.B. "Local~DI_8x24VDC_BA_1_1" auch über die Objektbausteinschnittstelle übergeben und das Mapping intern machen. Würde auch Schnittstellenverlängerungen automatisch mitkriegen etc. Aber dasselbe ginge ja auch einfach mit nem UDT auf der Hardwaresymbolik und UDT Schnittstelle am Baustein.

Also wozu genau dient das GETIO genau? was sind die Vorteile?

mfG René
 
Ich denke in erster Linie ist der GETIO dafür da Daten Konsistent auszulesen. Immerhin ruft dieser den SFC14 DPRD_DAT auf.
Vermutlich besteht der Unterschied nur darin das der GETIO sein Zielbereich als VARIANT adressieren kann.

Du würdest also für alle von dir verfügbaren Baugruppen UDTs anlegen und dann deine Peripherie über Objekte einlesen und auf DBs schreiben ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du würdest also für alle von dir verfügbaren Baugruppen UDTs anlegen und dann deine Peripherie über Objekte einlesen und auf DBs schreiben ?

Jop vor allem die Objekte die sich auch auf den IOs abbilden. Also immerwieder die gleiche Reihenfolge haben.
LDB ist z.B. so ein Objekt. Eine DI Karte,dann DO, AO, und Energiemesskarte. Immer gleich belegt. Da bietet sich eine Struktur eben an. Dann könnte man dann am Objektbaustein direkt die Struktur anhängen und der macht dann Alarming, Verarbeitung und die Objektbedienung gleich dadraus. Hat den Vorteil das man bei einem zusätzlichen Schaltschrank für 40 zusätzliche Datenpunkte nur in echt 5 Strukturen an einem FB anhängt und von LDB5 nach LDB6 ändert.
Verringert die Fehlerquote ungemein. Ohne n haufen schwer nachvollziehbare Pointer im Baustein selber.

mfg René
 
Wenn man wirklich so fest definierte Objekte hat ist das sicher eine sehr interessante Lösung.
Wenn man die Siemens HMI nutzt könnte man sich die Alarme dann sogar automatisch generieren lassen mit dem Program_Alarm da Baugruppenname und Elemente ausgelesen werden können.

Auf jeden Fall eine interessante Möglichkeit.

Ganz genau betrachtet hat man so vermutlich einen doppelten Peripheriezugriff. Einmal durch das zyklische Prozessabbild und dann durch den GETIO.
Bei der Performance der heutigen Steuerungen wohl kein Problem, falls doch kann man die Anschaltung ja aus dem Prozessabbild raus nehmen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der Kollege liest seine IOs ein und mapped diese auf DBs.

Hierzu hat er zwei Methoden ins Auge gefasst.

1. UDT für die Peripheriebereiche anlegen (geht bei der 1500er) und anschließend Händisch den Peripheriebereich in den DB kopieren.

2. Der Kollege schreibt sich eine Funktion die nur den symbolischen Namen der Peripherie kennen muss. Über diesen Namen liest (RD_ADDR) er die Adresse der der Baugruppe aus. Mit der Adresse als Parameter für GETIO liest er dann die Peripherie der Baugruppe aus und kopiert diese in seinen DB. In seinem Beispiel hier macht er das zwar für jedes Element seiner Struktur einzeln (vermutlich wegen der Negierung) aber er könnte auch Struktur auf Struktur kopieren. Wenn man ganze Strukturen kopiert könnte man den Baustein sogar so gestalten das dieser die Struktur per VARIANT bekommt und somit ein Baustein für das Mapping aller Baugruppen zu verwenden ist.
 
2. Der Kollege schreibt sich eine Funktion die nur den symbolischen Namen der Peripherie kennen muss. Über diesen Namen liest (RD_ADDR) er die Adresse der der Baugruppe aus. Mit der Adresse als Parameter für GETIO liest er dann die Peripherie der Baugruppe aus und kopiert diese in seinen DB. In seinem Beispiel hier macht er das zwar für jedes Element seiner Struktur einzeln (vermutlich wegen der Negierung) aber er könnte auch Struktur auf Struktur kopieren. Wenn man ganze Strukturen kopiert könnte man den Baustein sogar so gestalten das dieser die Struktur per VARIANT bekommt und somit ein Baustein für das Mapping aller Baugruppen zu verwenden ist.

Ich hab mir bei dieser Vorgehensweise halt gedacht, dass es irgendwie möglich sein sollte einem Baustein nur den Baugruppennamen zu übergeben
"LDB-01~DI16_1" und dann auf die Module dieser Baugruppe indiziert zugreifen kann. Also dieses Symbol zum übersetzungszeitpunkt irgendwie zusammensetzen kann (oder wärend der Laufzeit)
Also kann ich LDB-01~ am aufrufenden Baustein übergeben und dann an RD_ADDR das Symbol zusammensetzen LDB-01~DI16_1.
Dann könnte ich die ganze Behandlung mit nur einem einzigen Datenpunkt statt mit einem Datenpunkt für jedes Modul behandeln.

mfG René
 
achso ...

ist das verwenden des UDT in den Peripheriebereich nicht schon eine Art Mapping und
kann er dann diese gemappte Periperie nicht direkt Symblisch an seinen Baustein legen?

Meiner Aufassung nach währe doch diese doppelte mappen eine Recourcen Verschwendung
und macht die sache noch ein wenig unüberschaubarer.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Meiner Aufassung nach währe doch diese doppelte mappen eine Recourcen Verschwendung
und macht die sache noch ein wenig unüberschaubarer.

Eben, doppelt wollte ich es auf keinen Fall machen. In der Symbolik kann ich ja aber nur Typweise mappen. Also zusammenhängende Adressbereiche.
Wenn ich ein DI modul, dann DO, dann AI habe. Dann kann ich zwar ein UDT über DI und AI legen (wenn die adressen direkt aufeinander folgen) aber in diesem UDT kann sich dann nicht DO befinden.

Kann ich das aber mit RD_ADDR in einem Baustein abhandeln, kann mir die peripherieadresse ja egal sein. Ich frag einfach die einzelnen Slots ab und leg die entsprechend auf die DB/IDB Variable
Also will ich meinen DB
screenshot.52.jpg

direkt abfüllen indem ich eine der Hauptvariablen des Kopfes an einem Baustein anlege.
screenshot.51.jpg

und daraus dann die Submoduladresse ableite.
screenshot.50.jpg


Und damit könnte ich dann ja die Peripherieadressen auslesen.

mfG René
 
Nein, das verwenden von UDTs für Variablen nutzt trotzdem die E/A aus dem Prozessabbild. Es ändert sich nur die Sicht.
 
Ich mappe das dann direkt und habe eben für IN und OUT einen getrennten Datentyp. Umkopieren auf DB ist wirklich Verschwendung, finde ich.
Vorteil ist, das kann wirklich jeder lesen und finden, denn es passiert einfach in der Symbolliste. Schnittstellen für FC/FB zur Übergabe sind dann halt 2, ich lege das i.d.R. auf INOUT.
Was du vorhast würde 98% der Programmierer, die nicht mit deiner Software vertraut sind zum verzeifeln bringen, denke ich mal. Und uns Allen kann mal was passieren, oder ein längerer Ausfall drohen, also möglichst allgemeinverständlich programmieren ist schon keine schlechte Idee.

PS. Sagt mal, warum kann man eigentlich kein Strukturmember aus so einer per Datentyp angelegten Variable in der Symboltabelle einfach ins Programm ziehen, wie das mit "normal" angelegten E/A geht.
Hier muß man das leider immer per Hand eingeben, wenn man im Programm mit diesen Strukturmembern arbeitet. Sehr unschön, weils wieder den Arbeitsfluß unterbricht oder behindert.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich mappe das dann direkt und habe eben für IN und OUT einen getrennten Datentyp. Umkopieren auf DB ist wirklich Verschwendung, finde ich.

Nunja ich möchte es eigentlich schon gerne auf einen DB Mappen. Eben wegen der Invertierung sowohl an IN als auch OUT. Ich habe diverse Ausgänge die wenn gesetzt das Licht ausschalten. Und alarme wenn true = Gut. Ich mag es wenn ich mit Datenpunkten arbeiten kann die immer gleich daher kommen. AN = TRUE Fehler/Störung = True.

Was du vorhast würde 98% der Programmierer, die nicht mit deiner Software vertraut sind zum verzeifeln bringen, denke ich mal. Und uns Allen kann mal was passieren, oder ein längerer Ausfall drohen, also möglichst allgemeinverständlich programmieren ist schon keine schlechte Idee.

Das stimmt schon. Meine Intention wäre dann auch gewesen, FB aus der Bibliothek. Und es muss nur noch der Knoten angegeben und die Struktur für die SCADA Leute. Der rest macht der Baustein. Also nicht nötig das da jemand was programmieren oder korrigieren muss.

PS. Sagt mal, warum kann man eigentlich kein Strukturmember aus so einer per Datentyp angelegten Variable in der Symboltabelle einfach ins Programm ziehen, wie das mit "normal" angelegten E/A geht.
Hier muß man das leider immer per Hand eingeben, wenn man im Programm mit diesen Strukturmembern arbeitet. Sehr unschön, weils wieder den Arbeitsfluß unterbricht oder behindert.

Echt jetzt? Maus? Du ziehst Member mit der Maus ins Programm? Das hätte ich jetzt nicht von dir gedacht ;)

mfG René
 
@vollmi

Doch echt, mach ich inzwischen manchmal, weil mir die Symbolik oft zu lang ist. :cool: Außerdem gehe ich voll mit der Zeit. KlickiBunti eben, also TIA.
Außerdem gibts ja eh keinen kontinuierlichen Arbeitsfluß, dauernd muß ich mit der Maus irgendwo an Fenstern rumzuppeln. :ROFLMAO:
 
Zurück
Oben