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

Zuviel Werbung?
-> Hier kostenlos registrieren
Vielen Dank für eure Hilfe.

Der Datentyp ANY belegt 10 Byte. Wenn du in TEMP eine Variable vom TYP ANY anlegst, dann kannst du den ANY von IN nach TEMP kopieren.
Das mach doch der AWL Code aus meinem Post #28 oder?

Der String soll 16 Zeichen lang sein? Oder die StringVariable inklusive der 2 Byte LängenAngabe?
Es basiert alles auf einem Array of Char. Es wurde nie ein String genutzt.

1707150434694.png

Wenn wir hier noch bei dem Punkt sind "ist der Inhalt korrekt ?"

Es handelt sich immer und eine Datumsangabe die mit den schon erwähnten FC "DT_ASCII" generiert wird.
z.B. 240205173314.
Der Nadelpräger ist in der Anlage und graviert an einer bestimmten Stelle diese Nummer auf das Bauteil.

Dieser Vergleich hier soll nur sicherstellen das keine Leerzeichen zu dem anderen DB (Finish Band) gesendet wird.

Damit ihr nicht noch mehr Zeit für mich vergeudet sollten wir das hier beenden.

PN/DP hat mir geraten kein Any in AWL zu nutzen.
Ich habe keine TIA um diese Schleife in einem Netzwerk zu nutzen.
Den Any von einem FC zum anderen FC (mit dem SCL Code) zu bringen ist wahrscheinlich genauso schwer wie mit AWL.

Also lasse ich die Vergleicher.

Vielen Dank für Eure Zeit und Mühe und sorry für den verbockten Thread.

Grüße Tommylik
 
Den Any von einem FC zum anderen FC (mit dem SCL Code) zu bringen ist wahrscheinlich genauso schwer wie mit AWL.
Es ist natürlich deine Entscheidung was du weiter machst. Aufgeben wäre für mich keine Option ...
Das Ganze in SCL umzuzsetzen ist überhaupt nicht schwer - ich würde dann aber da ansetzen wo das Char-Array erzeugt wird.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es ist natürlich deine Entscheidung was du weiter machst. Aufgeben wäre für mich keine Option ...
Das Ganze in SCL umzuzsetzen ist überhaupt nicht schwer - ich würde dann aber da ansetzen wo das Char-Array erzeugt wird.

Möchte ich eigentlich nicht, ich möchte aber auch nicht eure kostbare Zeit verschwenden.

Ok, ich habe eine laufende Variante mit dem Array of Char, besser und einfacher als mit dem Any.

Code:
// Baustein-Kommentar ...
//
VERSION : '1.0'
AUTHOR  : author
NAME    : name
FAMILY  : family

// Bausteinparameter
VAR_INPUT
    Start_vergl             : BOOL;                  // Trigger Signal
    Vergleich               : ARRAY[1..16] OF CHAR;               
END_VAR

VAR_IN_OUT
    // Durchgangsparameter
END_VAR

VAR_OUTPUT
    // Ausgangsparameter
    Vergleich_iO              : BOOL;
END_VAR

VAR_TEMP
    // temporäre Variablen
       i                   : INT;
              
END_VAR

BEGIN
Vergleich_iO := TRUE;

FOR i := 1 TO 12 DO
    IF Vergleich[i] < '0' OR Vergleich[i] > '9' THEN
       Vergleich_iO := FALSE;                      //unzulässiges Zeichen (ungleich '0'..'9') gefunden!
       EXIT;
          
    END_IF;
END_FOR;
END_FUNCTION


Hier ist der vergleich iO.
1707206406910.png


Hier ist er niO.
1707206543247.png


Vielen Dank Larry, dein Zureden hat geholfen.

Grüße Tommylik
 
Möchte ich eigentlich nicht, ich möchte aber auch nicht eure kostbare Zeit verschwenden.
Du verschwendest keine kostbare Zeit - wenn man etwas nicht versteht oder wissen will dann muss man fragen ... und das hat NIE etwas mit Verschwenden zu tun.
Vielen Dank Larry, dein Zureden hat geholfen.
Wenn es immer sooooo einfach ist dann immer wieder gerne - denk aber dran : die eigentliche Arbeit haben Andere gemacht ...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du verschwendest keine kostbare Zeit - wenn man etwas nicht versteht oder wissen will dann muss man fragen ... und das hat NIE etwas mit Verschwenden zu tun.

Wenn es immer sooooo einfach ist dann immer wieder gerne - denk aber dran : die eigentliche Arbeit haben Andere gemacht ...

Ja, das hast du recht, der Lob und der Dank für eure Hilfe und für den Code geht an euch. Vielen Dank.

Deine FOR-Schleife vergleicht nur die ersten 12 Zeichen anstatt alle 16. Ist das so gewollt?
Ja, das ist so gewollt. Und deine Frage hat mir eine Idee zum SCL lernen gegeben.

Hier eine neue Variante mit Trigger und Ausgang rücksetzen wenn Datensatz leer (Kein Bauteil)
Mit Anzahl Char für die Schleife.

Code:
FUNCTION X_FC1460_Vergleich : VOID
TITLE = 'Vergleich'

// Baustein-Kommentar
//
VERSION : '1.0'
AUTHOR  : author
NAME    : name
FAMILY  : family

// Bausteinparameter
VAR_INPUT
    Start_vergl             : BOOL;                  // Trigger Signal
    DS_Leer                 : BOOL;
    Anzahl_Char             : INT;
    Vergleich               : ARRAY[1..16] OF CHAR;              
END_VAR

VAR_IN_OUT
    // Durchgangsparameter
END_VAR

VAR_OUTPUT
    // Ausgangsparameter
    Vergleich_iO              : BOOL;
END_VAR

VAR_TEMP
    // temporäre Variablen
       i                   : INT;            
END_VAR

BEGIN

IF Start_vergl AND NOT DS_Leer THEN

    Vergleich_iO := TRUE;

    FOR i := 1 TO Anzahl_Char DO
        IF Vergleich[i] < '0' OR Vergleich[i] > '9' THEN
            Vergleich_iO := FALSE;                      //unzulässiges Zeichen (ungleich '0'..'9') gefunden!
        EXIT;        
        END_IF;
       
    END_FOR;
END_IF;

IF DS_Leer THEN
    Vergleich_iO := FALSE;
END_IF;
   
END_FUNCTION

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.

Was mich interessieren würde wie ich in SCL > B#16#47 und/ oder < B#16#58 eingeben müsste?

Ansonsten nochmal vielen Dank, mit diesem kleinen Baustein werden so einige Netzwerke übersichtlicher.

Grüße Tommylik
 
Was mich interessieren würde wie ich in SCL > B#16#47 und/ oder < B#16#58 eingeben müsste?
B#16#47 und B#16#58 sind falsche Grenzwerte. Wenn du unbedingt mit "magic numbers" vergleichen willst, dann müsstest du auf dezimal 47 und 58 vergleichen. Oder B#16#2F und B#16#3A. Dann musst du aber den Programmcode kommentieren, warum mit ausgerechnet diesen Zahlen verglichen wird. Ich persönlich halte den Vergleich mit den ASCII-Zeichen '0' und '9' für am verständlichsten (ohne Umweg über magic Zahlen, kein Kommentar nötig)
'0' = B#16#30 = 48, '9' = B#16#39 = 57
Probiere folgende Varianten (ungetestet, evtl. Syntax Fehler?):
Code:
IF Vergleich[I] < '0' OR Vergleich[I] > '9' THEN
oder
IF Vergleich[I] <= 47 OR Vergleich[I] >= 58 THEN
oder
IF Vergleich[I] <= B#16#2F OR Vergleich[I] >= B#16#3A THEN
 
Code:
FUNCTION X_FC1460_Vergleich : VOID
TITLE = 'Vergleich'

// Baustein-Kommentar
//
VERSION : '1.0'
AUTHOR  : author
NAME    : name
FAMILY  : family

// Bausteinparameter
VAR_INPUT
    Start_vergl             : BOOL;                  // Trigger Signal
    DS_Leer                 : BOOL;
    Anzahl_Char             : INT;
    Vergleich               : ARRAY[1..16] OF CHAR;           
END_VAR

VAR_IN_OUT
    // Durchgangsparameter
END_VAR

VAR_OUTPUT
    // Ausgangsparameter
    Vergleich_iO              : BOOL;
END_VAR

VAR_TEMP
    // temporäre Variablen
       i                   : INT;         
END_VAR

BEGIN

IF Start_vergl AND NOT DS_Leer THEN

    Vergleich_iO := TRUE;

    FOR i := 1 TO Anzahl_Char DO
        IF Vergleich[i] < '0' OR Vergleich[i] > '9' THEN
            Vergleich_iO := FALSE;                      //unzulässiges Zeichen (ungleich '0'..'9') gefunden!
        EXIT;     
        END_IF;
    
    END_FOR;
END_IF;

IF DS_Leer THEN
    Vergleich_iO := FALSE;
END_IF;
 
END_FUNCTION
Dein SCL Code hat Logik-Fehler - das geht bei IF..THEN(-Orgien) leider sehr einfach und unbemerkt!
Wenn der INPUT Start_vergl FALSE ist, dann wird dem OUTPUT kein Wert zugewiesen! Das darf bei FC nicht sein, weil der OUTPUT dann einen unkontrollierten (quasi zufälligen) Wert zurückgibt.

Außerdem sollte man einem OUTPUT nicht mehrmals etwas zuweisen! Wegen der Übersichtlichkeit, und bei FC kann das Probleme bei Multitasking machen. Also: im FC lokale (TEMP) Variable verwenden, die initialisieren bzw. garantiert etwas zuweisen, und am Ende den Wert in den OUTPUT übertragen.

Tipp: Wenn man das Vergleichsergebnis nicht als OUTPUT, sondern als Rückgabewert (Typ der Function) zurückgibt, dann kann das Ergebnis in SCL direkt verknüpft/verwendet werden: result := MyFunction(...); Bei FC-Aufruf in FUP/KOP ist der Rückgabewert der OUTPUT RET_VAL
Code:
FUNCTION X_FC1460_Vergleich : BOOL
(...)
VAR_OUTPUT
    // Ausgangsparameter
END_VAR

VAR_TEMP
    // temporäre Variablen
       i           : INT;
    Vergleich_iO   : BOOL;
END_VAR

BEGIN

Vergleich_iO := TRUE; //unbedingt initialisieren!
IF Start_vergl AND NOT DS_Leer THEN
    FOR i := 1 TO Anzahl_Char DO
        IF Vergleich[i] < '0' OR Vergleich[i] > '9' THEN
            Vergleich_iO := FALSE; //unzulässiges Zeichen (ungleich '0'..'9') gefunden!
            EXIT;
        END_IF;
    END_FOR;
END_IF;

X_FC1460_Vergleich := Vergleich_iO AND Start_vergl AND NOT DS_Leer; //Ergebnis in Rückgabewert

END_FUNCTION
 
Zuletzt bearbeitet:
Zurück
Oben