TIA FOR Schleife zur Auswertung von Daten

opc_ua_expert

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

:)

ich habe folgende Schleife erstellt (siehe Bild), in der ich die Daten als Schleife auswerten möchte. Die Auswertung an sich ohne Schleife funktioniert gut, allerdings müsste ich dann für jeden Abschnitt des Arrays eine neue Auswertung schreiben. Um das zu vermeiden, möchte ich eine Schleife verwenden, da ich aber 2 verschiedene Werte hochzählen möchte, habe ich 2 For-Schleifen verwendet.
Ich habe 8 Werte die ich aus den Array "DATA_Umwandeln" 20-51 auslesen möchte.
Habt ihr Erfahrungswerte die mir hier weiterhelfen könnten?
screenshot_1.PNG
 
Was ist jetzt dein Problem?

Kannst du uns mal zeigen, wie deine Arrays deklariert sind?
Kannst du mal erklären, wozu der Code ist? Was soll da ganz allgemein gemacht werden?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich empfange Daten von einem Endgerät die ich in ein Array schreibe. In diesem screenshot sind es Temperaturwerte die ich auswerten und Anzeigen möchte.

Die Empfangenen Zahlen sind in HEX und in vierer Blöcken
Beispiel:
010900DD00EB00E700F241EF41EF41EF
0109 wird von HEX in REAL geschrieben und durch zehn geteilt.

Im einzelnen funktioniert die Auswertung, leider nicht in der Schleife.

Da ich nicht für alle Blöcke eine separate Abfrage schreiben möchte, war es meine Absicht dies mit einer Schleife zu lösen.
 
Bist du sicher, dass du wirklich hexadezimal codierte Werte in ASCII-Zeichen erhältst, oder beobachtest du die empfangenen Zeichen nur hexadezimal?
Im einzelnen funktioniert die Auswertung, leider nicht in der Schleife.
Wenn das wirklich korrekt funktioniert, dann wird es wohl so sein.


Beantworte bitte meine Frage:
Kannst du uns mal zeigen, wie deine Arrays deklariert sind?
 
Ich empfange Daten von einem Endgerät die ich in ein Array schreibe. In diesem screenshot sind es Temperaturwerte die ich auswerten und Anzeigen möchte.

Die Empfangenen Zahlen sind in HEX und in vierer Blöcken
Beispiel:
010900DD00EB00E700F241EF41EF41EF
0109 wird von HEX in REAL geschrieben und durch zehn geteilt.

Im einzelnen funktioniert die Auswertung, leider nicht in der Schleife.

Da ich nicht für alle Blöcke eine separate Abfrage schreiben möchte, war es meine Absicht dies mit einer Schleife zu lösen.
Welche Blöcke? Für die verschiedenen Geräte?

Du kannst auch einfach separate Schleifen für die verschiedenen Blöcke machen, oder alles ineinander verschachteln oder oder oder
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hilfreich wäre, wie PN/DP geschrieben hat, wie die Daten deklariert sind hier anzugeben bzw. wie ist denn #Data_umwandeln aufgebaut?
Außerdem hast Du noch ein Zahlendreher? 4E1F würde 19999 entsprechen und nicht wie unten 16879.
HEX: 0109 00DD 00EB 00E7 00F2 41EF 41EF 41EF
DEZ: 0265 0221 0235 0231 0242 16879 16879 16879
Meines Erachtens überschreibst Du dein Array #ZoneGrad mit dem letzten Block. Die Schleife mit dem index b ist meines Erachtens unnötig.
 
Zuletzt bearbeitet:
hier meine deklarierung:

Screenshot2.PNG

Dies ist der Code um einen Temperaturwert auszuwerten.
Dort brauche ich in Pchars eine Schleife die in 4er schritten nach oben zählt (8mal) ab Array [20], da die Werte in den Arrays [20] bis [52] stehen.
zB. stehen hier in DATA_Umwandeln [20] - [23] ( 0 1 0 5 ), diese Zahlen möchte ich in Zone_HEX als HEX Zahlen schreiben. Danach wandele ich diesen Wert in DEZ (261) anschließend zur einer REAL Zahl (261) und teile sie durch zehn (26.1) um die richtige Kommastellung zu bekommen.


Screenshot3.PNG


Screenshot4.PNG
 
Meines Erachtens überschreibst Du dein Array #ZoneGrad mit dem letzten Block. Die Schleife mit dem index b ist meines Erachtens unnötig.
Meines Erachtens ist vieles in dem Code-Auszug unnötig. Also, eigentlich alles, außer den Zeilen 4-17.

Der Rest ist entweder eine unnötige Zuweisung (Initialisieren von a und b, die danach in der Schleife sofort mit den gleichen Werten initialisiert werden) oder eine rekursive Zuweisung (ab Zeile 20 werden die Variablen mit sich selbst überschrieben).
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich würde mir den Datenstrom nur einmal insgesamt holen und mir den dann so zurecht schneiden wie er benötigt wird, als da ein riesiges Schleifenumrunden draus zu machen.

Du bist vielleicht sogar jetzt schon länger mit dem Schleifen beschäftigt, als es dauern würde das einzeln, achtmal abzubilden für die einzelnen Datenbestandteile
 
Ich würde mir den Datenstrom nur einmal insgesamt holen und mir den dann so zurecht schneiden wie er benötigt wird, als da ein riesiges Schleifenumrunden draus zu machen.

Du bist vielleicht sogar jetzt schon länger mit dem Schleifen beschäftigt, als es dauern würde das einzeln, achtmal abzubilden für die einzelnen Datenbestandteile
die Temperaturen sollen aber immer aktuell angzeigt werden bro*innenen
 
Ich glaub, die Scheife ist so nicht sinnvoll.

Wenn ich das Recht verstehe, willst du ab Position 20 je 4 Hex als Char rausnehmen, in Real / 10.0 wandeln und dann in Zone_Grad 0-7 speichern.

Dann nimm eine Schleife mit b von 0-7 und zähle PChars entsprechend hoch mit
mypChars := 20 + (4*b)
Die dort rauskopierten 4 Zeichen wandelst du wie gehabt und speicherst sie in Zone_Grad

Das kannst du dann beliebig skalieren. Aber Achtung, wird der Schleifen-Count zu groß dann steigt deine Zykluszeit an. Wenn das der Fall sein sollte, dann aufteilen in mehrere Parts. 256 sollte aber noch gehen, je nach SPS.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
In der Realität sind es aber 256
Infos die keiner von uns hat.

Es gilt immer noch:
Meines Erachtens ist vieles in dem Code-Auszug unnötig. Also, eigentlich alles, außer den Zeilen 4-17.

Der Rest ist entweder eine unnötige Zuweisung (Initialisieren von a und b, die danach in der Schleife sofort mit den gleichen Werten initialisiert werden) oder eine rekursive Zuweisung (ab Zeile 20 werden die Variablen mit sich selbst überschrieben).

Da sind einfach viele unnötige Zuweisungen drin (meiner Meinung nach):
Screenshot 2024-07-22 140854.png

Warum du diese Zuweisungen hast, darfst du uns gerne schildern.. #b gibt dir ja schon vor in welchen Zeiger der Wert geschrieben wird..
 
Code:
FOR i:= 1 TO AnzahlZonen DO
    #Startbereich:= 20 + ((i-1)*4);

    Chars_TO_Strg(  Chars   := #DATA_umwandeln,
                    pChars  := #Startbereich,
                    Cnt     := 4,
                    Strg => #Zone_Hex[#i]);
  
    // === hier  dann noch umwandlung in  #Zone_Grad[#i]);
END_FOR

Es reicht eine Schleife
 
Infos die keiner von uns hat.

Es gilt immer noch:


Da sind einfach viele unnötige Zuweisungen drin (meiner Meinung nach):
Anhang anzeigen 79982

Warum du diese Zuweisungen hast, darfst du uns gerne schildern.. #b gibt dir ja schon vor in welchen Zeiger der Wert geschrieben wird..
Um sich die Werte anzusehen, hat er doch geschrieben.
 
Um sich die Werte anzusehen, hat er doch geschrieben.
Innerhalb einer Schleife kann man sich so etwas allerdings sparen. *)
Innerhalb der inneren von zwei ineinander geschachtelten Schleifen erst recht.
Nicht nur, dass niemand so schnell gucken/beobachten kann.
Die BildschirmAnzeige wird sooo schnell gar nicht aktualisiert.

*) Denkbar wäre es, innerhalb der Schleife eine CASE-Selektion zu spendieren, so dass man den Zustand bei einem bestimmten Wert der SchleifenVariablen anzeigen lassen kann.
 
Innerhalb einer Schleife kann man sich so etwas allerdings sparen. *)
Innerhalb der inneren von zwei ineinander geschachtelten Schleifen erst recht.
Nicht nur, dass niemand so schnell gucken/beobachten kann.
Die BildschirmAnzeige wird sooo schnell gar nicht aktualisiert.

*) Denkbar wäre es, innerhalb der Schleife eine CASE-Selektion zu spendieren, so dass man den Zustand bei einem bestimmten Wert der SchleifenVariablen anzeigen lassen kann.
Dier letzten Werte schein man ja zu sehen, immerhin.
 
Zurück
Oben