TIA In SCL auf dynamische DBs zugreifen?

Geisterkarle

Level-2
Beiträge
126
Reaktionspunkte
9
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!

Ich möchte/muss in mehreren DBs, die gleich aufgebaut sind, an einer definierten Stelle ein spezielles "Codewort" finden und danach dann zurückgeben in welchem DB ich das gefunden habe.

Dachte ich kann in SCL schön einfach mit einer Schleife und einem Zähler durch meine DBs gehen und dann die Stelle vergleichen; aber irgendwie kapiere ich nicht, wie ich auf die DBs zugreifen kann!
Habe hier ein wenig rumgesucht und z.B. diesen Eintrag hier gefunden:
https://www.sps-forum.de/simatic/19333-pointer-scl.html#post132967

Das wäre, was ich machen möchte! Halt dann ne Stelle vergleichen, anstatt was einzutragen.
Leider geht es bei mir nicht :( ... weiss nicht, ob es an meiner 1510SPer CPU (zudem technisch bedingt TIA V14!) liegt, aber "Word_to_Block_DB" (z.B.) existiert nichtmal und ich scheitere selbst mit "Konstanten" als Test.
AWL-Code wie DB10.DBW10 oder so geht auch nicht... kapiere also nicht, wie ich DBs anspreche...
Kann mir da wer nen Tipp geben, wie das funktioniert?
Bestimmt total simpel und ich lauf grad im Wald...

Danke schonmal für Hilfe!
 
Ob das Word_to_Block_DB in TIA noch geht weiß ich ehrlich gesagt gerade auch nicht.
Ich greife auf DBs eigentlich immer so zu "DB_Daten".Codewort, anstatt DB10.DBW10.
Die Adressierung über DBXX.DBWYY geht mit optimierten DBs auch nicht mehr.
Wenn die Stelle immer die selbe ist und die Anzahl der DBs sich zur Laufzeit nicht verändert, könntest du es mit einer Case Anweisung machen.

Code:
For i := 1 to 20 Do
Case i of
1: If "DB_Daten1".Codewort = Codewort then
Exit;
End_If;
2: If "DB_Daten2".Codewort = Codewort then
Exit;
End_If;
3:.....
.
.
.
.
.
.
20:....
End_Case;
End_FOR;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der Zugriff auf einen Datenbaustein (unter SCL) setzt immer voraus, dass der Compiler (also SCL) den DB und dessen Aufbau kennt.
Sprichst du den DB symbolisch an so kannst du natürlich alle seine deklarierten Einzel-Bestandteile auch (entsprechend ihres Typs) ansprechen.
Möchtest du den DB aber absolut ansprechen so funktioniert das unter Step7Classic bzw. bei TIA und deaktiviertem "optimierten Bausteinzugriff" nur über die Basis-Typen (Bit, Byte, Word, DWord). Hast du bei TIA den "optimierten Bausteinzugriff" (o.ä.) eingeschaltet so funktioniert das m.E. gar nicht mehr (über Pointer o.ä.).
Nehmen wir also einmal an, du hättest Variante 1. Hier kannst du natürlich mit etwas Aufwand das trotzdem hinbekommen. Du weißt ja, was du suchst und möglicherweise folgt das, was du suchst, ja auch einem bestimmten Raster.
Was du machen müßtest wäre : In deinem Baustein einen String deklarieren, auf den du vergleichen möchtest. Dann nach und nach die Bytes der DB's in den String hineinkopieren und schauen, ob da dein Suchwort auftaucht.

Gruß
Larry
 
Hallo!
Danke für die Antworten bisher!
Also das "Codewort" sind im Prinzip zwei Doppelwörter. Daher wären Basistypen kein Problem; allerdings weiss das SCL ja "theoretisch" nicht, welchen DB ich haben möchte wenn ich das dynamisch machen möchte, daher wird er wohl weiterhin Probleme haben...
Zombie's Lösung müsste funktionieren; wollte das ganze aber eigentlich gerade in SCL machen, damit das nicht so doof "umständlich" ist :p
Könnte man, bei einer Symbolischen Lösung, denn wenigstens den Bausteinname dynamisch generieren? Denn die DBs sind vom Name her ".._01, .._02, ..." und könnte dann den DB-Name in einer Schleife zusammensetzen und Zeilen sparen!
Muss wohl doch wieder "komplexer" werden... Faulheit scheint nicht immer zu siegen :( ;)

grüße
Geisterkarle
 
Nein ... du kannst dir nicht den Variablen-Namen in der SPS zusammenbauen, so wie du es möglichweise in der Visu vielleicht schon mal gemacht hast.
Die SPS kennt nur den kompletten symbolischen Namen (es ist also auch kein Mix möglich - ein bißchen symbolisch und ein bißchen absolut) oder die absolute Adresse.

Skizzier doch mal, die deine Such-DB's so in etwa aufgebaut sind.
Vielleicht kann man der Faulheit dann ja wenigstens noch mittelbar zum Sieg verhelfen ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mist :p

ich bin jetzt doch wieder zurück zu AWL, denn da konnte ich ne einfachere Schleife zusammenbauen:
Code:
//SchleifenstartStart: NOP 0


// DB Nummer setzen
      L     #Start_DB
      L     #SchleifenZaehler
      +I
      T     #DBNr


// DB öffnen
      AUF DB [ #DBNr]


// Vergleichen
      U(
      L     %DBD4
      L     #EingangsDW_1
      ==I
      )
      U(
      L     %DBD8
      L     #EingangsDW_2
      ==I
      )
      SPB   DWOK


// Wenn hier, nicht gefunden :( hochzaehlen
      L     #SchleifenZaehler
      L     1
      +I
      T     #SchleifenZaehler


// Sind wir am Ende?
      U(
      L     #SchleifenZaehler
      L     #Anzahl_DBs
      >I
      )
      SPB   ENDE
      SPA   Start
// Gefunden!
DWOK: NOP 0
// Ausgabe der DB Nummer
      L     #DBNr
      T     #ZielDB
      SPA   ENDE


ENDE: NOP 0
Jetzt ist halt die Position der Doppelwörter fest drin; mag es eigentlich immer, wenn ich da was variabel halten könnte, falls sich was im DB verschiebt.
 
TIA-Hilfe und Systemhandbuch STEP 7 Professional V14.0

2.4 Besonderheiten bei der Migration von PLC-Programmen (S7-1500)
2.4.5.2 Indirekte Adressierung in SCL (S7-1500)

Indirekte Adressierung
S7-300/400
S7-1500
Indirekte Adressierung eines
DB
Datentyp "BLOCK_DB"
Datentyp "DB_ANY"
Indirekten Adressierung von
DB-Variablen
WORD_TO_BLOCK_DB(#myWord).%DBW3
WORD_TO_BLOCK_DB(#myWord).DW(IDX:=#myInt)
Anweisungen "PEEK"/"POKE"
Anweisungen "PEEK"/"POKE"
[...]
Der Datentyp "BLOCK_DB" steht in S7-1500 nicht mehr zur Verfügung. Variablen dieses Datentyps werden von der Migration in den Datentyp "DB_ANY" umgewandelt. Die Konvertierungsfunktionen "BLOCK_DB_TO_WORD" und "WORD_TO_BLOCK_DB" werden nach "UINT_TO_WORD(DB_ANY_TO_UINT)" und "UINT_TO_DB_ANY(WORD_TO_UINT)" migriert.
[...]
Indirekte Angaben von Datenbausteinen oder DB-Variablen werden in S7-1500 über die Anweisungen "PEEK"/"POKE" implementiert.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... das kannst du aber entsprechend genau so auch in SCL programmieren ...
Was wäre denn die SCL Entsprechung von "AUF"?

@PN/DP:
Ahja, Poke/Peek hatte ich vergessen! Vermutlich weil ich bisher nur mit Poke_BLK rumgespielt habe... Ist alles so neu, kommt noch nicht so mit :)
Hab ich gerade mal getestet, geht auch! ... Jetzt bin ich mal wieder auf dem Weg nach Rom :)

Danke! Glaub ist soweit geklärt :)
 
So eine richtige Entsprechung von "AUF" kenne ich eigentlich gar nicht.

Man benutzt "AUF DB10" ja um danach mit z.B. "DBW126" oder "DB20" mit weniger Schreiben die Variable anzusprechen.
Man könnte auch DB10.DBW126 schreiben.

In SCL geht es so "DB_Data_01".Blablabla symbolisch oder auch so "Word_to_Block_DB("DB_Nummer").DBW("Word")
 
Zurück
Oben