Strings in Von einem DB in einem DB

Beiträge
3
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebe Nutzergemeinde.

Ich habe da ein Problem. Ich habe mit WIN CC flex eine Rezepturverwaltung erstellt. Allerdings habe ich 40 diverse Materialien. Bei einem Rezept werden immer max. 7 benötigt. Jetzt wollte ich in SCL einfach ein Abfrage Programmieren indem ich die Menge > 0 Abfrage und dannach den dazugehörigen STRING [20] per BLOCKMOVE übersende.

Wenn ich die OUTPUT Variable direkt angebe, funktioniert auch alles super. Nur habe ich leider 7 Behälter die ich beschreiben muss. Daher wollte ich eine Schleife nehmen, die ich 7 mal durchlaufe und mit einem array[7] den Index einer Varibale beschreibe. Diese übergege ich dann in den OUTPUT. Leider klappt es nicht über die Variable. Habt ihr vielleicht eine Idee woran es liegen könnte?

Es ist eine große Zuordnung, aber ich habe immoment keine andere Idee außer diese. Oder muss ich einen FB nehmen, der speichter ja die Zwischenwerte. Allerdings ist dabei das Problem das der Pointer die String variablen nicht übergibt.

Ich bin echt um jeden Ratschlag dankbar

FUNCTION FC51 :VOID

VAR_INPUT
Mat_Na1: STRING[22];
Mat_Na2: STRING[22];
Mat_Na3: STRING[22];
Mat_Na4: STRING[22];
Mat_Na5: STRING[22];
Mat_Na6: STRING[22];
Mat_Na7: STRING[22];
Mat_Na8: STRING[22];
Mat_Na9: STRING[22];
Mat_Na10: STRING[22];
Mat_Na11: STRING[22];
Mat_Na12: STRING[22];
Mat_Na13: STRING[22];
Mat_Na14: STRING[22];
Mat_Na15: STRING[22];
Mat_Na16: STRING[22];
Mat_Na17: STRING[22];
Mat_Na18: STRING[22];
Mat_Na19: STRING[22];
Mat_Na20: STRING[22];


Mat_Nr1:INT;
Mat_Nr2:INT;
Mat_Nr3:INT;
Mat_Nr4:INT;
Mat_Nr5:INT;
Mat_Nr6:INT;
Mat_Nr7:INT;
Mat_Nr8:INT;
Mat_Nr9:INT;
Mat_Nr10:INT;
Mat_Nr11:INT;
Mat_Nr12:INT;
Mat_Nr13:INT;
Mat_Nr14:INT;
Mat_Nr15:INT;
Mat_Nr16:INT;
Mat_Nr17:INT;
Mat_Nr18:INT;
Mat_Nr19:INT;
Mat_Nr20:INT;
END_VAR

VAR_OUTPUT
Mat_Na_Behaelter1:STRING[22];
Mat_Na_Behaelter2:STRING[22];
Mat_Na_Behaelter3:STRING[22];
Mat_Na_Behaelter4:STRING[22];
Mat_Na_Behaelter5:STRING[22];
Mat_Na_Behaelter6:STRING[22];
Mat_Na_Behaelter7:STRING[22];
END_VAR

VAR
Mat_Na_Be:ARRAY[1..7] OF STRING[22];
Mat_Na_Be8:STRING[22];
Mat_Nummer1:INT;
Mat_Nummer2:INT;
Mat_Nummer3:INT;
Mat_Nummer4:INT;
Mat_Nummer5:INT;
Mat_Nummer6:INT;
Mat_Nummer7:INT;
Mat_Nummer8:INT;
Mat_Nummer9:INT;
Mat_Nummer10:INT;
Mat_Nummer11:INT;
Mat_Nummer12:INT;
Mat_Nummer13:INT;
Mat_Nummer14:INT;
Mat_Nummer15:INT;
Mat_Nummer16:INT;
Mat_Nummer17:INT;
Mat_Nummer18:INT;
Mat_Nummer19:INT;
Mat_Nummer20:INT;
zaehler:INT;
iSFCError:INT;
test:INT;
END_VAR

//Zuweisung Eingänge
Mat_Nummer1:=Mat_Nr1;
Mat_Nummer2:=Mat_Nr2;
Mat_Nummer3:=Mat_Nr3;
Mat_Nummer4:=Mat_Nr4;
Mat_Nummer5:=Mat_Nr5;
Mat_Nummer6:=Mat_Nr6;
Mat_Nummer7:=Mat_Nr7;
Mat_Nummer8:=Mat_Nr8;
Mat_Nummer9:=Mat_Nr9;
Mat_Nummer10:=Mat_Nr10;
Mat_Nummer11:=Mat_Nr11;
Mat_Nummer12:=Mat_Nr12;
Mat_Nummer13:=Mat_Nr13;
Mat_Nummer14:=Mat_Nr14;
Mat_Nummer15:=Mat_Nr15;
Mat_Nummer16:=Mat_Nr16;
Mat_Nummer17:=Mat_Nr17;
Mat_Nummer18:=Mat_Nr18;
Mat_Nummer19:=Mat_Nr19;
Mat_Nummer20:=Mat_Nr20;



test:=zaehler;
FOR zaehler := 1 TO 7 BY 1 DO
IF Mat_Nummer1 > 0 THEN
iSFCError:=SFC20(SRCBLK:=Mat_Na1,DSTBLK:=Mat_Na_Behaelter1);
Mat_Nummer1:=0;
ELSIF Mat_Nummer2 > 0 THEN
iSFCError:=SFC20(SRCBLK:=Mat_Na2,DSTBLK:=Mat_Na_Be[zaehler];
Mat_Nummer2:=0;
ELSIF Mat_Nummer3 > 0 THEN
iSFCError:=SFC20(SRCBLK:=Mat_Na3,DSTBLK:=Mat_Na_Be[zaehler]);
Mat_Nummer3:=0;
ELSIF Mat_Nummer4 > 0 THEN
iSFCError:=SFC20(SRCBLK:=Mat_Na4,DSTBLK:=Mat_Na_Be[zaehler]);
Mat_Nummer4:=0;
ELSIF Mat_Nummer5 > 0 THEN
iSFCError:=SFC20(SRCBLK:=Mat_Na5,DSTBLK:=Mat_Na_Be[zaehler]);
Mat_Nummer5:=0;
ELSIF Mat_Nummer6 > 0 THEN
iSFCError:=SFC20(SRCBLK:=Mat_Na6,DSTBLK:=Mat_Na_Be[zaehler]);
Mat_Nummer6:=0;
ELSIF Mat_Nummer7 > 0 THEN
iSFCError:=SFC20(SRCBLK:=Mat_Na7,DSTBLK:=Mat_Na_Be[zaehler]);
Mat_Nummer7:=0;
ELSIF Mat_Nummer8 > 0 THEN
iSFCError:=SFC20(SRCBLK:=Mat_Na8,DSTBLK:=Mat_Na_Be[zaehler]);
Mat_Nummer8:=0;
ELSIF Mat_Nummer9 > 0 THEN
iSFCError:=SFC20(SRCBLK:=Mat_Na9,DSTBLK:=Mat_Na_Be[zaehler]);
Mat_Nummer9:=0;
ELSIF Mat_Nummer10 > 0 THEN
iSFCError:=SFC20(SRCBLK:=Mat_Na10,DSTBLK:=Mat_Na_Be[zaehler]);
Mat_Nummer10:=0;
ELSIF Mat_Nummer11 > 0 THEN
iSFCError:=SFC20(SRCBLK:=Mat_Na11,DSTBLK:=Mat_Na_Be[zaehler]);
Mat_Nummer11:=0;
ELSIF Mat_Nummer12 > 0 THEN
iSFCError:=SFC20(SRCBLK:=Mat_Na12,DSTBLK:=Mat_Na_Be[zaehler]);
Mat_Nummer12:=0;
ELSIF Mat_Nummer13 > 0 THEN
iSFCError:=SFC20(SRCBLK:=Mat_Na13,DSTBLK:=Mat_Na_Be[zaehler]);
Mat_Nummer13:=0;
ELSIF Mat_Nummer14 > 0 THEN
iSFCError:=SFC20(SRCBLK:=Mat_Na14,DSTBLK:=Mat_Na_Be[zaehler]);
Mat_Nummer14:=0;
ELSIF Mat_Nummer15 > 0 THEN
iSFCError:=SFC20(SRCBLK:=Mat_Na15,DSTBLK:=Mat_Na_Be[zaehler]);
Mat_Nummer15:=0;
ELSIF Mat_Nummer15 > 0 THEN
iSFCError:=SFC20(SRCBLK:=Mat_Na15,DSTBLK:=Mat_Na_Be[zaehler]);
Mat_Nummer15:=0;
ELSIF Mat_Nummer16 > 0 THEN
iSFCError:=SFC20(SRCBLK:=Mat_Na16,DSTBLK:=Mat_Na_Be[zaehler]);
Mat_Nummer16:=0;
ELSIF Mat_Nummer17 > 0 THEN
iSFCError:=SFC20(SRCBLK:=Mat_Na17,DSTBLK:=Mat_Na_Be[zaehler]);
Mat_Nummer17:=0;
ELSIF Mat_Nummer18 > 0 THEN
iSFCError:=SFC20(SRCBLK:=Mat_Na18,DSTBLK:=Mat_Na_Be[zaehler]);
Mat_Nummer18:=0;
ELSIF Mat_Nummer19 > 0 THEN
iSFCError:=SFC20(SRCBLK:=Mat_Na19,DSTBLK:=Mat_Na_Be[zaehler]);
Mat_Nummer19:=0;
ELSIF Mat_Nummer20 > 0 THEN
iSFCError:=SFC20(SRCBLK:=Mat_Na20,DSTBLK:=Mat_Na_Be[zaehler]);
Mat_Nummer20:=0;
END_IF;


Mat_Na_Behaelter1:=Mat_Na_Be8;
Mat_Na_Behaelter2:=Mat_Na_Be[2];
Mat_Na_Behaelter3:=Mat_Na_Be[3];
Mat_Na_Behaelter4:=Mat_Na_Be[4];
Mat_Na_Behaelter5:=Mat_Na_Be[5];
Mat_Na_Behaelter6:=Mat_Na_Be[6];
Mat_Na_Behaelter7:=Mat_Na_Be[7];


test:=zaehler;
END_FOR;
 
Du kannst Dir das Leben deutlich leichter machen, wenn Du mit Datentypen (UDT) und ARRAYS arbeitest. Überlege zunächst, was alles zu einer Rezeptur gehört. Das fasst Du in einem UDT zusammen und legst ein Array von diesem UDT an. Dann kannst Du mit der Schleife sehr schön auf die einzelnen Arrayfelder gucken und musst nicht so viel umkopieren. Das spart etwa 80% des aktuellen Codes...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich habe dein Vorhaben nicht wirklich verstanden - sorry ...
Allerdings würde ich das, was ich verstanden habe, so angehen :
- Das Ganze als FB erstellen.
- Die Mat_Na-Strings im Stat-Bereich des FB deklarieren (als Array of String) und die Visu dort die Daten hineinschreiben lassen.

Dis Ausgabe der Daten (nach welche Kriterium ?) erfolgt nach wohin ?

Gruß
Larry
 
Ich verstehs auch nicht so ganz falls es dich beruhigt^^ Ich würde mich also ebenfalls über weitere Erläuterungen freuen ;-)
 
Formuliere doch erst einmal. Oft versteht man dann auch die Dinge plötzlich, wenn man versucht etwas zu formulieren... ;)

Wieviele Rezepturen gibt es?

Was gehört zu einer Rezeptur? (Elemente benennen und Datentyp angeben)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo.
Ich das Problem das ich über Win CC flex eine Rezepturverwaltung machen muss. Soweit kein Problem. Habe da die 40 Materialen in 1 Rezeptur zusammengefasst. Als Datensatz hab ich ca. 40 Mischungen. Wobei eine Mischung nur aus max.7 Materialen bestehen kann.
Bei der Rezeptverwaltung habe ich allerdings das Problem, das mir dann 34 Materialen mit 0 angezeigt werden. Diese solle ich Herausfiltern.
Da dachte ich mir es ist vielleicht einfacher die 7 Materialien rauszufiltern. Dazu dient die Abfrage, aber das muss doch noch irgendwie kürzer und schöner gehen. Ich frage einfach ab ob Material 1 - 40 den Wert 0 haben(wobei der Wert in INT gehandhabt wird) Wenn ja so wird der zugehörige Name in einem Ausgabefeld angezeigt.

Ich hoffe das ich es jetzt verständlicher ausgedrückt habe, wenn nicht bitte nochmal fragen.
 
Was verwendest du denn für eine Visu ? Wenn die Script-fähig ist dann könnte man das auch sehr elegant dort erledigen.
Ansonsten bleibe ich bei dem Vorschlag, die Visu-Daten komplett dem SCL-DB in seine Instanz zu übergeben und sie von dem DB dann (für die Visu) auswerten und umsortieren zu lassen.
In dem Fall kannst du dann auch (wie schon im Beitrag #2 von Tigerente erwähnt) die SCL-Fähigkeiten hinsichtlich Array's und Schleifen voll ausspielen und dadurch viel durchschaubareren (und kürzeren) Code erzeugen ...

Gruß
Larry
 
Zuletzt bearbeitet:
Ja, die Visu ist Skriptfähig. Ich benutze ein Skript um ein Protokoll zu erstellen.

Also wäre das auch noch eine Option.

Aber am schönsten ist es dann doch wohl mit einem UDT.

Sofern erst mal wieder ein Gang ins Büro ;)

Ich danke euch allen vielmals.

Gruß
 
Zurück
Oben