TIA ressourcenschonende Abfrage eines DB auf größer 0

Fluffi

Level-2
Beiträge
532
Reaktionspunkte
88
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

wie kann man in TIA (V15.1) einen (optimierten) DB bzw. ein dortiges Array
ressourcenschonend auf das Vorhandensein mind. eines Bits bzw. auf den Gesamtwert aller
Elemente im Array auf > 0 überprüfen?
Aktuell läuft es mit SCL über eine Scheife:

Code:
FOR #i := 0 TO 127 BY 1
DO
        IF "DB100".Data[#i] > 0
        THEN
            #Daten_vorhanden := true; 
             EXIT;
        END_IF;
        
    END_FOR;

Gibt es hier vielleicht noch einen effizienteren und weniger CPU-lastigen Weg?
 
Moin Fluffi,

die Abfrage an sich könnte man natürlich performanter programmieren (z.B. 32bit-Werte vergleichen). Allerdings muss man dafür natürlich vorher das Array of bool in Array of dword schreiben. Also bringt das in der Summe auch nichts (ist vielleicht sogar weniger performant, da zwei Schleifen arbeiten müssen).

Also ein Array of bool performanter zu prüfen scheint mir so einfach nicht möglich.

VG

MFreiberger
 
Moin,
du kannst dir einen identischen DB als Leer-Vorlage erstellen.
Code:
#Daten_vorhanden := "DB100".Data <> "DB101-Leervorlage".Data;
Macht zumindest den Code kürzer - die Performance würde ich dann mal einfach ausmessen (z.B. mit dem Runtime-Baustein)
 
auf das Vorhandensein mind. eines Bits bzw. auf den Gesamtwert aller
Elemente im Array auf > 0 überprüfen?
Da solltest Du schon mal besser auf "<> 0" anstatt "> 0" prüfen, dann funktioniert das auch unabhängig vom Datentyp des Arrays. Falls Dein Datentyp z.B. INT ist, dann liefert Dein "> 0"-Vergleich falsche/ungewollte Ergebnisse.

Was macht TIA eigentlich, wenn Du Dein Array mit einem gleich großen Array vergleichst, wo alle Werte auf 0 initialisiert sind? (evtl. die Struktur von Data als UDT/PLC-Datentyp deklarieren)
Code:
IF "DB100".Data <> #Leer_Array THEN ... //in #Leer_Array sind alle Elemente = 0

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin Howard,

Code:
#Daten_vorhanden := "DB100".Data <> "DB101-Leervorlage".Data;

Allerdings macht die Schleife vom TE etwas anderes:
Bei Ihm wird das Array bis zum ersten Bit durchsucht, das "TRUE" ist und dann abgebrochen. Also alle Bits davor SIND "FALSE", das gesuchte ist "TRUE" und alle danach sind unbestimmt. Zumindest ist mind. ein Bit "TRUE".

Bei Dir wird geguckt, ob sich der Inhalt von "DB100" geändert hat. Er kann auch zu "0" geworden sein. Dann ist aber das Ergebnis falsch, da der TE wissen will, ob mind. ein Bit "TRUE" ist.


VG

MFreiberger
 
Bei Dir wird geguckt, ob sich der Inhalt von "DB100" geändert hat. Er kann auch zu "0" geworden sein. Dann ist aber das Ergebnis falsch, da der TE wissen will, ob mind. ein Bit "TRUE" ist.
Wenn in "DB101-Leervorlage".Data alle Bits 0 sind, dann kann ein Unterschied des DB100 zu DB101 nur ein 1-Bit sein ...

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das Ergebnis ist in beiden Fällen das gleiche. Die Schleife vom TE kann halt deutlich fixer sein, wenn sie sofort einen Treffer findet - oder aber langsam wenn erst das letzte Element <> 0 ist. Ich persönlich mag das nicht so, weil ich ungern künstlich einen Jitter programmiere. Das liegt aber auch an meiner Endanwendung und muss von jedem individuell beurteilt werden. Ich benutze meine Variante halt ganz gerne in Verbindung mit UDTs, weil sich halt beim Ändern der UDT immer beide Seiten automatisch ändern, ohne das man dort händisch nochmal bei muss. Außerdem kann ich so grundsätzlich den Initialzustand abprüfen, der ja nicht immer 0 oder False sein muss - sondern vielleicht auch 1, 2 oder 42.
 
Ich kann mir vorstellen, daß der SCL-Compiler bei "#Daten_vorhanden := "DB100".Data <> "DB101-Leervorlage".Data;" Code erzeugt, der beim ersten Unterschied abbricht - da hättest Du dann auch einen "versteckten" Jitter.
Da habe ich auch schon drüber nachgedacht - man müsste es wohl einfach mal testen.
 
Zurück
Oben