WinCC flexible/Rezeptur/Eingabe

c.wehn

Level-2
Beiträge
609
Reaktionspunkte
47
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebste Community,

ich hab eine einfache aufgabe.. und komm nicht auf die Lösung

Wir haben eine Rezepturverwaltung...
Allerdings möchte ich die Rezeptur nicht mit einem Dropdown Menu anwählen.. und dann ein Button zum übertragen in die Steuerung anwählen

Sondern einfach die Artikelnummer eingeben, enter drücken.. und das wars =)

Habt ihr eine Idee?
 
du könntest eine Variabel nehmen wo der Bediener die Artikel Nr eingibt,
dann bei Wertänderung die Funktionen ausführen "Schreibe Datensatz in
Steuerung" wo dann als Datensatznummer deine Variabel mit der Artikel Nr
eingestellt ist.
 
Ich habe es so verstanden da du einen Datensatz laden möchtest
wenn du deine Artikel Nr eingibst, aber anderson sollte es auch
funktionieren. Du kannst diese Funktionen auch ausführen wenn
bei ein bestimmten Eingabefeld, für die Variabel die Aktion
"Eingabe abgeschlossen" die gewünschte Funktionen ausführen.

Wenn dein Panel Scriptfähig ist kannst du noch ganz andere ablâufe
für deinen Rezepturverwaltung ausführen.
 
Neue Rezepturen lege ich ganz normal im Rezepteditor von WinCCFlex an.
Von Step7 aus bebeschreibe ich die nötigen Variablen und setzen dann eine Triggervariable. Diese Triggervariable (Ausführen bei Wertänderung) lädt dann ein Rezept an Hand des Datensatznamens (Funktion in WinCCFlex), der die Arteikelnummer bekommen hat.

Aber Achtung, die Triggervariable darf erst ca. 500ms nachdem man alle anderen Variablen eingetragen hat gesetzt werden. Ansonsten ist nicht sicher, dass WinCCFlex nicht noch alte Daten in den Variablen hat und diese dann zur Ausführung nutzt.

Hier mal ein SCL-Script, dass ich dazu nutze:


Code:
FUNCTION_BLOCK FB41

Title = 'Rezept'
//
// Rezeptur von HMI über Variable im HMI 
// anfordern
// die Variable ist auf "Ausführen bei Wertänderung" eingestellt
// und arbeitet mit den an sie übergebenen Variablen
// Rezeptnummer und Datensatzname
// Der Wert Status wird zurückgegeben
// Status = 2 --> Daten werden geholt
// Status = 4 --> Daten holen erfolgreih beendet
// Status = 12 -> Daten holen Fehler
//
Version : '1.0'
author  : Ralle
name    : RZ01
family  : REZEPT

VAR_INPUT
  // Eingangsparameter
  Ack: BOOL;
  Rezept: INT;
  Datensatzname: STRING[16];
END_VAR

VAR_IN_OUT 
  // IN_OUT_Parameter
Auftrag:    STRUCT            
                Rezeptnummer:    INT;       
                Datensatznummer:    INT;     
                Datensatzname:    STRING[16];       
                Status:    INT;       
                Startvar:    INT;     
                Toggelvar:    INT;        
            END_STRUCT;            
  bStart: BOOL;
  bBusy: BOOL;
  bEnd: Bool;
  bErr: Bool;
END_VAR

VAR_TEMP
  // temporäre Variablen
  Timeout_bit : BOOL ; 
  Auftrag_Wait: BOOL ;
END_VAR
VAR
    // statische Variablen
  bHM_StartFlanke: BOOL;
  Wait_Timer : TON;   
  Timeout_Timer : TON;   
  Timeout_stat : BOOL ;  
END_VAR

    // Anweisungsteil
IF bStart THEN
    bEnd := False;
END_IF;
    
//Der Auftrag wird gestartet, Rezeptnummr und Datensatzname an das HMI übergeben    
IF (Auftrag.StartVar = 0) AND bStart AND NOT bHM_Startflanke THEN
    Auftrag.Rezeptnummer := Rezept;
    Auftrag.Datensatzname := Datensatzname;
    Auftrag.Status := 0;
    bEnd := False;
    bErr := False;
    bHM_Startflanke := True;
    Auftrag.StartVar := 1;
END_IF;

//Wartezeit bis zum Start der Funktion im HMI
//da sonst Rezeptnummer und Datensatzname u.U. noch die alten Werte haben
Auftrag_Wait := (Auftrag.Startvar = 1);

Wait_Timer(IN := Auftrag_Wait // IN: BOOL
          ,PT := T#500ms // IN: TIME
          ); 
   
//Start der Funktion im HMI nach Wartezeit   
IF Wait_Timer.Q THEN
    IF Auftrag.Toggelvar > 1000 THEN
        Auftrag.Toggelvar := 0;
    ELSE
        Auftrag.Toggelvar := Auftrag.Toggelvar + 1;
    END_IF;
    Auftrag.Startvar := 2;
END_IF;

//Auftrag ist korrekt beendet, Meldung nach außen
IF (Auftrag.Startvar = 2) AND (Auftrag.Status = 4) AND bStart AND bHM_Startflanke THEN
    bStart := False;
    bHM_Startflanke := False;
    bEnd := True;
    Auftrag.Startvar := 0;
END_IF;

//Ausgabe Busy
bBusy := bHM_Startflanke;

//Timeout nach 5 Sekunden Busy
Timeout_Timer(IN := bBusy // IN: BOOL
          ,PT := T#5s // IN: TIME
          ); 
Timeout_bit := Timeout_Timer.Q; // OUT: BOOL
//   := Timeout_Timer.ET; // OUT: TIME

IF Timeout_bit THEN
    Timeout_stat := True;
END_IF;

//Reset mit Ack
IF ACK AND Timeout_stat THEN
    Timeout_stat := False;
    bStart := False;
    Auftrag.Startvar := 0;
    bHM_Startflanke := False;
END_IF;

//Ausgabe Error
bErr := Timeout_stat;

    ;
END_FUNCTION_BLOCK

Wird der Fehler gesetzt, dann ist kein Rezept mit der entsprechenden Artikelnummer im Panel gefunden worden und man muß es erst anlegen.

attachment.php
 

Anhänge

  • Rezept.jpg
    Rezept.jpg
    89,3 KB · Aufrufe: 252
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Fb41

Hallo zusammen,

ich habe ein Problem, ich möchte wie oben beschrieben dieses Script verwenden
um mit einer Artikelnummer ein Datensatz (vom Rezept1) aufzurufen.
Aber ich kann den in den Aufruf des FB41 nicht den Datensatznamen (als String) eingeben.
Der S7 Editor sagt immer das der erwartete Parameter ein String(16) sein muss und die zeile bleibt ROT.
Ich habe schon alles versucht. Ich sehe nur ROT.

Hat jemand einen Tipp ??

Gruss
 
Du mußt in einem DB oder in TEMP einen STRING[16] anlegen und symbolisch an den FB41-Eingang ranschreiben. Wichtig: die deklarierte Länge muß genau 16 sein.

Harald
 
Zurück
Oben