String Auswertung

Moin,

ich brauche mal Eure Hilfe.
Ich habe folgendes vor weiß aber nicht wie ich das angehen soll. Vielleicht habt ihr ein paar Tips für mich :
Es geht um eine AUswertung des Link-Th ( One-Wire )
Um die Abfrage zu beschleunigen möchte ich die Gesamtauflistung auswerten und nicht jeden Sensor einzeln abfragen.
Ich habe einen String der aus mehrern Wertepaaren besteht. Jedes Werte paar ist durch einen Zeilenumbruch getrennt. Ein Wertepaar besteht aus SensorID und dem Tempwert.
Ich möchte jetzt diesen String in die Wertepaare aufteilen. Dann die Temperaturen und die ID sperat in eine Tabelle schreiben. Eine Zeile Für ID und Temp. Jeweils eine Spalte für ID und Temp.
Dann möchte ich die Tabelle auslesen und Temperatur der passenden ID auf eine Variable schreiben.
Somit bin ich unabhängig davon, in welcher Reihenfolge die Sensoren ausgegeben werden.
Das Auswerten des Strings ist mir klar … aber wie schreibe ich diese „Einzelwerte“ in eine Tabelle und wie lese bzw schreibe ich diese wieder auf eine Variable ?
Hoffe meine Idee ist nachvollziehbar…

Für Eure Hilfe wäre ich dankbar

Gruß
Sascha

Hallo Sascha,

grundsätzlich ist eine Gesamtauflistung auch nur ein Auslesen aller Sensoren nach einander, d.H. es besteht kein Unterschied ob du alle Sensoren auf einmal auswerten willst oder zu verschiedenen Zeiten. Es ist immer das gleiche, Sensoren erst fragen und danach gibt der Sensor dir seine Werte.

Grüße
andrge

Hallo andrge,

ja du hast Recht … aber :

Der Vorteil ist das ich die Sensoren schneller hintereinander abfragen kann Es ist was anderes ob ich alle Sek. einen Sensor abfrage oder alle 2 Sek. alle Sensoren gemeldet bekomme.
Bitte daran denken das ich einen Link-TH nutze ! :smiley:
Somit habe ich auch eine Meldung ob ein Sensor fehlt wenn die Anzahl der Sensoren nicht mehr stimmt.
Frage ich mit dem Link-Th einen Sensor einzeln ab, bekomme ich eine Rückmeldung egal ob er dran ist oder nicht.
Hoffe man kann mir in meinem Kosmos folgen :confused::smiley:

Gruß
Sascha

Den Link-TH kannst Du nicht abfragen, dieser fragt die Sensoren selbstständig ab.

Hallo Rainer,

ich nutze z.Zt. noch kein IPS … möchte die Wago erstmal alleine laufen haben.
Die Wago fragt den Link-TH ab.
Das funktiniert soweit auch … nur würde ich die Stringabfrage bzw. Verareitung gerne verbessern !
Siehe oben !
Gruß
Sascha

Ich möchte diesen STring „zerhacken“
Mit List_Get aus Oscat … hier kann man das Zeilenumbruchzeichen als Separationszeichen nehmen. Diesen entstehenden String weiter aufteilen auch über List_Get mit Komma Seperationszeichen. Dann möchte ich Sensor ID und Tempwert in Tabelle schreiben. Das mache ich dann genaso weiter mit dem nächsten Zeilenumbruch. Werte in die nächste Zeile der Tabelle. usw.
Dann möchte ich mir die Werte aus der Tabelle abholen :

In der ersten Zeile nach Sensornummer suchen und vergleichen und in der zweiten Spalte dann die dazugehörige Temp. auf eine Variable schreiben.

So ist mein Grundgedanke
Nachvollziehbar ? :eek::eek::confused:

Aufzeichnen.JPG

Ok ich habe mal etwas probiert …
die Abfrage und das zerhacken des Strings funktioniert.
Um mal ein bild zu bekommen wie das ganze aussieht siehe Anhang. Sicher kann man das ganze auch in einer Schleife laufen lassen, so dass man nicht alles von Hand eingeben muß. Aber wie ? ( Ist aber erstmal nicht so wichtig, aber für Anregungen bin ich DankBAR :slight_smile: )

Jetzt muß ich nur noch die ID´s der Sensoren im Array raussuchen und den Dazugehörigen Tempwert auf eine Variable schreiben.
Aber wie durchsuche ich ein Array ?

Danke für Anregungen :rolleyes:

Sascha

Hallo,
wenn ich dein Problem, richtig verstanden habe, teste mal folgende Lösung:

unter ID die ID des Sensors eintragen und bei Temperatur erscheint der entsprechende temperaturwert (ich würde gleich in REAL umwandeln)

FUNCTION wert_suchen : REAL
VAR_INPUT
	ID:STRING;
	size:INT; (*arraygröße*)
END_VAR
VAR
	x: INT;
END_VAR
---------------------
FOR x:=1 TO size DO
  IF werte[x,2]=ID
	THEN wert_suchen:=STRING_TO_REAL(werte[x,3]); RETURN;END_IF;
END_FOR;

Gruß,
Rayk

Das schaut doch super aus !!
Das werde ich mal testen … Danke !

Enra, eine Frage :

wofür setzt du den Return Befehl am Ende ? Was bewirkt der ?

Also Funktion ist da … muß das ganze jetzt nur optimieren :
Abfrage erst nach Empfang der Daten. Und Abfrage zusätzlicher ID´s.
Muß das noch zurecht basteln.
Ein Vorteil hat das Ganze jetzt schon :
Jetzt habe ich eine Wertaktualisierung aller Baustein von ~1.5 Sek
Vorher hatte ich alle 1.5 Sek einen Wert !

Vielen Dank für Eure Hilfe !!

Gruß
Sascha

ich habe das Teil s.o. mal in eine Funktion geändert, ist einfacher, das Messergebnis wird als REAL-Wert geliefert
wenn du das Messergebnis als STRING haben möchtest, was mir unsinnig erscheint, musst du statt REAL String im Kopf eintragen und STRING_TO_REAL entfernen,

der RETURN Befehl bewirkt das verlassen des Bausteins, wenn der Wert gefunden wurde, sonst würde das ganze ARRAY (for x:=1 TO size) durchsucht

warum sollen die Messwerte im Sekundentakt abgefragt werden?

Gruß,
Rayk

Hallo Enra,

ja die Umwandling String zu REAL habe ich auch so gemacht gemacht …

Wenn ich jetzt mehre ID´s abfrage wie mache ich das ??
FOR x:=1 TO size DO
IF werte[x,2]=ID

THEN wert_suchen:=STRING_TO_REAL(werte[x,3]); 

END_IF;
IF werte [x,2]=ID2
THEN wert_suchen2:=STRING_TO_REAL(werte[x,3]);
END IF;
END_FOR;
RETURN;

Ist das so richtig ?

Kannst du mir mal die Unterschiede bzw Vorteile zwischen Programm, Funktionsblock und Funktion erklären ?

Also so wie ich es vorher abgerufen haben sich die Sensoren ca. alle 13 Sek abgerufen. Das ist doch etwas langsam wenn man damit eine Heizungsregelung betreibt !
Jetzt habe ich alle 2 Sek alle Werte … das ist doch etwas womit es sich vernünftig regelt ! !

Gruß
Sascha

Hallo,
Temperatur im Sekundentakt messen halte ich für unsinnig, da physikalisch gesehen sich die Temperatur langsam ändert. Ich messe meine Raumtemperaturen alle 4 Minuten.

ich zitiere mal die CoDeSys Hilfe bezüglich Bausteine:
Programm
Ein Programm ist ein Baustein, der bei der Ausführung einen oder mehrere Werte liefert. Programme sind global im gesamten Projekt bekannt. Alle Werte bleiben von einer Ausführung des Programms bis zur nächsten erhalten.

Funktionsbaustein (Funktionsblock)
Ein Funktionsbaustein - auch Funktionsblock genannt - ist ein Baustein der bei der Ausführung einen oder mehrere Werte liefert.

Funktion
Eine Funktion ist ein Baustein, der als Ergebnis der Ausführung genau ein Ergebnis zurückliefert.

soll bedeuten:
ein Programm kann nur einmal aufgerufen werden,
eine Funktion kann mehrmals aufgerufen werden, liefert nur ein Ergebnis und kann sich nichts merken,
ein Funktionsbaustein (Funktionsblock) kann mehrmals aufgerufen werden (Funktionsblock-Instanz) und hat im Gegensatz zur Funktion ein Gedächtnis, er kann sich Werte merken

Ich habe mal einen Vorschlag angehängt wie du die einzelnen ID’s nacheinander suchen kannst.

Gruß,
Rayk

Zwischenablage01.jpg

Hallo Rayk,

Du hast Recht das man die Raumtemperaturen nicht so oft messen muss ! Aber ich nutze sie zur Heizungsregelung. Also Vorlauftemperaturregelung von zwei Heizkreisen. An diesen hängen dann die einzelnen Räume bzw. die Fussbodenheizung.
Auswertung funktioniert jetzt ! Juhuuu ! danke für Eure Hilfe !

Umppfff … jetzt stoße ich an ein neues Problem … was mache ich wenn ein String größer als 255 Zeichen ist ??
Kann man sowas wie ein Schieberegister basteln ??
Man schafft sich mit jeder Optimierung aber auch wieder neue Probleme :smiley:

Hallo,
wie soll das gehen?
Die Werte liegen im ARRAY, dann werden die Messwerte ausgelesen und abgelegt. Wie soll ein Messwert > 255 Zeichen werden, oder verstehe ich was falsch?

Rayk

Ok vielleicht nicht ganz sauber beschrieben :smiley:

Ankommender String vom Link-TH > 255 Zeichen … dieser wird zerhackt und in die Arrays geschoben.
Was mache ich wenn der ankommende String größer 255 Zeichen wird ?

Hi

Wie bereits ENRA sagte, sollte der Sting nicht grösser als 255 sein/kommen.

Der Link/TH liest permanent die Werte vom 1-Wire ein.

Das Problem dürfte jedoch nur beim ersten starten kommen.
Dann hat der TH sich die Infos zwischengepuffert.

Bitte teste das doch mal.

Abhilfe, sollte es so sein wie ich sage --> Auslesen der seriellen Schnittstelle und „verwerfen“ der ersten Daten.

(Du kannst natürlich auch Zeichenweise von der „Seriellen“ einlesen und die Infos parsen.)

Gruß Karl

Irgendwie lesen ich diese Antwort jetzt erst …

(Du kannst natürlich auch Zeichenweise von der „Seriellen“ einlesen und die Infos parsen.)

Kannst du das mal näher erklären was du damit meinst ?

Könnte man quasi den ankommenden String direkt beim Empfangen zerhacken ohne zu warten bis der String komplett empfangen ist ?

Genau! Aus diesem Grund lese ich die Sensoren seriell, also nacheinander ein.
Aber evtl hat jemand eine Lösung gefunden.

Grüße
Cali