Step 7 Messwert von DB nacheinander in anderen DB kopieren

Hacke3

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

ich habe einen Messwert (REAL) von einem Lasersensor aufgenommen, dieser schwankt jedoch ziemlich. Nun möchte ich diesen Messwert nacheinander abspeichern ca. 50-100 mal um daraus in Excel ein Diagramm darstellen zu können, wie die maximale Abweichung ist etc. . Über den BLK MOV Baustein kopiere ich mir 50 Messwerte Taktabhängig in einen anderen DB, jedoch ist die Zugriffsbreite nicht dynamisch, sondern fix mit 196 Byte.

Meine Daten im DB sehen momentan so aus: (Messwert1 zum Zeitpunkt 1 in DB10.DBD0.0, Messwert1 zum Zeitpunkt 1 in DB10.DBD4.0, Messwert1 zum Zeitpunkt 1 in DB10.DBD8.0...) und werden alle mit jedem Takt dann neu synchronisiert.

Meine Frage nun, kann ich diese dynamisch machen, dass mit jedem Takt diese um 4 Byte verringert wird? Oder gibt es andere elegante Lösungen, ich habe es auch mit AWL und SCL probiert, bin jedoch daran gescheitert.

Meine Daten im DB sollen später so in etwa aussehen:

Messwert1 zum Zeitpunkt 1 in DB10.DBD0.0
Messwert2 zum Zeitpunkt 2 in DB10.DBD4.0
Messwert3 zum Zeitpunkt 3 in DB10.DBD8.0
....

Viele Grüße

Hacke
 
Der Blockmove arbeitet ja mit Pointern als Angabe der Herkunft und Zieldaten.
Was du machen müsstest, ist die Variable die die Länge in den beiden Pointern angibt in jedem Zyklus um 4 Byte zu verringern.
D.h. Pointer zu jedem Aufruf neu zusammenbauen, die Länge jedesmal um 4 Byte verringert. Du darfst nicht 40Byte versuchen in 36 zu schreiben, deshalb 36 auf beiden Seiten, usw.

Weshalb du aber immer alle Messwerte schreibst erschließt sich mir nicht. Du bekommst doch zu jedem Zeitpunkt einen einzigen Messwert, der in einem REAL drinsteht. Dann schreibe doch auch immer nur einen einzigen.

Du kannst aber auch die Messwerte symbolisch in den DB schreiben indem du ein Array of DINT[1..100] angibst und dann in jedem Aufruf den aktuellen Messwert (einen einzigen) in die Zielvariable schreibst, die der aktuellen Messwertnummer entspricht. Z.B. der vierte Messwert beim vierten Durchlauf "Messwert_DB".Messwert[4] := Akt_Messwert; beim näxhten Aufruf ist die Laufvariable dann 5 und du bekommst den Wert in die fünfte Variable geschrieben "Messwert_DB".Messwert[4] := Akt_Messwert;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zombie,

mein Problem hast du gut erkannt, könntest du mir bitte ein Programmbeispiel geben, wie ich es mit dem Array machen könnte? Ich hatte schon selber eine Funktion geschrieben, jedoch scheiterte es dann daran, dass ich an dem Ausgang der Funktion nicht das Array eingeben konnte bzw. mir der Befehl nicht bekannt ist.

Hier meine Funktion:

FUNCTION FC1: VOID
VAR_INPUT
Differenz_MW : REAL; // Differenz zwischen den beiden Sensoren
Null_Merker : BOOL; // Einschaltkontakt bei pos. Flanke
Taktmerker : BOOL; // Taktmerker mit 100ms
END_VAR
VAR
i : INT; // Zählvariable
END_VAR
VAR_OUTPUT
Messwerte : ARRAY [0..49] OF Real ;
END_VAR
BEGIN
//Wird ausgeführt wenn eine Taktflanke erkannt wird und der Enable Kontakt gesetzt ist
IF Taktmerker & Null_Merker THEN
FOR i := 0 TO 49 DO
Messwerte := Differenz_MW;
END_FOR;
END_IF;
END_FUNCTION


Viele Grüße

Hacke
 
Zurück
Oben