WinCC Flex 2008 - Simples Projekt funktioniert nicht ohne Simulator

ThomaZ

Level-1
Beiträge
14
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo an alle,

Ich habe ein Projekt erstellt mit welchem ich Digitale IOs von W&T-Modulen "überwache".
Von W&T gibt es einen eigenen OPC-Server, der auch TOP funktioniert und auch WinCC kommt super damit klar.

Mein Projekt arbeitet wie folgt:

Variablen:
1. Input aktiv - OPC (bool)
- Variable 1 ist nur für ein grünes Blinklicht in der Visu zuständig.
2. Input gesamtcounter - OPC (long)
- Variable 2 ist eine Zahl die direkt aus dem Modul kommt und auch ins WinCC korrekt übertragen wird
3. nextMinute - OPC (bool)
- Jede Minute ist diese Variable für 500ms auf Wert 1 - ansonsten 0

4. Input conter start (interne Variable)

- Der Wert von "Input Gesamtcounter" der zu beginn des Skripts festgehalten wird
5. Input delta (interne Variable)
- Wird beim start auf 0 gesetzt - dann solange in einer Loop aktualisiert, bis "nextMinute" auf 1 wechselt
6. Input save (interne Variable)
- Hier wird "Input delta" reingeschrieben und Archiviert



Code:
Do While 1

' Variablan vorbereiten
    'DELTA-Inputs auf NULL setzen
    SetValue SmartTags("Input 0 Delta"),
    
    'Counter-Startwerte setzen
    SetValue SmartTags("Input 0 Counter start"), SmartTags("Input 0 Counter")
    
' aktualisieren solange nextinute = 0
    Do While  SmartTags("nextMinute") = 0
        
        SmartTags("Input 0 Delta") = SmartTags("Input 0 Counter") - SmartTags("Input 0 Counter start") 
    
    Loop
    
    SetValue SmartTags("Input 0 Takt SAVE"),SmartTags("Input 0 Delta") 
    
Loop

Leider funktioniert das nicht...
Anfangs hatte ich das an die Uhrzeit gekoppelt (startminute = Minute(Now) / aktualisieren bis startminute sich ändert). Das ging einwandfrei im Simulator, aber nicht mehr sobald ich ohne Simulator gestartet habe.

Hat jemand eine Idee was falsch läuft und eventuell einen Tipp?

Vielen Dank und Grüße

ThomaZ
 
Ich frage mich eher was daran überhaupt funktionieren soll?

Code:
Do While 1

[COLOR=#ff0000]If _something_ Then[/COLOR]
[COLOR=#ff0000]    Exit Do[/COLOR]
[COLOR=#ff0000]End If[/COLOR]

Loop
Du darfst die Scripting-Umgebung nicht mit einer Code-Ablauf-Umgebung verwechseln.
Scripte werden über irgendwelche Trigger aufgerufen, laufen ab und werden beendet.
Die Ablaufzeit sollte auch möglichst kurz sein.

Dementsprechend arbeitet WinCC-Flexible auch nur 1 Skript nach dem anderen (max. eines gleichzeitig) ab.
Du wirst hier also umdenken müssen.

Irgendwo gibt es denk ich gute WinCC-Flex Scripting Manuals. Ich kenn jetzt auf die schnelle keines, vielleicht wirft hier ja jemand noch einen Link rein.
HIER müsste aber was zu finden sein...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke RONIN für deine Antwort.

Ich habe das ganze jetzt umgebaut dass bei Wertänderung von "nextMinute" das Skript ausgeführt wird.
Leider funktioniert das immer noch nicht...

Ich bin nun gestolpert über folgendes:


Variablen-DeklarationGültigkeit
SkriptWinCC Flex Proj.Steuerung
Externe Variablexxx
Interne Variablexx
Skript Variablex

Ist es überhaupt möglich in der Form wie ich es versuche, oder muss ich für JEDE Variable in meinem Skript eine Interne Variable erstellen und via SmartTag ansprechen?

Skript:
Code:
If SmartTags("nextMinute") Then
    Dim startEins
    Dim deltaEins
    Dim counterEins


    counterEins = SmartTags("Input 1 Counter")    
    startEins = counterEins    
    deltaEins =  counterEins - startEins    
    SetValue SmartTags("Input 1 Takt SAVE"), deltaEins
    
End If



Gruß

Thomas



Edit:
Die Tabelle sah seltsam aus - hab sie mal neu erstellt.
 
Zuletzt bearbeitet:
Hmm...

Ich habe es jetzt nochmal auf SmartTags umgestellt - leider geht es trotz allem nicht :(

wincc-simulator.png

1. Ich ändere den Counter-Wert per Hand
2. Ich ändere "nextMinute" auf 1

eigentlich sollte nun das Skript laufen - es passiert aber scheinbar nichts.
 
Dein VBS Code für Delta erzeugt ein schönes rundes Null.

Erklär mal was das ganze machen soll.
Ich habe den Gefühl das du bist auf den komplett falschen Spuhr.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Prinzipiell soll folgendes passieren:

- jede Minute gibt es für eine Sekunde einen Wechsel von "0" auf "1" (OPC-Server Variable "nextMinute")
- Diese Wertänderung führt ein Skript aus (Skript_1)

In diesem Skript steht:
Code:
If SmartTags("nextMinute") > 0 Then
     [...]
End If
Ich weiß nicht ob dies nötig ist, aber da die Wertänderung nach einer Sekunde wieder auf "0" sprigt, halte ich das für sinnvoll.

der Code der im Innern der If-Abfrage ist lautet:
Code:
SmartTags("Input_1_Counter_start") = SmartTags("Input_1_Counter")
Den aktuellen Input_x_counter (aus dem OPC Server) in die Startvariable schreiben.



Code:
SmartTags("Input_1_Delta") =  SmartTags("Input_1_Counter")-SmartTags("Input_1_Counter_start")
Das Delta berechnen, indem der Startwert vom Endwert abgezogen wird.



Code:
SetValue SmartTags("Input_1_Takt_SAVE"), SmartTags("Input_1_Delta")
Das Delta in die Archivierte Variable schreiben - diesen Schritt könnte ich vermutlich einsparen indem ich direkt die Dalte-Variable Archiviere.



Mehr soll nicht passieren. Es soll also "nur" die Differenz des Counters alle 60 Sekunden(nextMinute) festgehalten werden.
 
Ich weiß nicht ob dies nötig ist, aber da die Wertänderung nach einer Sekunde wieder auf "0" sprigt, halte ich das für sinnvoll.
JA.

Um die Bemerkung von JesperMP mit Zahlen zu unterstreichen...
Deine Beiden Codezeilen...
Code:
SmartTags("Input_1_Counter_start") = SmartTags("Input_1_Counter")
SmartTags("Input_1_Delta") =  SmartTags("Input_1_Counter")-SmartTags("Input_1_Counter_start")

Wenn dein Skript aufgerufen wird, steht in SmartTags("Input_1_Counter") igendein Wert, oben in deinem Bild ist es 12.
Code:
SmartTags("Input_1_Counter_start") = SmartTags("Input_1_Counter")
[COLOR=#ff0000]SmartTags("Input_1_Counter_start") = 12[/COLOR]

SmartTags("Input_1_Delta") =  SmartTags("Input_1_Counter")-SmartTags("Input_1_Counter_start")
[COLOR=#ff0000]SmartTags("Input_1_Delta") =  12 - 12[/COLOR]

[COLOR=#FF0000]SmartTags("Input_1_Delta") = 0
[/COLOR]
Noch Fragen? ;)

Das SetValue kannst du dir sparen...
Code:
SetValue SmartTags("Input_1_Takt_SAVE"), SmartTags("Input_1_Delta")
Weise Werte gleich direkt mit SmartTags(_irgendwas_) =
SmartTags(_irgendwasanderes_) zu.
 
Zuletzt bearbeitet:
Das Skript ist besser per "Wertänderung" ausgeführt von ein (andere) Zählervariabel der jede Minute inkrementiert wird.

Ich wurde aber die Berechnung von Delta in der SPS machen.
Nur der Abspeicherung von Delta soll der HMI durchführen.

Dann probier mal:
Delta = Counter - Counter_mem
Counter_mem = Counter
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du hast eine Startbedingung des Skriptes eingebaut. Bei den Skripten in Flex eigentlich unnötig. Das Skript wird dann gestartet wenn es aufgerufen wird, deshalb ist eine Startbedingung wie gesagt unnötig. Hast du das Skript auch irgendwo aufgerufen? Z.B. Wincc Variable "Next_Minute" Eigenschaft- "Wertänderung" Aktion ausführen -> Skript aufrufen und dann wird das Skript gestartet. Vorher ist das Skript drin, wird aber nicht genutzt. Edit: Hast du die Verbindung auch aktiviert? Mit deaktivierten Verbindungen kann man die Variablen simulieren, aber im Panel funktionieren die dann nicht.
 
Zuletzt bearbeitet:
Oh man...
Alle Antworten habe ein Stück mehr die Augen geöffnet... :grin:

Code:
If SmartTags("nextMinute")=True Then
	SmartTags("Input 0 Delta") = SmartTags("Input 0 Counter")-SmartTags("Input 0 Counter start"):
	SmartTags("Input 0 Takt SAVE") = SmartTags("Input 0 Delta"):
	SmartTags("Input 0 Counter start") = SmartTags("Input 0 Counter")
End If

Ich habe die ":" hinzugefügt, weil in der Doku steht: "Eine Anweisung oder mehrere durch Doppelpunkte voneinander getrennte Anweisungen, die ausgeführt werden, wenn Bedingung den Wert True hat."
Dies steht NICHT nur bei einzeiliger Syntax,sondern auch die Mehrzeilige.

Nachdem ich das gemacht habe hat es sofort funktioniert :shock:


Nachdem meine Denkfehler von euch aufgezeigt wurden und ich die Syntax nochmal nachgeschlagen habe, funktioniert nun alles zu meiner absoluten zufriedenheit.
Jede Minute wird das Delta Archiviert und in der Visu ausgegeben.

Vielen Dank an alle die mitgeholfen haben :)

Thomas
 
Ich habe die ":" hinzugefügt, weil in der Doku steht: "Eine Anweisung oder mehrere durch Doppelpunkte voneinander getrennte Anweisungen, die ausgeführt werden, wenn Bedingung den Wert True hat."
Dies steht NICHT nur bei einzeiliger Syntax,sondern auch die Mehrzeilige.

Nachdem ich das gemacht habe hat es sofort funktioniert :shock:
Das ist Quatsch, das war es nicht. Die Doppelpunkte werden nur bei einzeiliger If...Then (ohne End If) benötigt. Du kannst und solltest die Doppelpunkte entfernen, es wird trotzdem funktionieren.

Code:
If SmartTags("nextMinute")=True Then
	SmartTags("Input 0 Delta") = SmartTags("Input 0 Counter")-SmartTags("Input 0 Counter start"):
	SmartTags("Input 0 Takt SAVE") = SmartTags("Input 0 Delta"):
	[COLOR="#FF0000"]SmartTags("Input 0 Counter start") = SmartTags("Input 0 Counter")[/COLOR]End If
End If
Es funktioniert nun deshalb, weil Du die rote Zeile ans Ende versetzt hast, da wo sie hingehört und wie es Jesper in Beitrag #8 gezeigt hat.
Vorher hast Du zuerst die aktuelle Position als Startposition gemerkt und danach die Differenz zur aktuellen Position berechnet - da muß ja 0 rauskommen. Nun berechnest Du zuerst die Differenz zur vorher gemerkten Startposition und merkst Dir erst danach die aktuelle Position als Startposition für den nächsten Skriptdurchlauf.

Harald
 
Zurück
Oben