TIA Adressen bei optimierten DBs

Den1uX

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

erstmal vielen Dank noch mal für die Hilfe bei meinem letzten Thread bzgl. STEP7!

Ich versuche derzeit mich ein wenig mit den optimierten Bausteinen zu beschäftigen und das System dahinter nachzuvollziehen. Erstmal eine Verständnisfrage:
Wenn ich mit optimierten DBs arbeite, kann ich ja die Adressen nicht einsehen (ist ja auch der Sinn dahinter). Die Variablen müssten ja theoretisch weiterhin an bestimmten Addressstellen liegen, oder? Werden diese Adressstellen jedes Mal neu vergeben sobald ich die SPS starte, oder einmalig, wenn ich das Programm in die SPS lade?

Der Sinn hinter den optimierten Datenbausteinen ist ja der, dass man mit den Variablennamen arbeiten kann, statt mit den absoluten Adressen. Aber wie sieht die Geschichte außerhalb der Programmierung, also innerhalb der SPS aus? Ich verwende eine S7-1212C AC/DC/Rly, weiß nicht ob sich das eventuell zwischen der S7-1200 und anderen S7 Steuerungen noch unterscheidet.

Ich suche derzeit eine Möglichkeit, mir irgendwie die Adresse einer Variable innerhalb eines optimierten DBs auszugeben oder zumindest angezeigt zu bekommen.
Gibt es denn eine Möglichkeit nachvollziehen zu können, an welchem Adressbereich sich eine bestimmte Variable befindet?

Vielleicht hat sich ja schon jemand damit beschäftigt. Auf Google etwas zu finden, ist leider nicht besonders einfach, finde ich. Aber vielleicht habe ich auch einfach die falschen Suchbegriffe verwendet :confused:


Beste grüße,
Den1uX
 
Moin,
Ich versuche derzeit mich ein wenig mit den optimierten Bausteinen zu beschäftigen und das System dahinter nachzuvollziehen. Erstmal eine Verständnisfrage:
Wenn ich mit optimierten DBs arbeite, kann ich ja die Adressen nicht einsehen (ist ja auch der Sinn dahinter). Die Variablen müssten ja theoretisch weiterhin an bestimmten Addressstellen liegen, oder?
klar - die SPS muss diese ja irgendwo finden wenn sie sie brauch

Werden diese Adressstellen jedes Mal neu vergeben sobald ich die SPS starte, oder einmalig, wenn ich das Programm in die SPS lade?
Das wird dir wohl nur Siemens sicher sagen können. Sie werden aber mit Sicherheit einmalig an einem Ort im Speicher abgelegt und das beim Laden in die CPU.

Der Sinn hinter den optimierten Datenbausteinen ist ja der, dass man mit den Variablennamen arbeiten kann, statt mit den absoluten Adressen. Aber wie sieht die Geschichte außerhalb der Programmierung, also innerhalb der SPS aus? Ich verwende eine S7-1212C AC/DC/Rly, weiß nicht ob sich das eventuell zwischen der S7-1200 und anderen S7 Steuerungen noch unterscheidet.

Ich suche derzeit eine Möglichkeit, mir irgendwie die Adresse einer Variable innerhalb eines optimierten DBs auszugeben oder zumindest angezeigt zu bekommen.
Gibt es denn eine Möglichkeit nachvollziehen zu können, an welchem Adressbereich sich eine bestimmte Variable befindet?
Symbolische Programmierung ging früher auch tadellos, das ist nichts neues.
Optimierte Bausteine auf der 1200er heißt - Speicheroptimiert. Das heißt deine Datentypen in einem DB werden (in der Regel) speicheroptimal abgelegt.
Optimierte Bausteine auf der 1500er heißt - Performanceoptimiert.
Der Thomas_v2.1 hat da mal was spannendes zu geschrieben:
https://www.sps-forum.de/simatic/68502-der-s7-1200-unter-den-rock-geschaut.html?highlight=optimierte
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn Du vollsymbolisch arbeitest, ist es völlig unrelevant, in welchen Speicherzellen sich die Daten befinden.
;)

Der Sinn eines optimierten Bausteins ist aber nicht das vollsymbolische Arbeiten, das sollte auch bei einem nicht optimierten Baustein möglich sein.
Vielmehr geht es darum, dass die Daten in der CPU möglichst so abgelegt werden, dass entweder der Speicherbereich optimal genutzt wird (S7-1200) oder auf die Daten möglichst zeitoptimal zugegriffen werden kann (S7-1500).
(In wie weit das wirklich gelingt, sollen aber besser andere beurteilen. :ROFLMAO:)
 
Hallo,

eure Beiträge haben mir zum Verständnis auf jeden Fall geholfen, danke dafür.
Bin nur leider blutiger Anfänger, arbeite mich daher noch langsam rein. Habe zwar diese Woche eine Fortbildung besucht für TIA Portal mit S7-300, aber dementsprechend wurde das Thema Optimierte Bausteine nicht behandelt. Außerdem, war es nur das erste von 6 Modulen :rolleyes:

Ich überlege derzeit, irgendwie an die Adressen der erstellten Variablen zu kommen. Gibt es eventuell eine einfache Anweisung, in der ich den DB angebe und als Rückgabewert die Adresse erhalte? Ich schätze mal nicht, aber vielleicht weiß ja doch jemand was.

Ansonsten wäre noch eine Idee gewesen, mit einer Schleife alle Adressen auszulesen und zu versuchen, irgendwie darunter die richtige Adresse zu finden. Muss mir nur noch Details überlegen. Sicher nicht das Beste für die Performance, aber ganz abhaken möchte ich diese Idee noch nicht. Muss nur überlegen wie ich herausfinde, welche von den nicht leeren Adressen nun die richtige ist/sind.

Oder gehe ich ideentechnisch einen komplett falschen weg? Komme leider aus der .NET-Ecke und da wäre diese Vorgehensweise gar nicht soo abwegig :p

Der Artikel von Thomas_v2.1 ist auch gar nicht schlecht, hat mir auf jeden Fall um ein Stück mehr benötigte Informationen gebracht.
 
Hallo Den1uX.

Symbolisch kann man auch mit nicht optimierten DB's arbeiten.

Wenn du aus der .net Ecke kommst, kennst du ja den Symbolischen Optimierten Zugriff. z.B. du erzeugst eine Objekt xyz der Klasse Adresse (Name, Straße etc.) du weißt wie du auf einen Wert in einem Objekt zugreifen kannst z.b. auf die Straße. So in etwa kann man sich das Symbolische Adressieren vorstellen.

Der Absolute Zugriff, du schreibst auf Byte 2583 im Ram den Wert 1. Das ist der Absolute Zugriff.
Alternativ, du speicherst die Informationen in C:/Adressen.txt

Wenn du von extern ohne entsprechende API auf ein Element zugreifen willst musst du diese Informationen Absolut ablegen.
Wenn du mit einer API arbeitest kannst du direkt auf die Symbolik zurückgreifen. Sprich xyz.Name (z.B. mit einem Siemens HMI)

Ich hoffe ich habe es verständlich rüber gebracht den in .net bin ich noch Anfänger.

Was hast du den genau vor?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Naja, es ist halt immer die Frage was du im speziellen vor hast. Wenn man den optimierten Zirkus nutzen will, dann sollte man seinen gesamten Softwareaufbau dahingehend ausrichten. Das heißt konsequentes Verwenden von UDTs, Arrays, Multiinstanzen und Parameterübergaben.
Ich habe bspw. alles was vorher in 10 DBs für bspw. 10 Motore stand, jetzt in einem DB mit einem Array[1..10] of UDT_Motor zusammengefasst. Dann interessieren Nummern und Adressen einfach nicht mehr. Gerade wenn man was neues entwickelt geht das schon ganz gut. Das ist halt nur hart, wenn man alte, getestete und gut funktionierende Software komplett umschreiben muss.
 
Ich suche derzeit eine Möglichkeit, mir irgendwie die Adresse einer Variable innerhalb eines optimierten DBs auszugeben oder zumindest angezeigt zu bekommen.
Das ist absichtlich nicht möglich (und auch nicht nötig). Was willst Du mit dem Wissen über die Adresse anfangen?
Der Compiler weiß selbstverständlich auf welche Adresse er eine Variable gelegt hat, doch wenn er die Adresse bekannt geben würde, dann würden Programmierer anfangen, von der Adresse einer Variable auf die Adresse anderer Variablen schließen zu wollen um irgendwelche vermeintlichen "Abkürzungen" aus dem Symbolik-Zwang zu nutzen. Zwischen den Adressen verschiedener Variablen besteht aber kein Zusammenhang, wenn der Compiler die Variablen (nach irgendeinem Prinzip optimiert) verstreut im Speicher ablegt.

Die Adresse einer Variable kann nur symbolisch mit deren Name referenziert werden.

Harald
 
Hallo Hadante,

ich verstehe was du meinst, allerdings hilft mir das in dem Fall nur bedingt. Nichts für ungut, trotzdem Danke :)
Mein Hauptziel ist es wirklich, irgendwie an die Adressen von optimierten Bausteinen zu kommen, wenn möglich ohne große Umwege. Es sollen aber auf jeden Fall optimierte Bausteine sein.

Beispiel:
Ich erstelle einen optimierten DB 99 mit der Variable "Test" und einen nicht optimierten DB 100 mit der Variable "DB99_Adresse". Ich möchte in einem FC in eine Anweisung z.B. DB99."Test" angeben können und daraufhin die Adresse der Variable "Test" in die Variable "DB99_Adresse" schreiben.

Alternativ, das gleiche per Schleife zu versuchen.

Ich hoffe, das erklärt mein Vorhaben eher.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@TE:
Wenn du im DB100 und im DB99 die Variable "Test" hast dann kannst du unabhängig von ihrer realen Adresse im Speicher die symbolisch einander zuweisen.
Aber ich glaube, dass du das gar nicht meinst ... ohne allerdings verstanden zu haben, was du nun meinst. Viellicht führst du es doch mal (ggf. als Pseudo-Code) in einem Beispiel aus ...
Falls du insgesamt an so etwas wie Reflektion unter .Net denkst - das gibt es in der von dir gedachten Form in der SPS-Welt nicht - also etwas wie : mein Object ist der DB99 und ich möchte alle seine beinhalteten Variablen (mal unabhängig des Typs) auf gleich-benannte Variablen des DB100 schreiben, wobei der DB1200 aber eine (teilweise) andere Struktur wie der DB99 hat ...

Gruß
Larry
 
Hallo,

muss auch leider gestehen dass ich nicht ganz sicher bin, ob ich die richtigen Begriffe verwende. Mit Adresse meine ich das Offset der Variablen in einem Datenbaustein.

Nochmal zur Verdeutlichung:
- Ich habe einen optimierten Datenbaustein DB1 mit der Variable "Test"
- Ich habe einen nicht optimierten Datenbaustein DB2 mit der Variable "Offset_von_DB1_Variable_Test" bei Offset 0.0
- Ich möchte herausfinden, welches Offset die Variable "Test" im DB1 hat, und diesen Wert in DB2 in die Variable "Offset_von_DB1_Variable_Test" schreiben

Zum Schluss möchte ich auf den DB1 in der Variable "Offset_von_DB1_Variable_Test" z.B. den Wert "12.0" stehen haben. Ich möchte also nicht das Offset der Variable in DB1 verändern, sondern lediglich das Offset der Variable in DB2 z.B. als String im DB1 stehen haben, als Wert. Diesen möchte ich später extern verwerten.

Es ist leider etwas kompliziert das zu erklären, aber ich hoffe, dass das halbwegs verständlich war.
Dennoch danke für die bisherige Hilfe und Anteilnahme an diesem Thread.
 
Hallo,

die Adresse bzw. den Offset von einem optimierten DB kann man nicht auslesen. Keiner außer Siemens weiß wo die Daten im Controller abgelegt werden. Dies braucht man auch nicht. Wenn du die Adresse der Variable brauchst dann musst du mit einem nicht optimierten DB arbeiten.

Stefan
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Nochmal zur Verdeutlichung:
- Ich habe einen optimierten Datenbaustein DB1 mit der Variable "Test"
- Ich habe einen nicht optimierten Datenbaustein DB2 mit der Variable "Offset_von_DB1_Variable_Test" bei Offset 0.0
- Ich möchte herausfinden, welches Offset die Variable "Test" im DB1 hat, und diesen Wert in DB2 in die Variable "Offset_von_DB1_Variable_Test" schreiben

Zum Schluss möchte ich auf den DB1 in der Variable "Offset_von_DB1_Variable_Test" z.B. den Wert "12.0" stehen haben. Ich möchte also nicht das Offset der Variable in DB1 verändern, sondern lediglich das Offset der Variable in DB2 z.B. als String im DB1 stehen haben, als Wert. Diesen möchte ich später extern verwerten.
:confused:
Hast Du mal versucht, diese Erklärung selber nachzuvollziehen?
Der zweite Teil Deiner Erklärung passt nicht zum ersten Teil. z.B. im DB1 gibt es gar keine Variable "Offset_von_DB1_Variable_Test"...

Kannst Du mal losgelöst von dem ganzen Offset-Geraffel mit einfacher Umgangssprache ohne Programmierer-Begriffe möglichst bildlich erklären was Du tun willst?
(Also z.B. nicht "Ich will wissen wo genau in einem kopiergeschützten Glasbehälter mit besonderem Design der Eichstrich ist, weil ich diesen Wert extern verwerten will" sondern: "Ich will ein Bierglas füllen und austrinken")

Harald
 
@TE: Noch einmal :
Du kannst auf jeden Fall im Code schreiben :
Code:
DB_Nicht_optimiert.Test := DB_optimiert.Test
... oder umgekehrt.
Aber Variable für Variable.
Eine Schleife würde nur bei einem Array funktionieren oder bei einer AT-Sicht (die allerdings das optimierte wieder aushebelt).
Leider hast du uns ja noch nicht verdeutlicht, was der Sinn des Ganzen ist. Damit ist es immer sehr schwer, irgend etwas zu raten.
Möglicherweise verfolgst du ja auch einen komplett falschen Ansatz ... Aber Nebenfrage : warum ist überhaupt der eine DB "optimiert" und der andere nicht ...?

Gruß
Larry
 
Hätte auch noch eine Frage bezüglich den optimierten DB's. Ist es bei TIA V16 mit RT Advanced irgendwie möglich, in einem optimierten DB den Wert einer Variable auszulesen? Das Ziel schlussendlich wäre es, dass ich in einem E/A- Feld einen Variablenname eingeben kann und danach den Wert dieser Variable in ein weiteres E/A- Feld geschrieben wird.

Bin für jeden Denkanstoß dankbar.
Gruß Christoph
 
Zurück
Oben