2 DBs ein Problem

RON_87

Level-1
Beiträge
36
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

Habe folgendes Problem und weiß nicht wie ich es am einfachsten lösen kann.

Habe ein DB mit ca. 5000 Bits. Diesen will ich spiegeln und somit einen 2ten DB erstellen.

Allerdings soll die Spiegelung erst nach einer eingestellten zeit passieren.

D.h

DB1.DBX0.1 = True => eingestellte zeit => DB2.DBX0.1 = True

Es soll keine Kopie des DBs nach einer bestimmten zeit erfolgen sondern es soll jedes einzelne Bit betrachten werden.

Die eingestellte zeit ist für alle Bits gleich.

Natürlich soll dies so wenig wie möglich zykluszeit kosten.
 
Verstehe ich nicht!
Was macht das für einen Sinn, den DB nicht nach Zeit x zu kopieren?

Wenn Du das unbedingt bitweise machen willst, dann nimm 2 Schleifen.
1. Schleife für bitweises hochzählen von 0 bis 7
2. Schleife für byteweises hochzählen von 0 bis ...
Es kann Dir natürlich passieren, das Du aufgrund der "langen" Schleife diese Operation auf mehrere Zyklen aufteilen musst!

Idealerweise nimmst Du hierfür SCL zum programmieren.

Einfacher gehts mit SFC20 (Blockmove)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es soll nicht der ganze DB nach zeit x kopiert werden
weil es könnte ja sein das ein Bit 1/2x erst hat.

Ablauf wäre wie folgt

DB1.DBX0.1 = 1 => zeit x starten => zeit abgelaufen => DB2.DBX0.1 = 1

DB1.DBX0.2 = 1 => zeit y starten => zeit abgelaufen => DB2.DBX0.2 = 1

Der Zeitwert ist allerdings gleich 10sec.
 
Bei einem DB mit 5000 Bits, die einzeln überwacht werden sollen,
müssten das gem. deinem Ansinnen also 5000 Zeiten zu jeweils
10s sein, die du vorhalten willst ?

Das ist eine echte Herausforderung !
 
Prüfen 10 Sekunden warten, kopieren nächster da dauer der Durchlauf nur 13,8 Stunden für die 5000 Bits aber alles mit einem Timer. ;)

Gruss Daniel
 
Hm, was ist, wenn innerhalb des Zeitfenster von 10s (für ein geändertes Bit) noch ein oder mehrere weitere Bits hinzukommen ?
Die dürften dann ja erst nach 10s + X kopiert werden, oder ?

X < 10s
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Wobei eine Idee hätte ich da schon. SCL und da eine Art ARRAY of SFB4. Nur ob das die CPU Packt.
Die 5000 Bits in einem Zyklus durchackern wird hart.

Gruss Daniel
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Vielleicht ein weiterer Lösungsansatz:

Den DB1 zwischenspeichern (DB xx) und in jedem Zyklus auf Änderung prüfen.
Bei erkannter Änderung einen Zeiger auf dieses Bit zusammen mit einem
Zeitstempel der Systemzeit (DB yy) ablegen.
Die abgelegten Zeitstempel in jedem Zyklus mit der aktuellen Systemzeit
auf >=10s prüfen, wenn ja, dann in DB 2 kopieren.

Das spart die ganzen Zeiten/TON´s, wie sich dabei die Schleifen auswirken, wäre dabei
einen Versuch wert.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Aktuelle CPU können doch 16000 DB's verwalten!

Dennoch, was sind das für Bit's? Was haben die für eine Funktion? 5000 : 32 = 156,.. Doppelwörter. Würde es ein Doppelwortvergleich nicht auch tun?
 
Hallo
Danke erstmal für die Antworten....

Habe auch schon die Idee gehabt einen DB anzulegen, in welchem die Zeit von jedem einzelnen Bit sozusagen gespeichert wird. Allerdings braucht man ja mindest ein Word pro Bit für die Zeit-
Dies würde allerdings die DB Bausteingröße sprengen.

Der zweite Gedanke war die Einheit auf ein Byte zu verkleinern. In dem man
die Anzahl der Zyklen in der eingestellten Zeit ermittelt, um dann im DB Hochzählen zu können => Zähler.
 
hmmm nette Denksportaufgabe ;)
Softmaschines Lösung wäre die Richtige. ABER:
Lösung 1:
5000bit = 625 byte (Quelle) //Nicht wirklich groß
5000 x TIME_OF_DAY (32) = 160 000 byte + 5000 x DATE(32) = 320 000byte //Ja nee is klar. Für so eine Aufgabe so viel Speicher opfern........
Tageszeit Tag
5000bit = 625 byte (Ziel) //Nicht wirklich groß

Lösung 2:
5000bit = 625 byte (Quelle) //Nicht wirklich groß
5000 x time (32) = 160 000 byte //Sind mindestens 3DB´s. Für "alte" CPU´s 10DB´s (da bei 16k Schluss ist) und die CPU brauch auch min 256k speicher
T#24D_20H_31M_23S_648MS => damit es "dauerhaft" funzt musst EINEN Timer nehmen und alle 24Tage diesen reseten. Dadurch kann es im ungünstigsten fall, alle 24 Tage einmal vorkommen, dass statt 10 19sec gebraucht werden bis das Bit gesetzt wird.
5000bit = 625 byte (Ziel) //nicht wirklich groß

Lösung 3 (eigentlich einzig machbare):
5000bit = 625 byte (Quelle) //Nicht wirklich groß
5000bit x 1byte= 5000 byte //Sec Zähler
5000bit = 625 byte (Ziel) //Nicht wirklich groß

Ausführung:
Es wird ein Impuls von einer Sekunde genutzt(Flanke). Dieser läuft durch eine Schleife (können auch zwei sein und jeder wird 500ms nach der Anderen gestartet. Jeh nach CPU)

//reset wenn bit=0
U DB1.DBX0.0
spb res
L 0
T Zaehler_Byte_1
res: nop 0

//Zähler hochzählen bit=1
U DB1.DBX0.0
spbn plus
L Zaehler_Byte_1
L 1
+i
T Zaehler_Byte_1
plus: nop 0

//Auswertung
L Zaehler_Byte_1
L 10
>=i
S DB2.DBX0.0

Da der Durchlauf nur alle Sekunde ausgeführt wird, ist das der Timer und im Zaehler_Byte stehn die abgelaufenen Sekunden.

Zur Schleife darfst es selber machen :)
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ganz ohne Timer und mit weniger Speicherbedarf als mit TON:
1. Bits in DB1 auf positiven Zustandwechsel prüfen (Flanke)
2. Aktuelle Zeit und Datum in ein Array of Date_and_Time (DT) eintragen
3. Dieses Array zyklisch durchsuchen auf Zeiten älter als 10s untersuchen und entsprechendes Bit im DB2 setzen

Das Verfahren lässt sich natürlich weiter verbessern (Wertepaare, Sortierung, ...). In SCL eigentlich gar kein so großer Aufwand.

Gruß
Dieter
 
Hallo

Wenn die Genauigkeit von einer Sekunde reicht, würde ich einen weiteren DB mit 5000 Integer-Werten, in welchen 5000 Istzeiten abgelegt werden erstellen.
Desweiteren erstellst Du einen FC, welcher nur jede Sekunde aufgerufen wird (zB. Weckalarm OB). In diesem FC machst Du eine Schlaufe in der Du jeweils jedes der 5000 Bit's im auf True kontrollierst. Ist das Bit True, so wird der dazugehörige Istwert um eins erhöht. In der gleichen Schlaufe wird der Istwert auf >=10 kontrolliert und das entsprechende Bit im zweiten DB auf True gesetzt. Wird das erste Bit wieder False, muss der Istwert und das Bit im zweiten DB wieder auf 0 gesetzt werden.

Benutze AWL und beachte die Ausführungszeiten der Befehle (in der Schlaufe) die Du verwendest, dann wird sich die Zykluszeit in Grenzen halten.

Um Zykluszeit zu sparen , könnte man z.B. alle 100mS 500 Bit's prufen.

Das Ganze erinnert mich wieder an die gute alte Zeit der S5, wo man bei jedem Befehl versuchte Zykluszeit zu sparen.

Gruss Hoyt
 
Wenn die Genauigkeit von einer Sekunde reicht, würde ich einen weiteren DB mit 5000 Integer-Werten, in welchen 5000 Istzeiten abgelegt werden erstellen.
Desweiteren erstellst Du einen FC, welcher nur jede Sekunde aufgerufen wird (zB. Weckalarm OB). In diesem FC machst Du eine Schlaufe in der Du jeweils jedes der 5000 Bit's im auf True kontrollierst. Ist das Bit True, so wird der dazugehörige Istwert um eins erhöht. In der gleichen Schlaufe wird der Istwert auf >=10 kontrolliert und das entsprechende Bit im zweiten DB auf True gesetzt. Wird das erste Bit wieder False, muss der Istwert und das Bit im zweiten DB wieder auf 0 gesetzt werden.
:s12:
Also wenn ich dieses Problem zu lösen hätte, würde ich mich jetzt ganz klar für die Lösung von Hoyt entscheiden. :cool:
 
Zurück
Oben