WinCC DB im HMI auslesen, abspeichern und abgespeichertes später wieder einlesen!

SPS-Benni

Level-2
Beiträge
22
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Tag,

für eine kleine Mustermaschine müssen 8-Zylinder angesteuert werden.
Wie die Zylinder letztendlich angesteuert werden, soll immer individuell geschehen und durch eine Eingabe im HMI vorab bestimmt werden.
Für das Projekt steht mir Tia v17 und ein KTP400 Basic zur verfügung. Die visualisierung mach ich über WinCC.
Die Programmierung der Zylinder habe ich problemlos hinbekommen.
Dazu habe ich verschiedene E/A´s angelegt und mit dem DB meiner PLC verknüpft.
Wenn alle benötigten E/A´s angewählt sind soll das Ganze wie ein Programm per Namen im HMI selber gespeichert werden.
Wenn das "Programm" benötigt wird soll es natürlich auch wieder ausgewählt und aus dem HMI ausgelesen werden können.

Das ganze wollte ich über eine Rezeptur lösen. Das Problem ist jedoch, dass die Rezeptur bei einem KTP400 max. 100 Variablen zulässt..
Ich habe 8Zylinder mit jeweils 45 zuständen (erster durchlauf Zylinder angesteuert ja nein? zweiter durchlauf Zylinder angesteuert Ja nein?
usw bis zum 45 durchlauf und dann beginnt alles wieder von vorne..).
Das alleine sind schon 360 Variablen, was einfach zu viel ist für diesen Lösungansatz.

Hat eventuell jemand eine andere Lösung, wie ich meinen aktuellen Zustand des DB´s mit einem dazugehörigen Namen im HMI speichern
und nach Bedarf auch wieder auslesen kann?

Schon jetzt vielen Dank für eure Hilfe.

Liebe Grüße
Ben
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe 8Zylinder mit jeweils 45 zuständen (erster durchlauf Zylinder angesteuert ja nein? zweiter durchlauf Zylinder angesteuert Ja nein?
usw bis zum 45 durchlauf und dann beginnt alles wieder von vorne..).
Ich verstehe die 45 Zustände der 8 Zylinder nicht so ganz. Meinst Du 2 Zustände pro Zylinder und Du betrachtest unterschiedliche Kombinationen der 8 Zylinder zu 45 verschiedenen Zeitpunkten eines Ablaufs?
Wie wär's mit 45 Bytes, die den 45 Zeitpunkten entsprechen. Jedes Bit der Bytes wird einem der 8 Zylinder zugeordnet.
 
@Heinileini vielen Dank für die schnelle Antwort.
Ich wollte das Ganze nicht zu genau ausführen,
da sich die Frage ja eigentlich um das abspeichern eines DB´s mithilfe einer HMI dreht..

Also um es kurz zu halten, der Bediener soll die Möglichkeit haben, verschiedene Webmuster anzulegen.
die länge eines sogenannten "Rapports" (das sich zu wiederholende Muster) habe ich auf maximal 45 begrenzt,
da es ansonsten die Systembegrenzung der Variablen sprengen würde..

Also im Großen und Ganzen liegst du richtig mit deiner Aussage. Jeder Zylinder hat zwei Zustände (betätigt oder nicht betätigt)
und das, wie du bereits erwähnt hast, an 45 verschiedenen Zeitpunkten. Realisiert habe ich das Ganze mit 8 Arrays für die jeweiligen Zylinder mit je 45 Bit´s
für die jeweiligen Zeitpunke. Also eigentlich ziemlich ähnlich..

Das Muster wird über das HMI eingegeben und steuert dann die einzelnen Bit´s im DB,
Das ganze funktioniert auch soweit ohne Probleme,
nur soll der Bediener eben die Möglichkeit haben, das eingegebene Webmusters unter dem jeweiligen Namen abzuspeichern,
um es später nicht wieder neu eintippen zu müssen.

Und hier muss man wohl leider sagen, dass @JesperMP Recht behält und das KTP400 für diese Aufgabe nicht optimal ist,
aber manchmal muss man eben mit dem arbeiten, was die Firma einem zu verfügung stellt:p

Naja falls jemanden noch eine Idee hat, wie man den aktuellen Zustand des DB´s sichern kann, um ihn dann später über das HMI wieder einzulesen,
ich bin für jeden brauchbaren Tipp dankbar..

Liebe Grüße
Ben
 
Zuletzt bearbeitet:
Realisiert habe ich das Ganze mit 8 Arrays für die jeweiligen Zylinder mit je 45 Bit´s für die jeweiligen Zeitpunkte.
Oder ein 2-dimensionales Array, erste Dimension die 45 Zeitpunkte und zweite Dimension die 8 Zylinder.
nur soll der Bediener eben die Möglichkeit haben, das eingegebene Webmusters unter dem jeweiligen Namen abzuspeichern
Für die Namen kann man auch ein Array anlegen (array of string) mit so vielen Elementen, wie man verschiedene Rezepte bzw. deren Namen
"verwalten" will.
Wie viele Namen und wie lang maximal jeder Name?
Naja falls jemand noch eine Idee hat, wie man den aktuellen Zustand des DB´s sichern kann, um ihn dann später über das HMI wieder einzulesen, ...
Dazu habe ich leider keine Idee, mangels praktischer Erfahrung im Umgang mit HMIs/Rezepturen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen Heinileini,
um 21 Uhr hab ich schon geschlummert :sleep:

Oder ein 2-dimensionales Array, erste Dimension die 45 Zeitpunkte und zweite Dimension die 8 Zylinder.
Keine schlechte Idee, wäre auf jeden Fall übersichtlicher..
Für die Namen kann man auch ein Array anlegen (array of string) mit so vielen Elementen, wie man verschiedene Rezepte bzw. deren Namen
"verwalten" will.
Wie viele Namen und wie lang maximal jeder Name?
10 Namen sollten reichen und jeweils 15 Zeichen pro String sollten ausreichend sein.
Dazu habe ich leider keine Idee, mangels praktischer Erfahrung im Umgang mit HMIs/Rezepturen.
Klar kein Problem. Wie gesagt über die Rezeptur hab ich es ja eigentlich hinbekommen, aber die ist leider auf 100 Rezepturvariablen beschränkt und ich bräuchte ja für jedes Bit eine Variable also reicht es vorne und hinten nicht..

Falls jemand noch eine andere Idee außer eine Rezeptur hat, gerne schreiben.
Ansonsten werde ich es jetzt so belassen, da es ja ohnehin nur eine Mustermaschine ist und nicht produktionsrelevant.
Falls es dann mal ein Projekt an der Produktion wird, muss man halt mal ein wenig mehr investieren.

Liebe Grüße
Ben
 
Wie gesagt über die Rezeptur hab ich es ja eigentlich hinbekommen, aber die ist leider auf 100 Rezepturvariablen beschränkt und ich bräuchte ja für jedes Bit eine Variable also reicht es vorne und hinten nicht..
Also, Du brauchst NICHT für jedes Bit eine Variable!

Mit 100 Rezepturvariablen kommt man doch wunderbar hin?
Wenn man nicht exakt auf 45 Zeitpunkte angewiesen ist, zu denen jeweils ein Bitmuster zugeordnet ist (wobei 45 (Bytevariablen) schon zweimal in 100 hinein passen), könnte man bei 48 Zeitpunkten auf Wörter (24 Variablen) oder Doppelwörter (12 Variablen) gehen.
Bei Doppelwörtern könnte man sogar mit 400 Zeitpunkten (100 Doppelwortvariablen mit je 4 Byte "Zeitpunkten") arbeiten.

VG

MFreiberger


Nachtrag: Ich bin mir nicht sicher, ob ein Array auch als eine Variable gilt?
 
@MFreiberger Habs gerade mal ausprobiert!
Ich hatte nämlich auch schon die Idee, einfach meine 8 Arrays aus dem DB zu verwenden
und diese dann einfach mit meiner Rezeptur zu verknüpfe..
Leider zählt aber ein Array nicht als eine Variable sondern eben jedes Bit einzelnd.
Naja war ja eigentlich zu erwarten, man kann ja schließlich auch jedes Bit einzelnd abfragen..

Die Lösung mit den Wörtern oder Doppelwörtern ist eine Überlegung wert.
Müsste ich allerdings mein ganzes Programm umschreiben und da ich die einzelnen Bits nicht abfragen kann,
müsste ich vermutlich mit Maskierungen arbeiten?

Danke für die Gedankenstütze 😌

Liebe Grüße
Ben
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin SPS-Benni,

die einzelnen Bits eines Bytes, Wortes oder Doppelwortes kannst Du mit dem Slice-Zugriff abfragen/beschreiben.

Variable (BYTE)

Variable.x0
Variable.x1
Variable.x2
Variable.x3
Variable.x4
Variable.x5
Variable.x6
Variable.x7

Siehe Hilfe "Slice"

VG

MFreiberger
 
Servus MFreiberger

Super Sache so ein Slice-Zugriff!

Na dann mach ich mich mal ans Werk.
Ich halte euch auf dem laufenden, ob alles soweit funktioniert hat.

Liebe Grüße
Ben
 
Ich hatte nämlich auch schon die Idee, einfach meine 8 Arrays aus dem DB zu verwenden
Wie wär's denn mit einem Array of Byte (oder Word) mit 45 Elementen für die 45 Zeitpunkte?
Und jedes Bit in den Bytes ist mit einem Ventil "verheiratet" (Bit0 mit Ventil0, u.s.w. bis Bit7 mit Ventil7).
Die Bits kann man doch mit Slice genauso gut (oder besser) beherrschen, wenn sie die Bedeutung 'Ventil' haben. ;)
Wie wär's mit 45 Bytes, die den 45 Zeitpunkten entsprechen. Jedes Bit der Bytes wird einem der 8 Zylinder zugeordnet.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mal etwas Anderes gefragt :
Wenn deine "Rezeptur" doch im Grunde einen Ablauf beschreibt ... warum speicherst du es dann nicht auch als solchen ab ? Also im Grunde hast du vielleicht für jeden Zylinder eine Nummer, die Reihenfolge, wie die Zylinder kommen sollen, hast du im Rezept (also vielleicht 1-2sek.-7-5 sek.-2-6-10sek-3-1-2-5sek.) und dein Programm weiß dann welchen Zylinder es anzusteuern hat und mit dem Zylinder dann ja auch gleich welche Ini's abzufragen sind ...

Gruß
Larry
 
Also, 8 Zylinder. 45 Schritte.
Jeden Zylinder kann beliebig ein Zeitwert innerhalb von jeden Schritt zugewiesen werden.

Ich sehe nicht wie man das weniger als 360 Zeitwerte packen kann.
Es sei denn, man ändert die Beschreibung von die Funktionalität.
Können unterschiedliche Zylinder dieselbe Zeitwerte teilen ?
Können die Zeitwerte abhängig nur von aktiven Schritt sein, also die einzelne Zylinder bekommen ein festen Zeitwert nur ob es in ein Schritt aktiv sein soll oder nicht.
 
Ich hatte zwar in #3 den Begriff "Zeitpunkt" ins Spiel geworfen, mangels einer konkreteren Vorstellung, was wie ablaufen soll.
Aber vielleicht ist der Ansatz mit den vielen Zeiten eher unangemessen bzw. "verkomplizierend"?
Ben, wie geschieht denn in Deinem Fall die "Taktung" durch die 45 "Schritte"? Ist sie evtl. Weg-gesteuert?
Wäre eine Festlegung von Zeiten im Rezept überhaupt sinnvoll und auch flexibel genug (in Hinblick auf evtl. sich ändernde Geschwindigkeiten bzw. vorübergehendes Anhalten des Vorgangs)?
Wie Bediener-freundlich kann man denn im HMI die Eingabe einzelner Bits in den Bytes umsetzen? Müsste man immer ein komplettes Byte neu eingeben oder kann man in einer Darstellung als BinärZahl einzelne Bits editieren, ohne die benachbarten zu beeinflussen?
Bezüglich der Anzeige im HMI mache ich mir weniger Gedanken. Eine Anzeige als 8-stellige BinärZahl dürfte kein Problem sein.
Und die Lesbarkeit dürfte für einen Bediener relativ leicht erlernbar sein.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wow es freut mich, dass alle so interessiert bei der Sache sind!
Die Taktung erfolgt über einen Taster (ganz simple eigentlich).
Wird der Taster 2x betätigt erfolgt der Zylinderwechsel.

Ich hab euch mal ein Bild von so einem Webmuster angehängt, ziemlich gleich erfolgt auch die Eingabe am HMI (dann muss der Mann vom Fach nicht umdenken) Rot bedeutet übrigens Zylinder nicht betätigt..

Weil das abtippen aber ein wenig lästig ist (vorallem bei dem kleinen Panel), wollte ich die Option bieten das Muster abzuspeichern, damit man sich die Mühe eben nur einmal macht..

Die HMI steuert bisher wie gewohnt ein Array im DB. Die Bits des Arrays schiebe ich jetzt mithilfe einer Forschleife in ein Doppelwort, welches wiederum als Rezepturvariable dient. Dadurch reicht mir dann auch die Datenlänge aus.

Hoffe das Ganze klappt wie gedacht:cool:
Ich halte euch auf den Laufenden.

Liebe Grüße
Ben
 

Anhänge

  • Rapport.JPG
    Rapport.JPG
    31,6 KB · Aufrufe: 15
  • HMI.JPG
    HMI.JPG
    39,3 KB · Aufrufe: 13
Zuletzt bearbeitet:
Servus,
für diejenigen, die es interessiert, ein kleines Update.

Alles hat wunderbar funktioniert. (fast schon ein wenig zu gut :unsure:).
Der Rezeptur dient nun kein Array mehr als Datenspeicher sondern 16 dWörter.
Damit reichen die Rezepturvariablen auch völlig aus. Danke @Heinileini & @MFreiberger für den Tipp☺️

Dass array aus dem DB wird als Bitcode in die dWörter geschrieben der Bitcode wird dann in der Rezeptur gespeichert
und wenn benötigt wieder ausgelesen und in das Array geschrieben (so ganz grob erklärt).

Eine abschließende Frage hätte ich aber noch.. gibt es beim beobachten keine möglichkeit Hex in Binär anzeigen zu lassen?
Das umdenken von Hex zu Binär ist zwar kein Problem aber auf dauer doch ganzschön anstrengend..

Einen schönen Tag wünsche ich euch allen.

Liebe Grüße
Ben
 
Eine abschließende Frage hätte ich aber noch.. gibt es beim beobachten keine möglichkeit Hex in Binär anzeigen zu lassen?
Das umdenken von Hex zu Binär ist zwar kein Problem aber auf dauer doch ganzschön anstrengend..
Moin SPS-Benni,

wo beobachten? In einer Beobachtungstabelle (unter "Beobachtungs- und Forcetabellen") kannst Du in der Spalte "Anzeigeformat" auf bin umstellen.

VG

MFreiberger
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Servus MFreiberger,

sry, hab ich vergessen zu erwähnen.
Ich meine direkt in einem globalen Datenbaustein.
Oder geht das nur in einer Beobachtungs- oder Forcetabelle?
Bei Beckhoff, bin ich der Meinung, ging es auch in den Variablentabellen.
Könnte mich aber auch täuschen.

Liebe Grüße
Ben
 
Moin SPS-Benni,

Im globalen Datenbaustein und in den Variablentabellen kann man die Ansicht nicht ändern.
Hier kann man nur den Beobachtungswert im gewünschten Format eingeben. Angezeigt wird er dann nach dem Datentyp der Variablen.

VG

MFreiberger
 
Servus MFreiberger,

Genau das fande ich so verwirrend..
Warum kann man die Variable mit dem gewünschten Format füttern, aber das Ganze nicht so anzeigen lassen.
Naja dann weiß ich immerhin, dass es nicht an mir gelegen hat.
Danke für die Hilfe.

Liebe Grüße
Ben
 
Zurück
Oben