TIA SCL-Schleife erhöht kurzfristig die Zykluszeit

Zuviel Werbung?
-> Hier kostenlos registrieren
wenn man irgendwelche Datenmengen in der SPS umschmeißen will kann man dies auch azyklisch machen... außer man braucht es halt sofort
ich benutze öfters die natürliche zyklus schleife der SPS dafür ;) wie gesagt wenn es halt nicht auf die Zeit ankommt ...

Prinzipell kein Schleifen war falsch von mir, ich vermeide es so gut es geht.

aber ist schon interessant das hier das so reagiert!
hast du mal versucht das programm auch auf einer 300er laufen zu lassen? würde mich mal interessieren ob es da gravierende unterschiede gibt :D
 
Moin Olli_BS,

das ist bei dem reduzieren der erlaubten Kommunikationslast auf 20% herausgekommen:

ZykluszeitRBGladenII.PNG

vielen Dank für den Hinweis!

VG

Mario
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin erzteufele,

hast du mal versucht das programm auch auf einer 300er laufen zu lassen? würde mich mal interessieren ob es da gravierende unterschiede gibt :D

Das ist nicht möglich, da das gesamte Programm nur auf einer 1500er entwickelt wurde und nur mit optimierten DBs arbeitet.

VG

MFreiberger
 
Hast Du auch ein HMI an der SPS? Kannst Du das mal vom IE-Netz trennen oder RT beenden oder ausschalten? Vielleicht wird durch das Programmladen ein Symbolverzeichnis ungültig und das HMI verursacht einen Haufen Kommunikationslast zur Aktualisierung der HMI-Variablen-Symbole?

Harald
 
Der unterschied einer Schleife wie "FOR x := 0 to 59" zu dem Code einfach 60 mal hinschreiben dürfte eigentlich nur die Lesbarkeit und der Aufwand sein. Die Zykluszeit müsste nahezu identisch sein
Unterschätzt mal die Schleifen nicht. Programmcode in Schleifen muß prinzipiell langsamer sein als die entsprechende Anzahl einzelner Anweisungen (*), weil mehr Anweisungen ausgeführt werden müssen, weil zu dem was die "produktiven" Anweisungen tun, noch zusätzlich der Schleifenzähler-Code und evtl. Pointer-Verwaltung und aufwendigere indirekte Adressierung dazukommt. Je nachdem wie viele oder wenige Anweisungen in jedem Schleifendurchlauf auszuführen sind, ist eine Verlangsamung des Codes auf die doppelte bis dreifache Abarbeitungszeit durchaus möglich. wie man z.B. im Bild von escride1 in #30 sehen kann

Bei Schleifen mit nur wenigen Durchläufen ist manchmal sogar der compilierte Programmcode als Schleife nicht kürzer als linear hingeschriebene Anweisungen, nur langsamer.

(*) Es sei denn, die Schleife macht nur sowas einfaches wie z.B. einen zusammenhängenden Bereich umkopieren und ein intelligenter Compiler erkennt das und ersetzt das z.B. durch einen BLKMOV in Maschinensprache - das kann schneller sein als einzelne Anweisungen.

Harald
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hast du den Opc-Server aktiviert? Nach dem Laden geht der Opc-Server auf Stop und startet neu durch. Ein Client könnte dann versuchen zu browsen, sprich das riesige xml auszulesen. Dies habe ich selber schon beobachtet das dieses browsen erheblich die Zykluszeit erhöht. Kann nachher noch ein paar Bilder nachliefern.
 
Moin eldon,

Hast du den Opc-Server aktiviert? Nach dem Laden geht der Opc-Server auf Stop und startet neu durch. Ein Client könnte dann versuchen zu browsen, sprich das riesige xml auszulesen. Dies habe ich selber schon beobachtet das dieses browsen erheblich die Zykluszeit erhöht. Kann nachher noch ein paar Bilder nachliefern.

Ja, der OPC-Server ist aktiviert. Das interessiert mich jetzt ganz besonders. Auf diese Bilder bin ich gespannt!

VG

Mario
 
Hi hier noch die Bilder

AUf dem ersten Foto ist die Zykluszeit mit OPCUA beim Verbinden und aktualisieren aller Variablen (weiss nicht mehr wieviele)

Zykluszeit_mit_OPCUA_beim_Verbinden_und_aktualisieren_aller_Variablen.jpg

Das zweite: Zykluszeit mit OPCUA Hinzufügen von neuen Variabeln in Watchlist(also neuer Subscribe, wahllos Struct und alles wilde)

Zykluszeit_mit_OPCUA_Hinzufügen_von_neuen_Variabeln_in_Watchlist.jpg

Beim laden geht wie schon gesagt der OPC-Server in Stop und der Client connected in der Regel neu. Das ergibt dann das erste Bild. Sieht ähnlich aus wie bei dir.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Unterschätzt mal die Schleifen nicht. Programmcode in Schleifen muß prinzipiell langsamer sein als die entsprechende Anzahl einzelner Anweisungen (*), weil mehr Anweisungen ausgeführt werden müssen, weil zu dem was die "produktiven" Anweisungen tun, noch zusätzlich der Schleifenzähler-Code und evtl. Pointer-Verwaltung und aufwendigere indirekte Adressierung dazukommt. Je nachdem wie viele oder wenige Anweisungen in jedem Schleifendurchlauf auszuführen sind, ist eine Verlangsamung des Codes auf die doppelte bis dreifache Abarbeitungszeit durchaus möglich. wie man z.B. im Bild von escride1 in #30 sehen kann

Ich meinte jetzt auch wenn man den gleichen Code nimmt. Also wenn man mit index arbeiten z.B. in einem Array das man denselben Code weiterkopiert und den Index zum nächsten Netzwerk um 1 hochzählt z.B.
Dann ist der unterschied ja nur noch der Schleifenzählercode. klar wenn man im Arbeitscode in der Schleife nur ein Bit verknüpft fällt die Schleifenberechnung ins Gewicht aber wenn man z.B. sowas hier ohne Schleife machen müsste und diesen Code auch nur 10 Mal kopieren würde um die Schleife zu vermeiden, wäre der CPU Zeitgewinn wohl kaum messbar die Speicherverschwendung aber wohl schon sichtbar.

Code:
            IF NOT (#Indizies.SetConfig >= 0 AND #Indizies.SetConfig <= #obereGrenze) THEN
                #Indizies.SetConfig := 0;
            END_IF;
            
            
            IF NOT #Fut_Tel_Koppel.Send_Koppel.Req AND #Telegramstarten THEN
                WHILE #Indizies.SetConfig >= 0 AND #Indizies.SetConfig <= #obereGrenze DO
                    IF #Signale[#Indizies.SetConfig].setconfig.Req AND #Signale[#Indizies.SetConfig].Act THEN
                        #Data_Len := #Len_SetConfig;
                        "FC_Fut_TAG_Gen"(#Signale[#Indizies.SetConfig].TagCmd);
                        #Signale[#Indizies.SetConfig].setconfig.Telegram[1] := #Signale[#Indizies.SetConfig].Act_Signalstatus.Config.Tout.%B1;
                        #Signale[#Indizies.SetConfig].setconfig.Telegram[2] := #Signale[#Indizies.SetConfig].Act_Signalstatus.Config.Tout.%B0;
                        "FC_Fut_Strom_to_Bytes"(Byte0 => #Signale[#Indizies.SetConfig].setconfig.Telegram[3],
                                                Byte1 => #Signale[#Indizies.SetConfig].setconfig.Telegram[4],
                                                Strom := #Signale[#Indizies.SetConfig].Act_Signalstatus.Config.Light);
                        "FC_Fut_SendTelCompose"(Addr      := #Signale[#Indizies.SetConfig].sid,
                                                Count     := #Data_Len,
                                                TagCmd    := #Signale[#Indizies.SetConfig].TagCmd,
                                                Data      := #Signale[#Indizies.SetConfig].setconfig.Telegram,
                                                Command   := #Cmd_SetConfig,
                                                SenderTel := #Fut_Tel_Koppel.Send_Koppel.Tel);
                        #Fut_Tel_Koppel.Send_Koppel.Len := #SendTelHeadLen + #Chk1 + #Data_Len + #Chk2;
                        #Signale[#Indizies.SetConfig].setconfig.Req := false;
                        #Fut_Tel_Koppel.Send_Koppel.Req := true;
                        #Indizies.SetConfig += 1;
                        EXIT;
                    ELSE
                        #Indizies.SetConfig += 1;
                    END_IF;
                END_WHILE;
            END_IF;

Aber ich glaube das führt jetzt zu weit. Das zyklusproblem scheint ja doch von woanders her zu kommen ^^
 
Zuletzt bearbeitet:
Zurück
Oben