Step 7 Zeitplanregelung

sps_klassik

Level-2
Beiträge
164
Reaktionspunkte
11
Zuviel Werbung?
-> Hier kostenlos registrieren
Hat jemand sowas?Also wo Sollwerte mit einem Zeitplan durchgeschaltet werden auf den Ausgang.
Die Parametersätze Sollwert und SollZeit liegen in einem DB als Array aus einer Struktur.(Sollwert+Ablaufzeit).
Abgelaufene Zeit und aktueller Datensatz als Information wären nicht schlecht.Sollwert als Real Format.
Eingabe Zeit im Time Format.IM Baustein kann man dann mit einer Schleife die Datensätze durchlaufen lassen.
Verändert man die Anzahl der Datensätze muss man im Baustein die Array groesse ändern.
 
Array-Größen lassen sich zur Laufzeit meines Wissens nicht ändern.

Du könntest deinen UDT im Array entsprechend definieren, dass du neben Sollwert und Zeit-Info auch ein Bool "Active" hast. Dann gehst du in der Schleife alle Elemente durch und prüfst, ob sie Aktiv sind, bevor du die Zeit auswertest. Dadurch kannst du dein Array im DB sehr groß machen. Du müsstest es nicht erweitern und würdest deine Auswertung trotzdem nicht durcheinander bringen
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zur Laufzeit muss nichts geändert werden.Nur generell soll die Anzahl der datensätze einfach verändert werden können.
Wenn ich halt 5 Datensätze brauche kopiere ich einen im DB dazu und ändere den Schleifenzähler.
 
Alternativ kannst du eine Globale Konstante definieren.

Dann hast du dein Array im DB als "Array [0..#CNT_DATASET] of UDT" und dein Schleifenzähler geht dann von 0 oder 1 bis #CNT_DATASET

Wenn du dann die Anzahl ändern möchtest, passt du die globale Konstante #CNT_DATASET an und musst es nicht an mehreren Stellen gleichzeitig ändern.
 
Alternativ kannst du eine Globale Konstante definieren.
Auf jeden Fall.
Spart dir im Nachhinein viel manuelles Ändern bzw. Konflikte wenn du mal eine Änderungsstelle übersiehst.

Für die Funktion, die die Datensätze durchschaltet, würde ich aber Vorschlagen diese per "Array[*] of Datensatztyp" zu übergeben.
Dann kann man im Baustein per UPPER/LOWER_BOUND die Arraygrenzen ermitteln und entsprechend in der Schleife verarbeiten.
Damit wäre die Logik zum Durchschalten der Datensätze unabhängig von der Anzahl der Datensätze (= Arraygröße) und unabhängig von externen Variablen (Thema: Bibliotheksfähigkeit).
 
Zuviel Werbung?
-> Hier kostenlos registrieren
oder eine idee im KOP/FUP-Style :) :
aus der LGF Standard Bibliothek x mal den LGF_TimerSwitch nehmen (Zeitschaltuhr, mit Startzeit, Stoppzeit in Format Monat/Tag/Stunde/Min und täglich, wöchentlich,....usw).
dann die x- Ausgänge auf den LGF_MergeBitsToWord in ein WORD wandeln.
dann den Standard Baustein MUX nehmen und mit dem WORD die Sollwerte umschalten....
LGF:
 
Ach, Mist, dann nehme ich alles zurück was ich zum Thema "Globale Konstanten" gesagt habe... Ich dachte, TE wäre in TIA unterwegs...
 
Kann ich das in S7 Klassik 5.5 integrieren?
Sind Tia Bibliotheken
Stimmt, die Info in welcher Programmierumgebung du dich rumtreibst wäre vllt. ganz nützlich gewesen.
Da bin ich aber leider raus, was die Möglichkeiten mit Array[*] und globalen Konstanten angeht.
Indizierter Zugriff oder etwas dark Magic mit Pointern müsste aber auch mit Classic-Systemen gehen.

Würde aber ja erst einmal theoretisch nichts dagegen sprechen den von @HaraldP. vorgeschlagenen Lösungsweg mit Classic-Bausteinen umzusetzen.
Ich meine es gibt auch im Classic entsprechende Bausteine.
Bei was & wie genau bin ich aber leider raus ¯\_(ツ)_/¯
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das bringt mich nicht weiter.Egal ob jetzt in TIA oder Klassik.
Ich denke ich nehme den Rampengenerator.Der hat die Funktionen Start Stop/Anhalten und eine Taktvorgabe in Sekunden.
Und den aufsummierten aktuellen Sekundenwert.
Ich kann auch Minuten nehmen.Aber auf diese Einheit bin ich halt festgelegt.
Das weitere wäre dann eine Array-Struktur in einem Datenbaustein festlegen.Die würde ich gerne an einen SCL-Baustein übergeben.
Dort könnte man mittels SCL dann durch das Array durchlaufen und mithilfe des Rampengeratorsausgangs [Zeit in Sekunden} die Zuweisungen machen.Ich hätte dann quasi 2 Bausteine die diese Funktion abbilden.
Die Frage ist nur bei SCL wie übergebe ich das Array aus Strukturen aus dem Datenbaustein.
 
Die Frage ist nur bei SCL wie übergebe ich das Array aus Strukturen aus dem Datenbaustein.
Dein Suchbegriff wäre wohl "indirekte Adressierung".

Wie 300er mit Arrays umgehen können weiß ich offen gesagt nicht genau.
Spontan würde ich dem Baustein zur Werteauswahl die DB-Nummer als Zahl übergeben und bausteinintern mir einen Pointer aus der DB-Nummer und dem Arrayindex zusammen schrauben.

Würde sicherlich funktionieren, aber keine Ahnung ob das der eleganteste weg in Classic wäre ¯⁠\⁠_⁠(⁠ツ⁠)⁠_⁠/⁠¯
 
Ich bin ein einfach denkender Mensch.Ich glaube das loht sich nicht.Ich mache das mal mit 5 Wertepaaren.
Im Grunde muss ich die Werte vorgeben.Dazu habe ich einen DB als Array mit Sollwert und Zeit eingegeben.
Beides in Real.
Die Wertepaare(Sollwert/Umschaltzeit) kann ich direkt im OB1 zum Testen zuweisen.
In einem weiteren Baustein Zeitplan FB(in FUP) lese ich die 5 Wertepaare ein.Ist altbacken aber einfach.
Dort berechne ich die Umschaltzeiten durch einfache Addition.Die Gesamtzeit berechne ich auch und zeige sie an.
Diese Gesamtzeit kriegt der Rampengerator als Sollwert..Starte ich den Rampengenerator gibt er am Ausgang die abgelaufene Zeit in Sekunden an.Diese lese ich ein und vergleiche sie mit den berechneten Werten und weise den jeweilgen Sollwert zu.Arg umständlich?
Vom programmieren her einfach.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich bin ein einfach denkender Mensch.Ich glaube das loht sich nicht.Ich mache das mal mit 5 Wertepaaren.
Im Grunde muss ich die Werte vorgeben.Dazu habe ich einen DB als Array mit Sollwert und Zeit eingegeben.
Beides in Real.
Die Wertepaare(Sollwert/Umschaltzeit) kann ich direkt im OB1 zum Testen zuweisen.
In einem weiteren Baustein Zeitplan FB(in FUP) lese ich die 5 Wertepaare ein.Ist altbacken aber einfach.
Dort berechne ich die Umschaltzeiten durch einfache Addition.Die Gesamtzeit berechne ich auch und zeige sie an.
Diese Gesamtzeit kriegt der Rampengerator als Sollwert...
Wo liegt denn nun das Problem?
 
Die Frage war nur gibt es einen einfacheren Weg, wie mit 2 Bausteinen oder gibt es was Fertiges.
Anscheind nicht.Bis jetzt hat sich auf jeden Fall keiner gemeldet.Ich würde das beispielsweise machen.
Aber jeder wie er mag.
 
Meine Frage war nur, ob das jemand schon mal gemacht hat.
Selbst im Classic gemacht? nein.
Schon gesehen? ja.

In unseren älteren Härteöfen funktionniert das im Prinzip mit nem Timer + Zählimpuls um den Index für das Sollwerte-Set zu generieren.
Ein kleiner Baustein macht dann aus DB-Nummer, UDT-Größe und Index den Pointer-Zugriff auf den jeweiligen Datensatz.
Dürfte aber eher S5-Style entsprechen, da man damals gerne funktionierende Konzepte übernommen hat.
Flexibilität war da keine Anforderung ¯\_(ツ)_/¯
 
Man braucht ja auch wenn man vom Haltemodus wieder auf einen neuen Sollwert verändert eine Rampenzeit.
Die würde dann jeweils eine Schrittweite berechnen.
Ich würde also gerne Sollwert,Rampenzeit(und damit Schrittweite) und Haltedauer(Sollwert) vorgeben.
Man müsste aber in SCL auf einen globalen Datenbaustein absolut zugreifen können?Dört hätte ich dann ein Array auss einem Datensatz.
Bin jetzt auch kein SCL Spezialist.Also einen SCL FB der auf einen globalen Datenbaustein zugreift.
Die Arraygroesse DB und SCL Programm müssen dann zusammenpassen.Oder man übergibt die Arraygroesse im DB noch dem SCL baustein.
Könnt ihr in eurem Fall dann auch automatisch die Schrittweite/Zeit verändern wenn die Sollwertsprünge unterschiedlich sind?
 
Zurück
Oben