Step 7 Niedrigsten Wert aus einem Variablenarchiv (DB) ermitteln

DennisBerger

Level-2
Beiträge
436
Reaktionspunkte
61
Zuviel Werbung?
-> Hier kostenlos registrieren
hallo,
ich speichere innerhalb von 180 sekunden 900 Druckwerte, die mal x-beliebig höher mal niedriger sind in einem DB.

Nun möchte ich aus dieser Liste den niedrigsten Wert ermitteln.

Hat jemand ein Idee wie ich das am Besten umsetze?

edit:
Software Step7 V5.6
Steuerung: CPU315-2
HMI: TP Comfort Panel

danke euch.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin,
wie Delta schon sagt, ist das prima in SCL zu erledigen. Du schaust dir den ersten Wert an, vergleichst ihn mit dem zweiten, und merkst dir den niedrigeren von beiden. Dann vergleichst du den gemerkten Wert mit dem dritten Eintrag usw...
Oder aber man ändert das Eintragen in diesen Druckwerte-DB, sodass hier schon entschieden wird, dass der einzutragende Wert niedriger als der aktuell niedrigste Wert ist. So könnte man sich das zykluszeitfressende DB-durchsuchen gänzlich sparen. Ist aber alles eine Konzeptfrage.
 
hab die Steuerungsinfos oben dazu geschrieben
edit:
Software Step7 V5.6
FUP und ein wenig AWL
Steuerung: CPU315-2
HMI: TP Comfort Panel


Danke euch, mit SCL hab ich leider keine Erfahrung, wie würde das aussehen (hoffe ist nicht zu viel Aufwand),
wäre lieb, wenn mir da jemand hilft
(gibt keine Vorgaben für die Sprache beim Projekt)

Oder aber man ändert das Eintragen in diesen Druckwerte-DB, sodass hier schon entschieden wird, dass der einzutragende Wert niedriger als der aktuell niedrigste Wert ist. So könnte man sich das zykluszeitfressende DB-durchsuchen gänzlich sparen. Ist aber alles eine Konzeptfrage.
Das wäre vielleicht ne idee
die Variablenspeicherung erfolgt momentan so:

L "DB_FA_Kurve".FA_Index_Kurve
L 900
<=I
U "DB_FA_Verwaltung".FA_Pruefung_laeuft
SPBN AAAA


L "DB_FA_Kurve".FA_Index_Kurve
L 4
*I
ITD
SLD 3
T #index
LAR1 #index


AUF "DB_FA_Kurve"


L #FA_Pruefdruck_Ist_Real
T DBD [AR1,P#0.0]


U "DB_FA_Verwaltung".FA_Pruefung_laeuft
SPBN AAAA


L "DB_FA_Kurve".FA_Index_Kurve
L 1
+I
T "DB_FA_Kurve".FA_Index_Kurve
 
Zuletzt bearbeitet:
Um das in SCL schön lesbar zu machen, sollten deine Druckwerte im DB als Array angelegt sein. Wie sieht der DB denn aktuell aus?
Um hingegen direkt beim Eintragen eines neuen Werts eine Prüfung (ob Wert kleiner) vorzunehmen, könnte man den aktuell niedrigsten Wert als ersten DB-Eintrag speichern. Soll ein neuer Wert gespeichert werden, dann läuft dein oben geschriebener Code ganz normal zum eintragen ab und zugleich prüfst du ob dein neuer Wert kleiner dem ersten DB-Eintrag (=aktuell niedrigster) ist. Wenn ja, dann überschreibst du den ersten Eintrag mit dem neuen kleinsten Wert.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
HI Howard, siehe oben, im DB "DB_FA_Kurve" werden die Daten abgelegt.
Prüfdruck_IST_real ist der Variablenwert

Man müsste den awl code dann ergänzen?
 
Zuletzt bearbeitet:
Das beantwortet nicht ganz meine Frage. Wie sieht die Deklaration vom DB_FA_Kurve aus?
Code:
[COLOR=#333333]L "DB_FA_Kurve".FA_Index_Kurve[/COLOR]
[COLOR=#333333]L 4[/COLOR]
[COLOR=#333333]*I [/COLOR]
[COLOR=#333333]ITD [/COLOR]
[COLOR=#333333]SLD 3[/COLOR]
[COLOR=#333333]T #index[/COLOR]
[COLOR=#333333]LAR1 #index
[/COLOR]
Das lässt mich vermuten, dass der Erste Eintrag im DB der aktuelle Index für die Position der DB-Einträge ist und danach einfach 900 Real-Variablen liegen?
 
Hallo Howard,
entschuldige bitte, war gestern nicht mehr online.

Ja genau, es werden 900 Real Werte nach und nach in den DB "DB_FA_Kurve" geschrieben, genau wie du es beschrieben hast.
Beginnend mit Pointer 0.0


Es gibt im FB auch noch die Variable "FA_Prufdruk_Speicher" (Array 0-899) beginnend bei 0.0

dies ist vorgesehen beim Neustart einer Messung alles auf 0 zu schreiben (fill) und den Prüfdruckspeicher damit zu leeren.

Code:
Netzwerk 1: Wertespeicher leeren
U M100.0  //Start löschen
L 0.000000e+000
T #Null_real

CALL "FILL"
BVAL :=#Null_real
RET_VAL:=#Ret_Val_SFC
BLK :="DB_FA_Kurve".FA_Prufdruk_Speicher       //( ist Array 0..899)


Netzwerk 2: 900 Werte aufnehmen 
[COLOR=#333333][FONT=Verdana]L "DB_FA_Kurve".FA_Index_Kurve[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]L 900[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]<=I [/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]U M100.1  //Schrittkette läuft[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]SPBN AAAA[/FONT][/COLOR]


[COLOR=#333333][FONT=Verdana]L "DB_FA_Kurve".FA_Index_Kurve[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]L 4[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]*I [/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]ITD [/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]SLD 3[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]T #index[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]LAR1 #index[/FONT][/COLOR]


[COLOR=#333333][FONT=Verdana]AUF "DB_FA_Kurve"[/FONT][/COLOR]


[COLOR=#333333][FONT=Verdana]L #FA_Pruefdruck_Ist_Real[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]T DBD [AR1,P#0.0][/FONT][/COLOR]


[COLOR=#333333][FONT=Verdana]U "DB_FA_Verwaltung".FA_Pruefung_laeuft[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]SPBN AAAA[/FONT][/COLOR]


[COLOR=#333333][FONT=Verdana]L "DB_FA_Kurve".FA_Index_Kurve[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]L 1[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]+I [/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]T "DB_FA_Kurve".FA_Index_Kurve[/FONT][/COLOR]


Hat jemand eine Idee / Lösung wie man da den niedrigsten Wert am geschicktesten ermittelt?
danke euch für eure Hilfe
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin nochmal,
wie gesagt, man müsste sich entscheiden ob man den DB mit den 900 gespeicherten Werten nach dem Minimum durchsuchen möchte oder aber an den Stellen die den DB füllen direkt eine Prüfung vornimmt. Letzteres könnte so oder so ähnlich in deinem Code eingebaut werden:
Code:
[COLOR=#333333]L "DB_FA_Kurve".FA_Index_Kurve[/COLOR]
[COLOR=#333333]L 900[/COLOR]
[COLOR=#333333]<=I [/COLOR]
[COLOR=#333333]U "DB_FA_Verwaltung".FA_Pruefung_laeuft[/COLOR]
[COLOR=#333333]SPBN AAAA[/COLOR]


[COLOR=#333333]L "DB_FA_Kurve".FA_Index_Kurve[/COLOR]
[COLOR=#333333]L 4[/COLOR]
[COLOR=#333333]*I [/COLOR]
[COLOR=#333333]ITD [/COLOR]
[COLOR=#333333]SLD 3[/COLOR]
[COLOR=#333333]T #index[/COLOR]
[COLOR=#333333]LAR1 #index[/COLOR]


[COLOR=#333333]AUF "DB_FA_Kurve"[/COLOR]


[COLOR=#333333]L #FA_Pruefdruck_Ist_Real[/COLOR]
[COLOR=#333333]T DBD [AR1,P#0.0][/COLOR]
[COLOR=#ff0000]L aktuellesMinimum[/COLOR]         [COLOR=#008000]// bspw. ein Merkerdoppelwort wo der aktuelle Minimalwert gespeichert ist[/COLOR][COLOR=#ff0000]
<D                         [/COLOR][COLOR=#008000]// wenn FA_Pruefdruck_Ist_Real kleiner als aktuelles Minimum ist...[/COLOR][COLOR=#ff0000]
SPBN 0001                  [/COLOR][COLOR=#008000]// dann nicht springen sondern...[/COLOR][COLOR=#ff0000]
L #FA_Pruefdruck_Ist_Real  [/COLOR][COLOR=#008000]// aktuellen Wert nochmal laden (oder Akkus mit TAK tauschen)[/COLOR][COLOR=#ff0000]
T aktuellesMinimum         [/COLOR][COLOR=#008000]// und als neues Minimum speichern[/COLOR]
[COLOR=#ff0000]0001: NOP 0[/COLOR]

[COLOR=#333333]U "DB_FA_Verwaltung".FA_Pruefung_laeuft[/COLOR]
[COLOR=#333333]SPBN AAAA[/COLOR]


[COLOR=#333333]L "DB_FA_Kurve".FA_Index_Kurve[/COLOR]
[COLOR=#333333]L 1[/COLOR]
[COLOR=#333333]+I [/COLOR]
[COLOR=#333333]T "DB_FA_Kurve".FA_Index_Kurve
[/COLOR]
 
Guten Morge,
mir wäre natürlich eine ressourcenschonende Lösung lieber direkt im code.


Dein Beispiel gefällt mir.
wäre ja wenig code.
Wäre super, wenn deine Codelösung funktioniert.
danke

P.s. wie würde denn eine Umsetzung aussehen wenn ich den niedrigsten Wert am Ende aus den 900 gespeicherten Werten des DBs auslesen möchte?
 
dies ist vorgesehen beim Neustart einer Messung alles auf 0 zu schreiben (fill) und den Prüfdruckspeicher damit zu leeren.

Code:
Netzwerk 1: Wertespeicher leeren
U M100.0  //Start löschen
L 0.000000e+000
T #Null_real

CALL "FILL"
BVAL :=#Null_real
RET_VAL:=#Ret_Val_SFC
BLK :="DB_FA_Kurve".FA_Prufdruk_Speicher       //( ist Array 0..899)


Netzwerk 2: 900 Werte aufnehmen
Dieser Code steht da aber nicht wirklich so, Du hast da Code weggelassen? Weil dann würde das Array immer gelöscht wenn der FB aufgerufen wird.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du hast natürlich recht, ich hab einen Teil weggelassen, nur Auszüge gepostet.
danke für den Hinweis.

Hoffe es ist aber verständlich gewesen, wie es programmiert wurde .

hier der korrekte code:
Code:
Netzwerk 1:

U     M100.0      SPBN  AAAB


      L     0.000000e+000
      T     #Null_real


      CALL  "FILL"
       BVAL   :=#Null_real
       RET_VAL:=#Ret_Val_SFC
       BLK    :="DB_FA_Kurve".FA_Prufdruk_Speicher

AAAB: NOP   0

Netzwerk 2:
...
.........
 
Code:
[COLOR=#333333]L #FA_Pruefdruck_Ist_Real[/COLOR]
[COLOR=#333333]T DBD [AR1,P#0.0][/COLOR]
[COLOR=#ff0000]L aktuellesMinimum[/COLOR]         [COLOR=#008000]// bspw. ein Merkerdoppelwort wo der aktuelle Minimalwert gespeichert ist[/COLOR][COLOR=#ff0000]
<D                         [/COLOR][COLOR=#008000]// wenn FA_Pruefdruck_Ist_Real kleiner als aktuelles Minimum ist...[/COLOR][COLOR=#ff0000]
SPBN 0001                  [/COLOR][COLOR=#008000]// dann nicht springen sondern...[/COLOR][COLOR=#ff0000]
L #FA_Pruefdruck_Ist_Real  [/COLOR][COLOR=#008000]// aktuellen Wert nochmal laden (oder Akkus mit TAK tauschen)[/COLOR][COLOR=#ff0000]
T aktuellesMinimum         [/COLOR][COLOR=#008000]// und als neues Minimum speichern[/COLOR]
[COLOR=#ff0000]0001: NOP 0[/COLOR]
Dies bedingt noch, dass der Minimalwert aktuellesMinimum bei Neuinitialisierung nicht (wie gewöhnlich) auf 0.0 steht, sonst kommen da nur Negativwerte drunter.
Oder eine Abfrage, auf <>0.0 für aktuellesMinimum, sonst auch #FA_Pruefdruck_Ist_Real eintragen.
PS: Bzw. den 1. Messwert nach Neuinitialisierung generell eintragen.
;)
 
Code:
Netzwerk 2: 900 Werte aufnehmen 
[COLOR=#333333][FONT=Verdana]L "DB_FA_Kurve".FA_Index_Kurve[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]L 900[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]<=I [/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]U M100.1  //Schrittkette läuft[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]SPBN AAAA[/FONT][/COLOR]


[COLOR=#333333][FONT=Verdana]L "DB_FA_Kurve".FA_Index_Kurve[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]L 4[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]*I [/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]ITD [/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]SLD 3[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]T #index[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]LAR1 #index[/FONT][/COLOR]


[COLOR=#333333][FONT=Verdana]AUF "DB_FA_Kurve"[/FONT][/COLOR]


[COLOR=#333333][FONT=Verdana]L #FA_Pruefdruck_Ist_Real[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]T DBD [AR1,P#0.0][/FONT][/COLOR]


[COLOR=#333333][FONT=Verdana]U "DB_FA_Verwaltung".FA_Pruefung_laeuft[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]SPBN AAAA[/FONT][/COLOR]


[COLOR=#333333][FONT=Verdana]L "DB_FA_Kurve".FA_Index_Kurve[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]L 1[/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]+I [/FONT][/COLOR]
[COLOR=#333333][FONT=Verdana]T "DB_FA_Kurve".FA_Index_Kurve[/FONT][/COLOR]
Optimierung und Korrektur
Code:
Netzwerk 2: 900 Werte aufnehmen
      L "DB_FA_Kurve".FA_Index_Kurve  //darf nur 0..899 sein
      L 900
      [COLOR="#0000FF"]<I[/COLOR]                              //! "[COLOR="#FF0000"]<=I[/COLOR]" ist falsch!
      U "DB_FA_Verwaltung".FA_Pruefung_laeuft
      SPBN AAAA

      L 0
      L "DB_FA_Kurve".FA_Index_Kurve
      ==I
      SPBN MPTR

      L #FA_Pruefdruck_Ist_Real
      T aktuellesMinimum              //aktuellesMinimum initialisieren mit erstem Wert
      POP                             //(TAK geht auch) "DB_FA_Kurve".FA_Index_Kurve zurück in AKKU1

MPTR: SLD 5
      T #index                        //(hier unnötig, oder wird #index noch irgendwo gebraucht?)
      LAR1

      L #FA_Pruefdruck_Ist_Real
      AUF "DB_FA_Kurve"
      T DBD [AR1,P#0.0]
      L aktuellesMinimum
      [COLOR="#0000FF"]<R[/COLOR]                              //! "[COLOR="#FF0000"]<D[/COLOR]" ist falsch!
      SPBN MEMN
      POP                             //(TAK geht auch) #FA_Pruefdruck_Ist_Real zurück in AKKU1
      T aktuellesMinimum
MEMN: SET

      L "DB_FA_Kurve".FA_Index_Kurve
      + 1
      T "DB_FA_Kurve".FA_Index_Kurve
noch effizienter, aber schlechter verstehbar:
Code:
Netzwerk 2: 900 Werte aufnehmen
      L "DB_FA_Kurve".FA_Index_Kurve
      L 900
      <I
      U "DB_FA_Verwaltung".FA_Pruefung_laeuft
      SPBN AAAA

      L 0
      L "DB_FA_Kurve".FA_Index_Kurve
      + 1
      T "DB_FA_Kurve".FA_Index_Kurve
      + -1
      ==I
      L #FA_Pruefdruck_Ist_Real
      SPBN MPTR

      T aktuellesMinimum

MPTR: TAK                             //"DB_FA_Kurve".FA_Index_Kurve in AKKU1
      SLD 5
      LAR1

      TAK                             //#FA_Pruefdruck_Ist_Real in AKKU1
      AUF "DB_FA_Kurve"
      T DBD [AR1,P#0.0]
      L aktuellesMinimum
      <R
      SPBN MEMN
      TAK                             //#FA_Pruefdruck_Ist_Real in AKKU1
      T aktuellesMinimum
MEMN: SET

Harald
 
Zurück
Oben