Step 7 DB-Bereich 16Byte auf größer 0 vergleichen

tommylik

Level-2
Beiträge
115
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Servus,

In einem FC vergleiche ich 16Byte einzeln auf >0 (völlig unübersichtlich Netzwerk viel zu lang)

1706872354061.png


Ich übergebe diesem FC sowieso den speziellen Any mit einer Zugriffsbreite von 16Byte.

1706872189211.png

Könnte man nicht gleich mit diesem Any diesen Vergleich auf >0 machen?
Gibt es vielleicht einen SFC / SFB der das kann?

Hat jemand von Euch so etwas schonmal in SCL geschrieben?
Oder kann mir mit Stichpunkte erklären, wie ich das selber machen könnte?

Ich hoffe, ihr habt eine Idee für mich. Vielen Dank.

Grüße Tommylik
 
Da wird nicht auf den Wert Null verglichen, sondern die einzelnen Bytes werden auf > Hex 20 verglichen. Da geht es wohl eher um eine ASCII-Zahl oder was string-artiges.
Gruß
Erich
 
1) Meinst du wirklich >0 oder geht auch <>0 ?
Man könnte die 16 Bytes als 4 Doppelwords verodern und am Ende vergleichen, ob das Ergebnis <>0 ist.

2) Du vergleichst nicht mit 0, sondern mit dem Zeichen '0' (16#20) - Warum???

3) Du hast eine UND-Verknüpfung, die nur TRUE wird, wenn alle Zeichen > '0' sind - ???

4) Erzähl mal etwas mehr, warum du das machen willst und was das bewirken soll.
 
Zuletzt bearbeitet:
2) Du vergleichst nicht mit 0, sondern mit dem Zeichen '0' (16#20) - Warum???
Sorry Harald, aber 16#20 ist ein Leerzeichen (' '). '0' ist 16#30.
1) Meinst du wirklich >0 oder geht auch <>0 ?
Ich vermute, er meint <>0 und nicht >0.
3) Du hast eine UND-Verknüpfung, die nur TRUE wird, wenn alle Zeichen > '0' sind - ???
Ich vermute ferner, dass er prüfen will, ob mindestens eine Ungleichheit vorhanden ist und er müsste dementsprechend mit ODER verknüpfen.
Da wird nicht auf den Wert Null verglichen, sondern die einzelnen Bytes werden auf > Hex 20 verglichen. Da geht es wohl eher um eine ASCII-Zahl oder was string-artiges.
Das vermute ich auch. 16#20 ist das "kleinste" druckbare ASCII-Zeichen. So gesehen macht der Vergleich auf grösser doch Sinn. Gesucht werden also druckbare Zeichen, die aber nicht "unsichtbar" sind wie das LeerZeichen.
 
Zuletzt bearbeitet:
Sorry Harald, aber 16#20 ist ein Leerzeichen (' '). '0' ist 16#30.
Da hast du recht.

Ich vermute, er meint <>0 und nicht >0.
Vermute ich auch. Furchtbar, wenn Programmierer nicht exakt formulieren können...

Ich vermute ferner, dass er prüfen will, ob mindestens eine Ungleichheit vorhanden ist und er müsste dementsprechend mit ODER verknüpfen.
oder alle Vergleiche auf '==' und UND (und falls nötig das Ergebnis negieren)
 
Zuletzt bearbeitet:
Servus,

Vielen Dank an alle für die vielen Antworten.

Es sind ASCII-Zeichen.

Wird mit einer Funktion generiert und nennt sich "DT_ASCII".

1707115527342.png

1) Meinst du wirklich >0 oder geht auch <>0 ?
Man könnte die 16 Bytes als 4 Doppelwords verodern und am Ende vergleichen, ob das Ergebnis <>0 ist.

Ich meine >0, muss ich bei ASCII-Zeichen das <>0 benutzen?

3) Du hast eine UND-Verknüpfung, die nur TRUE wird, wenn alle Zeichen > '0' sind - ???
Ja, ich muss sicherstellen, dass alle Zeichen vorhanden sind.

Hier in AWL:

1707117337863.png


Sorry für meine ungenaue Erklärung. Ich hoffe, es ist jetzt verständlicher.

Vielen Dank für Eure Hilfe.

Grüße Tommylik
 
Moin Tommylik,

der AWL-Code erschließt sich mir nicht. Da sind doch zwei identisch gleiche Vergleichsabfragen UND-Verknüpft. Wofür soll das gut sein?

Das vermute ich auch. 16#20 ist das "kleinste" druckbare ASCII-Zeichen. So gesehen macht der Vergleich auf grösser doch Sinn. Gesucht werden also druckbare Zeichen, die aber nicht "unsichtbar" sind wie das LeerZeichen.
Wenn es tatsächlich um druckbare Zeichen gegangen wäre (außer dem Leerzeichen), hätte man aber auch auf < 16#7F abfragen müssen.

Was macht jetzt eigentlich "DT_ASCII"? ASCII-Zeichen "generieren"? Woraus (Byte => Char)?

Gruß
MFreiberger
 
Warum vergleichst du dann nicht mit 0 (16#00), sondern mit dem Leerzeichen, dem ASCII-Zeichen ' ' (16#20)?

muss ich bei ASCII-Zeichen das <>0 benutzen?
Solange es keine negativen Werte gibt, ist es egal ob auf >0 oder <>0 geprüft wird.
Wenn ich prüfen will, ob überhaupt irgendein Wert vorhanden ist, der nicht 0 ist, dann entspricht das in meiner Logik einem Vergleich auf <>0

Ja, ich muss sicherstellen, dass alle Zeichen vorhanden sind.
Du meinst vermutlich, dass in jedem CHAR ein (druckbares) ASCII-Zeichen drin ist, also der Wert zumindest <> 0 ist, aber vielleicht muss es auch ein Ziffern-Zeichen '0'..'9' sein? Oder sind auch andere Zeichen, z.B. Leerzeichen ' ' (16#20) oder Minus '-' (16#2D) oder Trennzeichen '.' ':' ... möglich? Müsstest du nicht auch auf unzulässige Zeichen prüfen? Oder ist garantiert, das keine unzulässigen Zeichen enthalten sind? Welche Zeichen werden erwartet?
 
Servus,

1707123623106.png

Ja genau abgeschnitten.
Hier interessiert nur die Zuweisung. Alle 16 Bytes müssen einen Wert haben, deswegen die Und-Verknüpfung.

1707124105208.png

So sieht es aus, wenn kein Wert vorhanden ist.

Was macht jetzt eigentlich "DT_ASCII"? ASCII-Zeichen "generieren"? Woraus (Byte => Char)?
Ja genau. Aber daran kann ich nichts ändern. Ist ein gesperrter Baustein.

Ich soll nur diese 16Bytes überprüfen, dass bevor kopiert wird Werte enthalten sind. Sonst sind ja nur Leerzeichen drin.

Vielen Dank für Eure Hilfe.

Grüße Tommylik
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@tommylik :
Ich vermute mal, dass du deinen "Prägecode", wenn welcher dort eingetragen ist, als String weiter verwendest (oder ?).
Falls ja dann könntest du ihn in SCL auch einfach mit einem gleich langen Leerstring vergleichen. Das wäre dann auch deutlich schneller zu durchschauen was das soll ... (und du bauchst keine Schleife etc.)
 
Zuletzt bearbeitet:
Es steht jetzt schon relativ lange die Frage im Raum, ob "irgendein" Zeichen im Speicher stehen soll, irgendein druckbares Zeichen oder ggf. sogar nur eine Ziffer.
Danach ergibt sich, wie Du die Abfrage machen mußt.

1707125635876.png

Markiere doch einfach mal, welche ASCII-Zeichen für Deinen Prägecode zulässig sind, dann kann Dir hier auch eine konkrete Antwort gegeben werden.

@tommylik :
Ich vermute mal, dass du deinen "Prägecode", wenn welcher dort eingetragen ist, als String weiter verwendest (oder ?).
Falls ja dann könntest du ihn in SCL auch einfach mit einem gleich langen Leerstring vergleichen. Das wäre dann auch deutlich schneller zu durchschauen was das soll ... (und du bruachst keine Schleife etc.)

Das hilft ihm aber nicht, wenn einzelne Zeichen "leer" oder ungültig sind.
 
Servus,

Warum vergleichst du dann nicht mit 0 (16#00), sondern mit dem Leerzeichen, dem ASCII-Zeichen ' ' (16#20)?

Ich weiß gar nicht, warum ich >0 geschrieben habe.
So wie ich es in meinem ersten Post mit den Symbolen gemeint hatte.
CMP>I
Da habe ich ja auch den Wert mit Leerzeichen B#16#20 mit angegeben.

Diese blöde 0 hat alles durcheinander gebracht.

1707125028780.png

Du meinst vermutlich, dass in jedem CHAR ein (druckbares) ASCII-Zeichen drin ist, also der Wert zumindest <> 0 ist, aber vielleicht muss es auch ein Ziffern-Zeichen '0'..'9' sein? Oder sind auch andere Zeichen, z.B. Leerzeichen ' ' (16#20) oder Minus '-' (16#2D) oder Trennzeichen '.' ':' ... möglich? Müsstest du nicht auch auf unzulässige Zeichen prüfen? Oder ist garantiert, das keine unzulässigen Zeichen enthalten sind? Welche Zeichen werden erwartet?
Hier in diesem Fall sind es nur Zahlen was der Baustein "DT_ASCII" generiert.

Die eigentliche Frage war, ob man mit dem Any als In-Parameter diese 16Byte auf einen Wert hin prüfen kann,
also >I in meinem Fall kein Leerzeichen.

Sorry für das durcheinander.

Vielen Dank für Eure Hilfe.

Grüße Tommylik
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich soll nur diese 16Bytes überprüfen, dass bevor kopiert wird Werte enthalten sind.
Dann müsstest du jedes Byte prüfen, ob es ein zulässiges/erwartetes ASCII-Zeichen enthält, z.B. Ziffern '0' .. '9'
Code:
i : INT;
t_PrgCode1_vorh : BOOL;

t_PrgCode1_vorh := TRUE;

FOR i := 1 TO 16 DO
    IF "DeinDBname".Praegecode[i] < '0' OR "DeinDBname".Praegecode[i] > '9' THEN
        t_PrgCode1_vorh := FALSE; //unzulässiges Zeichen (ungleich '0'..'9') gefunden!
        EXIT;
    END_IF;
END_FOR;
 
Dann ist eigentlich schon Post #2 die Antwort, nur nicht auf >0, sondern auf >32 abfragen (nach Deiner Logik W#16#20). Ich würde aber ja auf
> 47 und < 58 abfragen.
 
@tommylik :
Ich vermute mal, dass du deinen "Prägecode", wenn welcher dort eingetragen ist, als String weiter verwendest (oder ?).
Falls ja dann könntest du ihn in SCL auch einfach mit einem gleich langen Leerstring vergleichen. Das wäre dann auch deutlich schneller zu durchschauen was das soll ... (und du bruachst keine Schleife etc.)
Wenn der Prägecode kopiert wurde, ist alles vorbei. Er wird in einer anderen DB eingetragen, wo eine Windowssoftware ihn ausliest und weiter verarbeitet. Deswegen ist es wichtig, dass Werte vorhanden sind.

Grüße Tommylik
 
Zurück
Oben