Für was, möchtest du jetzt fertigen Code?Dankeschön!
Du kannst den DB z.b. mit einer FOR Schleife durchsuchen und bei einem Fund entsprechend reagieren. Wenn nein dann eben auch entsprechend reagieren.Überprüfung ob Nummer vorhanden
INPUT
Nummer_IN : Int
Aktueller_Wert_IN : Int
Neue_Nummer_IN : Bool
OUTPUT
Wert_OUT : Int
STATIC
Produktnummer : Array[0..10000] of Int
Wert : Array[0..10000] of Int
Laufvariable : Int
Laufwert : Int
Neue_Nummer : Bool
IF #Neue_Nummer_IN
THEN
#Neue_Nummer := TRUE;
END_IF;
IF #Neue_Nummer
THEN
FOR #Laufvariable := 1 TO #Laufwert BY +1 DO
IF #Produktnummer[#Laufvariable] = #Nummer_IN
THEN
#Wert_OUT := #Wert[#Laufvariable];
#Laufwert := #Laufvariable;
#Neue_Nummer := FALSE;
END_IF;
END_FOR;
IF #Laufvariable = #Laufwert
THEN
#Produktnummer[#Laufvariable] := #Nummer_IN;
#Wert[#Laufvariable] := #Aktueller_Wert_IN;
#Laufwert := #Laufvariable + 1;
#Neue_Nummer := FALSE;
END_IF;
END_IF;
Hier wäre ein Ansatz. Geht das in die richtige Richtung?
Produktnummer : Array[0..10000] of Int
Wert : Array[0..10000] of Int
IF #Neue_Nummer_IN
THEN
#Neue_Nummer := TRUE;
END_IF;
#Neue_Nummer := #Neue_Nummer_IN;
for #i := 0 to 9999 do
#tmpFoundProductNo := (Product[#i].No = #Nummer_IN);
if tmpFoundProductNo then
exit;
end_if;
end_for;
If tmpFoundProductNo then
#out := Product[#i].Value;
else
for #i := 0 to 9999 do
// naechsten freien Platz suchen und nummer eintragen, danach schleife verlassen
end_for;
end_if;
Zudem wird der Barcodeleser ja wahrscheinlich einen string oder array[0..n] of char liefern und keinen rein numerischen Wert.INT ist zu klein für 1234567
Geht das wirklich, Mario? Bezüglich Anlegen eines neuen DB zur Laufzeit habe ich keine Bedenken, aber einen DB zur Laufzeit per Befehl löschen?Danach den alten DB löschen.
Ja, das geht. Einschränkung: Es können nur DBs gelöscht werden, die zuvor mit create_DB erzeugt wurden.Geht das wirklich, Mario? Bezüglich Anlegen eines neuen DB zur Laufzeit habe ich keine Bedenken, aber einen DB zur Laufzeit per Befehl löschen?
Ja, das geht. Das ging auch schon auf der S7-300/400 ( CREAT_DB / DEL_DB ).Geht das wirklich, Mario? Bezüglich Anlegen eines neuen DB zur Laufzeit habe ich keine Bedenken, aber einen DB zur Laufzeit per Befehl löschen?
Beschreibung
Mit der SFC 22 "CREAT_DB" (create data block) erzeugen Sie im Anwenderprogramm einen Datenbaustein, der keine vorbesetzten Werte enthält. Er enthält stattdessen Zufallsdaten. Die SFC erzeugt einen Datenbaustein mit einer Nummer aus einem angegebenen Bereich sowie mit vorgegebener Größe. Aus dem angegebenen Bereich vergibt die SFC die kleinste mögliche Nummer an den DB. Einen DB mit bestimmter Nummer erzeugen Sie, indem Sie der Ober- und Untergrenze des vorzugebenden Bereichs die gleiche Nummer geben. Die Nummern der im Anwenderprogramm bereits enthaltenen DBs können Sie nicht mehr vergeben. Die Länge des DBs müssen Sie in einer geraden Zahl angeben.
Beschreibung
Mit der SFC 23 "DEL_DB" (delete data block) löschen Sie einen im Arbeitsspeicher und gegebenenfalls im Ladespeicher der CPU liegenden Datenbaustein. Der zu löschende DB darf weder in der aktuellen noch in einer niederprioren Ablaufebene aufgeschlagen sein. D. h., er darf weder in einem der beiden DB-Register noch im B-Stack eingetragen sein. Bei Aufruf der SFC 23 startet die CPU sonst den OB 121. Wenn der OB 121 nicht vorhanden ist, wechselt die CPU in STOP; bei S7-300 (Ausnahme: CPU 318) erfolgt das Löschen des DB ohne Aufruf des OB 121.
HinweisDas Löschen von Instanz-DBs mit der SFC 23 "DEL_DB" ist nicht sinnvoll und führt stets zu Programmfehlern. Vermeiden sie daher das Löschen von Instanz-DBs mit der SFC 23!
Na klar. Aber zumindest "winzig kleine" DatenBanken können durchaus in einer SPS realisiert werden.Sowas macht man doch eigentlich über Datenbanken, ...
Wenn die DatenSätze nach der Grösse des SuchBegriffs sortiert werden können, dann kann man recht schnell "binär" suchen und finden.Der DB wird immer größer und die Suche länger und dadurch auch die Zykluszeit..
Du meinst anscheinend nicht, dass Deine "Datenbank" zusätzlich in einer csv-Datei gespeichert werden soll, sondern ausschliesslich in der Datei.... vielleicht lohnt sich ja auch der Aufwand eine csv File zu schreiben und lesen.. dann hat man das ganze nicht auf der Steuerung liegen..
Hab bisher nur mit csv Dateien im HMI gearbeitet (lesen, schreiben, suchen) und das ging eigentlich sehr gut. Wie man sieht gibts einige Möglichkeiten das zu lösen
Zudem wird der Barcodeleser ja wahrscheinlich einen string oder array[0..n] of char liefern und keinen rein numerischen Wert.
Also brauchst Du am besten ein Array[0..n] of Struct. In der Struct ein Array[0..n] of char und ein int.
Theoretisch könnte man bei einer neuen Nummer einen neuen DB erstellen, der groß genug ist. Dann den Inhalt des alten DBs hineinkopieren und den neuen Datensatz hinzufügen. Danach den alten DB löschen. Allerdings geht das m.W. nur mit nicht optimierten DBs und auch nur mit einem (großen) Array[0..n] of byte.
Aber es wäre eine Möglichkeit.
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?
We use cookies and similar technologies for the following purposes:
Do you accept cookies and these technologies?