TIA Array of CHAR auf Visu in Einzelwerte anzeigen

Lipperlandstern

Level-3
Beiträge
6.023
Reaktionspunkte
1.738
Zuviel Werbung?
-> Hier kostenlos registrieren
Guten Morgen SPS-Nerds.

Ich muss jetzt tatsächlich mein erstes großes Projekt mit TIA erstellen. Ich hatte gehofft das ich es bis zur Rente ohne diese Seuche schaffe aber nun gut. Jetzt wird es halt ernst :)

zu meinem "Problem"

Ich bekomme ein Telegramm mit 100 Zeichen die ich in einem optimierten DB als ARRAY of CHAR schreibe. Besteht jetzt die Möglichkeit das ich mir in der Visu nur teile dieses ARRAY anzeigen lassen kann ? Bei meinem ersten Versuch konnte ich entweder nur auf ein CHAR zugreifen oder auf die 100 CHAR.

Und gleich noch eine Frage : Warum kann ich mir ein CHAR-Variale mit der Länge 1 nicht als Zeichenkette anzeigen lassen ?


TIA V17 WINCC Advance
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich würde die Struktur, welche auch in der Visualisierung bzw. in der restlichen Software benötigt wird, sauber in einen DB ablegen.
Dann haben deine Variablen (Strings) auch saubere Namen.

Wäre für mich der sauberste Weg, mit dem man auch zukünftig wenig Kopfschmerzen hat.

Wird mit dem Telegramm in der SPS nicht gearbeitet oder werden da die Infos per Char[x] rausgezogen?
 
Wenn ich das richtig sehe gibt es sogar Bausteine für das kopieren. Die muss ich mir mal anschauen.

In diesem Fall brauche ich aus dem Telegramm tatsächlich nur ein Zeichen auszuwerten. Das ist bei zukünftigen Projekten aber anders.
 
Ich bekomme ein Telegramm mit 100 Zeichen die ich in einem optimierten DB als ARRAY of CHAR schreibe. Besteht jetzt die Möglichkeit das ich mir in der Visu nur teile dieses ARRAY anzeigen lassen kann ? Bei meinem ersten Versuch konnte ich entweder nur auf ein CHAR zugreifen oder auf die 100 CHAR.
Ich habe sowas mal mit einer Überlagerung gelöst.
1688624503390.png
Dann kannst du den String am Panel anzeigen. Ich würde die Daten zusätzlich in / von einem DB kopieren, damit du nicht Bereiche des Instanz-DBs am Panel anzeigen must.

zu Überlagerung:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Für solche Fälle eignet sich z.B. SPLIT / JOIN.
Dann kann das ganze Telegramm auch sauber in die einzelnen Segmente aufgeteilt werden.
Die Überlagerung ist doch auch wieder nur eine Krücke.

Das Telegramm einfach nur zum Senden/Empfangen als Array of Byte/Char behandeln und intern sauber in der jeweilige Struktur ablegen.
Dann hat man von überall im Programm einen sauberen Symbolischen Zugriff.

Nur meine Meinung.
 
Für solche Fälle eignet sich z.B. SPLIT / JOIN.
Dann kann das ganze Telegramm auch sauber in die einzelnen Segmente aufgeteilt werden.
Die Überlagerung ist doch auch wieder nur eine Krücke.
Aber nur bei einer 1500er, nicht bei 1200er.
Außerdem hat er ja schon das Array of Char, er will es ja nur am Panel anzeigen.
 
Warum kann ich mir ein CHAR-Variale mit der Länge 1 nicht als Zeichenkette anzeigen lassen ?
Tja, ich meine, in ProTool ging sowas noch. :cool: Vielleicht steht in irgendeiner Migrier-Anleitung, wie man das in WinCC flex oder TIA realisieren soll?
EDIT: Nein, in ProTool ging das auch nicht direkt als Text/String, sondern nur als Textsymbol mit Symbolliste.

Für TIA fällt mir ein symbolisches E/A-Feld mit der Char-Variable als Prozessvariable und einer Textliste ein. Da muß man allerdings fleißig einmal die ASCII-Tabelle als Textliste eingeben (oder zumindest die Zeichen, die tatsächlich vorkommen können).
Code:
Textliste TL_ASCII
    Wert Text
-------------
Standard ?
      32   (Leerzeichen)
      33 !
      34 "
...
      48 0
      49 1
...
      57 9
...
      65 A
      66 B
      67 C
...
      97 a
      98 b
      99 c
...

EDIT2: man könnte auch bei Wertänderung der Char-Variable deren Wert in einen panel-internen WString umkopieren (mit SetzeVariable)

Harald
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Aber nur bei einer 1500er, nicht bei 1200er.
Außerdem hat er ja schon das Array of Char, er will es ja nur am Panel anzeigen.
Für 1200er habe ich ehrlich gesagt keine Ahnung, hatte ich dafür zu selten im Einsatz.
Ein Array of Char hat man bei Telegrammen doch irgendwie immer, da die Send/Receive Funktionen damit beschickt werden?
Wie so oft, führen viele Wege zum Ziel und ich finde es schöner, so etwas aufzugliedern.

Wenn jetzt das Zeichen mitten im Telegramm liegt und man dann per Überlagerung einen String drauf legt, dann wird's auch wieder ein gebastel.
Da dann einfach die Speicherlängen nicht passen.
 
Wie so oft, führen viele Wege zum Ziel und ich finde es schöner, so etwas aufzugliedern.
Mit dieser Aussage hast du mehrmals recht, viele Wege führen zum Ziel und es ist wirklich schöner sowas aufzugliedern. Ich bin hier davon ausgegangen, dass ein Array of Char vorhanden ist und nur am Panel angezeigt werden soll. Da erscheint mir eine Überlagerung am einfachsten.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Erstmal vielen Dank für die Anregungen.

Split/Join klingt gut. Allerdings habe ich nicht immer Trennzeichen in meinen Telegrammen.

Überlagerung. Hab ich mich bisher noch nicht mit beschäftigt.

Es müsste doch auch Deserialize funktionieren, oder ? Wenn das geht ist das ja eigentlich eine universale Lösung.


Tja, ich meine, in ProTool ging sowas noch. :cool: Vielleicht steht in irgendeiner Migrier-Anleitung, wie man das in WinCC flex oder TIA realisieren soll?
EDIT: Nein, in ProTool ging das auch nicht direkt als Text/String, sondern nur als Textsymbol mit Symbolliste.

Für TIA fällt mir ein symbolisches E/A-Feld mit der Char-Variable als Prozessvariable und einer Textliste ein. Da muß man allerdings fleißig einmal die ASCII-Tabelle als Textliste eingeben (oder zumindest die Zeichen, die tatsächlich vorkommen können).
Code:
Textliste TL_ASCII
    Wert Text
-------------
Standard ?
      32   (Leerzeichen)
      33 !
      34 "
...
      48 0
      49 1
...
      57 9
...
      65 A
      66 B
      67 C
...
      97 a
      98 b
      99 c
...

Harald

Bei WINCC Profession ging das. Da habe ich mir mal die Mühe gemacht und eine längere Zeichenkette so anzeigen lassen. Mich wunderte bei meinem testen nur das das bei Advance nicht geht.
 
Erstmal vielen Dank für die Anregungen.

Split/Join klingt gut. Allerdings habe ich nicht immer Trennzeichen in meinen Telegrammen.

Überlagerung. Hab ich mich bisher noch nicht mit beschäftigt.

Es müsste doch auch Deserialize funktionieren, oder ? Wenn das geht ist das ja eigentlich eine universale Lösung.




Bei WINCC Profession ging das. Da habe ich mir mal die Mühe gemacht und eine längere Zeichenkette so anzeigen lassen. Mich wunderte bei meinem testen nur das das bei Advance nicht geht.
Split/Join funktioniert auch ohne Trennzeichen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich bekomme ein Telegramm mit 100 Zeichen die ich in einem optimierten DB als ARRAY of CHAR schreibe. Besteht jetzt die Möglichkeit das ich mir in der Visu nur teile dieses ARRAY anzeigen lassen kann ?
Nur im HMI projektieren:
* Ein VBS-Skript
Code:
Function Sub_TeilString(ByRef CharArray, ByVal Start, ByVal Length)
'Teil eines CharArrays in String kopieren

Sub_TeilString = Mid(CharArray, Start, Length)

End Function

* HMI-Variablen
DB_HMI_CharArray : Array [0..99] of Char : HMI_Verbindung_1 : DB_HMI.CharArray
Teilstring : WString : <Interne Variable> : Länge: 100
Teilstring_Trigger_1s : Bool : HMI_Verbindung_1 : "Clock_0.5Hz"

* Die Variable DB_HMI_CharArray irgendwie im Bild unterbringen, damit sie aktualisiert wird, z.B. ein auf immer unsichtbar animiertes Ausgabefeld.
* Ein Ausgabefeld für die interne Variable Teilstring.

* Ein Trigger-Ereignis auswählen oder basteln, z.B. einen Button klicken, oder "Wertänderung" einer PLC-Variable (z.B. Taktmerker "Clock_0.5Hz") und die Variable irgendwie im Bild unterbringen (z.B. für die Unsichtbarkeit-Animation des Ausgabefeldes von DB_HMI_CharArray, von 0 bis 1 unsichtbar).
* Das Trigger-Ereignis ruft dann das VBS-Skript auf:
Code:
Sub_TeilString
   Rückgabewert : Teilstring
   CharArray    : DB_misc_CharArray
   Start        : 2
   Length       : 4
Damit werden die Zeichen 2 bis 5 von DB_misc_CharArray (DB_misc_CharArray[1]..[4]) in Teilstring kopiert. Start und Length können auch variabel

Harald
 
Würdest du das wirklich so empfehlen, wenn ein Projekt neu erstellt wird und somit noch alles offen ist?
@PN/DP

Du beschreibst doch eigentlich einen Workaround um ein Problem, welches mit der richtigen Struktur im SPS-Programm so einfach zu umgehen wäre.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du beschreibst doch eigentlich einen Workaround um ein Problem, welches mit der richtigen Struktur im SPS-Programm so einfach zu umgehen wäre.
Was für einen Workaround meinst Du? :unsure:
Für mich wäre ein Workaround, wenn man ohne Not Aufgaben der HMI in die PLC verlagert, nur weil der HMI-Projektant nicht weiß, wie er ein bestimmtes Problem in der HMI löst. Wozu soll eine PLC 100 mal jede Sekunde etwas ausrechnen und Daten hin und her kopieren, wo vielleicht einmal in der Woche jemand kurz drauf schaut. Was hat die PLC davon? Nüscht, nur verpulverte Rechenleistung und Speicherplatz und Energie. Und es werden unnötig PowerTags erzeugt und Kommunikationslast, wo das HMI sich die Teildaten bei Bedarf doch so einfach selbst aus den Rohdaten herausschneiden kann.

Würdest du das wirklich so empfehlen, wenn ein Projekt neu erstellt wird und somit noch alles offen ist?
Wenn noch alles offen ist, würde ich noch gar nicht anfangen. ;)
Im Ernst, ich würde das Problem mit dem Teilstring tatsächlich so lösen wie ich im Beitrag #15 beschrieben habe. Das einzige was daran ungewöhnlich ist (und vielleicht nach unerträglich viel Arbeit klingt? ;) ), daß ein 1s-Trigger selbst erzeugt wird, weil das WinCC Advanced den nicht zur Verfügung stellt, und weil ein Char-Array kein Ereignis "Wertänderung" hat. Alles andere ist normale Projektier-Arbeit, die man sowieso leisten muß.

Harald
 
So definiert jeder seinen Workaround :)
Mein Ansatz ist anscheinend anders, da ich eher die Logik aus der HMI raushalte, soweit vertretbar.

Mich hat es einfach nur interessiert, auch mal andere Herangehensweisen zu sehen/verstehen.
Danke für deine Erklärung.
 
Zurück
Oben