TIA S7-1200 Länge eines DB ermitteln

Hi Robert

die steht in den Eigenschaften des DB

aber vermutlich willst du das im Programm heraus finden. Das gibt es nicht. Wozu auch?

Ich hatte das bei der Übernahme von Programmen aus Step7 V5 auch schon manches Problem. Bis ich letztlich dahinter gekommen bin, dass es viel einfacher geht und das ganze Gehampel mit ANY und Adressregistern unnötig ist. Leider gibt es kein Patentrezept für alle Fälle. Und ein paar Lücken gibt es auch noch. Vielleicht löst die V13 die offenen Punkte. Die Hoffnung stirbt zu letzt.


In AWL schreibt man wie bei der 300/400 L DBLG -- oder so ähnlich -- das gibt es aber nicht auf der 1200. Die 1500 kann das, liefert aber "falsche" Werte. Also richtig falsch sind sie nicht, aber brauchbar sind sie auch nicht. Der Wert der da kommt ist unterschiedlich zu dem aus den Bausteineigenschaften.

Auf 1200 und 1500 gibt es Optimierte und Standard Bausteine. Das gilt sowohl für die DB als auch für FC/FB und OB. Faustregel: optimiert ist schneller, meist auch kleiner, aber nicht immer. Richtig blöd ist es wenn man mischt. Man sollte alles optimiert machen. Aber dummerweise klappen dann die Tricks aus der Vergangenheit (AT ANY Adressregister) nicht mehr. D.h. manchmal muss man eben doch Standard. Und dann vermischt es sich :-( So richtig schlimm wird es wenn man in Static eines FB eine Instanz eines anderen FB hat. Der eine Optimiert, der andere Standard.
Darüber hinaus kann man für jedes Element im FB angeben, ob es RETAIN , NON_RETAIN oder SET_IN_IDB ist. "Hergottsakrament ... wos is ets dees". Wie schon in Zeiten von Step7 V5 kann man am DB angeben, ob dieser RETAIN sein soll oder nicht. Soweit so schlecht, denn das galt ja immer für den gesamten DB und war damit eigentlich gar nicht nach IEC61131. Wie hat S. bloß das Siegel bekommen? Egal. Im TIA-Portal hat man sich nun eines besseren belehrn lassen und wie von der Norm vorgedacht die RETAIN Eigenschaft einzeln an die Elemente im FB/DB definiert. Aber Siemens wird seine Vergangenheit nicht los, und hat demnach drei Möglichkeiten. Für die optimierten Teile gilt die Einzeldefinition nach Norm, für die standard Teile die bisherige Definition nach Step7 V5.

Für die nach standard definierten Elemente eines FB und seines daraus entstehenden DB bekommst du auch Adressen angezeigt und kannst (bei der 1500) mit Adressregister und ANY und AT und ... den ganzen Schmarrn halt ... zugreifen. Und L DBLG liefert die Größe des Standard Bereichs eines DB. Für die Optimierten geht das alles nicht. Und deswegen verrät L DBLG diese Größe nicht. Und auf der 1200 gibt es gar keine Möglichkeit, denn was würdest du damit machen wollen? Das geht ja auch nicht

'n schön' Tach auch
HB
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

Hintergrund für die Frage: Kommunikation zu einem PLS.
Optimierte DB können nicht eingesetzt werden, da das PLS auf Adressen zugreift.
Mit der Länge des DB wäre es halt möglich gewesen, z.B. Änderungen von Werten zu ermitteln.


Gruß

Robert
 
Hallo Robert

stimmt, wenn man von außen in die 1200 rein greift, also auf der anderen CPU PUT und GET verwendet, dann kommt man nur auf die Standard Adressen von 1200 und 1500.
Wenn man von 1200 oder 1500 nach außen greift, dann kann man durchaus auch optimierte Daten der 1200 oder 1500 verwenden.

Irgendwie stehe ich auf dem Schlauch. Wie willst du an der Länge eines DB die Änderung seines Inhalts erkennen? Wenn die AS ein paar Bytes ausspuckt, ist doch keinerlei Wissen über die Interpretation dabei. Diese muss doch sowieso vorher geklärt sein. Und wenn das vorher geklärt ist, dann ist damit auch die Länge der Daten klar.

Wenn ich bisher Daten der Produktion zwischen Simatics hin und her geschubst habe, dann habe ich immer eine Art Header vorne dran, die mir sagt, was und wieviel drin ist. Die Länge des DB war noch nie Gegenstand der Kommunikation.

'n schön' Tach auch
HB
 
Hallo,

es ist natürlich nicht nur eine Anlage, sondern sehr viele.
Auf jeder Anlage ist der Aufbau der Daten entsprechend angepaßt und somit sind die DB's auch unterschiedlich.
Mit Hilfe der DB-Länge kann dann automatisch eine Auswertung gemacht werden (Schleife), ohne jedes mal selbst
die Länge irgendwo von Hand einzutzragen.
Anhand der Länge kann ich natürlich keine Änderung von Werten erkennen, aber die Länge brauche ich, für andere
Funktionen auzuführen.

Gruß

Robert
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Erstmal Kritik:

Wenn das PLS absolut auf Adressen in einem DB zugreift dann muß es die Struktur des DB kennen um den Inhalt der Speicherstellen korrekt zu interpretieren. Dann weiß es doch auch, wie lang der DB mindestens sein muß?
Du willst jetzt umgekehrt aus der Länge eines DB auf eine bestimmte Struktur schließen... wenn das mal gut geht... :confused::sm14:

Woher weiß Dein PLS, wieviele lokale Variablen es selber für den Kommunikationspartner vorhalten muß? Oder willst Du die Variablen im PLS erst zur Laufzeit dynamisch erzeugen?? Also alles völlig ohne Symbolik und Kommentare?

Was meinst Du, wird in 2 Jahren noch irgendjemand nachvollziehen können was Du heute programmieren willst - Dich eingeschlossen?
Bist Du jetzt nur zu faul die ganzen Variablen sauber im PLS anzulegen oder willst Du einfach nur Powertags sparen auf Kosten der Nachvollziehbarkeit?

Steuert Dein PLS irgendwas gefährliches? Ich hoffe kein KKW, wo das PLS "automatisch" erkennen soll wieviele Brennstäbe es kontrollieren muß... ;)


Lösungsvorschlag:

Schreibe doch die Länge des DB oder irgendeine vereinbarte (Typ-)Kennung in das erste Datenword der DB.

Harald
 

Beispiel: Wenn nur verglichen werden soll, muss auch die Länge, aber nicht die Struktur bekannt sein. BLKMOV kommt auch ohne die Struktur-Info aus, aber braucht die Länge.

Wenn so eine Vergleichsfunktion anstatt der Länge die komplette Strukturinfo kennen wollte, um jedes Element einzeln zu vergleichen - ja, dann würde es gefährlich werden. Bei Programmänderungen in 2 Jahren würden sich Bugs in so eine Funktion einschleichen.

Andererseits habe ich selbst noch nie eine DB-Länge zwingend abfragen müssen, und kann mich nicht erinnern, sie mal abgefragt zu haben. Vielleicht gibt es ganz andere Lösungsansätze.

Du willst jetzt umgekehrt aus der Länge eines DB auf eine bestimmte Struktur schließen...

Das wäre absurd und nach #3 ist es wohl auch nicht der Fall.
 
Zurück
Oben