WinCC Unified txt file per Javascript in die PLC lesen

Quickmik

Level-2
Beiträge
8
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo ,

ich habe Probleme per button ein txt file von der Festplatte meines Visurechners ins die SPS zu schreiben . Mein Ansatz :
***************************************************************************************************************
export async function Schaltfläche_10_OnTapped(item, x, y, modifiers, trigger) {
HMIRuntime.Tags.SysFct.SetTagValue("TimeProgNo", 1); // hier beschreibe ich meinen Zeiger auf 1 / Array in der SPS
// Please note, the format of a file path is device and operating system specific.
// You need to adapt the given path to your environment.
// Example for a Unified Comfort device (Linux OS): /home/user1/data.dat
// Example for a Unified PC-based device (MS Windows OS): C:\Users\Public\data.dat

HMIRuntime.FileSystem.ReadFile("C:\bm\miniring\fill\a\suck.txt", "utf8").then( // damit versuche ich einen tag Text den ich als WSTRING
function(text) { // angelegt habe zu beschreiben
screen.items("myText1").text =text;
HMIRuntime.Trace("Text=" + text);
});
}

das Script habe ich so in einem Beispiel für Textfile einlesen gefunden

Wenn jemend das so schon mal umgesetzt hat wäre ich für einen Tip dankbar

Grüsse
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Botimperator ,

vielen Dank für die schnelle Antwort . Den Beitrag hatte ich noch nicht aber trifft es nicht genau .
Ich muss ein txt file von der Platte des IPC (Unified Rechner ) einlesen und als WSTRING in eine 1518 schreiben .
Ich habe mich an das Video von "Der Hecht4.0" Youtube gehalten , schaffe es aber nicht txt file zu lesen und in ein WSTRING Tag in die SPS zu schreiben.
 
Ich habe mich an das Video von "Der Hecht4.0" Youtube gehalten , schaffe es aber nicht txt file zu lesen und in ein WSTRING Tag in die SPS zu schreiben.
Wenn meine Glaskugel funktionieren würde, würde ich vermutlich jetzt am Strand liegen & weißes Pulver von Emma Whatsons 🍑 ziehen (°ー°〃)
[hier weitere Varianten der Glaskugel-Antwort einfügen (°ー°〃) ]

Ich vermute mal dein Script bricht einfach ab, ohne irgendetwas sichtbares zu machen?
Im SIMATIC WinCC Unified - Tipps und Tricks zur Skripterstellung (JavaScript) gibt es im Abschnitt 5.16 einiges zum Thema Debugging, was in deinem Script noch fehlt & unbedingt ergänzt werden sollte.

Den TraceViewer könntest du beispielsweise mit so etwas füttern:
Javascript:
try {
    //Code hier einfügen
;
} catch (ex) {
    HMIRuntime.Trace("\n" +
        "Bildobjekt: " + item.Name + "\n" +
        "Screen Name: " + Screen.Name + "\n" +
        "Screen Window Name: " + Screen.Parent.Name + "\n" +
        "Screen Window Path: " + Screen.Parent.Path + "\n" +
        "Beschreibungstext für das Script bzw. die auslösende Stelle.\n" +
        "Fehler: " + ex, HMIRuntime.Trace.Enums.hmiSeverity.Error);
};
Damit bekommst du dann zumindest mal eine konkrete Aussage was das Problem ist.
 
Moin , ich denke da muss ich ich einen anderen Plan machen . Ich hatte gehofft das JS kann was .Wenn das so ein Akt ist ein file zu lesen und an die SPS zu übergeben muss ich da evtl. andere Wege gehen . Die Simatic - Hilfe ist mir für ein JS Ahnungslosen zu dünn , und die Syntaxcontrole
hilft mir da auch nicht . Ich hatte gehofft das es einen "Codeschnipsel" gibt das ein txt von der IPC-Platte holt und, an einen an die SPS durchgereichten WSTRING Tag, übergibt. Ist wohl doch etwas komplexes oder ich kann es nicht greifen .
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Naja, du wirst dich schon etwas damit befassen müssen was du machen willst ¯\_(ツ)_/¯
JS kann das Problemlos was du machen willst & das Codeschnipsel ist auch praktisch fertig.
Klemmt halt irgendwo, also musst du nachschauen wieso. => Debugging-Konsole
Es reicht ja schon ein Tippfehler, damit er die Datei oder das Ziel für den gelesenen Text nicht mehr findet.
 
Ich danke Dir für Deine Hilfe , ich muss das im Moment auf die Seite legen . Ich hoffe ich finde dann später im Projekt die Zeit dafür , oder noch besser jemand der das macht . Das mit dem befassen ist ganz sicher der richtige Weg aber für mich im Moment nicht zu schaffen.
Danke nochmal und evtl. bis in ein paar Wochen
 
Da ich mich noch nicht mit Unified beschäftigen mußte, habe ich mal die KI gefragt, vielleicht ist da ja ein Tipp für Dich dabei:

Hallo! Das Problem ist ein Klassiker in WinCC Unified. Der Code sieht auf den ersten Blick logisch aus, scheitert aber meist an zwei Hürden: den Sicherheitsbeschränkungen des Browsers (Sandbox) und der Syntax der Dateipfade in JavaScript.

Hier sind die entscheidenden Punkte, um das Skript zum Laufen zu bringen:

1. Das Pfad-Problem (Backslashes)​

In JavaScript ist der Backslash \ ein Escape-Zeichen. Pfade unter Windows müssen daher entweder mit doppelten Backslashes oder einfachen Forward-Slashes geschrieben werden.

  • Falsch: "C:\bm\miniring\..." (Das \b wird als "Backspace" interpretiert).
  • Richtig: "C:/bm/miniring/fill/a/suck.txt" oder "C:\\bm\\miniring\\fill\\a\\suck.txt".

2. Zugriffsberechtigungen & Speicherort​

WinCC Unified läuft in einer Web-Umgebung. Ein direkter Zugriff auf C:\ ist aus Sicherheitsgründen oft gesperrt.

  • Tipp: Nutze für Tests den Ordner C:\ProgramData\SCADAProjects\.
  • Stelle sicher, dass der User, unter dem die Runtime läuft (meist der "UMC" Dienst oder der lokale IIS-User), Leserechte auf den Ordner hat.

3. Der Schreibvorgang in die SPS​

Dein Skript liest die Datei zwar ein und schreibt sie in ein HMI-Feld (screen.items("myText1").text = text), aber es schreibt den Inhalt noch nicht in die SPS-Variable.

Hier ist eine korrigierte und stabilere Fassung des Skripts:

Javascript:
export async function Schaltfläche_10_OnTapped(item, x, y, modifiers, trigger) {
    
    // 1. Zeiger in der SPS setzen
    HMIRuntime.Tags.SysFct.SetTagValue("TimeProgNo", 1);

    // 2. Datei einlesen (Pfad mit Forward-Slashes!)
    HMIRuntime.FileSystem.ReadFile("C:/bm/miniring/fill/a/suck.txt", "utf8").then(
        function(text) {
            // Erfolg: Text im Trace ausgeben
            HMIRuntime.Trace("Datei erfolgreich gelesen: " + text);

            // Text an HMI-Variable übergeben (die mit der SPS verbunden ist)
            // Ersetze "DeinSPSVariablenName" durch den echten Namen deiner WSTRING-Variable
            let tag = HMIRuntime.Tags("DeinSPSVariablenName");
            tag.Write(text);

            // Optional: Anzeige im Bild aktualisieren
            screen.items("myText1").text = text;
        }
    ).catch(function(errorCode) {
        // Fehlerbehandlung (Wichtig!)
        HMIRuntime.Trace("Fehler beim Lesen der Datei: " + errorCode);
    });
}


Was du prüfen solltest:​

  1. WSTRING-Länge: Ein WSTRING in der SPS hat eine begrenzte Länge (standardmäßig 254 Zeichen, max. 16382). Wenn deine .txt größer ist, wird der String abgeschnitten oder der Schreibvorgang schlägt fehl.
  2. Dateiformat: Achte darauf, dass die .txt wirklich in UTF-8 gespeichert ist, damit Umlaute oder Sonderzeichen keine Probleme machen.
  3. Simulation vs. PC-Station: Wenn du am Engineering-PC simulierst, muss die Datei lokal auf deinem Rechner liegen. Läuft das Projekt auf einem echten Unified PC, muss die Datei dort liegen.
Kleiner Tipp am Rande: Nutze das Tool "RTILaceViewer" (wird mit WinCC Unified installiert), um die HMIRuntime.Trace-Ausgaben live zu sehen. Dort siehst du sofort, ob ein "Access Denied" oder ein "File Not Found" Fehler auftritt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo JSEngineering ,
Das ist der Ansatz den ich auch im Verdacht hatte .
- Ich kann nichts lesen von der Platte .
Das mit dem debugger tool ist auch klasse . Ich mache mich gleich an die Sache und berichte wie es läuft.
WSTRING Länge passt , UTF-8 passt ( ich habe nur Zahlen und - ) , In der Simulation hab ichs nicht geschafft und habe nun reale HW .
Darf ich Fragen welche KI du da nutzt , bei Deep Seek habe ich nicht so gut Tips bekommen

Vielen Dank und Grüsse
 
Hi, das Problem besteht leider weiterhin .
Ist schon heftig wie hilflos man da ist.
Trace Viewer schreibt mir Zahlencodes die ich nicht entschlüsseln kann . Siemens hat da keine Info für mich.
Fehler beim lesen der Datei : 2156935125

5 Zeilen Program weder Daten lesen noch Daten schreiben funktioniert , kein Ansatz wo das Problem liegt .
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das Gefühl ist absolut verständlich – die Fehlermeldungen in WinCC Unified können extrem kryptisch sein. Der Fehlercode 2156935125 ist jedoch ein alter Bekannter im Unified-Umfeld.
Umgerechnet in Hexadezimal bedeutet dieser Code 0x809000D5. Das ist der Standardfehler für "Access Denied" oder "Path not found/not allowed".
Hier ist der Schlachtplan, um das Problem systematisch zu lösen:
1. Das "Sandbox"-Problem (Der Hauptgrund)
WinCC Unified darf aus Sicherheitsgründen nicht auf jeden beliebigen Ordner zugreifen. Wenn dein Skript auf C:\bm\... zugreifen will, blockiert Windows oder die Runtime das sofort.
Die Lösung:
Verschiebe deine Datei testweise in den offiziellen Datenaustausch-Ordner von WinCC Unified. Dieser ist speziell freigeschaltet:
C:\ProgramData\SCADAProjects\scriptdata\
(Falls der Ordner scriptdata nicht existiert, erstelle ihn manuell).
2. Korrektur der Pfad-Syntax
Wie erwähnt, frisst JavaScript einfache Backslashes in Pfaden oft falsch. Nutze im Skript Forward-Slashes /.
Dein Pfad im Skript sollte so aussehen:
"C:/ProgramData/SCADAProjects/scriptdata/suck.txt"
3. Debugging-Script (Minimal-Setup)
Lass uns alles Unnötige (SPS-Variablen etc.) kurz weglassen, um nur den Lese-Vorgang zu prüfen. Kopiere diesen Code 1:1 in deine Schaltfläche:

Javascript:
export async function Schaltfläche_10_OnTapped(item, x, y, modifiers, trigger) {
    const filePath = "C:/ProgramData/SCADAProjects/scriptdata/suck.txt";
    
    HMIRuntime.Trace("Leseversuch startet für: " + filePath);

    try {
        const text = await HMIRuntime.FileSystem.ReadFile(filePath, "utf8");
        HMIRuntime.Trace("ERFOLG! Inhalt: " + text);
        if (screen.FindItem("myText1")) {
            screen.items("myText1").text = text;
        }
    } catch (err) {
        // Hier wird der Fehlercode detailliert ausgegeben
        HMIRuntime.Trace("FEHLER: " + err + " | Code: " + err.number);
    }
}

4. Berechtigungen prüfen
Selbst im richtigen Ordner braucht der WinCC-Dienst Rechte.
Rechtsklick auf den Ordner scriptdata -> Eigenschaften.
Reiter Sicherheit.
Klicke auf Bearbeiten -> Hinzufügen.
Gib Jeder oder Everyone ein (für den Test) und gib Vollzugriff.
Wichtig: Prüfe, ob die Datei suck.txt nicht gerade von einem anderen Programm (z.B. Notepad mit Schreibsperre) geöffnet ist.
Warum Siemens dir kaum hilft:
Die Unified Runtime basiert auf Web-Technologien. Der Zugriff auf das Dateisystem ist dort bewusst "hürdenreich" gestaltet, um zu verhindern, dass eine manipulierte Visu-Seite einfach Festplatten löschen kann.
Checkliste für dich:
Liegt die Datei in C:/ProgramData/SCADAProjects/scriptdata/?
Sind im Pfad im Script nur / (Forward Slashes)?
Hat die Gruppe "Jeder" Vollzugriff auf den Ordner?

Mein Tipp für den nächsten Schritt:
Anstatt die Codes zu entschlüsseln, nutze im Script das Error-Objekt, um die Klartext-Meldung zu erzwingen. JavaScript kann dir manchmal mehr verraten als der nackte Code im Trace Viewer:

Javascript:
} catch (err) {
    // Das gibt oft eine lesbare Nachricht aus, z.B. "Permission denied"
    HMIRuntime.Trace("Fehlermeldung: " + err.message);
    HMIRuntime.Trace("Fehlernummer: " + (err.number >>> 0).toString(16)); // Wandelt direkt in Hex um
}

Die Datei "Simatic.S7.Scripting.hlp"
Es gibt im Installationsverzeichnis von TIA oft Hilfedateien für das Scripting, aber die sind gut versteckt. Suche in deinem TIA-Installationspfad (meist unter C:\Program Files\Siemens\Automation\...) nach Dateien mit der Endung .chm oder .hlp, die "Scripting" oder "Unified" im Namen haben. Dort sind manchmal Tabellen für FileSystem Fehler hinterlegt.
 
Wenn Du mir Dein bisher erstelltes Skript als Textfile, um nicht alles einzutippen und die Datei die Du lesen möchtest ebenfalls als Textfile sendest, teste ich Dein Skript und prüfen warum das Daten nicht in die SPS geschrieben werden. Welche WinCc Unified Version verwendest Du ?
 
Moin ,

@JSEngineering , vielen Dank für die super Unterstützung . Ich komme bis Erfolg im TraceViewer , leider klappt das schreiben auf den screen noch nicht. > screen is not defined . ich habe einen WinCC Tag MyText1 Intern als WSTRING

@schufri : vielen Dank dafür . Das wäre Super

Ich habe folgende Grundlage :
TIA V20 ( CPU 1518F-3 PN ) und WinCCUnfied V20 ( auf Beckhoff IPC ) .

Script bei left mouse button :
****************************************************************************************************

export function Schaltfläche_10_OnTapped(item, x, y, modifiers, trigger) {
HMIRuntime.Tags.SysFct.SetTagValue("TimeProgNo", 1);
// Please note, the format of a file path is device and operating system specific.
// You need to adapt the given path to your environment.
// Example for a Unified Comfort device (Linux OS): /home/user1/data.dat
// Example for a Unified PC-based device (MS Windows OS): C:\Users\Public\data.dat

//export async function Schaltfläche_10_OnTapped(item, x, y, modifiers, trigger) {
//HMIRuntime.Tags.SysFct.SetTagValue("TimeProgNo", 1);
const filePath = "C:/ProgramData/SCADAProjects/scriptdata/bm/miniring/fill/a/suck.txt";

HMIRuntime.Trace("Leseversuch startet für: " + filePath);

try {
const text = HMIRuntime.FileSystem.ReadFile(filePath, "utf8");
HMIRuntime.Trace("ERFOLG! Inhalt: " + text);
if (screen.FindItem("myText1")) {
screen.items("myText1").text = text;
}
} catch (err) {
// Hier wird der Fehlercode detailliert ausgegeben
HMIRuntime.Trace("FEHLER: " + err + " | Code: " + err.number);

}

****************************************************************************************************

Das Textfile Suck.txt im Anhang ist ein typisches File . Grösse und Position der Trennzeichen ändert sich nicht . nur die Zahlen können sich ändern.

Auf der SPS habe ich ein WSTRING[9000] tag als Ziel angelegt und diesen in den HMI tag BM_Text WSTRING verknüpft .
Es sollten 1152 Zeichen sein ( evtl. ist da ein Zeilensprung Zeichen drin ) muss ich dann im SPS Prog ausmaskieren .

viele Grüsse und danke nochmal
 

Anhänge

Zuviel Werbung?
-> Hier kostenlos registrieren
Habe mit Deinem Textfile Stuk.txt auf meinem System einen kurzen Test gemacht.
Das Textfile wurde nur dann gelesen wenn lediglich eine einzige Zeile in dem File enthalten ist.
Siehe Hardcopys im Anhang. Eine Erklärung für das Verhalten habe ich jedoch ebenfalls nicht.
Am besten Du fragst noch bei dem Support nach warum es zu diesen Verhalten kommt.
Ich habe den Text ein eine interne Variable geschrieben.

Soweit ich weiß ist auch die Anzahl der Zeichen die man an eine auf einmal an eine S7-1500 übertragen kann begrenzt. PDU-Länge 960 Byte bei S7-1500 Steuerungen.
D.h. die 9000 Zeichen wirst Du vermutlich nicht auf einmal an die SPS übertragen können.
 

Anhänge

  • Screenshot 2026-01-22 145133.png
    Screenshot 2026-01-22 145133.png
    16,6 KB · Aufrufe: 5
  • Screenshot 2026-01-22 145308.png
    Screenshot 2026-01-22 145308.png
    52,1 KB · Aufrufe: 5
  • Screenshot 2026-01-22 151241.png
    Screenshot 2026-01-22 151241.png
    8,3 KB · Aufrufe: 5
Hi , vielen Dank . Ich hatte das meinen Tests schon erwartet das evtl nur eine Zeile übertragen wird . es ist ja am Ende ein unsichtbares return für eine neue Zeile . das Lesen im UTF8 Format bricht da evtl ab .
 
Zurück
Oben