TIA Wertevergleich aus DB

spirit

Level-1
Beiträge
961
Reaktionspunkte
23
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

es will mir nicht gelingen, beispielsweise Werte in einem DB auf Null zu vergleichen:

attachment.php



Schon die erste Zeile wird gelb markiert:

attachment.php



Als Hinsweis erhält man: Die Adresse wird nicht durch eine Variable belegt.


In Classic klappt das aber ganz wunderbar!

Gibt es in TIA eine andere Möglichkeit? :confused:
 
Hallo spirit,

zumindest ich kann Deine Anhänge leider nicht sehen (ungültiger Anhang) ...

Ich rate mal:
Du willst anders/größer auf den DB zugreifen als die Einzelvariablen darin deklariert sind? --> vergleiche jede einzelne Variable so wie deklariert
Sind das Variablen aus einem Array oder Struct?
Ist der "optimierte Zugriff" am DB abgeschaltet?
Was ist das für eine CPU?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

es will mir nicht gelingen, beispielsweise Werte in einem DB auf Null zu vergleichen:

attachment.php



Schon die erste Zeile wird gelb markiert:

attachment.php



Als Hinsweis erhält man: Die Adresse wird nicht durch eine Variable belegt.


In Classic klappt das aber ganz wunderbar!

Gibt es in TIA eine andere Möglichkeit? :confused:


Die Meldung sollte "nur" eine warnung sein. Tia geht davon aus, dass du vergleiche nur mit Symbolischen Variablen machst, sprich deine Variable hat nicht die Adresse im DB, sondern einen Eigenen symbolischen Namen. Das amcht es unglaublich nervig, wenn einzelne Bits aus Worten verglichen werden sollen o.Ä..

Leider werden mir die angehängten Bilder nicht angezeigt...
 
Weiß nicht, was das mit den Bildern ist ...

neuer Versuch! ;)


Die CPU ist eine 300er

DB.jpg

Anweisung.jpg
 
Zuletzt bearbeitet von einem Moderator:
Wie die Meldung/Warnung schon sagt: es ist keine Variable mit der Adresse DBW0 deklariert. Weil an der Adresse ein Struct mit vielen Bools liegt.

Bei einer 300er könntest Du die Anfangsadresse des Struct #Werte in ein Adressregister oder temp-DWord laden (Achtung: Multiinstanz-Offset aus AR2 beachten!) und dann indirekt Wordweise auf die Struktur zugreifen. Sowas "unsauberes" unsymbolisches sollte aber heutzutage nicht mehr veranstaltet werden.
Zusätzliche Gefahr: der Wordweise Zugriff erfasst auch ggf. nicht deklarierte Padding-Bits und -Bytes mit unkontrolliertem Inhalt.

In SCL wäre vermutlich eine AT-Sicht möglich und eventuell auch sinnvoll.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Weiß nicht, was das mit den Bildern ist ...
Kann es sein, daß Du auf Bilder auf Deiner Festplatte oder anderen lokalen Speicherplatz verlinkt hast?
Bilder für Forum-Beiträge musst Du hier oder bei einem Internet-Filehosting-Dienstleister hochladen.

Harald
 
Wie die Meldung/Warnung schon sagt: es ist keine Variable mit der Adresse DBW0 deklariert. Weil an der Adresse ein Struct mit vielen Bools liegt.

Harald

Danke Harald & Christmaspoo,

komisch - Step7 Classic hat sich daran auch nie gestört. Wäre es, wenn ich es so belasse, eine grobe "Unschönheit"? Denn funktionieren tut's ja!

@Harald: Nein, lade die Bilder direkt von der Festplatte hier hoch ...
 
Step7 Classic hat, im Unterschied zu TIA, Zugriffe auf irgendwelche Speicherbereiche noch nie geprüft, da war noch einzig und allein der Programmierer der Verantwortliche.

Und das du bei soeinem sagen wir mal unschönen Zugriff eine Warnung erhältst ist jetzt ausnahmsweise mal absolut berechtigt.
a) Ignorieren
b) Intelligentere, symbolische, Methode einfallen lassen, Harald hat ja schon ein paar Möglichkeiten genannt.

Das größte Problem das ich damit habe:
Auf diese Art erzeugt man jede Masse Warnungen, und die eine Warnung die vielleicht doch irgendwann mal interessant wäre geht dann im Wust unter.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie die Meldung/Warnung schon sagt: es ist keine Variable mit der Adresse DBW0 deklariert. Weil an der Adresse ein Struct mit vielen Bools liegt.

Bei einer 300er könntest Du die Anfangsadresse des Struct #Werte in ein Adressregister oder temp-DWord laden (Achtung: Multiinstanz-Offset aus AR2 beachten!) und dann indirekt Wordweise auf die Struktur zugreifen. Sowas "unsauberes" unsymbolisches sollte aber heutzutage nicht mehr veranstaltet werden.
Zusätzliche Gefahr: der Wordweise Zugriff erfasst auch ggf. nicht deklarierte Padding-Bits und -Bytes mit unkontrolliertem Inhalt.

Harald

Aber angenommen, es würden weit aus mehrere Bools in diesem Struct liegen - dann klappt das mit dem Laden, beispielsweise in ein temp-DWord, ja nicht. Wie könnte frau sich da behelfen?
 
Das temp-DWord soll nicht für die Bools aus dem Struct sondern für den Pointer einer speicherindirekten Adressierung sein:
Code:
L   P##myStruct
T   #temp-DWord

AUF DB10
L   DBW [#temp-DWord]  //Lade 16 aufeinanderfolgende Bools

Oder Du benutzt für den Pointer ein Adressregister für registerindirekte Adressierung:
Code:
L   P##myStruct
LAR1

AUF DB10
L   DBW [AR1, P#0.0]  //Lade 16 aufeinanderfolgende Bools

Auf die nächsten 16 Bools greifst Du zu, indem Du entweder den Pointer (#temp-DWord oder AR1) um P#2.0 erhöhst oder bei der registerindirekten Adressierung in der Operation einen Offset "DBW [AR1, P#2.0]" angibst. Für sehr viele Bits könnte man den Code in eine Schleife packen.

Wenn der Code in einem FB ist und myStruct in seinem IDB liegt (z.B. STAT), dann muß zu P##myStruct noch der Multiinstanz-Offset aus AR2 addiert werden (Forumsuche benutzen).

Harald
 
Lieben Dank Harald,

ui - es wird mal wieder kompliziert für mich ...

Ich versuche mal deinen Vorschlag mit der Schleife aufzugreifen:

Code:
        AUF  DB10

        L     P#0.0
        T     #pointer     
           
        L     4                                // 4 DWORDs abfragen
Next:   T     #count

        L     DBD [#pointer]
        L     L#0
        <>D
        =     "Merker"

        L     #pointer
        L     P#4.0
        +D    
        T    #pointer

        L     #count
        LOOP  Next

Der Schleifenteil soll halt feststellen, ob ein Bit ungleich Null ist ... denke aber mein Konstrukt ist so noch nicht lauffähig, oder? ;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der Schleifenteil soll halt feststellen, ob ein Bit ungleich Null ist ... denke aber mein Konstrukt ist so noch nicht lauffähig, oder? ;)
Der Schleifenteil wird es feststellen - und gleich wieder vergessen. ;)
Wenn der Vergleich <> 0 feststellt (und TRUE an "Merker" zuweist), dann sollte die Schleife verlassen werden (SPB exit)

Harald
 
Der Schleifenteil wird es feststellen - und gleich wieder vergessen. ;)

Harald

Och menno - blöder Schleifenteil ... :p

Wenn der Vergleich <> 0 feststellt (und TRUE an "Merker" zuweist), dann sollte die Schleife verlassen werden (SPB exit)

Harald

Ok, dann vielleicht so:

Code:
        AUF  DB10

        L     P#0.0
        T     #pointer     
           
        L     4                                // 4 DWORDs abfragen
Next:   T     #count

        L     DBD [#pointer]
        L     L#0
        <>D
        =     "Merker"
        SPB   Exit

        L     #pointer
        L     P#4.0
        +D    
        T    #pointer

        L     #count
        LOOP  Next


Exit:      NOP 0
 
Ich kann keinen Fehler an Deinem Code sehen. Das wird schon funktionieren. :D


Bis ca. 16 DWORDs würde ich keine Schleife nehmen sondern linear runterprogrammieren.
Nebeneffekt: Gerade wenn es Störmeldebits sind, habe ich hier eine prima Stelle zum schnellen Beobachten aller Bits ohne extra den DB öffnen zu müssen. Bei einer Schleife ginge das nicht.

Und ich würde am Anfang des Codes einen "überflüssigen" Zugriff auf den ersten Member der Struktur nur für die Referenzdaten einbauen, damit man diesen Zugriff auf die Struktur finden kann. Und auch das dann eigentlich überflüssige "AUF DB10" würde ich auf jeden Fall für die Referenzdaten drinlassen.

Code:
        U "Werte_DB".Werte.Wert_1   //DB10.DBX0.0 / nur für Referenzdaten
        CLR                         //VKE-Abgrenzung

        LAR1  P#0.0                 //P##myStruct

        AUF   DB10                  //DB nochmal öffnen für Referenzdaten
        L     DBD [AR1, P#0.0]
        L     DBD [AR1, P#4.0]
        OD
        L     DBD [AR1, P#8.0]
        OD
        L     DBD [AR1, P#12.0]
        OD
        U     <>0
        =     "Merker"

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Und ich würde am Anfang des Codes einen "überflüssigen" Zugriff auf den ersten Member der Struktur nur für die Referenzdaten einbauen, damit man diesen Zugriff auf die Struktur finden kann. Und auch das dann eigentlich überflüssige "AUF DB10" würde ich auf jeden Fall für die Referenzdaten drinlassen.

Harald


D.h.

Code:
        U "Werte_DB".Werte.Wert_1   //DB10.DBX0.0 / nur für Referenzdaten
        CLR                         //VKE-Abgrenzung

dieser Code dient rein zur "Orientierung" und hat nichts mit der eigentlichen Funktionalität zu tun? :confused:
 
Zuletzt bearbeitet:
dieser Code dient rein zur "Orientierung" und hat nichts mit der eigentlichen Funktionalität zu tun? :confused:
Ja

Den Code kann man weglassen - nur dann findet man diesen Zugriff auf die Bitstruktur nicht mehr in den Referenzdaten. Nur noch ein einsames "AUF DB10" irgendwo in dem Baustein verrät, daß auf irgendwas in dem DB10 zugegriffen wird. Und selbst dieses "AUF DB10" findet man nur, wenn man nur nach DB10 oder nach überhaupt allen DB-Zugriffen sucht. Bei "überlappenden Zugriffen" auf irgendwas im DB10 erscheint AUF DB nicht. (in Step7 classic. TIA weiß ich jetzt nicht, vermutlich zeigt das noch weniger?)

Nachtrag:
Außerdem kann ich dann örtlich nahe anhand dieser Zeile die Absolutadressen der Struktur mit den Adressen vergleichen, welche die indirekten Zugriffe verwenden.

Harald
 
Zuletzt bearbeitet:
Zurück
Oben