TIA WinCC - AutoFill Funktion bei Balken

mbb

Level-2
Beiträge
20
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen an alle,

ich wollte euch vorher mal Fragen bevor ich anfange zu Bauen.
Mein Aufgabe ist es über 500 Temperatur Sensoren in ein TouchPanel (TP700 Comfort) unterzubringen. Sowie deren gespeicherten Statuswert.

Gibt es eine möglichkeit einer Autofill Funktion?
Damit meine ich das ich eine Seite "Bild" als Template erstelle und die Funktion füllt alle Balken mit den Variablen?


Vielen Dank schon einmal im Voraus.
 
Hallo,

verwendest du WinCC im TIA oder noch das WinCC vor TIA?

Mein Lösungsansatz wäre einen "Standard DB" für den Screen zu erstellen auf dem das HMI zugreift. Diesen DB veränderst du dann in der PLC abhängig davon welche Temperatursensor du aufrufst.
Z.B. Du hast ein Übersichtsbild, klickst auf Sensor 215 -> HMI sendet Anforderung an PLC das Standard DB mit Informationen von Temp Sensor 215 befüllt werden soll (DB des jeweiligen Temp Sensors in den Standard DB kopieren). Somit müsstest du nur 1 Screen erstellen und dieser könnte für jeden Temp. Sensor verwendet werden.

Ich hoffe du verstehst was ich damit meine.
Falls nicht, melde dich einfach bei mir.
Könnte dir auch ein Beispiel Projekt per PN zukommen lassen.

LG
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für deine Schnelle Antwort.

Ich nutze WinCC im TIA Portal v14.

hmm die Idee von dir klingt sehr interessant. Ich glaube im groben habe ich es verstanden.
Ich werde mal ne Nacht darüber grübeln. Ich melde mich vielleicht noch mal bei dir.

Danke nochmal.
 
... vorausgesetzt die verwendete CPU kennt und unterstützt den Datentyp ANY und die Temperaturwerte liegen nicht in optimiertem Speicher ...
"Multiplexen von Variablen" geht übrigens auch völlig ohne (undurchsichtige?) Programmierung in der CPU.

Falls die Temperaturen auch noch archiviert werden sollen und/oder Trendkurven nötig sind, dann wird er nicht drum'rum kommen, die 500 Variablen anzulegen (dafür gibt es ein Autofill) und Details und Anzeigen einzeln händisch zu bearbeiten.

PS:
Sowie deren gespeicherten Statuswert.
Was ist ein gespeicherter Statuswert?

Harald
 
Zuletzt bearbeitet:
Erstmal ein weiteren Dank für die vielen Antworten!

Soweit habe ich das jetzt hinbekommen ich hänge jetzt nur noch an ein Problem. Ich erkläre mal was ich gemacht habe:

Als Hardware wird die CPU ET200SP 1512 F-1 PN genommen.

Die Temperaturen werden Direkt an das ControllSystem über OPC-UA ausgelesen (also nicht zwischengespeichert)
Der Statuswert gibt an ob der Temperaturwert OK, Warnung oder in Alarmbereich ist. Dies wird über Peek und Poke ausgewertet und landet in ein nicht Optimierten Datenbaustein.

Zu meinen Lösungsansatz:
Ich habe jetzt ein Extra Datenbaustein(DB_TempTP) angelegt, für die Template Seite(Bild) vom Touchpanel. Und dort wird für die erste Seite alle Balken, EA-Feld, und Texte die Werte ausgelesen.
Dies mache ich in dem ich auf dem TouchPanel eine Taste drücke und der Zeiger in den jeweiligen Datensetzen hochzählt und den DB_TempTP neu beschreibt. (PEEK Funktion)
Das Funktioniert sehr gut.

Nun zu mein Problem:
Für den einzelnen Namen des Temperaturfühlers habe ich ein weiteren Datenbaustein angelegt der aus Strings Besteht, wo die einzelnen Namen der Temp. Sensoren drin steht. Nur kann ich diese aber nicht per PEEK Funktion auslesen um diese an das Touchpanel über den DB_TempTP auszulesen.

Wie könnte man Strings sonst per Zeiger bearbeiten?

Zudem muss ich zugeben das ich nur in SCL oder FUP Programmieren kann. Mit AWL komme ich nicht wirklich klar.Deshalb habe ich die Anleitung für Any-Datentypen noch nicht ganz verstanden. Wenn ich mal mehr Zeit habe werde ich Sie nochmal genauer anschauen.
 
Sind deine Strings fixen ID's zuweisbar? z.B. ID1 = Tempfühler 1, ID2 = Tempfühler 2 usw?
Wenn ja könntest du in deiner HMI eine Textliste anlegen und dann entsprechend deiner ID dem Template den richtigen String aus der Textliste zuweisen.

Zum AnyPointer
Hab dir noch eine Version in SCL angehängt, macht genau das gleiche wie in AWL, halt nur in SCL programmiert.
Vielleicht verstehst du das leichter.

Code:
FUNCTION "Popup_Verwaltung_SCL" : Void
{ S7_Optimized_Access := 'FALSE' }
VERSION : 0.1
//------------------------------------------------------------------------------------------------------
//
//  Beispiel FC: zeigt wie man ein ANY Pointer dynamisiert bevor man ihn als //  Parameter dem SFC20 übergibt.
//
//------------------------------------------------------------------------------------------------------
   VAR_INPUT 
      DB_Nummer_Quell : Int;
      DB_Nummer_Ziel : Int;
      Anzahl_Bytes : Int;
   END_VAR

   VAR_TEMP 
      SOURCE : Any;   // Symbolischer Name des ANY Pointers
      VON AT SOURCE : Struct   // Mit dem  AT Befehl wird der gleiche Bereich in einer anderen Form définiert
         ID : Word;   // ID für ANY (1002 hex = es wird mit Bytes gearbeitet)
         NBR : Int;   // Anzahl Daten
         DBN : Int;   // DB der im ANY Pointer benutzt wird ANY
         PTR : DWord;   // Pointer Doppelwort um den Angfang des Datenbereichs und den Datentyp zu definieren (84hex = DB Datentyp)
      END_STRUCT;
      DESTIN : Any;
      NACH AT DESTIN : Struct
         ID : Word;
         NBR : Int;
         DBN : Int;
         PTR : DWord;
      END_STRUCT;
      ORIG : Int;
      SFC_Err : Int;   // RETVAL des SFC
   END_VAR


BEGIN
    
    // Befehle
    //__________________________
    
    #ORIG := 0; // Beispiel: man will bei DBX0.0 anfangen
    
    // Aufbauen des ANY Pointers der Quelle (VON) 
    
    #VON.ID := 16#1002;  // ID 10 et 02 um mit Bytes zu arbeiten
    #VON.NBR := #Anzahl_Bytes;  // entspricht BYTE 100. Könnte eine Variable sein.
    #VON.DBN := #DB_Nummer_Quell; // DB 150
    #VON.PTR := INT_TO_DWORD(8 * #ORIG) OR 16#8400_0000;  // Pointer zeigt zuf Bit, deshalb 8*Byte Nummer
    
    // Aufbauen des ANY Pointers des Ziels (NACH)
    #NACH.ID := 16#1002;
    #NACH.NBR := #Anzahl_Bytes;
    #NACH.DBN := #DB_Nummer_Ziel;
    #NACH.PTR := INT_TO_DWORD(8 * #ORIG) OR 16#8400_0000;
    
    // Aufruf des SFC 20
    #SFC_Err := BLKMOV(SRCBLK := #SOURCE // IN: ANY
                       , DSTBLK => #DESTIN // OUT: ANY
    ); // INT
    
    
    
    
    
END_FUNCTION

LG
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Super! Jetzt klappt alles und ich Spare mir haufen Arbeit. Ein großen Dank nochmal an elsteiner13. :)

Zum Abschluss Kurze Beschreibung wie ich es gemacht habe falls es jemand auch mal brauch:

- Man muss ein Extra Datenbaustein für das Touchpanel anlegen wo die Template Seite (Bild) darauf zugreift.

- Die realen Temperaturwerte für die "Balken" übertrage ich mit der Funktion "PEEK_WORD" direkt von den Hardware Modul

- Die Ausgewerteten Statuswerte lese ich mit der Funktion "PEEK" aus einen Datenbaustein aus.

- Die Namen der einzelnen Temperatur Sensoren übertrage ich mit der Funktion BLKMOV aus einen Datenbaustein wo nur die Namen der Temperaturen drin stehen.
(Ein Beispiel der Funktion und sehr gut erklärt von elsteiner13 übermir)

Wichtig ist noch das alle benutzten Datenbausteine nicht Optimiert sein müssen.
Ich hoffe der nächste der so ein Problem hat kann damit weitergeholfen werden.
 
Wer Optimierte Bausteine nutzen muss kann sich ja einen DAtentyp anlegen der den Wert und Namen enthält und davon dann ein Array erzeugen welches dann in der Visualisierung genutzt werden kann.
Wer noch PowerTags sparen muss kann sich auch anhand der Visu Anwahl die entsprechenden Daten aus dem Array an eine bestimmte Stelle kopieren und nur darauf zugreifen z.B. Arrrayindex 0.


Gruß

Jens
 
Zurück
Oben