Funktion soll dynamisch ausführbar sein

Praktikant321

Level-1
Beiträge
14
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin ,
Ich habe ein "kleines" Problem mit meiner Funktion.
Die Funktion soll nämlich eine Jalousie beim ersten mal Drücken eines Tasters herunterfahren , beim zweiten mal drücken Stoppen. (Das gleiche beim hochfahren auch , und einmal für Alle Jalousien )
Nun , das habe ich bereits geschafft , möchte dies aber nicht für insgesamt 30 Ausgänge und 24 Eingänge wiederholen , da das Programm sonst sehr unübersichtlich und viel zu groß wird.
Leider habe ich keine gute Lösung dafür gefunden diese Funktion mit Variablen zu belegen , damit immer die richtigen Ausgänge geschaltet werden.

Brauche am besten eine FUP Lösung da STEP 7 nur noch FUP/KOP kann.
-----------

Benutze eine CPU 1212 C

--

So ist es gedacht:
E13.4 = true ---> X = A13.4
E13.6 = true ---> X = A13.6
E0.1 = true ---> X = A13.4 , A13.6 , A12.4 etc .. ( Für alle z.b)

--
Bereits versucht habe ich es mit Arrays zu lösen , nur verstehe ich nicht wie Array ( DB3.A[0]) zum Ausgang A13.4 gesetzt werden kann.
 

Anhänge

  • array.JPG
    array.JPG
    62,9 KB · Aufrufe: 43
  • Ausfuehrung Teil 1.JPG
    Ausfuehrung Teil 1.JPG
    88,7 KB · Aufrufe: 46
  • Ausfuehrung Teil 2.JPG
    Ausfuehrung Teil 2.JPG
    107,2 KB · Aufrufe: 37
  • Main.JPG
    Main.JPG
    94,1 KB · Aufrufe: 33
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
das, was du brauchst, wäre ein Funktions-Baustein.
Deine Steuer-Eingänge legst du auf die IN-Schnittstelle desselben, die Ausgänge entsprechend auf OUT. Im Baustein benutzt du dann diese Bezeichner, als Merker (o.ä.) verwendest du den STAT-Bereich des Bausteins (hier kannst du dann auch Zeiten etc. reinpacken).
Anschließend rufst du den Baustein so oft auf wie du Jalousien hast und gibst ihm jedesmal eine neue Instanz.
Deine Programmierung kann aber im Grundsatz so erhalten bleiben - korrekte Funktion immer vorausgesetzt.

Gruß
Larry
 
Ok , danke schonmal für die Antwort , aber ich verstehe noch nicht ganz wie ich das realisieren kann.
Ich habe meine Funktion nun in einem FB reingetan.
Wie genau schaffe ich nun beim drücken von E13.4 das mir auch A13.4 gesetzt wird? Oder beim drücken von E13.6 der Ausgang A13.6?
 
Hallo nochmal,
also erstmal vorweg - ich nutze kein TIA-Portal - meine Antworten sind hier also eher pauschal zu werten.
Du sollst deine Funktion nicht innerhalb eines FB's aufrufen sondern es an Stelle in einem FC in einem FB progarmmieren.
An Stelle der direkten Ein- und Ausgänge definierst du dir (das geht allerdings auch in einem FC) im Headerbereich "IN" (bzw. "OUT") des Bausteins symbolische Eingänge, die die Funktion deiner E/A's übernehmen (in deinem Code).

Wenn du dann später den FB aufrufst dann fragt er dich diese IN's und OUT's am Aufruf mit ab und du kannst an der Stelle dann die direkten E/A's antragen.
Vielleicht versuchst du erstmal, das zu realisieren und dann machen wir weiter ...

Gruß
Larry
 
Okay , und wie ändere ich nun IN und OUT in meinem Instanzdatenbaustein?
Das ist leider unhübsch gemacht in TIA portal , habs gerade mit WINSPS s7 demo probiert , dort ist es echt leichter zu erkennen , was Sie meinten!
Ich werde noch einwenig dazu suchen aber viel gefunden hab ich bereits nicht.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Poste mal meinen Rollo Baustein.

Funktionen:
Zeit Rollo AUF ZU
Posistion für auf(0) zu(100). Somit kann mann im Winter einstellen das der Rollo nicht auf 0 fähr um nicht Festzufrieren
Nachlaufzeit um Toleranzen auszugleichen.
Vorwahl Position damir Rollo bei definierter Position anhält,
Dynamischer Rollolauft ist dafür gedacht da das zusammenschieben der Lamellen nur 10% des gesamtweges einnimt( Sonnst wurde in der Simulation der Rollo bei 80% stehen und es müssen nurnoch die Lamellen eintauchen.)

E_SCHALTUHR ist für Schaltuhr.
E_FENSTER_TUERE_ZU ist für abfrage ob Fenster/Türe zu ist. Wenn Türe geöffnet ist wird Rollo nicht Automatisch von Schaltuhr ZU gefahren. Dies soll verhinter wenn z.b die Balkontüre geöffnet ist das der Rollo zufährt.

Um im HMI den Rollo Einzurichten muss der Merker Einrichten gesetzt werden. Dann kann mann in den IST_POS_ROLLO_REAL die Aktuellen Position des Rollos eingeben.

Bin noch am tüfteln mit der Schaltuhr da ich nicht jeden Rollo einseln Programieren möchte. Versuche ein Munü zu erstellen womit ich einstellen kann welche Rollos zu bestimmter Zeit an welchen Tag Zu/Auf oder Pos fahren sollen. Vielleicht hat jemand eine bessere Idee oder beispiel wie mann eine Zeitschaltug übersichtlich und Flexibel löst


Code:
FUNCTION_BLOCK ROLLO_CONTROL
CONST
     TAKT_ZEIT:=0.1;           // ZEIT Taktmerker für Berechnung 
     POS_ROLLO_LANGSAM:=90;    // Position ab der Lamellen eintauchen
END_CONST

VAR_INPUT
    E_ROLLO_AUF           :BOOL;
    E_ROLLO_ZU            :BOOL;
    E_FENSTER_TUERE_ZU    :BOOL;
    POS_EIN               :BOOL;
    POS                   :INT;   // POSITION von 0-100
    TAKT                  :BOOL;
    E_SCHALTUHR           :ARRAY[1..3] OF BOOL; //1=Rollo_ZU 2=ROLLO_AUF 3=ROLLO_POS                  
END_VAR
   
VAR_OUTPUT
    A_ROLLO_AUF           :BOOL;
    A_ROLLO_ZU            :BOOL;    
END_VAR
    
VAR_TEMP
    // temporäre Variablen

END_VAR
VAR
  HMI :STRUCT  
    BUTTON_ROLL_ZU    :BOOL;   // Rollo Zu Button HMI
    BUTTON_ROLL_AUF   :BOOL;   // Rollo Auf Button HMI
    BUTTON_ROLL_POS   :BOOL;   // Position vom HMI anfahren
    ROLL_POS          :INT;    // Position vom HMI
    EINRICHTEN        :BOOL;   // Einrichten
    
  END_STRUCT;  
    IST_POS_ROLLO         :INT;    // Ist  Position Rollo %
    IST_POS_ROLLO_REAL    :REAL;
    SOLL_POS_ROLLO        :INT;    // Soll Position Rollo %
    POS_ROLLO_AUF         :INT:=0  ;//Position Rollo Auf Anfangswert 0
    POS_ROLLO_ZU          :INT:=100;//Position Rollo Zu Anfangswert 100
    NACHLAUFZEIT          :TP;     // Nachlaufzeit bei Pos 0 und 100
    T_NACHLAUFZEIT        :TIME:=t#5s;
    SPERZEIT_ROLLO        :TOF;    // Sperzeit zwischen wechsel AUF / AB
    M_ROLLO_ZU            :BOOL;
    M_ROLLO_AUF           :BOOL;
    LAUFZEIT_ROLLO_AUF    :REAL:=20.0;// sec
    LAUFZEIT_ROLLO_ZU     :REAL:=20.0;// sec
       
    P_E_ROLL_ZU           :BOOL;
    P_E_ROLL_AUF          :BOOL;
    P_HMI_BUTTON_ROLL_ZU  :BOOL;
    P_HMI_BUTTON_ROLL_AUF :BOOL;
    P_TAKT                :BOOL;
    Edge_flag_pos1        :BOOL;
    Edge_flag_pos2        :BOOL;
    Edge_flag_pos3        :BOOL;
    Edge_flag_pos4        :BOOL;
    Edge_flag_pos5        :BOOL;

    
    
END_VAR

    BEGIN
 //*******************************************************************************************************************************************//   
  
    
    
    
    
    
    // Flankenmerker   
    //Bildung der positiven Flanke  //get the positive pulse
     P_E_ROLL_ZU  := E_ROLLO_ZU AND NOT Edge_flag_pos1;
     Edge_flag_pos1   := E_ROLLO_ZU;
     
     P_E_ROLL_AUF  := E_ROLLO_AUF AND NOT Edge_flag_pos2;
     Edge_flag_pos2   := E_ROLLO_AUF;
     
     P_HMI_BUTTON_ROLL_ZU := HMI.BUTTON_ROLL_ZU  AND NOT Edge_flag_pos3;
     Edge_flag_pos3   := HMI.BUTTON_ROLL_ZU ;

     P_HMI_BUTTON_ROLL_AUF  := HMI.BUTTON_ROLL_AUF  AND NOT Edge_flag_pos4;
     Edge_flag_pos4   := HMI.BUTTON_ROLL_AUF ;
     
     P_TAKT  := TAKT  AND NOT Edge_flag_pos5;
     Edge_flag_pos5   := TAKT ;

     
//***********************************************************   
//*                      SPERZEIT                           *
//*********************************************************** 
     SPERZEIT_ROLLO(IN :=A_ROLLO_AUF OR A_ROLLO_ZU,PT := T#2s); 
     
//***********************************************************   
//*      // Soll Position Rollo setzen                      *
//*********************************************************** 
    IF HMI.EINRICHTEN THEN
       SOLL_POS_ROLLO := REAL_TO_INT (IST_POS_ROLLO_REAL);  
    ELSIF P_HMI_BUTTON_ROLL_ZU OR P_E_ROLL_ZU OR (E_SCHALTUHR[1]  AND E_FENSTER_TUERE_ZU) AND NOT A_ROLLO_AUF  THEN
        SOLL_POS_ROLLO := POS_ROLLO_ZU;
    ELSIF P_HMI_BUTTON_ROLL_AUF OR P_E_ROLL_AUF OR E_SCHALTUHR[2] AND NOT A_ROLLO_ZU  THEN
       SOLL_POS_ROLLO := POS_ROLLO_AUF;
    ELSIF HMI.BUTTON_ROLL_POS THEN
       SOLL_POS_ROLLO := HMI.ROLL_POS;
    ELSIF POS_EIN OR (E_SCHALTUHR[3] AND E_FENSTER_TUERE_ZU) THEN 
       SOLL_POS_ROLLO := POS;
    END_IF;
//***********************************************************   
//*          Überprüfung ob SOLL_POS logisch                *
//*********************************************************** 
        
    IF SOLL_POS_ROLLO >100 THEN
       SOLL_POS_ROLLO := 100;
    ELSIF SOLL_POS_ROLLO <0 THEN
       SOLL_POS_ROLLO := 0;
    END_IF; 
    
//***********************************************************   
//*          ROLLO Stoppen wärend fahrt                     *
//*********************************************************** 

    IF A_ROLLO_AUF AND (P_HMI_BUTTON_ROLL_ZU OR  P_E_ROLL_ZU)  THEN        
       SOLL_POS_ROLLO := IST_POS_ROLLO;
    END_IF;
    IF A_ROLLO_ZU AND (P_HMI_BUTTON_ROLL_AUF OR  P_E_ROLL_AUF)  THEN        
       SOLL_POS_ROLLO := IST_POS_ROLLO;
    END_IF;

//***********************************************************   
//*         // Rollo in Position Fahren
//***********************************************************    
    
     M_ROLLO_AUF:=IST_POS_ROLLO > SOLL_POS_ROLLO;
     M_ROLLO_ZU :=IST_POS_ROLLO < SOLL_POS_ROLLO;
     
//***********************************************************   
//*       Nachlaufzeit Rollo bei Pos 0 oder 100 
//***********************************************************            
     NACHLAUFZEIT(IN :=IST_POS_ROLLO = 0 OR IST_POS_ROLLO = 100,PT := T_NACHLAUFZEIT); 
     
 //***********************************************************   
//*                   Ausgänge setzen 
//***********************************************************       
  // Ausgänge EIN setzen
    IF    M_ROLLO_AUF=TRUE AND SPERZEIT_ROLLO.Q=FALSE THEN
           A_ROLLO_AUF:=TRUE; 
    END_IF;                            
    IF M_ROLLO_ZU =TRUE AND SPERZEIT_ROLLO.Q=FALSE THEN
           A_ROLLO_ZU:=TRUE;
    END_IF;
    
    
 // Ausgänge AUS setzen
    IF    M_ROLLO_AUF=FALSE AND NACHLAUFZEIT.Q=FALSE THEN
           A_ROLLO_AUF:=FALSE;
    END_IF;       
    IF M_ROLLO_ZU =FALSE AND NACHLAUFZEIT.Q=FALSE THEN
           A_ROLLO_ZU :=FALSE;
    END_IF;
    
 //***********************************************************   
//*  Position errechnen: Rollo bis 80% der Laufzeit schnell 
//                  fahren dann langsam
//************************************************************   
    
  // ROLLO AUF
    IF A_ROLLO_AUF AND P_TAKT   THEN
      IF IST_POS_ROLLO < POS_ROLLO_LANGSAM THEN
            IST_POS_ROLLO_REAL:=IST_POS_ROLLO_REAL - (INT_TO_REAL (POS_ROLLO_LANGSAM)/(LAUFZEIT_ROLLO_AUF*0.8))*TAKT_ZEIT;
      ELSE
           IST_POS_ROLLO_REAL:=IST_POS_ROLLO_REAL - (INT_TO_REAL (100 - POS_ROLLO_LANGSAM)/(LAUFZEIT_ROLLO_AUF*0.2))*TAKT_ZEIT;
      END_IF;
      IST_POS_ROLLO := REAL_TO_INT (IST_POS_ROLLO_REAL);
    
      IF IST_POS_ROLLO <= 0  THEN
          IST_POS_ROLLO:=0;
          IST_POS_ROLLO_REAL:=0.0;
      END_IF;
    END_IF; 
    
          
    // ROLLO ZU    
    IF A_ROLLO_ZU AND P_TAKT   THEN
       IF IST_POS_ROLLO < POS_ROLLO_LANGSAM THEN
            IST_POS_ROLLO_REAL:=IST_POS_ROLLO_REAL + (INT_TO_REAL (POS_ROLLO_LANGSAM)/(LAUFZEIT_ROLLO_ZU*0.8))*TAKT_ZEIT;
       ELSE
           IST_POS_ROLLO_REAL:=IST_POS_ROLLO_REAL + (INT_TO_REAL (100 - POS_ROLLO_LANGSAM)/(LAUFZEIT_ROLLO_ZU*0.2))*TAKT_ZEIT;
       END_IF;
       IST_POS_ROLLO := REAL_TO_INT (IST_POS_ROLLO_REAL);

       IF IST_POS_ROLLO >= 100   THEN
          IST_POS_ROLLO:=100;
          IST_POS_ROLLO_REAL:=100.0;
       END_IF;
    END_IF; 
    
        
        ;
END_FUNCTION_BLOCK
 

Anhänge

  • Rollo1.JPG
    Rollo1.JPG
    47,2 KB · Aufrufe: 35
  • Rollos.JPG
    Rollos.JPG
    75,2 KB · Aufrufe: 31
  • Schaltuhr Rollo.JPG
    Schaltuhr Rollo.JPG
    57,2 KB · Aufrufe: 32
Zuletzt bearbeitet:
Problem liegt wahrscheinlich an meinen Unverständnis für Tia-Portal. Arbeite erst wieder seit 1 Woche damit und muss mich erstmal wieder einwenig sortieren..
Theoretisch sollte es doch beim anlegen eines FB's eine IDB anlegen. Eigentlich tut es das auch , nur werden dort NICHT meine Variablen die im FB drinne sind übernommen.
Ich kann die IDB aber auch nicht verändern , alle felder sind grau!
Wäre dankbar hilfe von jem. mit Tia-Portal Kenntnissen zu bekommen!
Und danke nochmal an @Larry und Emillio für die Antworten.
 
Hallo,
das hat nicht mit dem TIA-Portal zu tun ...
Beim Aufruf des FB (in irgend einem Baustein) gibst du den zu verwendenden I-DB an und dann wird er wenn nötig erzeugt (ganz von selbst).
An dem I-DB selbst solltest du "von hand" gar nicht herumbasteln - der gehört dem FB ... ;)
Wie so ein FB aussehen könnte hat dir Emilio ja ganz schön gezeigt. Der ist zwar in SCL, aber der Header-Aufbau und die Art und Weise der Variablen-Verwendung (der FB-eigenen) ist eigentlich ziemlich gleich ...

Wo hängt es denn nun konkret ?

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
"Deine Steuer-Eingänge legst du auf die IN-Schnittstelle desselben, die Ausgänge entsprechend auf OUT. Im Baustein benutzt du dann diese Bezeichner, als Merker (o.ä.) verwendest du den STAT-Bereich des Bausteins (hier kannst du dann auch Zeiten etc. reinpacken)."
Daran hängt es konkret.
Ich weiß nicht wie ich in TIA-Portal die IN und OUT stellen festlegen kann, da alle Felder grau angezeigt werden.
Also muss ich theoretisch jetzt erstmal einen FB erstellen.
Dort mach ich dann (z.b Positive Flanke , XOR , Zuweisung)
Den Eingang der Positiven Flanke soll IN sein , die Ausgänge der XOR OUT .
Liegt es vielleicht daran , das ich den FB garnicht zu einem MultiInstanz-Baustein machen kann?!
Ich hab echt keine Ahnung was da falsch läuft!
 
Was hast du denn FB-technisch jetzt so erstellt ...?
Hast du überhaupt schon versucht, einen FB zu erstellen ?
Mach doch erst mal Eins nach dem Anderen ...
 
Ja klar hab ich einen erstellt.
Dort hab ich die sache mit Positive Flanke XOR etc. ja reingetan!
Nur verstehe ich nicht , wenn ich diesen FB in OB1 reinziehe , (Dabei wird ja auch die DB für FB1 erstellt) wie ich die Werte in der DB hinzufügen kann?!
Es ist nämlich immer Leer und ausgegraut so etwa : ( Bitte FB 2 & 3 ignorieren!)
Grau.JPG
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Tach auch,
im FB mußt du unter Var_Input z.B. Taster_Auf : Bool usw anlegen
unter Var_Output Motor_Auf: bool anlegen

DANN alles übersetzen (es wird der DB neu generiert)
Dann diesen FB z.b im OB1 beliebig oft aufrufen, dort kannst du dann die "Hardware" Eingänge/Ausgänge belegen(Also den VAR_INPUT / VAR_OUTPUT zuweisen).
->Parametrierter Baustein.. so wie schon von Larry beschrieben
 
Guck dir mal meine Screenshots an. Dort siehst du was Larry Laffer meint
 

Anhänge

  • FB_Neu.jpg
    FB_Neu.jpg
    398,8 KB · Aufrufe: 21
  • FB_Neu_1.jpg
    FB_Neu_1.jpg
    441,2 KB · Aufrufe: 17
Hab die Öffnung zur Schnittstelle gefunden!
Larry danke für deine Hilfe!! Deine Beschreibung war allgemein perfekt , aber wenn man net die fking Schnittstellenöffnung bei Siemens findet , ist man einfach aufgeschmissen!
Sry Aber Siemens hat die kacke echt gut versteckt!
Solche ********** :)
Naja Hier 'n' Screenshot wie des aussieht! Ich hab überall zuerst gesucht aber nicht dort :x:x:TOOL:
Schnittstele.JPG
 
Zurück
Oben