DB nach Werten durchsuchen - SCL ?

karsten.schmidt

Level-1
Beiträge
4
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

suche eine einfache Lösung für folgende Aufgabe:

Ein Datenbaustein mit 50 INT-Werten, mit Werten zwischen 1 und 100 muss wie folgt durchsucht und ausgewertet werden.

-Ist in einer der Felder die Zahl 1 vorhanden ? Wenn ja den Ausgang 1 mit TRUE belegen.
-Ist in einer der Felder die Zahl 2 vorhanden ? Wenn ja den Ausgang 2 mit TRUE belegen.
.
.
.
-Ist in einer der Felder die Zahl 100 vorhanden ? Wenn ja den Ausgang 100 mit TRUE belegen.

Habe mir überlegt diese Aufgabe mit SCL und Schleifen zu lösen.
Da ich im Thema SCL jedoch noch "Anfänger" bin :confused: würde ich mich freuen, wenn mir jemand einen Lösungsansatz machen könnte.
Der FB/FC sollte einen INPUT haben, an dem der zugehörige DB festgelegt werden kann.

Bin für alle Tips dankbar !!! :D
 
Ein Datenbaustein mit 50 INT-Werten, mit Werten zwischen 1 und 100 muss wie folgt durchsucht und ausgewertet werden.

-Ist in einer der Felder die Zahl 1 vorhanden ? Wenn ja den Ausgang 1 mit TRUE belegen.
-Ist in einer der Felder die Zahl 2 vorhanden ? Wenn ja den Ausgang 2 mit TRUE belegen.
.
.
.
-Ist in einer der Felder die Zahl 100 vorhanden ? Wenn ja den Ausgang 100 mit TRUE belegen.

Muss der DB festgelegt werden können? Viel einfacher wäre es wenn die zu durchsuchenden Daten im Datenbaustein auch als Array of Int angelegt sind.
Dann sähe das in SCL auch viel eleganter aus:
Code:
FUNCTION FC2000 : VOID

VAR_INPUT
    DATA: ARRAY[1..50] OF INT;
END_VAR

VAR_IN_OUT
    OUT1 : ARRAY[1..100] OF BOOL;
END_VAR

VAR_TEMP
    i : INT;
    x : INT;
END_VAR

BEGIN
    // Ausgangsarray initialisieren
    FOR i := 1 TO 100 DO
        OUT1[i] := false;
    END_FOR;
    
    FOR i := 1 TO 50 DO
        x := DATA[i];
        IF x >= 1 AND x <= 100 THEN
            OUT1[x] := true;
        END_IF;
    END_FOR;       
    
END_FUNCTION
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn du das mit einstellbarem DB machen willst:
Parameter vom Typ Block_DB nehmen und evtl. das Startbyte einstellbar machen:
Code:
DB_NUM : BLOCK_DB;  // Datenbausteinnummer
START_DW : INT;     // Startadresse im DB
Und in der Schleife dann Zugriff über eine temp-Variable "dw" mit

Code:
dw := START_DW;
// Schleife start
x := WORD_TO_INT(DB_NUM.DW[dw]);
// Schleife ende

dw musst du dann pro Schleifendurchlauf um 2 erhöhen.
 
Zurück
Oben