TIA Portal - DB Zugriff -> nicht eindeutige Adresse

rs-plc-aa

Level-1
Beiträge
727
Reaktionspunkte
57
Zuviel Werbung?
-> Hier kostenlos registrieren
fiktives Beispiel:

Ich habe einen DB mit 16 Boolschen Variablen, diese zu einem Struct zusammengefasst und möchte an irgend einer Stelle alle zeitgleich auf den Signalzustand 0 setzen.

Nun ging ich da seither relativ simpel an die Sache heran und bemühte folgenden Code:

Code:
L  0
T  DB1.DBW0


Das TIA Portal scheint das aber nicht so gut zu finden und meckert beim übersetzen (nicht eindeutige Adresse)

Es ist zwar nur eine Warnung und kein Fehler aber trotzdem nicht schön...
 
Na ja, das würde ich jetzt nicht als Störend ansehen. Die Software kann deine Zuweisung
jetzt keinen Operanden zuordnen und warnt dich einfach, ob du das wirklich tun möchtest
was du da tust. Es könnte höchstens noch nützlich sein, das nach einer Quittierung dieser
Warnung TIA das speichert und dann nicht mehr anmeiert.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
also eher ignorieren - weil ja nicht wirklich falsch - und gut sein lassen?

Mich würde trotzdem interessieren ob es einen Weg gibt die Warnung zu umgehen - ist doch jetzt nicht so ausgefallen das Beispiel, oder?

Dem neuen AT Befehl von dem ich bisher nur mal so was gehört habe hatte ich eigentlich mehr bedeutung zugetraut um eben solche gemischten Zugriffe endlich sauber umsetzen zu können - aber der lässt sich hierbei leider nicht verwenden...
 
Du könntest jeden Wert einzelnd mit einer Schleife beschreiben. -> schlechte Lösung

Alternativ dürfte das auch mit der "Fill" Funktion gehen (SFC 21).

Oder du definierst eine andere Struktur die statisch "0" Werte hat und kopierst sie auf deine Zielstruktur (BLKMOV)
 
Wenn der DB rein symbolisch (optimierter Zugriff) angelegt wurde, dann kann TIA im Prinzip die Adressen vergeben wie es will. Wenn der DB nur aus den 16 Bits besteht ist das kein Problem, aber wenn dort mehr Variablen drinstehen, könnte es passieren, dass die Adressen nicht in der erwarteten Reihenfolge verwendet werden. Abhilfe: beim Erzeugen des DB den optimierten Zugriff nicht anklicken bzw. abwählen. Eine spätere Änderung hat keine Auswirkungen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das TIA Portal scheint das aber nicht so gut zu finden und meckert beim übersetzen (nicht eindeutige Adresse)

Es ist zwar nur eine Warnung und kein Fehler aber trotzdem nicht schön...
Also ich bin der gleichen Meinung wie TIA, denn wenn du symbolisch programmierst war ja die Lösung im Step7 Classic schon fragwürdig.
Ich würde da auch die Vorschläge von Deltal nach folgender Sortierung favorisieren:
(3) jeden Wert einzelnd mit einer Schleife beschreiben. -> schlechte Lösung

(1) Alternativ dürfte das auch mit der "Fill" Funktion gehen (SFC 21).

(2) Oder du definierst eine andere Struktur die statisch "0" Werte hat und kopierst sie auf deine Zielstruktur (BLKMOV)
 
Das ist ja genau das worauf ich hinaus wollte...

Nur weil es im Step7 Classic nicht als Fehler oder Warnung angezeigt wurde muss es ja nicht heissen dass es die beste Lösung ist und man an Ihr festhalten muss bis in alle Ewigkeit (Stichwort: "Das haben wir schon immer so gemacht...")

Ich würde gerne ein paar Änderungen in Kauf nehmen wenn es zielorientiert ist.

Das Beispiel ist zwar rein fiktiv gewählt gewesen, allerdings bin ich darauf gestossen beim Durchsehen von testweise migrierten Projekten um mal zu sehen was davon noch übrig geblieben ist.

Aber ist es nicht so dass wenn ich jetzt die Fill Funktion benutze das genau selbe passiert nur unter einem anderen Deckmantel?

Es wird doch auch genau der angegebene Bereich beschrieben - oder kann das Betriessystem sich dann "denken" was der Anwender haben möchte im Falle eines DBs mit optimiertem Zugriff?
 
Es wird doch auch genau der angegebene Bereich beschrieben
Ja, aber du kannst ihn symbolisch angeben und damit wird ja bei späteren Erweiterungen die Länge automatisch angepasst.
oder kann das Betriessystem sich dann "denken" was der Anwender haben möchte im Falle eines DBs mit optimiertem Zugriff?
Genau, das System schaut auf den Struct und erkennt in diesem fiktivem Fall dass es sich um zwei Byte handelt.
Aber ist es nicht so dass wenn ich jetzt die Fill Funktion benutze das genau selbe passiert nur unter einem anderen Deckmantel?
Was die PLC intern macht kann uns doch egal sein, wichtig ist doch das Handling am Baustein / Programm selber.
Was meinst du mit Deckmantel?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Na ja mit Deckmantel meinte ich halt dass die gleiche Aktion anders verpackt wird...

Jetzt habe ich aber an einem realen Beispiel eine andere Hürde entdeckt.

Die Funktion Fill oder auch Blkmov müssen ja versorgt werden.

Wenn ich jetzt in einem FB auf einen Global DB zugreifen will, dieser aber je nach Instanz des FBs eine andere Nummer hat - bin ich seither so vorgegangen:

Die benötigte DB Nummer als IN Parameter beim Aufruf dem FB übergeben, darin dann die Nummer in den TEMP Bereich kopieren (geht sonst nicht) und dann mit der Anweisung:

Code:
AUF DB [Nummer_des_DBs_aus_Temp_Bereich]
L DBD 0
usw...

Den ANY kann man leider auf die Art nicht bilden - oder etwa doch?
 
Hi

ich hab bisher noch nicht gelesen auf welcher SPS das laufen soll. Auf der 1200 hast du jetzt auch die Möglichkeit direkt ein BIT in einem DW oder ähnlichen anzusprechen. Also brauchst du da aus meiner Sicht hier keinen AT Befehl mehr.
Das sieht dann in SCL so aus:

Code:
FUNCTION_BLOCK "Baustein_1"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_INPUT 
      "WordTest" : Word;
   END_VAR

   VAR_TEMP 
      "TestBit" : Bool;
   END_VAR


BEGIN
    #TestBit := #WordTest.X0; //Zugriff auf ein Bit
    #WordTest := 0; // Alles nullen

END_FUNCTION_BLOCK

daschris
 
es handelt sich um eine 300er... - sorry (ich dachte immer das ist der Defaultwert, und nur wenn es was anderes ist muss man es extra erwähnen :cool:)

Ich habe auch noch ein wenig "geforscht" und habe herausgefunden dass wenn ich, bezogen auf das fiktive Beispiel, folgendes schreibe:

Code:
L  0
AUF  "Symbolischer_Name_von_DB1"
T  DBW  0

es dann zufrieden ist...

Ich denke die Warnung kommt dann wenn die Adresse keine Symbolische Zuordnung erlaubt (obwohl es ja genau so falsch sein kann wenn man vor der Variable später was anderes einfügt -> aber ich denke wenn man so etwas programmiert sollte man wissen was man wo einfügen darf).
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe auch noch ein wenig "geforscht" und habe herausgefunden dass wenn ich, bezogen auf das fiktive Beispiel, folgendes schreibe:

Code:
L  0
AUF  "Symbolischer_Name_von_DB1"
T  DBW  0

es dann zufrieden ist...

Das finde ich böse. Ich laufe sehr oft an ältere Programme heran die mit solchen Zugriffen zugepflastert sind. Die Querverweisliste wird so nahezu unbrauchbar.

Wenn es irgendwie geht immer vollqualifizierte Zugriffe auf DBs.

mfG René
 
zusätzlich kann mann auch noch sagen das die CPU's so leistungsfähig geworden sind, das mann
solche Kunstgriffe, eigentlich nicht mehr unbedingt braucht. Mann könnte eben mal jedes einzelene
Bit direkt zurücksetzen.
 
Auf der einen Seite stimme ich zu, auf der anderen würde ich sagen dass es doch möglich sein sollte (Feature) so etwas ohne Einschränkungen programmieren zu können.

Ich glaube nicht dass der Vorschlag mit SCL, der weiter oben genannt wurde, besser in der QVWL dasteht wie "meine" Lösung...

Alle Bits einzeln rückzusetzen wäre sicher eine mögliche, wenngleich umständliche Vorgehensweise (es sind ja in der Praxis normalerweise ein Vielfaches von den 16 aus dem Beispiel).

Es kommt wohl auch immer darauf an wer Kunde ist oder für was die PLC eingesetzt wird (in Bezug auf die spätere Nachvollziehbarkeit durch andere Personen).


Wenn ich da an Adressregisteroperationen denke, die teilweise hardcoremäßig in AWL verwendet werden, ist das doch Kindergarten dagegen :ROFLMAO:
 
Natürlich -> Weil "DB1.NullMichAb" nicht symbolisch geht wenn gleichzeitig Bits symbolisiert sind (dann könntest du dir das auch mit dem Temp Word sparen, es würde ja auch so gehen...)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mir ist gerade noch eingefallen dass eigentlich schon immer die Möglichkeit bestand, über die Symboltabelle (zumindest in Step7 Classic) im Falle eines Merkerspeicherbereichs, zum einen einzelne Bits symbolisch zu definieren und gleichzeitg das darüberliegende Byte/Wort/Doppelwort ebenfalls symbolisch zu definieren.

Hier ist dann eben genau das Möglich -> sowohl einzelne Bits als auch alle auf einmal vollständig symbolisch anzusprechen.

Leider existiert diese Möglichkeit für DB-Variablen nicht, und im TIA-Portal immer noch nicht.

Daher auch mein Vorschlag (weiter oben schon) daran etwas zu ändern...
 
Das finde ich böse. Ich laufe sehr oft an ältere Programme heran die mit solchen Zugriffen zugepflastert sind. Die Querverweisliste wird so nahezu unbrauchbar.

Wenn es irgendwie geht immer vollqualifizierte Zugriffe auf DBs.

mfG René

Aber es gibt noch immer Fälle, wo das durchaus Sinn macht, z.Bsp. wenn man den DB variabel halten muß, aber den Instandhaltern und Kollegen eine Orgie mit indirekter Adressierung ersparen will, besonders, wenn man auch noch mehrere DB gleichzeitig variabel nutzen muß. Ansonsten hast du durchaus Recht, immerhin findet man aber die nicht qualifizierten Zugriffe in der Referenz ("Gehe zur Verwendungsstelle"), indirekte Adressierung leider nicht.
 
Habe gerade beim Stöbern die SFC "Reset" gefunden...

Nennt sich "Bereich bitweise zurücksetzen"

Das passt hierfür genau! Man gibt das erste Bit im gewünschten Bereich an und die Anzahl die zurückgesetzt werden soll, Fertig.

Code:
CALL  RESET
         S_BIT :="DB_XYZ".Erstes_Bit
         N     :=32
 
Zurück
Oben