Array mit Zeitwerten

Nanos

Level-1
Beiträge
3
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Liebe Experten,

ich möchte euch kurz mein Problem schildern und hoffe, dass einer von euch mir helfen kann. Ich arbeite mit Codesys2.3.

Ich habe 2 Arrays erzeugt. Das eine besteht aus Zeiten deklariert als TIME und das andere aus Integerwerten. Die Arrays bestehen aus jeweils 100 Werten
Ich benötige nun eine Schleife die den n-ten Zeitwert mit den n-ten Integerwert verknüpft. Z.B. Zeit[5]=10s und Integer[5]=3. Dann möchte ich, dass für 10 Sekunden der Wert 3 angezeigt wird und danach zur nächsten Zeit/Integer Kombination gesprungen wird und das ohne Delay.

Ich habs bisher erfolglos mit einer For-Schleife probiert in der ich einen TP-Timer eingebaut hab.

Bin dankbar für jede Hilfe

Nanos
 
So?

Code:
PROGRAM MAIN
VAR
	Zeit : ARRAY[1..100] OF TIME;
	Wert: ARRAY[1..100] OF INT;

	i:INT;
	Timer:TON;

	intDisplay: INT;
END_VAR



IF i>101 OR i<0 THEN
	i:=1;
END_IF;

timer.IN:=TRUE AND NOT timer.Q;

timer(pt:=Zeit[i]);


IF timer.Q=TRUE THEN
	i:=i+1;
END_IF;


intDisplay:=Wert[i];
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bilde dir einen Takt (so wie du es dir ja schon mit dem TP Timer gemacht hast).
Erstelle daraus eine Flanke.
Mit dieser Flanke incrementierst du die Variable z.B. "Zaehler". (Typ WORD)
Dann kannst du die entsprechenden ArrayWerte aufrufen ( Zeit[Zaehler] bzw. Integer[Zaehler] )und Verknüpfen ,so wie du möchtest.
Probiers mal aus, kannst ja hinterher mal den Code hier reinstellen.

Viel Erfolg
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also ich würd' da wenn schon, denn schon auf Nummer sicher gehen:
Code:
timer.IN:=(TRUE OR NOT FALSE) AND NOT timer.Q;
:ROFLMAO: :ROFLMAO:

(********************************************************)
PROGRAM MAIN
VAR
Zeit : ARRAY[1..100] OF TIME;
Wert: ARRAY[1..100] OF INT;
_i:INT:=1;(*Startwert Array*)
_z:INT:=3;(*Taktzeit Timer*)
Timer:TON;
intDisplay: INT;
zeitDisplay:TIME;
END_VAR

(*Programm*)

Timer(IN:=1 AND NOT Timer.Q,PT:=INT_TO_TIME(_z*1000)); (*1000ms=1s*)

IF _i < (100+1) AND Timer.Q THEN(*Array alle 3s bis 100 abarbeiten*)
intDisplay:=Wert[_i];(*Arrayitem anzeigen *)
zeitDisplay:=Zeit[_i];
_i:=_i+1;
ELSE
IF _i >=100 THEN(*wenn Ende erreicht dann wieder auf 1*)
_i:=1;
END_IF;
END_IF;
(***************************************************************)
 
PROGRAM MAIN
VAR
Zeit : ARRAY[1..100] OF TIME;
Wert: ARRAY[1..100] OF INT;
_i:INT:=1;(*Startwert Array*)
_z:INT:=3;(*Taktzeit Timer*)
Timer:TON;
intDisplay: INT;
zeitDisplay:TIME;
END_VAR
(****************************************************************)
Timer(IN:=1 AND NOT Timer.Q,PT:=INT_TO_TIME(_z*1000)); (*1000ms=1s*)

IF _i < (100+1) AND Timer.Q THEN(*Array alle 3s bis 100 abarbeiten*)
intDisplay:=Wert[_i];(*Arrayitem anzeigen*)
zeitDisplay:=Zeit[_i];
_i:=_i+1;
ELSE
IF _i >=100 THEN(*wenn ende erreicht dann wieder auf 1*)
_i:=1;
END_IF;
END_IF;
(**********************************************************************)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Muss das nicht so heissen? :confused:
Code:
Timer(IN:=INT_TO_BOOL(1) AND NOT Timer.Q,PT:=INT_TO_TIME(_z*1000));
:ROFLMAO: :ROFLMAO: :ROFLMAO:

Harald

Ja und Nein,
es kommt auf den Compiler an, viele vergessen, dass der Quelltext erst für die Steuerung
übersetzt wird.
Sofern die angewandte Schreibweise keinen Fehler bei der Übersetzung hervorruft, das
Programm fehlerfrei funktioniert sehe ich da kein Problem.


Irek
 
@Irek,
1. erkennt man Ironie meistens an den :ROFLMAO:, vor allem, wenn sie mehrfach benutzt werden
2. wäre es nett, wenn Du in Zukunft für Programmcode den Codebutton [#] in der 2. Iconzeile ganz rechts benutzt, dann läßt sich das Ganze besser lesen

und 3.
Sofern die angewandte Schreibweise keinen Fehler bei der Übersetzung hervorruft, das
Programm fehlerfrei funktioniert sehe ich da kein Problem.
könnte man die von nun schon 3 Usern aufgeführte Zeile unendlich so sinnlos erweitern, ohne das je ein Fehler bei der Übersetzung erzeugt wird.
Es reicht einfach:
Code:
IN:= NOT timer.Q
Ob direkt im Timeraufruf, wie bei Dir, oder vorweg, wie bei Klingone22, ist da unerheblich.
Man muss das nicht mit irgendwas verUNDen, was immer wahr ist, ob das nun TRUE, NOT FALSE, die implizite Umwandlung von 1 oder die explizite Anweisung INT_TO_BOOL(1) ist.
Aber wenn man nur ohne Fehler übersetzen möchte, steht das natürlich jedem frei.
;)

:ROFLMAO:
 
Zurück
Oben