TIA Scoreboard in HMI einfügen.

Zuviel Werbung?
-> Hier kostenlos registrieren
i & n funktionieren, aber tmp_Score & swapped nicht
Bei der Deklaration der Variablen dürfen das # und die Anführungsstriche nicht mit eingegeben werden (habe ich in #12 und im Bild #16 auch nicht gemacht - bitte gaaanz genau hinschauen und vergleichen). Die # und " werden nur bei der Verwendung der Variablennamen vom TIA automatisch ergänzt, als Kennzeichen daß das lokale oder globale Variablen sind.
Du hast bei der Deklaration von swapped (in Temp) ein # davor geschrieben - das muß da gelöscht werden.
 

Anhänge

  • swapped_falsch.png
    swapped_falsch.png
    82,9 KB · Aufrufe: 14
Moin MaxH,

in deinem DB ist die Ergebnisliste ja ein struct. Du musst noch den namen hinzufügen:

Code:
"DB_Scoreboard".Ergebnisliste[#i].name

Des Weiteren ist name in Deinem DB ein string[10] (enthält 10+2 byte); tmp_Score in der temporären Variablendeklaration der FC aber ein string (enthält 254+2 byte). Das kannst Du nicht zuweisen. Die Datentypen müssen gleich sein.

Und #swapped := true geht nicht, weil es keine deklarierte Variable swapped, sondern nur #swapped gibt. Man könnte auch #"#swapped' im Code schreiben, aber das wollen wir mal lieber lassen ;)
Stimmt danke :giggle:
Was empfiehlst du, gegen die Ungleichheit zu tun?:unsure:
 

Anhänge

  • 1682077915277.png
    1682077915277.png
    139,4 KB · Aufrufe: 15
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei der Deklaration der Variablen dürfen das # und die Anführungsstriche nicht mit eingegeben werden (habe ich in #12 und im Bild #16 auch nicht gemacht - bitte gaaanz genau hinschauen und vergleichen). Die # und " werden nur bei der Verwendung der Variablennamen vom TIA automatisch ergänzt, als Kennzeichen daß das lokale oder globale Variablen sind.
Du hast bei der Deklaration von swapped (in Temp) ein # davor geschrieben - das muß da gelöscht werden.
Mein TIA hat schon die Arbeitswoche beendet (und ich auch gleich). Würde auch ein zweites # an der Verwendungsstelle funktionieren?
 
Stimmt danke :giggle:
Was empfiehlst du, gegen die Ungleichheit zu tun?:unsure:
Na, entweder bei der temporären Variablen die Einschränkung auf 10 Zeichen entfallen lassen und nur string schreiben oder im DB auf 10 Zeichen begrenzen und string[10] schreiben.
Kommt halt drauf an, ob auch mal mehr als 10 Zeichen enthalten sein können. Kann auch ne Frage nach dem Speicherplatz sein, aber bei der geringen Menge wohl eher nicht.
 
Des Weiteren ist name in Deinem DB ein string[10] (enthält 10+2 byte); tmp_Score in der temporären Variablendeklaration der FC aber ein string (enthält 254+2 byte). Das kannst Du nicht zuweisen. Die Datentypen müssen gleich sein.
Na, entweder bei der temporären Variablen die Einschränkung auf 10 Zeichen entfallen lassen und nur string schreiben oder im DB auf 10 Zeichen begrenzen und string[10] schreiben.
:unsure: worauf beziehst Du den Hinweis mit dem string[10] im DB ??? Das müsste schon längst ersetzt sein durch den Datentyp t_Score.

In dem Bild vom DB_Scoreboard in #29 ist der Name doch ein String[10]?
Wobei @MaxH da das Bild leider so gedankenlos gemacht hat, daß man nicht sehen kann, ob da nun der Datentyp t_Score oder Struct verwendet wurde... :rolleyes:

Und ich möchte dem Kollege @MaxH da auch schon wieder auf die Finger klopfen - macht er da doch entgegen meinem Vorschlag eigenmächtig ein Array[0..100] draus - das könnte dann Probleme mit der Zykluszeit beim BubbleSort machen... 🤷‍♂️

Harald
 
:unsure: worauf beziehst Du den Hinweis mit dem string[10] im DB ??? Das müsste schon längst ersetzt sein durch den Datentyp t_Score.
Ach, ich sehe schon, das mittlere Bild in #31 mit dem Datentyp t_Score

Da frage ich mich, wozu ich mir die ganze Arbeit mache und extra eine gaaaanz ausführliche Anleitung mit Bild in #21 gemalt habe, wenn der Kollege das noch nicht mal fehlerfrei abmalen kann... Ist der einfach nur schlampig oder hat er eine Konzentrationsschwäche-Krankheit? :unsure: Ich glaube, ich bin hier erstmal 'raus und geh' in Feierabend.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Schönen Wochenstart!

Soweit sollte alles laufen!

Das einzige Problem ist, dass die Variable "DB_Scoreboard"[5].Roboterzeit & "DB_Scoreboard"[5].Menschzeit nicht "deklariert" sind.
Welche Lösung gibt's dazu?
 

Anhänge

  • 1682331602042.png
    1682331602042.png
    127,7 KB · Aufrufe: 13
  • 1682331704642.png
    1682331704642.png
    150,8 KB · Aufrufe: 13
Zuviel Werbung?
-> Hier kostenlos registrieren
"Zeit_Fehler_Int" & "Roboterzeit_gebraucht_Int" haben Werte, aber werden nicht in den DB übertragen...
Doch, das werden Sie. Du überschreibst sie nur vermutlich an anderer Stelle gleich wieder. Stelle doch einmal den kompletten Code ein.

Hier wird der Zeitwert z.B. überschrieben:
n = 6
Schleife 0 TO n - 2 bedeutet 0 TO 4
[i + 1] bedeutet 4+1 = 5 Also wird in der Schleife sobald die Bedingung darüber erfüllt ist die "Ergebnisliste[5].Menschzeit" überschrieben ( mit tmp_Score )

1682341045710.png
 
Zuletzt bearbeitet:
Code:
"DB_Scoreboard".Ergebnisliste[15].Menschzeit := "Zeit_Fehler_Int";
"DB_Scoreboard".Ergebnisliste[15].Roboterzeit := "Roboterzeit_gebraucht_Int";


//mit Bubblesort, aufsteigend, 0-Werte ans Ende
//https://de.wikipedia.org/wiki/Bubblesort#Algorithmus , Variante bubbleSort2

IF "jetztSortieren" THEN
    "jetztSortieren" := FALSE; //nur einmal sortieren
    
     #n := 16; //Anzahl Einträge in der Liste
    REPEAT
        #swapped := FALSE;
FOR #i := 0 TO #n - 2 DO
            IF "DB_Scoreboard".Ergebnisliste[#i + 1].Menschzeit <> 0
                AND ("DB_Scoreboard".Ergebnisliste[#i].Menschzeit > "DB_Scoreboard".Ergebnisliste[#i + 1].Menschzeit
                OR "DB_Scoreboard".Ergebnisliste[#i].Menschzeit = 0)
            THEN
                REGION Swap(i,i+1)
                    #tmp_Score := "DB_Scoreboard".Ergebnisliste[#i];
                    "DB_Scoreboard".Ergebnisliste[#i] := "DB_Scoreboard".Ergebnisliste[#i + 1];
                    "DB_Scoreboard".Ergebnisliste[#i + 1] := #tmp_Score;
                END_REGION
                 #swapped := TRUE;
            END_IF;
        END_FOR;
        #n -= 1;
    UNTIL NOT #swapped END_REPEAT;
    
END_IF;
 

Anhänge

  • 1682346847990.png
    1682346847990.png
    174 KB · Aufrufe: 5
  • 1682346896924.png
    1682346896924.png
    111 KB · Aufrufe: 5
Zuviel Werbung?
-> Hier kostenlos registrieren
Hab ich von Harald aus #12
Für was soll folgender Befehl sein?

Den Rest vom Code finde ich sehr umständlich geschrieben. Leider schreibst du auch keinen Kommentar was geht und was nicht geht bzw. was überhaupt passiert.
Die Daten sollen nach der Menschzeit durch einen Bubblesort sortiert werden.
Mehr kann ich dazu nicht sagen weil mir das wissen dazu fehlt…
 
Für was soll folgender Befehl sein?
#n -= 1; ist die kurze Schreibweise von #n := #n - 1;
Das Dekrementieren von n sorgt dafür, daß die FOR-Schleife bei jedem Durchlauf ein Element kürzer wird, weil im Durchlauf davor ja schon das jeweils größte Element ans Ende der Liste geschoben wurde und nicht nochmal geprüft werden muß, ob das nächstgrößte Element größer als das im Durchlauf davor größte Element ist.

Den Rest vom Code finde ich sehr umständlich geschrieben. Leider schreibst du auch keinen Kommentar was geht und was nicht geht bzw. was überhaupt passiert.
@DMA
Die ausführliche original Beschreibung zu meinem original Code-Vorschlag ist in Beitrag #12
Die Schleife ist ein Bubble-Sort. Wer einen Kommentar zu dem einfachen Standard-Algorithmus will, kann in Wikipedia nachlesen. Die vielleicht unverständliche Bedingung beim IF sorgt für eine Sonderbehandlung der 0-Werte, so daß die 0-Werte ans Ende der Liste sortiert werden.

Der Fragesteller MaxH kann leider meine detaillierte Anleitung nicht umsetzen, weil er nicht genau liest und nicht genau kopiert, und wenn TIA dann meckert, dann vermutet er, daß da wohl Schreibfehler von mir wären... und bevor er überhaupt meinen Vorschlag zum Laufen bekommen hat, muß er schon dran rumändern, so daß wir nicht mehr durchsehen, wie sein aktueller Code überhaupt aussieht.


"Zeit_Fehler_Int" & "Roboterzeit_gebraucht_Int" haben Werte, aber werden nicht in den DB übertragen...
Warum schreibst Du die immer (in jedem Zyklus) in den letzten Ergebnislisten-Eintrag? Hast Du da keinen sinnvollen Trigger dafür, z.B. dann wenn die Werte entstanden sind?
Wenn ein neuer Datensatz entstanden ist, der zur Ergebnisliste hinzugefügt werden soll, dann immer auf den unsichtbaren Einfügeplatz am Ende der Liste kopieren und danach die Liste sortieren.
Lies den Beitrag #12 noch ein zweites Mal, und ein drittes Mal, und ein viertes Mal... solange, bis Du ihn verstanden hast. Und dann bring meinen Code zum Laufen, so wie ich ihn vorgeschlagen habe. Und wenn der dann funktioniert, dann kannst Du Deine gewünschten Änderungen einarbeiten.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der zugrunde liegende Bubblesort-Algorithmus arbeitet mit 2 Schleifen. Da kommt das n her. Die optimierte Variante ersetzt die äußere FOR-n-Schleife durch eine WHILE-Schleife, bis in einem FOR-i-Durchlauf nicht mehr getauscht (swapped) wurde. Dann braucht man nicht mehr weitermachen.

Harald
 
Die Daten sollen nach der Menschzeit durch einen Bubblesort sortiert werden.
==>
Lies den Beitrag #12 noch ein zweites Mal, und ein drittes Mal, und ein viertes Mal... solange, bis Du ihn verstanden hast. Und dann bring meinen Code zum Laufen, so wie ich ihn vorgeschlagen habe. Und wenn der dann funktioniert, dann kannst Du Deine gewünschten Änderungen einarbeiten.
 
Zurück
Oben