TIA SPS Arbeitsreduktion

Stogi

Level-2
Beiträge
103
Reaktionspunkte
4
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich bin grade dabei einen Kommunikationsbaustein zu schreiben. Kurz: Remanente DBs werden mit Einträgen gefüllt, an ein anderes System übertragen und anschließend entfernt. Ein Logikabschnitt prüft wie voll die DBs sind.

Jetzt zur eigentlichen Frage:
Die Überprüfung muss nicht jeden Zyklus oder zu definierten Zeitpunkten stattfinden, u.a. weil das Ganze nicht sehr dynamisch ist. Ich hätte jetzt einfach eine Variable x hochgezählt (z.b. bis 50) und dann wenn x = 50 die Überprüfung gemacht und die Variable resettet. Macht man das so? Ist ja sicher ein häufiger Fall - gibt es hier ein (Siemens)-Standardverfahren bzw. ne good practice?
 
Moin Stogi,

Du solltest x >= 50 vergleichen.

Ich würde es aber anders machen:

Code:
#x += (#x + 1) mod 50;

IF
    #x = 0
THEN
    do something;
END_IF;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hey,
danke für die schnelle Antwort.
Also ich schließe mal das allgemein Vorgehen einfach ne Variable zu zählen/berechnen und die Ausführung eines Codeabschnittes davon abhängig zu machen ist in Ordnung.

Warum deine Berechnung? Effizienter?
 
Warum deine Berechnung? Effizienter?

Ja sehr. Clevere Anwendung von simpler Mathematik. Die Berechnung kommt für das Hochzählen und Grenzwert-prüfen und Rücksetzen der Variable ohne IF..THEN-Geschwurbel und ohne Sprünge aus, und liefert garantiert einen Wert im Bereich 0..49. Der clevere "Trick" liegt in der Verwendung der Mod-Anweisung. Da ist allerdings ein kleiner Fehler: anstatt += muss da := stehen, also #x := (#x + 1) mod 50;
 
Zuletzt bearbeitet:
Sehr cool! Machen wirs gleich ein bisschen spannender!

Wie würdet ihr das dann umsetzen, wenn verschiedene Codeabschnitte versetzt ausgeführt werden sollten?
Einfach mehrere Variablen mit gleicher Berechnung wobei entweder der konstante Summand oder der Wert des Modulo sich unterscheiden?

Oder diesmal doch grade hochzählen und den entsprechenden Abschnitt hinter CASE oder IF-Abfrage für den Variablenwert ablaufen lassen?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Remanente DBs werden mit Einträgen gefüllt, an ein anderes System übertragen und anschließend entfernt.
Du meinst jetzt aber nicht, dass die DB entfernt werden, sondern die Einträge?
Wenn das Entfernen effizient sein soll, dann lösche die Einträge aber nicht unnötigerweise durch Überschreiben mit Löschzeichen.
 
Kurz: Remanente DBs werden mit Einträgen gefüllt, an ein anderes System übertragen und anschließend entfernt. Ein Logikabschnitt prüft wie voll die DBs sind.
Das war zwar nicht explizit deine Frage, aber wie löst du in „ein anderes System übertragen“ und „anschließend entfernen“?
Je nach „Übertragungsart“ wäre eventuell ein Handshake sinnvoll.

Beim „anschließend entfernt“ handelt es sich um ein löschen der Daten?
Das darf natürliche erst erfolgen, wenn die Daten zuvor vollständig übertragen wurden.

Deine Anwendung ist so langsam, dass die Übertragung immer problemlos zwischen 2 Aufzeichnungen passt?
 
Du meinst jetzt aber nicht, dass die DB entfernt werden, sondern die Einträge?
Wenn das Entfernen effizient sein soll, dann lösche die Einträge aber nicht unnötigerweise durch Überschreiben mit Löschzeichen.
Haha nein natürlich werden die Einträge entfernt nicht die DBs.

Mein DB ist ein Ringpuffer.
Neue Einträge kommen an die erste freie Stelle
Ist ein Eintrag kommuniziert, verschieben sich alle Einträge um 1

Was ist meine Alternative?
Ein Merkmal im DB, ob der Eintrag schon kommuniziert wurde und ein separater DB, der die Reihenfolge enthält?
Neue Einträge überschreiben dann einfach die erste Position im DB, die als "kommuniziert" geflagt ist?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das war zwar nicht explizit deine Frage, aber wie löst du in „ein anderes System übertragen“ und „anschließend entfernen“?
Je nach „Übertragungsart“ wäre eventuell ein Handshake sinnvoll.

Beim „anschließend entfernt“ handelt es sich um ein löschen der Daten?
Das darf natürliche erst erfolgen, wenn die Daten zuvor vollständig übertragen wurden.

Deine Anwendung ist so langsam, dass die Übertragung immer problemlos zwischen 2 Aufzeichnungen passt?

Ja per Handshake.

Ich hatte das absichtlich etwas ungenau beschrieben um nicht vom Thema abzukommen aber:
Es sind 6 DBs in welche Einträge geschrieben und entfernt werden.
Aus diesen DBs wird dann der nächste Eintrag ausgewählt (Teils durch Zeit des Eintrags, teils durch Priorisierung zwischen den DBs)
Dieser Eintrag geht in eine Schnittstelle und wird dann kommuniziert.
Wenn Handshake ok, wird der nächste Eintrag gesucht, falls vorhanden.
 
Wie würdet ihr das dann umsetzen, wenn verschiedene Codeabschnitte versetzt ausgeführt werden sollten?
Wenn etwas 10000 mal ausgeführt werden soll, das aber für einen Zyklus zu lange dauert, dann die Wiederholungen auf mehrere Schritte/Zyklen aufteilen, zB. erst FOR i := 1 TO 5000 DO und im nächsten Schritt im nächsten Zyklus FOR i := 5001 TO 10000 DO
Allerdings muss man nun auch noch dafür sorgen, daß sich die Daten während der unterbrochenen Aufgabe nicht ändern.

Darf man fragen, was für eine gewaltige Aufgabe du da in Teilschritten ausführen willst?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn etwas 10000 mal ausgeführt werden soll, das aber für einen Zyklus zu lange dauert, dann die Wiederholungen auf mehrere Schritte/Zyklen aufteilen, zB. erst FOR i := 1 TO 5000 DO und im nächsten Schritt im nächsten Zyklus FOR i := 5001 TO 10000 DO
Allerdings muss man nun auch noch dafür sorgen, daß sich die Daten während der unterbrochenen Aufgabe nicht ändern.

Darf man fragen, was für eine gewaltige Aufgabe du da in Teilschritten ausführen willst?

Bei mir nicht groß/relevant. Das war rein interessehalber.
 
Zurück
Oben