TIA Daten aus DB auslesen und ablegen in SCL

Magni

Level-2
Beiträge
313
Reaktionspunkte
17
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,
ein SCL Neuling bräuchte ein bisschen Hilfe. Ich möchte aus einer Folge von Datenbausteinen zB. DB25-DB125 den Wert "Analog" auslesen und ihn dann in einem Datenbaustein ab DBD25 in Reihe ablegen. Vor ein paar Jahren habe ich mal davon gehört, dass sowas geht. Kann mir jemand einen Tipp geben, wie das umzusetzen geht?

Dankeschön
 
Guten Morgen,

grundsätzlich gibt es bei Siemens keine Bausteinnummerindizierung, das heißt wenn man 100 DBs hat aus denen was kopiert werden soll, dann muss man diese Vorgänge auch alle einzelnd/händisch programmieren. Dafür braucht man dann kein SCL, das geht genauso in FUP/KOP/AWL.

Gruß Christian
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin,
erstmal müsste man wissen um welche CPU es sich handelt (300er oder 1200/1500)?
Dann wäre noch relevant, ob die DBs optimiert sind oder nicht.
Man könnte das ganze über peek und poke schon indiziert machen, aber vielleicht wäre es sinnvoll, mal über die Programmstruktur nachzudenken. Also vielleicht die DBs 25-125 in einen DB als Array zu packen. Dann ginge das ganze auch optimiert und symbolisch.
 
Die DB haben keinen optimierten Bausteinzugriff. Es handelt sich um eine 1500-er und um InstanzDB's. Aus denen soll ein Status in eine "Datenpunktsammlung" gelesen werden. Änderungen an den FB's kann ich leider nicht ausführen, da die geschützt sind.
Muss ich also jeden DB einzeln auslesen und ablegen?
 
Ich kann nur das mit manuelle Zuweisung also einzeln koppiren wie "@Stocky" geschrieben hat .


Theoretische kann man das durch programmieren, vielleicht mit C oder C# da nach meiner Meinung die Möglichkeiten von SCL

begrenzt sind. Vielleicht könnte man 2 Arrays einsetzen und die DB's rein packen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die FB sind KnowHow-geschützt, Du willst aber trotzdem aus den (nicht dokumentierten?) internen Instanzdaten Datenpunkte auslesen? Ist sichergestellt, daß die FB nie eine Versionsänderung bekommen? Oder sind die Datenpunkte auf die offiziellen/dokumentierten Bausteinschnittstellen herausgeführt?

Harald
 
Sie sind als out rausgeführt. Natürlich könnte ich auch den out entsprechend "moven". Aber ich dachte mir, dass es vielleicht auch bequemer geht.
 
Wenn du an die OUTs jeweils ein Arrayelement in der richtigen Reihefolge dran klatschts, dann kannst du alle OUTs auf einmal rüberkopieren. Auf IDBs sollte man nach Möglichkeit gar nicht von außen zugreifen, das ist sehr unfeine Programmierung...
 
Dann bleibt eigentlich nur noch die Frage offen, ob der Wert "Analog" in den DBs25-125 immer an der selben Adresse steht?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin... tadelt mich nicht. Ich muss nehmen was ich darf. Gefällt mir auch nicht. Aber Cheffe hat angeordnet das so zu machen... also mit diesen Bausteinen zu arbeiten.
 
In der Zeit, wo du hier Versuchst so etwas irgendwie nicht schön zu programmieren, hättest du auch einfach schnell deinen DB erstellen können, ab deinem DBD25 ein Array[1..100] of WORD/Real/etc. erstellen können.

An den jeweiligen Bausteinen dann am OUT einfach "deinDB.MyArray[x]" anlegen können. x = von 1 - 100 eben an den Bausteinaufrufen 1-100 vergeben. Das geht ja recht zügig. Da du dann deine Analogwerte in deinem DB als Array abliegen hast, kannst du dann ganz bequem für weitere Auswertungen z.B. mit schleifen etc. arbeiten.


-chris
 
Nicht nur bei dir. Zugriff auf Instanzdaten von außen ist BähBäh.

Hau die Variablen über den Ausgang in einen DB (Array of....) und arbeite dann mit denen.

Das finde ich noch gar nicht mal sooooo schlimm. Eher auf einer 1500 einen nicht optimierten IDB zu nehmen. Das ist für mich absoluter quatsch. War bei der 400er schon immer sehr gefährlich.

Wenn es Sinn macht, kann man durchaus von extern auf Instanzdaten zugreifen. Es muss halt zur Programmierphilosophie des Programms passen und lesbar bleiben.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
.... auf einer 1500 einen nicht optimierten IDB zu nehmen. Das ist für mich absoluter quatsch....
Ernsthafte Frage, soll jetzt keine Provokation sein.
Was ist so verwerflich daran einen Nichtoptimierten DB zu nehmen?
Geringerer Speicherbedarf? - - Für meine Programme haben die Speicherkarten bis jetzt immer gereicht.
Schnellerer Zugriff? - - Mit Zykluszeiten von 5ms (bei einem mittelgroßen Programm) kann ich ganz gut leben...
Oder liegt es vielleicht daran, dass man sich unbedingt von althergebrachtem abgrenzen will?
Genauso wie man hier fast einen Shitstorm lostreten kann wenn man sagt dass man auch schon mal eine S5-Time nimmt...



Wenn es Sinn macht, kann man durchaus von extern auf Instanzdaten zugreifen. Es muss halt zur Programmierphilosophie des Programms passen und lesbar bleiben.
Wenn ich den Wert an einem OUT abgreifen kann würde ich ihn niemals aus dem IDB holen, egal wie Programmierphilosophie ist.
Und schon gar nicht mit indirekter Adressierung (was ja das eigentliche Ansinnen des TE war)
 
Ernsthafte Frage, soll jetzt keine Provokation sein.
Was ist so verwerflich daran einen Nichtoptimierten DB zu nehmen?
Geringerer Speicherbedarf? - - Für meine Programme haben die Speicherkarten bis jetzt immer gereicht.
Schnellerer Zugriff? - - Mit Zykluszeiten von 5ms (bei einem mittelgroßen Programm) kann ich ganz gut leben...
Oder liegt es vielleicht daran, dass man sich unbedingt von althergebrachtem abgrenzen will?
Genauso wie man hier fast einen Shitstorm lostreten kann wenn man sagt dass man auch schon mal eine S5-Time nimmt...




Wenn ich den Wert an einem OUT abgreifen kann würde ich ihn niemals aus dem IDB holen, egal wie Programmierphilosophie ist.
Und schon gar nicht mit indirekter Adressierung (was ja das eigentliche Ansinnen des TE war)


Nein, um Himmels Willen, ich wollte dich nicht provozieren oder angreifen.
Sorry, dann habe ich mich falsch ausgedrückt.

Ich habe es so verstanden, dass die IDB ja auch nicht von dir stammen. Also war es mehr ein Vorwurf an jemand anderen.

Ich hantiere mit Steuerungen, die teilweise 24/7 laufen und sogar ein SPS-Neustart nur mit Handschaltung von Ventilen möglich ist.
Auf den SPSen liegen haufenweise IDBs die nach Änderung im FB nicht neu übersetzt wurden und Zugriff auf Instanzdaten z.T. mit L DIW32 usw passiert, anstatt mal symbolisch abzufragen.

Es sind sogar FBs vorhanden, die ein neuladen eines DB komplett ohne Verlust der Aktualdaten erlauben. Den braucht man immer dann, wenn beim Beobachten von DBs diese hochgefährliche Nachfrage kommt, ob man den DB laden und dann beobachten möchte.

Das ist ein Graus und man bekommt das Kotzen.

Daher kann ich es nicht verstehen warum noch immer der nicht-optimierte Zugriff gelebt wird. Es ist so viel einfacher, wenn man sich über die Adresse der Daten keine Gedanken mehr machen muss. Man kann seine Programmerweiterungen im DB sogar einsortieren, statt sie hinten anzuhängen ;-)

Die S5-Timer finde ich nach wie vor OK. Gibt auch Programme, bei denen sämtliche Timer in einem FB liegen. Persönlich finde ich das auch weniger Chaotisch und teilweise übersichtlicher.

Für mich wäre es das Nonplusultra, wenn man selbst die PLC-Variablen (M, MW etc) auch auf optimiert stellen könnte :-D


Aber soll echt kein Angriff sein. Ich (ICH!!) sehe nur keinen Sinn darin, nicht-optimiert zu nehmen. Vielleicht werde ich ja eines Besseren belehrt. :wink:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nein, um Himmels Willen, ich wollte dich nicht provozieren oder angreifen.
Eigentlich wollte ICH sagen, dass ICH mit meiner Frage nicht provozieren will ;)
Weil es eben manchmal schnell losgeht ... von gestern ... nix kapiert von der schönen Programmierwelt ... usw



Ich habe es so verstanden, dass die IDB ja auch nicht von dir stammen. Also war es mehr ein Vorwurf an jemand anderen.
Von mir sowieso nicht, ich bin nicht der TE


.
Auf den SPSen liegen haufenweise IDBs die nach Änderung im FB nicht neu übersetzt wurden und Zugriff auf Instanzdaten z.T. mit L DIW32 usw passiert, anstatt mal symbolisch abzufragen.
Na TIA fragt Dich doch gar nicht ob DU gerne übersetzen willst sondern lässt Dir gar keine Wahl
Aber Du hast vollkommen recht. Wenn bei Classic der IDB nicht passt, dann kann das sehr "spaßige" Phänomene geben.



... Ich hantiere mit Steuerungen, die teilweise 24/7 laufen
Es sind sogar FBs vorhanden, die ein neuladen eines DB komplett ohne Verlust der Aktualdaten erlauben. Den braucht man immer dann, wenn beim Beobachten von DBs diese hochgefährliche Nachfrage kommt, ob man den DB laden und dann beobachten möchte.
Da kannst Du dich mal mit Kollegen DUCATI kurzschließen, der kann davon auch ein Lied singen
 
Daher kann ich es nicht verstehen warum noch immer der nicht-optimierte Zugriff gelebt wird. Es ist so viel einfacher, wenn man sich über die Adresse der Daten keine Gedanken mehr machen muss.
Weil nur bei nicht-optimiert hat man überhaupt eine reale Chance, DB und IDB stoßfrei ohne Aktualdatenverlust in die SPS zu laden, wenn das TIA beschließt, daß reinitialisiert werden muß.

Ob man einen DB oder IDB stoßfrei ohne Aktualdatenverlust in RUN in die CPU geladen bekommt hängt imho vom Wissen und Können des Programmierers ab. Wenn man meint, daß man sich dem Mitdenken entziehen kann, indem man die Bausteine einfach auf "optimiert" stellt, dann hat man sich geschnitten und steht im Fall der Fälle noch viel hilfloser dem TIA gegenüber als bei nicht-optimierten-DB. Da bekommt man das Laden ohne Aktualdatenverlust nur mit riesigem Aufwand hin (2x kopieren jeder einzelnen betroffenen Variable!).

Man kann auch ohne "optimiert" symbolisch programmieren. Das eine hat mit dem anderen nicht viel zu tun.

Harald
 
Auch werden DBs bei Optimiert Größer als nicht Optimierte (1500er PLC), wenn Sie hintereinander viele Bools enthalten, da jedes Bool dann ein byte benötigt! Das kann dann im Remanenzbeteich schon mal eng werden.
 
Zurück
Oben