TIA IEC Timer Verständnisproblem

Zuviel Werbung?
-> Hier kostenlos registrieren
Erreichen will ich also das das Ventil Xmal gleich lange angesteuert wird, wenn der Knopf am Touch gedrückt wird.
Wichtig ist dabei, dass egal wie oft, die Dauer der Ventilansteuerung immer gleich ist.

Du möchtest nur aus irgendeinem Grund die Anzahl angeben. Warum denn? Wenn man die Gesamtzeit angibt reicht das nicht?
Aber wenn Du das unbedingt willst, wir brauchen dafür gar keinen Zähler weil es ja "am Stück" laufen soll.
Code:
FUNCTION_BLOCK "Baustein_1"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_INPUT 
      Amount : Int;
   END_VAR

   VAR_OUTPUT 
      QValve : Bool;
   END_VAR

   VAR_IN_OUT 
      "HMI.Start" : Bool;
   END_VAR

   VAR 
      Zeitwert : Time;
      sTPValveMan {InstructionName := 'TP_TIME'; LibVersion := '1.0'} : TP_TIME;
   END_VAR


BEGIN
    #Zeitwert:=INT_TO_TIME(#Amount*100);
    #sTPValveMan(IN:=#"HMI.Start",
                 PT:=#Zeitwert,
                 Q=>#QValve);
    IF #sTPValveMan.Q THEN
        #"HMI.Start" := false;
    END_IF;
    
END_FUNCTION_BLOCK
Zwischen BEGIN und END_FUNCTION_BLOCK steht der eigentliche Code.
Du musst nur die Anzahl Deiner Stöße mit der voreingestellten Zeit (hier 100ms) multiplizieren. Wenn man mag kann die 100 auch eine im Panel einstellbare Zeit sein. Dafür dann einfach im Panel auch das hinzufügen als Integer und anstelle der 100 eintragen.
 
Du möchtest nur aus irgendeinem Grund die Anzahl angeben. Warum denn? Wenn man die Gesamtzeit angibt reicht das nicht?
Aber wenn Du das unbedingt willst, wir brauchen dafür gar keinen Zähler weil es ja "am Stück" laufen soll.
Code:
FUNCTION_BLOCK "Baustein_1"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_INPUT
      Amount : Int;
   END_VAR

   VAR_OUTPUT
      QValve : Bool;
   END_VAR

   VAR_IN_OUT
      "HMI.Start" : Bool;
   END_VAR

   VAR
      Zeitwert : Time;
      sTPValveMan {InstructionName := 'TP_TIME'; LibVersion := '1.0'} : TP_TIME;
   END_VAR


BEGIN
    #Zeitwert:=INT_TO_TIME(#Amount*100);
    #sTPValveMan(IN:=#"HMI.Start",
                 PT:=#Zeitwert,
                 Q=>#QValve);
    IF #sTPValveMan.Q THEN
        #"HMI.Start" := false;
    END_IF;
   
END_FUNCTION_BLOCK
Zwischen BEGIN und END_FUNCTION_BLOCK steht der eigentliche Code.
Du musst nur die Anzahl Deiner Stöße mit der voreingestellten Zeit (hier 100ms) multiplizieren. Wenn man mag kann die 100 auch eine im Panel einstellbare Zeit sein. Dafür dann einfach im Panel auch das hinzufügen als Integer und anstelle der 100 eintragen.
Ich glaube wir reden aneinander vorbei. Die Zeit die das Ventil angesteuert wird, wird separat eingestellt.

Am Touch will ich nur die Anzahlt einstellen.

Also bei Anzahl 3 und ButtonStart =>
1.Ventil true für 100ms dann false, 2.Ventil true für 100ms dann false, 3. Ventil true für 100ms dann false.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich glaube wir reden aneinander vorbei. Die Zeit die das Ventil angesteuert wird, wird separat eingestellt.

Am Touch will ich nur die Anzahlt einstellen.

Also bei Anzahl 3 und ButtonStart =>
1.Ventil true für 100ms dann false, 2.Ventil true für 100ms dann false, 3. Ventil true für 100ms dann false.
Ja und warum geht Dein Ausgang immer auf das gleiche QValve? Wo willst Du das denn unterscheiden?
Ich seh nicht das da mehrere Ventile steht...
Wo wolltest Du denn die Ausgänge noch unterscheiden?
 
Ja und warum geht Dein Ausgang immer auf das gleiche QValve? Wo willst Du das denn unterscheiden?
Ich seh nicht das da mehrere Ventile steht...
Wo wolltest Du denn die Ausgänge noch unterscheiden?
Entschuldige.
Ich meine mit der Nummerierung die Sprühstöße

Also:

Anzahl Sprühstoße 3 und Button drücken
=> 1. Sprühstoß: Ventil für 100ms true, dann false
2. Sprühstoß: Ventil für 100ms true, dann false
3. Sprühstoß: Ventil für 100ms true, dann false
 
Gut, dann brauchst Du eine Puls-Pause-Kombination mit mehreren Ausgängen sowie variabel einstellbaren Ventilen da ich nicht weiß wieviele Du hast und variablem Puls und Pause zwischen den Ventilen.

Der Baustein würde jedes Ventil 1x schalten für die Pulszeit, eine Pause machen, dann das nächste Ventil schalten bis tSpitAmount erreicht wurde.
Sollte HMI.Button.Hand.Start in der Zwischenzeit wegfallen würde der Vorgang zurückgesetzt.
Code:
FUNCTION_BLOCK "Baustein_2"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1
   VAR_INPUT 
      tSpitAmount : Int;
      Puls : Time := T#200MS;
      Pause : Time := T#1S;
   END_VAR

   VAR_OUTPUT 
      QValve : Array[1..30] of Bool;
      aktiv : Bool;
   END_VAR

   VAR_IN_OUT 
      "HMI.Button.Hand.Start" : Bool;
   END_VAR

   VAR 
      aktuelles_Ventil : Int;
      Schleife { S7_SetPoint := 'True'} : Int;
      Start_intern : Bool;
      HM_FL { S7_SetPoint := 'True'} : Bool;   // Flankenmerker
      Timer_Pulszeit {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;
      Timer_Pausenzeit {InstructionName := 'TON_TIME'; LibVersion := '1.0'} : TON_TIME;
   END_VAR


BEGIN
    #Start_intern := #"HMI.Button.Hand.Start";
    #Timer_Pulszeit(IN := #Start_intern AND NOT #Timer_Pausenzeit.Q,
                    PT := #Puls);
    IF NOT #HM_FL AND #Timer_Pausenzeit.Q THEN
        #aktuelles_Ventil += 1;
    END_IF;
    #HM_FL := #Timer_Pausenzeit.Q;
    IF #aktuelles_Ventil > #tSpitAmount OR NOT #"HMI.Button.Hand.Start" THEN
        #aktuelles_Ventil := 1;
        
        #"HMI.Button.Hand.Start" := false;
    END_IF;
    FOR #Schleife := 1 TO #tSpitAmount DO
        #QValve[#Schleife] := NOT #Timer_Pulszeit.Q AND #Start_intern AND #aktuelles_Ventil = #Schleife;
    END_FOR;
    #Timer_Pausenzeit(IN := #Timer_Pulszeit.Q,
                      PT := #Pause);
    #aktiv := #Start_intern;
    
    
    
    
END_FUNCTION_BLOCK

Also, so würde ich das dann zumindest machen.
 
Zurück
Oben