Ich bin SPS learning by doing Neuling und benötige einen Lösungsanschubs:
Ich bekomme über einen selbstgebastelten Betriebsstundenzähler die Laufzeit in minuten von acht Motoren, die ich über einen FB_3Punkt Regler zu- oder abschalte. Da ich die Betriebsstunden von den Maschinen angleichen möchte, soll der Motor mit der niedrigsten Laufzeit zuerst in Betrieb gehen und bei abfallender Nachfrage der Motor mit der höchsten Laufzeit zuerst abgeschaltet werden.
Theoretisch könnte ich den Motor 1 nacheinander mit den anderen vergleichen, danach Motor 2 und 3etc, aber das halte ich für zu umständlich und such etwas eleganteres...
Info: programmiere jetziges Projekt in FUP in Somachine (Codesys 3.4) für Schneider M238 plus Magelis
Vielen Dank im Voraus,
Armin.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Ich habe einen MAX und MIN Baustein gefunden, den ich auf 6 Eingangswerte (8 reduziert auf 6, da 2 nicht notwendig) erweitert habe.
Zur Auswahl des Motores mit kleinster Laufzeit benutze ich den MIN Baustein, lade (MOVE) die Laufzeitminuten aller Motoren in den MIN und der zeigt mir den kleinsten Minutenwert, aber NICHT welcher Motor diesen Wert geliefert hat. Mit einem EQ-Vergleich des MIN Ergebnis und der Motorlaufzeit finde ich diesen Motor und liefere diesen in die Einschaltprozedur (mit Ein- und Ausschaltzeitverzögerung etc). Damit der Min Wert dieses Motores verschwindet um den nächsten einzuschaltenen Motors zu finden ersetze ich den realen Minutenwert des MIN Eingang über einen MOVE Befehl mit einem hohen (1000000) fiktiven Wert, nachdem der Motor in Betrieb gesetzt wurde.
Die Ausschaltroutine habe ich genauso, aber über den MAX Baustein programmiert.
Das alles funktioniert korrekt (noch habe ich eine kleine Fehlfunktion in dem Fall, wenn Motoren die gleiche Minutenlaufzeit aufweisen...lösbar), dennoch gefällt mir diese Lösung nicht! Sehr aufwendig und wenig elegant.
Beim Stöbern habe ich die Funktion BUBBLESORT entdeckt, die hier besser funktionieren könnte, habe diese aber nicht als FB zur Verfügung, und weiss nicht ,wie ich diesen selbst programmiere: 1) Theoretisch müsste ich die Laufzeiten jedes Motors in einen Array (noch keine Erfahrung mit Array) schreiben. 2) Bubblesort anwenden. 3)Ergebnis irgendwie abgreifen.
Für Kommentare der gefundenen MIN/MAX Lösung und Hilfestellung einer besseren Lösung (Bubblesort oder alternativen) wäre ich sehr dankbar.
Viele Grüsse, Armin.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Anonymous
-
2014-05-06
Originally created by: jl
Hallo
Ich habe zwar keine Erfahrung mit CoDeSys V3, programmiere mit V2.3 und hauptsächlich in ST.
Hier ein kleines Beispiel um einen Min/Max - Wert aus einem Array auszulesen, habe ein Array mit 20 beliebigen Werten befüllt.
Deklaration:
VAR
daten:
ARRAY [1..20] OF INT := 1023,56,74,32,12,45,678,345,12,87,45,23,564,7896,56,32,456,87,654,543;
i: INT;
minWert: INT;
maxWert: INT;
END_VAR
Programm:
maxWert := 0;
FOR i := 1 TO 20 DO
IF (daten[i] > maxWert) THEN
maxWert := daten[i];
END_IF
END_FOR
minWert := maxWert;
FOR i := 1 TO 20 DO
IF (daten[i] < minWert) THEN
minWert := daten[i];
END_IF
END_FOR
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Ich bin SPS learning by doing Neuling und benötige einen Lösungsanschubs:
Ich bekomme über einen selbstgebastelten Betriebsstundenzähler die Laufzeit in minuten von acht Motoren, die ich über einen FB_3Punkt Regler zu- oder abschalte. Da ich die Betriebsstunden von den Maschinen angleichen möchte, soll der Motor mit der niedrigsten Laufzeit zuerst in Betrieb gehen und bei abfallender Nachfrage der Motor mit der höchsten Laufzeit zuerst abgeschaltet werden.
Theoretisch könnte ich den Motor 1 nacheinander mit den anderen vergleichen, danach Motor 2 und 3etc, aber das halte ich für zu umständlich und such etwas eleganteres...
Info: programmiere jetziges Projekt in FUP in Somachine (Codesys 3.4) für Schneider M238 plus Magelis
Vielen Dank im Voraus,
Armin.
Hallo Forum,
Ich habe einen MAX und MIN Baustein gefunden, den ich auf 6 Eingangswerte (8 reduziert auf 6, da 2 nicht notwendig) erweitert habe.
Zur Auswahl des Motores mit kleinster Laufzeit benutze ich den MIN Baustein, lade (MOVE) die Laufzeitminuten aller Motoren in den MIN und der zeigt mir den kleinsten Minutenwert, aber NICHT welcher Motor diesen Wert geliefert hat. Mit einem EQ-Vergleich des MIN Ergebnis und der Motorlaufzeit finde ich diesen Motor und liefere diesen in die Einschaltprozedur (mit Ein- und Ausschaltzeitverzögerung etc). Damit der Min Wert dieses Motores verschwindet um den nächsten einzuschaltenen Motors zu finden ersetze ich den realen Minutenwert des MIN Eingang über einen MOVE Befehl mit einem hohen (1000000) fiktiven Wert, nachdem der Motor in Betrieb gesetzt wurde.
Die Ausschaltroutine habe ich genauso, aber über den MAX Baustein programmiert.
Das alles funktioniert korrekt (noch habe ich eine kleine Fehlfunktion in dem Fall, wenn Motoren die gleiche Minutenlaufzeit aufweisen...lösbar), dennoch gefällt mir diese Lösung nicht! Sehr aufwendig und wenig elegant.
Beim Stöbern habe ich die Funktion BUBBLESORT entdeckt, die hier besser funktionieren könnte, habe diese aber nicht als FB zur Verfügung, und weiss nicht ,wie ich diesen selbst programmiere: 1) Theoretisch müsste ich die Laufzeiten jedes Motors in einen Array (noch keine Erfahrung mit Array) schreiben. 2) Bubblesort anwenden. 3)Ergebnis irgendwie abgreifen.
Für Kommentare der gefundenen MIN/MAX Lösung und Hilfestellung einer besseren Lösung (Bubblesort oder alternativen) wäre ich sehr dankbar.
Viele Grüsse, Armin.
Originally created by: jl
Hallo
Ich habe zwar keine Erfahrung mit CoDeSys V3, programmiere mit V2.3 und hauptsächlich in ST.
Hier ein kleines Beispiel um einen Min/Max - Wert aus einem Array auszulesen, habe ein Array mit 20 beliebigen Werten befüllt.
Deklaration:
VAR
daten:
ARRAY [1..20] OF INT := 1023,56,74,32,12,45,678,345,12,87,45,23,564,7896,56,32,456,87,654,543;
i: INT;
minWert: INT;
maxWert: INT;
END_VAR
Programm:
maxWert := 0;
FOR i := 1 TO 20 DO
IF (daten[i] > maxWert) THEN
maxWert := daten[i];
END_IF
END_FOR
minWert := maxWert;
FOR i := 1 TO 20 DO
IF (daten[i] < minWert) THEN
minWert := daten[i];
END_IF
END_FOR