# WinCC VBS Skript If Then Anweisung Bitte um Hilfe



## Elektricks (2 Februar 2016)

Hallo Forengemeinde,

Es geht um WinCC 7.0, ich möchte in Abhängigkeit einer Variablen Stat_Ein die Variable Steu_Aus oder Steu_Ein auf true setzen. 
Leider sind meine VBS Kenntnisse sehr beschränkt, habe bereits viele Beispiele aus der Hilfe, oder dem netz probiert,
bekomme es aber nicht hin :roll: vielleicht könnt ihr mir bisl unter die Arme greifen...

Schreibe ich die Variable ohne der If Anweisung wird sie geschrieben.
Sobald die If Anweisung mit einfließt funktioniert es nicht mehr. 



```
Sub OnClick(ByVal Item)                                 

Dim Stat_Ein
Dim Steu_Aus
Dim Steu_Ein

Set Stat_Ein = HMIRuntime.Tags("VM-HA01-STAT_EIN")
Set Steu_Aus = HMIRuntime.Tags("VM-HA01-STEU-AUS")
Set Steu_Ein = HMIRuntime.Tags("VM-HA01-STEU-EIN")

If Stat_Ein = True Then

Set Steu_Aus = True
Steu_Aus.Write 7

End If

If Stat_Ein = False Then

Set Steu_Ein = True
Steu_Ein.Write 7

End If

End Sub
```

Danke für eure zeit und eure Bemühungen


----------



## Krumnix (2 Februar 2016)

```
Stat_Ein.Read
Stat_Ein.Value = True
```


----------



## Elektricks (2 Februar 2016)

Hi krumix, danke für die schnelle Antwort habe ich das so richtig interpretiert? 
funktioniert leider immer noch nicht. Ich projektiere in derlaufenden Runtime. Bildwechsel nach Änderung sollte doch reichen oder?

```
Sub OnClick(ByVal Item)                                     

Dim Stat_Ein
Dim Steu_Aus
Dim Steu_Ein

Set Stat_Ein = HMIRuntime.Tags("VM-HA01-STAT_EIN")
Set Steu_Aus = HMIRuntime.Tags("VM-HA01-STEU-AUS")
Set Steu_Ein = HMIRuntime.Tags("VM-HA01-STEU-EIN")

Stat_Ein.Read
If Stat_Ein.Value = True Then

Set Steu_Aus.Value = True
Steu_Aus.Write 7

End If

If Stat_Ein.Value = False Then
Set Steu_Ein.Value = True
Steu_Ein.Write 7

End If

End Sub
```


----------



## Krumnix (2 Februar 2016)

Ist dass das 1. Script in dem Projekt? Wenn ja, schau mal, ob das Ausführen von Scripten überhaupt aktiv ist. Findest du in den Eigenschaften vom Rechner im WinCC-Baum.

Dann brauchst du bei der Zuweisung kein SET zu schreiben. Das könnte auch ein Problem sein.
Es reicht

```
Steu_Ein.Value = TRUE
Steu_Ein.Write
```
zu schreiben.

Du kannst auch noch das apdiag.exe starten, dass dir Script-Fehler ggf. anzeigt.


----------



## Elektricks (3 Februar 2016)

Hallo krumnix,
bin langsam am verzweifeln. Schaffe es nicht einmal eine einzige Variable zu schreiben...
Inzwischen eine Testmaschine aufgesetzt mit Verbindung zur SPS, um nicht Gefahr zu laufen den Produktivprozess zu zuerschießen...

Im Projekt von gestern waren eigentlich nur C# Scripte vorhanden. keine VBS...

Habe in den Rechnereigenschaften GlobalScript aktiviert. Rechner neu gestartet



Mein Code sieht inzwischen nur noch so aus und trotzdem funktioniert nicht:


Aus der Hilfe: In VBS können Sie Variablen direkt über den Namen ansprechen und Werte setzen und lesen. Wenn Sie auf zusätzliche Eigenschaften der Variablen zugreifen wollen, z.B. den Qualitycode erfragen, müssen Sie die Variable immer über die Tags-Auflistung ansprechen. Über das zurückgelieferte Tag-Objekt haben Sie Zugriff auf alle Eigenschaften und Methoden der Variablen. Sie müssen für das Objekt eine Instanz bilden, damit z.B. mit HMIRuntime.Tags("Variable").Value=TRUE eine binäre Variable geschrieben wird.
was ist in dem zusammenhang eine Instanz???

Mit einer Direktverbindung keine Probleme: 



Habe auch schon etliche Varianten durchprobiert: Leerzeichen zwischen = und Zuweisung mit Set oder ohne.... mit .Value alles ohne Erfolg...

Wärs in C# einfacher?


----------



## Elektricks (3 Februar 2016)

Manchmal muss man nur einen Post schreiben und schon klappts: 

Dachte das die Variable hier auch gleich geschrieben wird, war aber nicht so.
Muss separat erfolgen...



Das wäre die erste Hürde. 

Hat vielleicht jemand eine Idee wie ich es schaffe, dass Bit wieder zurückzusetzen. 
Es muss allerdings natürlich solange im DB TRUE sein, damit die Steuerung dies auch mitbekommt.
Gibt's hierfür einen WAIT Befehl oder so? WAIT 60 - warte 60ms???


----------



## Elektricks (5 Februar 2016)

Gute Morgen zusammen,

da ich die Funktion mit VBS beim besten Willen nicht zum laufen bekommen habe, 
habe ich nun ANSI-C benutzt und das funktioniert tadellos.

Eine Frage an die Experten:
Ist das Gebilde so in Ordnung? Oder gibt es hier Argumente die dagegen sprechen? 
Ich merke zwar beim schnellen klicken hintereinander, dass dann ein klick verschluckt wird. 
Beugt aber wie ich finde Fehlbedienungen vor (Wir haben Benutzer die wissen immer noch nicht wann ein klick ausreicht und wann zwei nötig sind)


```
BOOL bstate;  //Boolsche Variable anlegen
BOOL bSteuEin;
BOOL bSteuAus;
//Variable zuweisen, Wert aus SPS lesen
bstate = GetTagBit("VM-HA01-STAT_EIN"); //Return-Type: BOOL 
 //Wenn bstate True ist, wird das Signal AUS auf TRUE gesetzt
if (bstate)
//Code für if = TRUE
SetTagBitWait("VM-HA01-STEU_AUS",TRUE);

//Code für if = FALSE: Wenn bstate FALSE, "EIN" auf TRUE setzen
else 
SetTagBitWait("VM-HA01-STEU_EIN",TRUE); 

bSteuEin = GetTagBitWait("VM-HA01-STEU_EIN");
bSteuAus = GetTagBitWait("VM-HA01-STEU_AUS");
{
if (bSteuEin)
//Ist Steuervariable "EIN" TRUE wird diese wieder auf FALSE geschrieben
SetTagBitWait("VM-HA01-STEU_EIN",FALSE);
}
{
if (bSteuAus)
//ist Steuervariable "AUS" TRUE wird diese wieder auf False gesetzt
SetTagBitWait("VM-HA01-STEU_AUS",FALSE);
}
```


----------



## Thomas_v2.1 (5 Februar 2016)

Wenn du dein Code entsprechend der Klammern einrückst, sollte dir was auffallen

```
BOOL bstate;  //Boolsche Variable anlegen
BOOL bSteuEin;
BOOL bSteuAus;

//Variable zuweisen, Wert aus SPS lesen
bstate = GetTagBit("VM-HA01-STAT_EIN"); //Return-Type: BOOL 

//Wenn bstate True ist, wird das Signal AUS auf TRUE gesetzt
if (bstate)
	//Code für if = TRUE
	SetTagBitWait("VM-HA01-STEU_AUS",TRUE);

//Code für if = FALSE: Wenn bstate FALSE, "EIN" auf TRUE setzen
else 
	SetTagBitWait("VM-HA01-STEU_EIN",TRUE); 

bSteuEin = GetTagBitWait("VM-HA01-STEU_EIN");
bSteuAus = GetTagBitWait("VM-HA01-STEU_AUS");
{
	if (bSteuEin)
		//Ist Steuervariable "EIN" TRUE wird diese wieder auf FALSE geschrieben
		SetTagBitWait("VM-HA01-STEU_EIN",FALSE);
}
{
	if (bSteuAus)
		//ist Steuervariable "AUS" TRUE wird diese wieder auf False gesetzt
		SetTagBitWait("VM-HA01-STEU_AUS",FALSE);
}
```
Die zwei Blöcke am Ende um die beiden if's sind in C zwar erlaubt, haben bei dir aber keine Funktion.
Ich weiß eh noch nicht so recht was du mit deinem Code so bezwecken willst, das mit den drei TagWait Funktionen ist zumindest äußerst unschön und macht die Ausführung extrem langsam.

Deinen Code könntest du zumindest dahingehend aufräumen, und so schreiben dass bei dir auch suchen und ersetzen funktioniert:

```
// WINCC:TAGNAME_SECTION_START
#define TAGSTEUEIN "VM-HA01-STAT_EIN"
#define TAGSTEUAUS "VM-HA01-STEU_AUS"
// next TagID : 1
// WINCC:TAGNAME_SECTION_END

BOOL bstate;
BOOL bSteuEin;
BOOL bSteuAus;

bstate = GetTagBit(TAGSTEUEIN);

if (bstate) {
	SetTagBitWait(TAGSTEUAUS, TRUE);
} else {
	SetTagBitWait(TAGSTEUEIN, TRUE);
}

bSteuEin = GetTagBitWait(TAGSTEUEIN);
bSteuAus = GetTagBitWait(TAGSTEUAUS);
if (bSteuEin) {
	SetTagBitWait(TAGSTEUEIN,FALSE);
}
if (bSteuAus) {
	SetTagBitWait(TAGSTEUAUS,FALSE);
}
```

Das ließe sich aber noch wesentlich zusammenkürzen, ich habe jetzt nur 1:1 deine Logik übernommen.

Vielleicht schreibst du mal wann welche Bits wann gesetzt und zurückgesetzt werden sollen, dann lässt sich da bestimmt einiges optimieren.


----------



## Elektricks (5 Februar 2016)

Hallo thomas und danke für die antwort. 

Erstmal zu meinem Ziel: 
ich möchte ein SR Glied in der SPS setzen (das wäre "VM-HA01-STAT_EIN") bzw. Rücksetzen über die variablen "VM-HA01-STEU_EIN" bzw. "VM-HA01-STEU_AUS".
Vielleicht ist meine Denke hier aber auch total falsch... Und Wincc bietet mit Bordmitteln diese Funktion ??? :?:

Ich möchte mit meinem Code wenn "VM-HA01-STAT_EIN" FALSE ist, das Signal "VM-HA01-STEU_EIN" für mind. einen Zyklus auf True setzen,
und wenn "VM-HA01-STAT_EIN" TRUE ist, das Signal "VM-HA01-STEU_AUS" für mind. einen Zyklus auf True setzen.

Daher warte ich auch bis die Steuervariablen geschrieben sind, um diese anschließend wieder zurückzusetzen...

Ich schreibe dass so ausführlich, damit ich auch in einem jahr Logisch nachvollziehen kann wie das funktioniert, da das nciht mein tägliches Geschäft ist. 
ich hänge gleich noch ein paar Bilder an, wenn ich wieder am Rechner bin... Grad Kaffeepause ;-)


----------



## borromeus (5 Februar 2016)

Ich verstehe nicht warum Du das im WinCC machen willst.

zB:
Taste Visu "EIN": SetTag (VM-HA01-STEU_EIN,TRUE);
Taste Visu "AUS": SetTag (VM-HA01-STEU_AUS,TRUE);
(also das ist C, wird im VBS auch nicht viel anders aussehen)

in der SPS: 

```
U VM-HA01-STEU_EIN
S VM-HA01-STAT_EIN
R VM-HA01-STEU_EIN

U VM-HA01-STEU_AUS
R VM-HA01-STAT_EIN
R VM-HA01-STEU_AUS
```


----------



## Elektricks (5 Februar 2016)

Vorgegebene Programmiersprache ist bei mir halt FUP, da muss man zwei Netzwerke für zwei Reset Anweisungen opfern...
Dein Weg wird wohl der sinnigere sein.... 
Ich dachte halt irgendwie muss es doch möglich sein, diese Variablen wieder zurückzusetzen. Da hat der Spieltrieb seinen Lauf genommen.
Ich hatte das rücksetzen zuerst auf das Ereignis linke Maustaste loslassen programmiert, da gab es keine derartigen Probleme ... und ich kann alles ohne SetTagBitWait programmieren.


----------



## Thomas_v2.1 (5 Februar 2016)

Das lässt sich aber auch in FUP in einem Netzwerk umsetzen. Und selbst wenn nicht, dann würde ich zwei Netzwerke in der SPS immer so einem Gebastel im HMI vorzuziehen.
Wenn du nur das WinCC machst und musst dich an ein bestehendes fertiges Programm ankoppeln, dann gehts nicht anders. Aber du kannst doch so wie es aussieht auch das SPS-Programm modifizieren.

Außerdem, wenn du nur eine Taste zum Ein/Aus toggeln hast, dann reicht doch auch ein einziger Befehl, und das Setzen/Rücksetzen (Eltako) machst du komplett in der SPS.


----------



## PN/DP (5 Februar 2016)

Elektricks schrieb:


> Vorgegebene Programmiersprache ist bei mir halt FUP, da muss man zwei Netzwerke für zwei Reset Anweisungen opfern...


Wo doch Netzwerke in der SPS sooo teuer sind 

Wie Thomas schon gezeigt hat, geht das S/R völlig problemlos in der SPS, sogar in nur 1 Netzwerk. Und die beiden UND-Verknüpfungen am S/R-Ausgang braucht man noch nichtmal.

Bedenke: eine Visu stellt nur auf grafische Weise Statusanzeigen, Bedientasten und Eingabefelder zur Verfügung. Die Programmierung, was bei einem Tastendruck passieren soll, erfolgt jedoch in der SPS. Die Visu teilt lediglich der SPS mit, daß eine Taste betätigt wurde - wie bei einem realen Hardware-Taster.

Harald


----------



## Thomas_v2.1 (5 Februar 2016)

PN/DP schrieb:


> Und die beiden UND-Verknüpfungen am S/R-Ausgang braucht man noch nichtmal.


Bei einer S7-400 schon. Falls das Kommunikationsbit zufälligerweise nach dem ersten UND und vor dem Rücksetzen eingebunden wird, würde der Befehl verloren gehen.


----------



## PN/DP (5 Februar 2016)

Der verlorengehende Befehl wäre in der Schaltung sowieso überflüssig und würde nichts bewirken. STEU_EIN wird ja nur zurückgesetzt, wenn das S/R eh' schon 1 ist und STEU_AUS nur wenn das S/R schon 0 ist.

Harald


----------



## borromeus (5 Februar 2016)

Seid mir nicht böse, aber ich kann das nicht mehr hören: "Vorgegebene Programmiersprache.... FUP".
Wenn ein Instandhalter, der für die SPSn zuständig ist nicht mal Grundlagen von AWL versteht, dann soll er bitteschön das PG nicht aufklappen.
Da wird mit Krampf irgendwas in FUP herumgestrickt wo kein Mensch mehr versteht wo der Zusammenhang der einzelnen Netzwerke ist.
FUP ist für das gut was eben früher Relaisschaltungen waren, und ein bisschen mehr. Das grundsätzliche Ablehnen von AWL ist absolut sinnbefreit und lässt sich aufgrund der Anforderungen an die Automatisierungstechnik heute real gar nicht umsetzen. Ich kenne Leute (mit PG), die verstehen nach 20 Jahren noch nicht was ein Flankenhilfsmerker ist. Der Kunde ist eben nicht immer König, zumindest bei mir nicht.

(diesen Fall hier kann man natürlich in FUP programmieren, kein Problem damit)


----------



## Elektricks (6 Februar 2016)

Erstmal danke an alle für die konstruktiven Beiträge. 
Ich hab wieder was gelernt ;-)
Werde es wohl so machen wie von Thomas vorgeschlagen

Darf ich fragen ob das die gängige Praxis im Alltag ist: Steuervariable im HMI setzen und in der SPS Rücksetzen?
Ich hab das grade bei flexible sehr oft gesehen, dass es so gemacht wird wie ich es vorhatte... im HMI setzen und rücksetzen... (Soll jetzt keine Rechtfertigung für den Mist sein )


----------



## borromeus (6 Februar 2016)

Es gibt sicher viele Möglichkeiten, ich hole aber einmal weiter aus:
Zu allererst "wünscht" man sich eine Funktion "Taste"- Taste hat den Vorteil gegenüber Schalter, dass dieser keine fixe Stellung einnimmt. Denke da zB an eine Parallelbedienung an einem Schaltschrank. Wenn da ein Schalter auf EIN steht, dann muss es EIN sein- es wäre ja verwirrend wenn man am Schaltschrank EIN schaltet und in der Visu auf AUS schalten könnte. 

Wir bevorzugen die oben angegebene Variante weil- die alternative wäre:
ein Impuls von der Visualisierung: da braucht man dann eine Zeit programmiert
oder
ein SetTagBit TRUE beim Drücken und ein SetTagBit FALSE beim Loslassen  (wie ein Hardwaretaster)- da haben wir schon oft erlebt, dass das Bit zu kurz kommt und gar nicht in der SPS landet

Mit dem Setzen des Bits in der Visu und Rücksetzen in der SPS ist somit eine Art Handshake aufgebaut- hat noch nie versagt.
Falls jemand das Argument bringt, dass wenn die Kommunikationsverbindung beim Drücken zwischen SPS und Visu gerade ausgefallen ist, der EIN-Befehl erst später und ungewollt in der SPS landet wenn die Kommunikation wieder hergestellt ist, muss man sagen, dass das nicht so ist. Die Visus die ich kenne lesen ja ständig die Werte aus der SPS und Schreibbefehle werden nur 1x abgesetzt.
Sprich: ist zum Zeitpunkt des TastenDrückens die Kommunikation ausgefallen passiert eben einfach nichts.


----------



## ducati (6 Februar 2016)

Elektricks schrieb:


> Im Projekt von gestern waren eigentlich nur C# Scripte vorhanden.
> Wärs in C# einfacher?





Elektricks schrieb:


> Gibt's hierfür einen WAIT Befehl oder so? WAIT 60 - warte 60ms???



Und so neben bei... es ist die Programmiersprache C in WinCC nicht C-Sharp

Und Wartebefehle in WinCC sind absolut böse und sollten nie verwendet werden... Da auf dem WinCC-Rechner in dieser Zeit garnix mehr passiert. Alle Scripte werden nacheinander abgearbeitet. d.h. wenn ein Script ne Wartefuntkion beinhaltet laufen auch alle anderen hundert Scripte in dieser Zeit nicht.

GetTagWait hat aber damit nichts zu tun, das ist wieder ne andere Geschichte...

Gruß.


----------

