Step 7 16 Chars von Kamera mit DB vergleichen

Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Heinileini,

Vielen Dank für deine Hilfe und Mühe.

// nur bis 11 statt 16 ?
Das UDT, was als Basis dient, hat ein Array[1..16] of Chars es werden aber nur 11 genutzt.

Könntest du bitte deinen letzten Code mal kommentieren aus deiner Sicht?

Einiges verstehe ich nicht.

Code:
Code_vergleich := TRUE ; // Warum wird hier auf TRUE gesetzt bevor angefangen wird? Verstehe ich nicht.
        FOR j := 1 TO 11 DO   
            IF "X_DB2390_NIOTeile".Teil[i].PraegeCode[j] <> PrCode[j] THEN
                Code_vergleich := FALSE; 
                EXIT; // Warum ist hier ein Exit? Wird auch bis zur 11 Stelle verglichen gerade die letzten Stellen sind aussagekräftig.
            END_IF;
        END_FOR;

Aber das Beste wird sein, wenn ich deinen Code in der Anlage ausprobiere. Ich lerne besser durch Ausprobieren.

Vielen Dank nochmal für deine tolle Unterstützung.

Gruß Tommylik
 
Code_vergleich wird davor auf True gesetzt, weil anschleißend die Schleife durchlaufen wird und wenn ein Char nicht paßt, wird Code_vergleich zurückgesetzt. Damit kann man sich den Else- bzw. Else_if-Zweig sparen. Da die Schleife in einem Rutsch(SPS-Zyklus) durchgearbeitet wird, ist das eine schöne, gut erkennbare Verfahrensweise. Vor der Schleife True, nach der Schleife immer noch True (dann ist alles ok) oder False, dann hat etwas nicht gepaßt.

Nachtrag:
Wichtig ist, dass Code_Vergleich eine interne Temp- oder Static-Var sein sollte und erst am Ende des FB/FC, also mind. nach dem Durchlaufen der Schleife einem Outputwert zugewiesen wird. Mit dem kann dann das restliche Programm sicher arbeiten. In der SPS selbst spielt das nicht die entscheidende Rolle, da das ja innerhalb eines Zyklus bearbeitet wird, aber wenn ein HMI auf Werte zugreift oder der FB von einem OB unterbrochen wird, könnte sollte man nie von außen auf interne Var zugreifen, die Schleife könnte ja gerade mitten im Ablauf sein, der Wert von Code_vergleich ist dann praktisch noch unbestimmt.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
...
// Warum wird hier auf TRUE gesetzt bevor angefangen wird? Verstehe ich nicht.
...
EXIT; // Warum ist hier ein Exit? Wird auch bis zur 11 Stelle verglichen gerade die letzten Stellen sind aussagekräftig.
...
Zwei Strings (oder Arrays) sind nur dann gleich, wenn sie in ALLEN Characters (oder Array-Elementen) gleich sind.
Und wenn sie gleich lang sind, möchte ich der Vollständigkeit halber noch hinzufügen.
Sobald ich beim Vergleichen der Characters (Elemente) darüber stolpere, dass ein "Pärchen" ungleich ist, weiss ich dass Ungleichheit herrscht und die Ergebnisse der evtl. noch nicht ausgeführten Vergleiche nichts mehr daran ändern können. Deshalb der Abbruch (EXIT) der FOR-Schleife.

Innerhalb der Schleife kann ich also nur den Zustand "ungleich" feststellen. In der Schleife also Gleich := FALSE;
Aber für den Fall, dass Gleichheit besteht, muss der Zustand Gleich := TRUE festgehalten (vorbesetzt) werden.
Wenn die Prüfungen in der Schleife nicht ergeben haben, dass Ungleichheit herrscht, hat 'Gleich' dann den zutreffenden Zustand TRUE.
Nach der Schleife den Zustand Gleich = TRUE festzustellen ist auch (aber nur dann) möglich, wenn der Schleifen-Index nach dem Durchlaufen der Schleife abfragbar ist und dann einen Wert hat, der bei AufwärtsZählen grösser bzw. bei AbwärtsZählen kleiner ist, als der vor gegebne Endwert.
In Deiner anfänglichen Version hast Du (mit Mehraufwand) noch verglichen ob der Index den Endwert erreicht hat. Das ist absolut korrekt, aber eben nur mit Mehraufwand möglich.

Zur äusseren Schleife:
Hier wird die Schleife mit EXIT verlassen, sobald eine Gleichheit des gesuchten Wertes mit einem Eintrag in der Liste gefunden wird.
Es wird nicht mehr geprüft, ob es noch weitere gleiche Einträge der Liste gibt. Ob das gewünscht wäre, weiss ich nicht.
Die "ErgebnisVariable" wird hier ebenfalls vor der Schleife vorbesetzt, allerdings mit FALSE für den Fall, dass die Schleife keine Gleichheit finden kann.

Ralle hat natürlich Recht mit seinem Hinweis, (Baustein-)interne Variablen für die "ErgebnisVariablen" zu benutzen und diese erst nach den Schleifen in die Output bzw. In-Out Variablen zu kopieren.

PS:
Zu "gerade die letzten Stellen sind aussagekräftig":
Diese Bemerkung könnte man mal unter dem Aspekt in Betracht ziehen, ob man besser den Index von 11 bis 1 statt von 1 bis 11 laufen lässt.
Wenn z.B. die ersten 8 Stellen meistens gleich sind und die Unterschiede erst in den letzten drei Stellen zu erwarten sind, dann könnte eine "rückwärts" laufende Schleife nach viel weniger SchleifenDurchläufen abgebrochen werden, also schneller zum Ergebnis kommen.
 
Zuletzt bearbeitet:
Zurück
Oben