Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 10 von 10

Thema: Array mit Zeitwerten

  1. #1
    Registriert seit
    07.10.2013
    Beiträge
    3
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    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
    Zitieren Zitieren Array mit Zeitwerten  

  2. #2
    Registriert seit
    21.04.2012
    Beiträge
    62
    Danke
    14
    Erhielt 11 Danke für 9 Beiträge

    Standard

    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];

  3. #3
    Registriert seit
    12.05.2010
    Ort
    Dortmund
    Beiträge
    889
    Danke
    57
    Erhielt 121 Danke für 89 Beiträge

    Standard

    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
    Weil Denken die schwerste Arbeit ist, die es gibt, beschäftigen sich auch nur wenige damit.

  4. #4
    Registriert seit
    25.11.2010
    Ort
    OWL
    Beiträge
    752
    Danke
    27
    Erhielt 165 Danke für 143 Beiträge

    Standard

    Zitat Zitat von Klingone22 Beitrag anzeigen
    Code:
    timer.IN:=TRUE AND NOT timer.Q;
    Muss das nicht so heissen?
    Code:
    timer.IN:=(TRUE OR FALSE) AND NOT timer.Q;

  5. #5
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.717
    Danke
    443
    Erhielt 920 Danke für 740 Beiträge

    Standard

    Zitat Zitat von StructuredTrash Beitrag anzeigen
    Muss das nicht so heissen?
    Code:
    timer.IN:=(TRUE OR FALSE) AND NOT timer.Q;
    Also ich würd' da wenn schon, denn schon auf Nummer sicher gehen:
    Code:
    timer.IN:=(TRUE OR NOT FALSE) AND NOT timer.Q;

  6. #6
    Registriert seit
    07.10.2013
    Beiträge
    96
    Danke
    7
    Erhielt 11 Danke für 10 Beiträge

    Standard

    Zitat Zitat von hucki Beitrag anzeigen
    Also ich würd' da wenn schon, denn schon auf Nummer sicher gehen:
    Code:
    timer.IN:=(TRUE OR NOT FALSE) AND NOT timer.Q;
    (********************************************************)
    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;
    (***************************************************************)

  7. #7
    Registriert seit
    07.10.2013
    Beiträge
    96
    Danke
    7
    Erhielt 11 Danke für 10 Beiträge

    Standard

    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;
    (**********************************************************************)

  8. #8
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.207
    Danke
    927
    Erhielt 3.293 Danke für 2.662 Beiträge

    Standard

    Zitat Zitat von Irek Beitrag anzeigen
    Timer(IN:=1 AND NOT Timer.Q,PT:=INT_TO_TIME(_z*1000));
    Muss das nicht so heissen?
    Code:
    Timer(IN:=INT_TO_BOOL(1) AND NOT Timer.Q,PT:=INT_TO_TIME(_z*1000));


    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  9. #9
    Registriert seit
    07.10.2013
    Beiträge
    96
    Danke
    7
    Erhielt 11 Danke für 10 Beiträge

    Standard

    Zitat Zitat von PN/DP Beitrag anzeigen
    Muss das nicht so heissen?
    Code:
    Timer(IN:=INT_TO_BOOL(1) AND NOT Timer.Q,PT:=INT_TO_TIME(_z*1000));


    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

  10. #10
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.717
    Danke
    443
    Erhielt 920 Danke für 740 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    @Irek,
    1. erkennt man Ironie meistens an den , 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.
    Zitat Zitat von Irek Beitrag anzeigen
    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.



Ähnliche Themen

  1. Antworten: 18
    Letzter Beitrag: 21.12.2016, 17:03
  2. Array mit Zeitwerten füllen
    Von MPH im Forum CODESYS und IEC61131
    Antworten: 7
    Letzter Beitrag: 24.10.2012, 11:33
  3. ST - FB mit ARRAY als OUT
    Von mike_roh_soft im Forum CODESYS und IEC61131
    Antworten: 6
    Letzter Beitrag: 11.01.2012, 14:32
  4. Arbeiten mit Array
    Von slma im Forum Simatic
    Antworten: 32
    Letzter Beitrag: 27.07.2007, 09:26
  5. DB -> Name mit Array-Klammern?
    Von Hawkster im Forum Simatic
    Antworten: 10
    Letzter Beitrag: 09.12.2006, 12:30

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •