Analogwerte im Array kontinuierlich speichern.

ara1989

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

ich beschäftige mich vom kurzen Zeit mit CODSYS 2.3, und versuch Analogwerte von den Sensorn im Array zu speichern bzw. einlesen und dann durch LABVIEW im Server zu schicken und dort zu speichern.

1-. Was ich gemacht habe:
A1 Array erstellt, dadurch die Werte von den Sensorn gelesen wird,

2-. A2 Array erstellet, dadruch werden alle Werte von A1[0].

mein Problem ist, dass die gespeicherte Werte im A2 ändern sich mit Änderung der Werte vom Sensor.

mein Ziel ist, dass ich alle geänderte Werte vom ersten Sensorn im A2 speichere.

Kann jemand mir helfen?

Damit das klarer wird:

mein Code:

PROGRAM PLC_PRG
A1 AT %ID4 :ARRAY [0..3] OF REAL ; (*4 verschiedene Sensor wert gezeigt *)
A2 : ARRAY [0..9] OF REAL; (*dadruch wird die Werte von A1[0] im A2[] gespeichert, Also erste 8 Werte von A1[0] *)
i : INT:= 0;
VAR

Anweisung:

FOR i:= 0 TO 8 DO
IF A2[i-1]<> A1[0] THEN
A2 := A1[0];
i := i+1;
END_IF
END_FOR

Problem(beim Start der Codesys. Wird gezeigt:):

A2[0]:= 32.075
A2[1]:= 0
A2[2]:= 32.075
A2[3]:= 0
A2[4]:= 32.075
A2[5]:= 0
A2[6]:= 32.075
A2[7]:= 0
A2[8]:= 32.075
A2[9]:= 0

Warum bekomme ich immer 0 bei jeder i+1 ?
warum bekomme ich immer das selbe immer 32.075? (d.h: bei jeder Änderung des Sensors Wert ändert sich auch der Werte 32.075 je nachdem welche Werte der Sensor ständig gibt).

ich will gerne wissen, wie ich alle veränderten Werte des ersten Sensor im A2[] speichern bzw. zeigen kann.

ich bedanke mich im Vorraus.

Gruß
Ara
 
Einmal addiert die For-Schleife und einmal addierst Du 1 zu i

Schau mal beim Stichwort Flankenauswertung nach. Das ist genau das Prinzip was Du suchst.

if sensorwert <> sensorwert_alt then
arraywert:=sensorwert;
i:=i+1;
end_if;
sensorwert_alt:=sensorwert;

Das packst Du jetzt in eine Vierfachschleife und machst dasselbe für alle 4 Sensorwerte im Array.
Aber dabei fehlt Dir die Zeit der Änderung, was m.E. eine Auswertung unmöglich macht.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
1.
Du greifst hier auf das Array Element -1 zu, also auf irgend einen Wert im Speicher weil des Element -1 nicht gibt:

FOR i:= 0 TO 8 DO
IF A2[i-1]<> A1[0] THEN

2.
Eine Schleife wird in einem Zyklus immer komplett durchlaufen. Da sich deine Sensorwerte aber innerhalb des Zyklus nicht ändern (IO werden zwischen 2 Zyklen ausgelesen) hat dein A1[0] in der Schleife immer den gleichen Wert. D.h. du knallst dir jedes mal A2 mit dem Wert von A1[0] zu.
 
Zusätzlich wird dann i um eins incrementiert, sodass beim nächsten Schleifendurchlauf (die Schleife inrementiert nochmal) i-1=0 ist (initialwert des arrays).

Warum der Aufwand, nach geänderten Werten zu suchen? Bei Beckhoffs Analogkarten, zeigt ein Flag neue Werte an (jeweils nach einem AD-Zyklus). Ich vermute, das auch andere Karten im Codesysumfeld sowas können.
 
Zuletzt bearbeitet:
Zurück
Oben