TIA Nokia Snake / Fifo mit Bool

Zuviel Werbung?
-> Hier kostenlos registrieren
Wird der Wert auf die erforderliche Menge an Flanschen (Bool) umgerechnet.
Ach, das Leben ist doch eines der schwersten ... und das müsste es nicht sein. :mad:

Der oben zitierte Satz könnte ...
- eine Feststellung sein, dann passt aber die Reihefolge der Worte nicht. Sie müsste lauten :
. . "Der Wert wird auf die erforderliche Menge an Flanschen (Bool) umgerechnet."
... oder ...
- eine Frage sein, dann passt zwar die Reihenfolge der Worte, aber es fehlt das FrageZeichen.
. . Die Frage müsste so aussehen:
. . "Wird der Wert auf die erforderliche Menge an Flanschen (Bool) umgerechnet?"

Warum bleibt eigentlich die Frage, ob alle 32 zuschaltbaren Leistungen gleich gross sind, so lange und so beharrlich unbeantwortet?
Man könnte ja meinen, dass hier ein BetriebsGeheimnis gehütet wird. Aber das will ich einfach nicht glauben.
Warum wird nicht andererseits erklärt, dass die Ist-(Gesamt-)Leistung gemessen und mit den SollWert verglichen wird?
Wahrscheinlich, weil sie nicht gemessen wird, ... aber deshalb muss sich doch niemand schämen ... das kann man doch einfach zugeben.
Schämen müsste sich aber jemand, dass er uns sooo verzweifelt herumraten und unsere GlasKugeln strapazieren lässt.
 
Warum bleibt eigentlich die Frage, ob alle 32 zuschaltbaren Leistungen gleich gross sind, so lange und so beharrlich unbeantwortet?
Vielleicht weil es mit der Aufgabe nicht primär was zu tun hat. :)
So wie ich das Problem verstehe, geht es hier mehr um eine gleichmäßige Verteilung der Laufzeiten ähnlich wie bei Kompressorstationen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielleicht weil es mit der Aufgabe nicht primär was zu tun hat. :)
So wie ich das Problem verstehe, geht es hier mehr um eine gleichmäßige Verteilung der Laufzeiten ähnlich wie bei Kompressorstationen.
So ist es.

Es geht nur wie in Beitrag #15 bechrieben darum das der erste Zeiger immer ein weiteres Bit setzt wenn die Flanke von „Leistung erhöhen“ kommt.
Von den gesetzten Bits soll der zweite Zeiger dann immer das alteste gesetzte Bit wieder löschen wenn die Flanke von „Leistung verringern“ kommt.
Die soll umlaufend geschehen.
Die Anzahl der Bits ist eine Variable von 2-32.

Bits=Flansche

grüßle
holgi
 
Vielleicht weil es mit der Aufgabe nicht primär was zu tun hat. :)
So wie ich das Problem verstehe, geht es hier mehr um eine gleichmäßige Verteilung der Laufzeiten ähnlich wie bei Kompressorstationen.
Hmmm. Aus meiner Sicht hat es aber einen erheblichen Einfluss darauf, wie man das Problem löst bzw. welche Strategie das Programm verfolgen sollte.
Wären die 32 zuschaltbaren Leistungen recht unterschiedlich gross, so würde man z.B. eine zu grosse Leistung dazuschalten, nur weil es in der gegebenen Reihenfolge die nächste verfügbare ist.
Hat man dann zuviel Leistung, was dann?
- Muss man prüfen, ob die nächste zum Abschalten anstehende Leistung die gewünschte Leistung besser durch Abschalten oder durch Beibehalten annähert?
- Muss man aus der Liste der aktivierten Leistungen diejenige selektieren, die vom Betrag her am besten zur zu erhöhenden Leistung passt?
Das würde das Konzept, das da durchschimmert, sehr umstossen. Ein Array von BOOL genügt dann nicht mehr. Zu jeder zuschaltbaren Leistung müsste noch die Grösse der Leistung und höchstwahrscheinlich noch der ZeitStempel beim Aktivieren bzw. die Laufzeit seit dem Aktivieren mitgeführt werden.

Ich schliesse daraus, dass diese 32 Leistungen zumindest annähernd gleich sein dürften, weil das geplante Konzept sonst ausgehebelt würde.

Die Anzahl der Bits ist eine Variable von 2-32.
Dann habe ich die Aufgabenstellung immer noch nicht verstanden. Mein Verständnis der Anzahl ("Flansche_aktiv") war bisher 0..32.
Oder hast Du eine Art "Grundlast", die nie unterschritten werden kann?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
"in der Spur" bin ich noch nicht weil ich nicht weis wie die Befehle lauten um das umzusetzen was ich vor habe. Einen Ansatz habe ich aus deinem Beispiel schonmal generieren können aber es geht noch nicht.
Die SOLL Leistung ist in % angegeben. Das rechne ich um in die mir zur verfügung stehenden Flansche (Bits).
Nun kann ich ja eine Flanke erzeugen wenn sich die geforderte Leistung um einen Flansch erhöht.
Ebenso wenn sie sich um einen Flansch veringert.

Soweit so gut.



Die erste Flanke soll den ersten Zeiger weiter schieben und mir ein weiteres Bit setzen von den frei einstellbaren Flanschen (immer eine gerade Anzahl!)
Die zweite Flanke soll das zuerst gesetzte Bit wieder löschen.
Die Zeiger dürfen sich nicht "Überholen" und sollen am Ende der (max32) Flansche wieder von vorn anfangen.

Im Grunde ist das eine einfache Sache. Ich habe das nur noch nie in SCL gemacht - geschweigedenn etwas anderes. Daher mein etwas plotziges Vorgehen.

Im späteren Einsatz wird sich die Leistung (gesetzte BITS) um 40-90% der vorhandenen (maximalen 32) bewegen. Aber das ist eigentlich völlig wurscht. Mein Simulator macht alle paar Sekunden einen Sprung um 10% von 20% bis 80%. Und die geschalteten Bits sollten entsprechend mitlaufen. Eben wie in #15 dargestellt.

Eigentlich ein FiFo der einzelne Bits setzt/rücksetzt. Nur kann ich`s halt nicht in SCL....

Andere Sprache kommt nicht in Frage - -passt nicht ins Konzept.

Und um die Neugier einzelner zu befriedigen - Die Leistung der einzelnen Flansche ist 50kW.
Aber das ist wie gesagt irrelevant. Auch der PID Regler der das ganze regelt ist bereits fertig. Nur der Fifo um die Flansche gleichmässig auszulasten ist nicht funktionsfähig.

grüßle
holgi
 
Warum so kompliziert?

Ich gehe jetzt davon aus, daß Du die benötigte Anzahl Flansche berechnet hast.

Nun kannst Du mit einer FOR-Schleife durch Dein Array gehen und zählen, wie viele Flansche aktiv sind.
Ist die Anzahl der benötigten Flansche größer als die akiven Flansche, schiebst Du Deinen Zeiger 1 um x Elemente weiter.
Ist die Anzahl der benötigten Flansche kleiner als die aktiven Flansche, schiebst Du Deinen Zeiger 2 um x Elemente weiter.
Das passiert zyklisch, ohne Flanken, ohne alles.... reine simple Logik.

Du mußt nur die bereits in #5 erwähnten Rahmenbedingungen einhalten.
Wie Du wiederum auf die Array-Elemente zugreifst, hab ich Dir in #8 gezeigt.

Ich sehe jetzt nicht mehr das große Problem
 
Eine Flanke brauchst du, wie auch von @JSEngineering genannt, nicht - das macht die Berechnung alleine.
Das Einzige wäre, dass du den ganzen Kram überspringst wenn alte_Anzahl = neue:Anzahl ist.

Die Zeiger dürfen sich nicht "Überholen" und sollen am Ende der (max32) Flansche wieder von vorn anfangen.
Hiermit liegst du allerdings komplett daneben - die Zeiger überholen sich zwar nicht, es kann aber trotzdem sein (durch die Ring-Geschichte), dass der Ende-Zeiger bei 2 steht und der Start-Zeiger bei 30. Den Fall habe ich in meinem SCL-Script, dass ich gepostet habe, berücksichtigt.

Die Sache mit SCL siehst du richtig. Sicher kann man es auch in AWL, KOP, FUP irgendwie machen - ich würde aber sagen, dass es schwer ist, da hinterher vernünftig durchzusteigen. Nichtsdestoweniger haben wir "früher" das natürlich so gemacht ... :rolleyes:

Um dich nicht im Regen stehen zu lassen - woran hängt es denn bei dir aktuell ?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Eine Flanke brauchst du, wie auch von @JSEngineering genannt, nicht - das macht die Berechnung alleine.
Das Einzige wäre, dass du den ganzen Kram überspringst wenn alte_Anzahl = neue:Anzahl ist.


Hiermit liegst du allerdings komplett daneben - die Zeiger überholen sich zwar nicht, es kann aber trotzdem sein (durch die Ring-Geschichte), dass der Ende-Zeiger bei 2 steht und der Start-Zeiger bei 30. Den Fall habe ich in meinem SCL-Script, dass ich gepostet habe, berücksichtigt.

Die Sache mit SCL siehst du richtig. Sicher kann man es auch in AWL, KOP, FUP irgendwie machen - ich würde aber sagen, dass es schwer ist, da hinterher vernünftig durchzusteigen. Nichtsdestoweniger haben wir "früher" das natürlich so gemacht ... :rolleyes:

Um dich nicht im Regen stehen zu lassen - woran hängt es denn bei dir aktuell ?
Ich würde das gerne mit 2 Flanken machen. Es kommt nämlich noch hinzu das es sich nicht um mein Projekt, sondern das eines Kollegen handelt. Der - wer hätte es gedacht - auch nicht viel mehr über SCL weis wie ich.
Wir haben aber die Funktion durchgesprochen und daher denke ich mit den Flanken verstehen wir das eher. Auch wenn es nicht so schön ist.

Der Ende-Zeiger darf sich halt nicht bewegen wenn er auf dem Start-Zeiger steht.

Jetzt muss ich sehen wie man die Flanken Programmiert...
 
und daher denke ich mit den Flanken verstehen wir das eher. Auch wenn es nicht so schön ist.

Der Ende-Zeiger darf sich halt nicht bewegen wenn er auf dem Start-Zeiger steht.
Die in #27 beschriebene Lösung kann man entweder zyklisch durcharbeiten oder aber, wenn eine Flanke auftritt... ist egal.
Wenn Ihr unbedingt eine Flanke einbauen wollt... macht es, es ändert aber am generellen Prinzip nichts.

Daß der Ende-Zeiger nie den Start-Zeiger überholen darf, muß man in entsprechender Logik hinterlegen.
Nur wie Larry schon gezeigt hat: Es gibt verschiedene Fälle:

  • Der Endzeiger kann vor dem Start-Zeiger liegen, weil der Start-Zeiger gerade wieder bei 0 anfängt, der End-Zeiger noch am Ende des Arrays steht
  • Der Endzeiger kann hinter dem Start-Zeiger liegen, wenn beide gerade das Array von vorne durchlaufen
  • Der Endzeiger kann gleich dem Start-Zeiger sein, wenn alle aus sind
Daß die Zeiger sich nicht überholen, könnte man absichern, indem man am Ende der Berechnung prüft: Wenn kein Array-Element TRUE ist, setzt man den Ende-Zeiger auf den Start-Zeiger.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So.
Die aktuelle Lösung sieht so aus und funktioniert!


#Flansche_SOLL := REAL_TO_INT(INT_TO_REAL(#"Anzahl Flansche gesamt") * (#"Leistung_%") / 100.0);
#Flansche_verfügbar := #"Anzahl Flansche gesamt" - #Flansche_aktiv;
#Leistung_erhöhen := #Flansche_aktiv < #Flansche_SOLL AND #"Anzahl Flansche gesamt" > #Flansche_aktiv;
#Leistung_verringern := #Flansche_aktiv > #Flansche_SOLL AND #Flansche_aktiv > 0;

REGION Alles löschen

IF #Alleslöschen THEN
FOR #M := 1 TO 32 DO
#Flansch[#M] := FALSE;
END_FOR;
#Alleslöschen := FALSE;
END_IF;
END_REGION

REGION Erhöhen
IF #Leistung_erhöhen AND #i <= #"Anzahl Flansche gesamt" THEN
#Flansch[#i] := TRUE;
#i := #i + 1;

//Anzahl gesetzter Bits ausgeben
//
#Flansche_aktiv := 0;
FOR #N := 1 TO 32 DO
IF #Flansch[#N] = TRUE THEN
#Flansche_aktiv := #Flansche_aktiv + 1;
END_IF;
END_FOR;
#Leistung_erhöhen := FALSE;
END_IF;
IF #i > #"Anzahl Flansche gesamt" THEN
#i := 1;
END_IF;
END_REGION

REGION Verringern
IF #Leistung_verringern AND #k <= 32 THEN
#Flansch[#k] := FALSE;
#k := #k + 1;
//Anzahl gesetzter Bits ausgeben
//
#Flansche_aktiv := 0;
FOR #N := 1 TO 32 DO
IF #Flansch[#N] = TRUE THEN
#Flansche_aktiv := #Flansche_aktiv + 1;
END_IF;
END_FOR;
#Leistung_verringern := FALSE;
END_IF;
IF #k > #"Anzahl Flansche gesamt" THEN
#k := 1;
END_IF;
END_REGION
 
Bin auch nicht alleine drauf gekommen - ich hatte mal wieder Hilfe eines Bekannten. Der war nur erstmal nicht erreichbar.
Der Code ist mit dem Simulator getestet und macht -zumindest dort- was er soll.
Bei der Integration ins Projekt des Kollegen sind noch ein paar andere Problemchen aufgetaucht. Die sind aber das Problem vom Zukunfts-holgi.
Sprich mach ich mich morgen drann.

Vielen Dank für eure Unterstützung! Hab doch einiges gelernt!

grüßle
holgi
 
Zurück
Oben