Bausteinausgänge per HMI einstellbar

BNick

Active member
Beiträge
31
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
Hallo, ich schreibe grad einen Baustein zur Ansteuerung einer Ventilinsel. Vorgabe ist das alles per HMI einstellbar ist. Mein Baustein kann maximal 6 Schwarz/Weiss- und 2 Prop-Ventile schalten, nun möchte ich per Eingabe am Display die Ausgänge zuordnen. Ist dies möglich und wenn ja hat jemand einen Ansatz?
 

Larry Laffer

Supermoderator
Teammitglied
Beiträge
13.096
Punkte Reaktionen
2.721
Hallo,
der einzige Weg, der mir da so einfallen würde, wäre der, in der Visu ein String einzugeben, der in der SPS dann in einem DB landet und den du dann (per Zerlegung) wie der in eine Adresse umbaust - das wäre dann für mich ein Fall für SCL.
Machbar ist das auf jeden Fall - es stellt aber einen gewissen Programmieraufwand dar ... 8)

Gruß
Larry
 
OP
B

BNick

Active member
Beiträge
31
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
Hmmm...nehmen wir mal an ich machs über ne Checkbox und wenn die Aktiv is schreib ich nen nen DB meinetwegen PY22...jetzt setzt bei mir aus wie ich das einen Ausgang zuordnen soll :confused:
 

Boeby

Well-known member
Beiträge
104
Punkte Reaktionen
11
Kurze Verständnisfrage:

Du möchtest im Prinzip einen Baustein schreiben, der 10 Ausgänge hat?
Da aber nicht bekannt ist, welches Ventil an welchem Ausgang hängt soll dann bei der IBN erst die Zuordnung erfolgen.
Ist das so richtig?

MfG
 

rostiger Nagel

Forums-Knochenbrecher
Teammitglied
Beiträge
14.368
Punkte Reaktionen
4.202
Du könntest das so machen, das du ein Auswahlfeld auf der HMI machst, wo du für jedes Ventil entsprechend deins Baustein eine Auswahl 1..10 machen kannst.

Die Zuweisung würde ich dann im SPS-Programm (einschließlich Überwachung auf Plausibiltät) machen, als Beispiel kann man dann so etwas sehr schön mit dem
Sprungverteiler lösen.
 
OP
B

BNick

Active member
Beiträge
31
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
Ich programmiere eine Druckgussanlage, das Teil wird in einer Schrittkette mit Insgesammt 20 Schritten produziert und ich schreibe eine Baustein der max 6 Ventile einer Ventilinsel ansteuert die vollbestückt 30 Ventile enthält. Vorgabe ist das für jeden Schritt max 6 der 30 Ventile vom Benutzer eingestellt werden können. Ich hoffe ihr versteht nun mein Problem. (Haben die Leute von der Konstruktion sich mal ausgedacht, was das für einen Aufwand bedeutet is denen nicht so ganz klar :( )

Ich versuch da heute mal weiter zu kommen und poste mal den Code, bisher versuch ich mich an den Vorschlag von Larry mit Strings...
 

Larry Laffer

Supermoderator
Teammitglied
Beiträge
13.096
Punkte Reaktionen
2.721
Nein ... das mußt du nicht.
Wenn das mit einer Index-Nummer genauso eine Variante wäre, wo du z.B. festlegst, dass die Ausgänge 40.0 bis 41.7 der Ventilinsel z.B. über die Index-Nummern 400 bis 417 oder noch besser durch eine Listbox (mit entsprechender Enumeration) nazusprechen gehen, dann wäre das doch noch leichte umsetzbar und auch noch etwas fehlerfreier zu überprüfen.

Welcher Programmiersprache willst du dich hierfür bedienen ? AWL ? Besser und praktischer dafür wäre m.E. SCL ... wäre das für dich ein Thema ?
Wo würde es konkret bei dir bei der Umsetzung hängen ?

Gruß
Larry
 

Blockmove

Supermoderator und User des Jahres 2019
Teammitglied
Beiträge
9.241
Punkte Reaktionen
2.442
Vergleichbare Lösungen hab ich schon öfters umgesetzt.

Wenn nur ein Ausgang möglich sein soll, dann bist du mit der Larry vorgeschlagenen Listbox / Sybolisches EA-Feld gut bedient. Dann entfällt (fast) die ganze Prüfung.
Ich persönlich mach es lieber mit Schaltflächen und einem Script zur Prüfung.

Ich leg mir meist eine UDT mit den entsprechenden Daten für einen Schritt.

Dann ein darauf aufsetzendes Array dieses Typ mit der entsprechenden Schrittanzahl +1.
In dieses Array schreibe ich mit dem Panel die entsprechenden Daten.
Wenn du ein Bild machst, indem du die Daten eines Schrittes eintragen kannst, dann kannst du auch hier mit der
indirekten Adressierung von WinCC flex arbeiten. Wenn du das in Tabellenform machen willst, dann brauchst halt entsprechend viele Variablen.
Hab auch schon mal über 200Variablen in einem Bild dafür gebraucht :rolleyes:

Ins Element 0 des Arrays kopiere ich mir immer die Daten des aktuellen Schrittes.
In SCL ist das ein simpler Einzeiler. In AWL ist halt etwas Pointer verbiegen angesagt.

Insgesamt hält sich der Aufwand in Grenzen ... Wenn das Gesamtsystem stimmt.
Aber das ist leicht gesagt :ROFLMAO:

Gruß
Dieter
 
OP
B

BNick

Active member
Beiträge
31
Punkte Reaktionen
0
Zuviel Werbung?
->Hier kostenlos registrieren
Ok ich hab mal ne Grundstruktur reingebracht nur steh ich mit WinCC flex absolut aufm Kriegsfuß, ich will ja nicht das eine Bild das für jeden Schritt gleich is tausendmal anlegen, kann ich ein Bild nicht per Skript aufrufen und Variablenpräfix vergeben? So kenn ich es aus WinCC...
 

Blockmove

Supermoderator und User des Jahres 2019
Teammitglied
Beiträge
9.241
Punkte Reaktionen
2.442
Ok ich hab mal ne Grundstruktur reingebracht nur steh ich mit WinCC flex absolut aufm Kriegsfuß, ich will ja nicht das eine Bild das für jeden Schritt gleich is tausendmal anlegen, kann ich ein Bild nicht per Skript aufrufen und Variablenpräfix vergeben? So kenn ich es aus WinCC...

Flexible bietet dir indirekte Adressierung für Variablen.
Damit kannst DBNr,ByteNr,BitNr einer Variablen durch eine andere Variable adressieren. Wenn du deine Schritt-Daten DBweise organisierst (Pro Schritt ein DB), dann kannst du einfach deine Variablen per DBNr adressieren. Ist wirklich simpel und funktioniert selbst auf OP77B.

Gruß
Dieter
 
OP
B

BNick

Active member
Beiträge
31
Punkte Reaktionen
0
Yeah, indirekt rult. Such grad eine Möglichkeit die Daten von einem SchrittDB in einen andren zu kopieren. Quelle und Ziel sollen vom Benutzer vorgegeben werden. Hier mein Script, hat jemand eine Idee was schief läuft? Kopiert wird nämlich nüscht:

Code:
Dim i Dim Quelle
Dim Ziel
Dim temp 


Quelle = SmartTags("Quelle")
Ziel = SmartTags("Ziel")


For i = 1 To 64
    
SmartTags("DB_Adresse") = Quelle 'Interne INT Variable, hier steht der DB
temp = SmartTags("SchrittVAR") 'SchrittVAR Variable dynamisch mit DB_Adresse und DB_Line
SmartTags("DB_Adresse") = Ziel 'Nun in DB_Adresse zahl vom Ziel DB schreiben
SmartTags("SchrittVAR")    = temp 'Temp zurückschreiben
SmartTags("DB_Line") = SmartTags("DB_Line") +4 '4 zur Adressvariable dazuzählen da ich 64 DBD kopieren möchte


Next
 

Larry Laffer

Supermoderator
Teammitglied
Beiträge
13.096
Punkte Reaktionen
2.721
Zuviel Werbung?
->Hier kostenlos registrieren
Ähh sorry ... ich verstehe deinen Code und was du damit erreichen willst nicht so recht.
Beim Umkopieren von Smarttags innerhalb eines Skriptes müssen alle Variablen für Flex namentlich bekannt sein.
Den Variablennamen kann du dem Smarttag als selnst zusammengebastelten String übergeben - das sehe ich hier aber nicht.
Genauso lassen sich so auch Array-Elemente ansprechen.

Villeicht beschreibst du mal etwas genauer dein Vorhaben ...

Gruß
Larry
 

Blockmove

Supermoderator und User des Jahres 2019
Teammitglied
Beiträge
9.241
Punkte Reaktionen
2.442
Yeah, indirekt rult. Such grad eine Möglichkeit die Daten von einem SchrittDB in einen andren zu kopieren. Quelle und Ziel sollen vom Benutzer vorgegeben werden. Hier mein Script, hat jemand eine Idee was schief läuft? Kopiert wird nämlich nüscht:

Tja das Panel aktualisiert deine Variablen nicht während das Schleifendurchlaufs.
Ich mach sowas immer in der SPS. Simpler Blockmove (SFC20) angestoßen vom Panel.

Gruß
Dieter
 
OP
B

BNick

Active member
Beiträge
31
Punkte Reaktionen
0
Blockmove will ich vermeiden, Kollege hat das so gemacht und sich voll verrannt bis schließlich die Zykluszeit jenseits von gut und böse war. Muss doch möglich sein das per Panel zu kopieren.

@Larry
Ich habe eine Variable angelegt deren DBNummer und Adresse dynamisch ist. Nun hol ich mir die Nummer vom QuellDB und dann vom ZielDB. Jetzt wird vom QuellDB die Adresse hochgezählt und alles in ein TempArray gesteckt, danach soll alles vom TempArray in den ZielDB kopiert werden und auch hier wird die Adresse in der Schleife hochgezählt. Im DB befinden sich Time-Variablen deshalb zähl ich jedesmal die Adresse um 4 hoch...
 
Oben