Step 7 Datenbaustein durchsuchen

Arzgebirgsoz

Level-1
Beiträge
20
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
Für eine OEE-Erfassungssoftware brauche ich aus der Steuerung ein Signal, welches so lange anliegt, wie die diese Anlage theoretisch bräuchte, um den Prozess auszuführen,
mein Problem ist nun, dass diese Anlage knapp 800 verschiedene Rezepturen abarbeitet und für jede unterschiedlich lange braucht, die Zeiten wie lange habe ich und könnte sich auch in Blöcken zusammenfassen, d.h. Rezept a, b und c dauern 5 Minuten, d, e und f 10 usw. meine Idee war jetzt jede Rezepturnummer mit der gleichen Zeit in einen Datenbaustein abzulegen.
Nur wie ich jetzt die aktuelle Rezeptnummer in den Datenbausteinen finde, um anhand der DB-Nr. die Zeit zuzuordnen, dafür habe ich noch keine Idee und hoffe, mir kann jemand helfen.
 
Ich würde in einem einzelnen DB für jedes Rezept eine eigene Zeitangabe machen und dann per Rezeptnummer einen Pointer generieren, der direkt zur passenden Adresse im DB zeigt und die Zeit dort auslesen.
 
Nein, die Rezeptnummer kommt aus einem übergeordneten System übertragen und auf einer Visu angezeigt, für den Start des Prozesses hätte ich eine Taste.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Und pro Rezept eine Zeit sind zu viele Variablen?Dann könntest du ja die Rezeptzeit -->aktuelleRezeptZeit kopieren mit der Taste.
Und mit dem Tastendruck einen verlängerten Impuls starten mit dieser Zeit.Hmmm.

Es gibt ja keine Verknüpfung zwischen der Rezeptnummer und der Zeit?So in der Art von Nummer x bis Nummer y ist gleich Zeit 1 , u.s.w
 
Hi!

Wie groß/lang ist denn die "Rezeptnummer"? Welcher Steuerungstyp wird verwendet?

Wenn die Rezeptnummer in einen 32bit DWord/Int passt und die Zeiten ebenfalls als TIME (also 32bit) abgespeichert wären, wären das bei 800 "Rezepten" 6400 Byte.

Ich würde ein Array in einem DB anlegen in dem pro Element diese beiden Informationen gespeichert sind. Die Erstellung dieses "konstanten" Arrays kann man schön mit Excel und einer AWL-Quelle machen. Um eine schnelle Suche zu bekommen, könnte das Array bspw. aufsteigend nach der Rezeptnummer sortiert sein. Mit einer binären Suche verkürzt sich die Suchzeit (nach der Rezeptnummer) damit schonmal (Komplexität O(log(n)) anstelle von O(n)).

Gruß
Max
 
danke erst mal für Deine Antwort,
Naja, zu viele ist relativ, ich habe halt bisher noch wenig Erfahrung mit der Pointerprogrammierung und habe gerade keinen Plan, wie ich vom Finden der Rezeptnummer zur
zugehörigen Zeit komme.
Und nein, die zugehörigen Zeiten sind vollkommen unterschiedlich.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
Die Rezeptnummer hat 7 bis 8 Stellen und liegt als DInt vor, die zeit wäre als S5Time, zwar hübscher, Time wurde aber auch gehen, wozu gibt es IEC- Timer.
mein Problem ist die Pointergeschichte, wie ich von der Nummer auf die Zeit komme.
 
Wüsste ich jetzt auch nicht.Kannst du die Zeit pro Datensatz nachtragen ohne die Adressen zu verschieben?Dann kannst du ja die rezeptvariable umkopieren auf die aktuell Zeit mit der Taste.Irgenwann kommt die TastenFlanke an und du machst einen verlängerten Impuls.

Man muss schauen ob die aktuelleZeit dann aus dem Rezept schon übernommen wurde.

Ich weiss jetzt nur nicht ob während der Impuls läuft das Rezept geändert werden kann.Dann müsste man rücksetzten.
Das ginge dann nur über AltRezeptname und NeuRezeptname(Altwert/Neuwertvergleich) der sich geändert hat während der Impuls läuft.
 
Oder noch einfacher wäre natürlich wenn sie dir den Rezeptindex 1-800 pro Rezept geben im Leitsystem.
Dann könntest du direkt über den Index(array) auf die Zeit zugreifen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wäre es nicht sinnvoller die Zeiten ins Leitsystem bzw. in die OEE Software zu übernehmen und von da je nach Rezept ausspucken zu lassen?
Ich verstehe das ja so das du anhand des Rezeptes eine Zeit ermitteln willst und dann einen Ausgang nach dieser Zeit setzen willst damit das OEE System diese Zeit erfaßt und dann auswertet? Da rennste ja mit der Kirche ums Dorf. Naja, muß jeder selber wissen.
Kannste evtl. die Zeit anhand der Rezeptnummer ausrechnen? Die Anlage muß ja das Rezept irgendwie umsetzen und je nachdem wie das zerlegt wird, könnte man sich da evtl. eine Funktion schreiben die die Zeit kalkuliert. Das wäre dann auch gleich flexibel und man muß das nicht für jedes neue Rezept anfassen. Für so etwas 800 DINT mit einer Zeit zu hinterlegen und das dann duchrwühlen zu müssen geht auf die Zykluszeit und verbraucht haufen Speicher für nix und wieder nix.
 
Sinnvoller ja, mit der Übernahme ins Leitsystem tut sich der Anbieter davon aber schwer und bei der OEE-Software geht jede Abweichung vom Standard gar nicht, leider,
und da es sich bei dem Prozess um einen mit mehreren teilweise von Hand ausgeführten Prozessen handelt, die so vielen Einflüssen unterliegen soll ja die theoretische Zeit angesetzt werden und wenn nach der der Prozess nicht beendet ist sollen die Ursachen dafür abgefragt werden. Aber stimmt schon, das ganze frisst jede Menge Speicher und vielleicht werde ich mir ja doch mit dem einen Programmierer des Leitsystems auf dem kleinen Dienstweg einig.
danke für Deine Hinweise.
 
Hi,

so wie sich das liest programmierst du in AWL? Eine Programmierung rund um Arrays in SCL ist nämlich sehr einfach und du brauchst absolut nicht mit Pointern (egal welcher Art) zu hantieren.

Mein Beispiel mit dem TIME-Typ war nur ein Beispiel. Eine S5TIME (16bit) ist natürlich auch verwendbar.

Gruß
Max
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Naja, jede Menge Speicher?
Ein DB mit 800 Ints oder Time-Vars und 3 Zeilen SCL-Code?

So wie ich deine Lage im Moment einschätze wird ohnehin irgendwer Rezeptbezogen eine "Sollzeit" vorgeben müssen, egal wo.

Also DB, Symbol MyDB:
Daten : ARRAY[0..1000] OF Time ;

SCL-Schnittstelle:
IN: Rezeptnummer : INT
OUT: Sollzeit : TIME
OUT: Error : BOOL

Error := Rezeptnummer < 0 OR Rezeptnummer > 1000 ;

IF NOT Error THEN
Sollzeit := MyDB.Daten[Rezeptnummer] ;
ELSE
Sollzeit := T#10d ; // oder irgend ein anderer Default-Wert.
END_IF;

Mfg
Manuel
 
Richtig, SCL habe ich bisher nur gehört, daß es das gibt, aber jetzt ist es wohl an der Zeit, sich damit mal auseinanderzusetzen.
ich danke für Eure Tipps!!!
 
Achtung @ Manuel:

Deine Lösung funktioniert nur dann, wenn die Rezeptnummern durchnummeriert sind von 0-1000. Besser wäre die folgende Struktur:
Code:
Daten: ARRAY[0..1000] OF STRUCT
    Nummer: DInt;
    Zeit: TIME;
END_STRUCT;

Der Code (Lineare Suche) würde in SCL dann so aussehen (basierend auf Manuels SCL-Schnittstelle):

Code:
BEGIN
     FOR tmpI := 0 to 1000 DO
        IF (MyDB.Daten[tmpI].Nummer = Rezeptnummer) THEN
            Sollzeit := MyDB.Daten[Rezeptnummer].Zeit;
            RETURN;
        END_IF;
     END_FOR;

    Sollzeit := T#10d;
END_FUNCTION;

Gruß
Max
 
Zurück
Oben