WinCC Variabeln aus .txt einlesen und dauerhaft zur Verfügung stellen

Marcel24

Level-1
Beiträge
4
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ersteinmal vielen Dank für dieses gesammelten Wissenschatz der mir schon sehr weitergeholfen hat!


Folgende FAQ:
https://www.sps-forum.de/faq/15348-...lesen-schreiben-mit-vb-script.html#post218816

Hat mir die Arbeit schon sehr erleichtert!


Einzig allein beim lesen der Variabeln komme ich im Moment nicht weiter.


Code:
Set fso = CreateObject("Scripting.FileSystemObject")
 
    Set TextFile = fso.openTextFile(datei, 1)
    x = 0
    do while textfile.atendofstream <> true
        x = x + 1
        name(x) = TextFile.readline
    loop
    textfile.close[

/CODE]

Wie schaffe ich es das Array Name(x) in die HMI-Variablenübersicht zu implementieren. 


Sodass ich auf den Inhalt über HMI-Elemente (Anzeigen) zugreifen kann bzw. die ausgelesen Werte als Sollwerte an die 
SPS schicken kann.


Würde mich freuen wenn Ihr mir helfen könnt!

Viele Grüße

Marcel
 
Wie schaffe ich es das Array Name(x) in die HMI-Variablenübersicht zu implementieren.
Was meinst Du mit "HMI-Variablenübersicht"???
Was ist das Array "Name"? Ein lokales Array im Skript oder eine HMI-Variable? Wie ist es genau deklariert? Falls das eine HMI-Variable (SmartTag) ist dann müsste die Zuweisung so lauten:
Code:
SmartTags("Name")(x) = TextFile.readline
Falls das Array keine HMI-interne Variable ist sondern ein SmartTag mit Anbindung an PLC-Variablen, dann besteht die Gefahr der Kommunikationsüberlastung, weil bei jedem Schreibzugriff auf das Array (also in jedem Schleifendurchlauf) das gesamte Array in die PLC geschrieben wird.

Wie ist das Array in WinCCflex deklariert? Wie ist das Array in der SPS deklariert?
Was steht in der Textdatei? (Beispiel)
Dir fehlt noch eine Begrenzung der Anzahl eingelesener Zeilen.
Bekommst Du Runtime-Errors aus dem Skript? Welche?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Harald,

vielen Dank für deine Meldung. Es handelt sich dabei ersteinmal um ein Trivialbespiel, dass dann später noch angepasst wird.

Name(x) ist ein Array im VB-Skript das dann die eingelesenen Daten enthalten soll. In diesem Beispiel Zeile1: 1 Zeile2: 2
Das Array Name hätte dann folgenden Inhalt
Name(1)=1 Name(2)=2


In der HMI-Variablenübersicht befinden sich ja alle verwendeten Variablen die das HMI sonst so benötigt bzw. verwendet. Z.b. ich möchte mir eine Lüfterdrehzahl die von der SPS kommt anzeigen lassen. So werde ich die Variabel dort wiederfinden.

Schön wäre es wenn dort Name(1) und Name(2) auftauchen würden. Sodass ich die Werte dann in meinem HMI verwenden kann.


Dir fehlt noch eine Begrenzung der Anzahl eingelesener Zeilen.
Bekommst Du Runtime-Errors aus dem Skript? Welche?

Genau da hast du Recht in diesem Beispiel bricht er nach zwei Zeilen ab, da dann die txt leer ist.



Hast du ein Beispiel wie in einem VB-Skript eine Variabel auf ein HMI Element geschrieben wird? Z.B. ein Counter in ein Ausgabefeld?
 
Welches WinCC verwendest Du? Welche Version?
Hast Du mal einen Screenshot von Deiner "HMI-Variablenübersicht"?

Mir scheint, Du versuchst da irgendwie was unmögliches. Werte schreibt man nicht in HMI-Grafik-Objekte (z.B. Ausgabefelder) sondern in HMI-Variablen.

Mein von Dir verlinkter Beispielcode in der FAQ (Sub SettingsIniLaden) liest Werte aus einer Textdatei mit dem Aufbau von typischen .ini-Dateien und weist die Werte den SmartTags (HMI-Variablen) zu, deren Name vor dem = angegeben sind, z.B.
Code:
Wert1 = 123
Wert3=4711
Wert2 = 4
Das Verfahren ist eher für wenige Werte geeignet (wegen den Textvergleichen auf erwartete Variablennamen). Wieviele Variablenwerte willst Du mit Deinem Skript einlesen?
Deine Aufgabe ist eigentlich eine typische Anwendung für Rezepte, da gibt es schon fertige Funktionen ohne viel Skripterei.

Harald
 
Hallo Harald,

anbei eine Übersicht der Variablen, bzw. der verwendeten Version.

Es handelt sich in einer Zeitdauer von ca. 3 Stunden um das Einlesen von maximal 5 Werten (alles Integer). Das wird auch maximal 5 mal innerhalb dieser 3 Stunden passieren.

Aber wenn du ein Beispiel für die Rezepturen hast gucke ich mir diese auch gerne an.

Wenn ich dich richtig verstehe muss ich nun eine Variabel in der Variablenübersicht anlegen(SmartTag) und diese dann über mein VB-Skript beschreiben.

Dann steht die Variabel für jegliche Anwendungen zur Verfügung.

Ist das so richtig?

Viele Grüße
 

Anhänge

  • HMI Variabelnübersicht.jpg
    HMI Variabelnübersicht.jpg
    116,5 KB · Aufrufe: 5
  • WinCC Version.jpg
    WinCC Version.jpg
    32,5 KB · Aufrufe: 3
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn ich dich richtig verstehe muss ich nun eine Variabel in der Variablenübersicht anlegen(SmartTag) und diese dann über mein VB-Skript beschreiben.

Dann steht die Variabel für jegliche Anwendungen zur Verfügung.
Ja.

Wenn das nur 5 Variablen sind dann würde ich nicht mit einem Array arbeiten sondern den Name der HMI-Variable im Skript direkt angeben oder zusammenbasteln, z.B. 5 HMI-Variablen anlegen:
Code:
FileImport_Var_1 : Int : <Interne Variable>
FileImport_Var_2 : Int : <Interne Variable>
FileImport_Var_3 : Int : <Interne Variable>
FileImport_Var_4 : Int : <Interne Variable>
FileImport_Var_5 : Int : <Interne Variable>
Wo kommt die Textdatei her? Soll die vom Bediener der WinCC Runtime auch editiert werden?
Sind das immer genau 5 Zeilen mit 5 Integer-Werten und die Reihenfolge der Werte ist immer gleich?

Wenn Du das Format der Textdatei so ändern kannst daß je Wert eine Zeile mit dem Format "Tagname = 123" drinsteht (Reihenfolge beliebig), dann kannst Du auf mein Beispiel SettingsIniLaden aufbauen.

Wenn in der Textdatei einfach nur in jeder Zeile ein Zahlenwert drinsteht, dann kannst Du dieses Grundgerüst verwenden:
Code:
Const ForReading = 1
Dim fso, f, txtfile, i, line, ivalue, tagname

txtfile = "C:\TEMP\test.txt"

[COLOR="#008000"]'ShowSystemAlarm "Öffne: " & txtfile 'Debug/Testausgabe[/COLOR]
Set fso = CreateObject("Scripting.FileSystemObject")
Set f = fso.OpenTextFile(txtfile, ForReading, False)
i = 0
Do While Not f.AtEndOfStream And i < 5
    line = f.ReadLine
    If line <> "" Then
        ivalue = Fix(line)
        i = i + 1
        tagname = "FileImport_Var_" & i
        [COLOR="#008000"]'ShowSystemAlarm tagname & "=" & ivalue 'Debug/Testausgabe[/COLOR]
        SmartTags(tagname) = ivalue
    End If
Loop
f.Close

Harald
 
Hallo Harald,

es werden mehrere Fälle zur Anwendung kommen. Einmal werden nur wenige Werte ausgelesen dann etwas mehr!

Die Textdateien werden vom Bediener nicht mehr modifiziert sondern von außen vorgegeben.

Das Beispiel werde ich mal ausprobieren! Vielen Dank erstmal für deine Hilfe!

Wie schätzt du die Möglichkeit ein mit VB-Skripten alle 30 Sekunden eine Textdatei mit ca. 70 Werten zu erzeugen?

Viele Grüße
 
Zurück
Oben