Einbindung USF 1000E in IPS

Ähm … verstehe ich das Problem jetzt nicht? (falls ich Blödsinn schreib, dann ignoriert mich einfach :wink: )
Das was ihr da einlesen wollt sind doch auch ASCII Daten, oder etwa nicht?
Ich denke die müssen doch erst noch in HEX Daten umgewandelt werden, bevor da irgendwelche Abfragen in IPS gemacht werden können…

Gruß
Jens

@prof
Wie schon gescheireben ist die USF von Oktober 2006 und die FHZ 1300PC von Dezember letzen Jahres.
Ich kann dir leider nicht sagen, ob da was geändert wurde, habe nur beim testen hier gesehen, das da noch jemadn mitsendet und dann mal alle anderen ausgeschaltet, und siehe da, es war die USF.

@HJH
Mit dem Hase im Pfeffer meine ich, das dein Script nur an die ASCII-Folge eine 0 dranhängt, wie es in dem Bild vom debug-Fenster zu sehen ist. Oder, was sicherlich auch möglich ist, ich mache iregendwas falsch.

Wie schon geschrieben habe ich keine Ahnung von php, bedauerlicherweise.

Gruß
Thilo

Du hast sicherlich noch eine Variable in IPS vom Typ Integer angelegt? Dann mußt Du den Wert natürlich da auch noch eintragen. Die wird mit der SetValue Funktion gemacht. Hier nochmal das Script von HJH.

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : Zisterne_1.ips.php
Trigger  : RegisterVariable "FTDIdata" OnUpdate overwrite
Interval :
*/

// benötigte Globale Variablen:
// "FTDIdata" (string) als Registervariable zum Abhören des Datenverkehrs



$z_data = $IPS_VALUE;                     // Daten aus "FTDIdata"
if ((strpos($z_data, "\x81\x0c\x04") == 0) and (strpos($z_data, "\x01\x01\xa0\x01") == 4)) {
  $fuellstand = ord($z_data[13]);        // Füllstand an Position 13 extrahieren
  // ab hier $fuellstand weiter verarbeiten
  SetValue(12345,$fuellstand);  // statt 12345 Deine ID eingeben!!
}
?> 

Gruß

Hallo Attain,

danke für deine späte Hilfe.

Ich habe jetzt noch die Integer-Varible angelegt, in die der Fuellstand geschrieben werden soll.
Dabei kommt ein Fehlermeldung (siehe http://alphacars.de/Bilder/screen.jpg)

Ich denke mal, ich sollte das alles nochmal durchgehen.

Ich habe eine Register Variable, die den FTDI-Verkehr auf die Variable FTDIdate (string) schreibt.
Dann habe ich das Script von HJH, und eine neue Integervariable, in die das Ergebnis des Script geschrieben wird.

Und während ich hier antworte laufen die erste Werte richtig auf…ich kann es nicht fassen.
Die Werte springen etwas, da sicherlich nicht alle Zeichenketten vollständig ankommen, aber man kann die Hand über den Sensor bewegen und er erkennt den Abstand…

Ich bin beeindruckt…
Jetzt fehlt nur noch die Überprüfung, ob der String vollständig und in einer Sendung empfangen wurde…
Die Fehlermeldung kommt bestimmt von oirgendwelchen abgehackten Paketen…

Das ist doch erstmal ein krönender Abschluss des Abends…

Ich danke allen, die hier mitgearbeitet haben!!!

Gruß
Thilo

Hallo Thilo,

bitte zeig uns doch einmal das von Dir verwendete Skript. Dann erfahren wir auch, was da in Zeile 21 steht.

Noch eine Bitte:
Bitte verwende für Screenshots die Funktion „Anhänge verwalten“. Und benutze das Datenformat .png oder .gif, aber nicht .jpg, da die Bilder durch die verlustbehaftete Kompression manchmal unleserlich werden. .jpg sollte ausschließlich für Fotos verwendet werden. Um Dein Skript hier einzubinden verwende bitte die PHP-Tags.

Übrigens: eine Version für unvollständige Datenpakete habe ich auch noch. Folgt später.

Gruß
HJH

Ein bitte: Verwendet in Register Variable die Möglichkeit die Daten in ein Skript umzuleiten - nicht in die Variable! Das wird euch früher oder später viel Ärger ersparen.

paresy

Hallo HJH, hallo Attain, hallo liebe Fornemitglieder.

Hier noch einmal das Script, wie es nun ohne Auswertung der Vollständigkeit der Datensätze bei mir läuft:

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : Zisterne_1.ips.php
Trigger  : RegisterVariable "FTDIdata" OnUpdate overwrite
Interval :
*/

// benötigte Globale Variablen:
// "FTDIdata" (string) als Registervariable zum Abhören des Datenverkehrs



$z_data = $IPS_VALUE;                     // Daten aus "FTDIdata"
if ((strpos($z_data, "\x81\x0c\x04") == 0) and (strpos($z_data, "\x01\x01\xa0\x01") == 4))
 $fuellstand = ord($z_data[13]);        // Füllstand an Position 13 extrahieren

// ab hier $fuellstand weiter verarbeiten
SetValue(38546 /*[Fuellstand1]*/,$fuellstand);  // statt 12345 Deine ID eingeben!!
?>

Wie schon gesagtkommen die Werte normalerweise gut an, ab und zu ist mal eine 0 oder eine 255 dazwischen.
Zeile 21 ist die SetValue-Zeile.

Ansonsten scheinen die Werte den Abstand in cm zu repräsentieren, so dass man nur noch einen Umrechnungsfaktor entsprechend seiner Zisterne hinzufügen muss. (Messung gestern Abend: Wert 171, Abstand 173cm)

Wie schon einmal möchte ich mich bei allen Helfern noch einmal bedanken und würde mich über eine vollständige Version (mit Unterscheidung der Datenlänge) oder sogar die Einbindung in IPS riesig freuen.

Viele Grüße
Thilo

Hallo Thilo,

ich möchte in diesem Zusammenhang nocheinmal auf das „Cuttermodul“ hinweisen. Dieses sammelt die Daten, die Blockweise kommen, ein und gibt den kompletten Datensatz an die Registervariable . Auch gibt es hier schon die Möglichkeit Daten rauszufiltern die nicht relevant sind. Du gibst an, daß an den Stellen 5-9 folgende Daten von der USF gesendet werden: 01 01 A0 01 . Da dieser Bereich sich von den Daten der FHT unterscheidet , wäre es eine Möglichkeit gezielt danach zu suchen. Somit wird das Script auch nicht mehr durch die FHT getriggert und die Rechenlast wird verringert. Einstellungen siehe Bild. Dabei werden die ersten 4 Bytes weggeschnitten, deßwegen muß das Script wiefolgt angepasst werden:

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : Zisterne_1.ips.php
Trigger  : RegisterVariable "FTDIdata" OnUpdate overwrite
Interval :
*/

// benötigte Globale Variablen:
// "FTDIdata" (string) als Registervariable zum Abhören des Datenverkehrs



$z_data = $IPS_VALUE;                     // Daten aus "FTDIdata"
$fuellstand = ord($z_data[9]);        // Füllstand an Position 9 extrahieren

// ab hier $fuellstand weiter verarbeiten
SetValue(38546 /*[Fuellstand1]*/,$fuellstand);  //  Deine ID eingeben!!
?> 

da der ankommende Datenstring nur noch 10 Bytes groß ist. Weiterhin wäre eine Änderung in der Registervariable, wie von paresy beschrieben, sinvoll. Einfach „Benutze Skript“ aktivieren und da das Skript angeben.

Gruß
Attain

PS: Kurzform des Scripts:


<?
SetValue(38546 /*[Fuellstand1]*/,ord($IPS_VALUE{9}));  //  Deine ID eingeben!!
?> 

Hallo Paresy,

das habe ich nicht verstanden. Könntest Du diese „Feature“ etwas näher erklären?

Gruß
HJH

Hallo Attain,

das glaube ich nun gar nicht. Dazu müsste das Cuttermodul prophetische Fähigkeiten haben und in die Zukunft schauen können.

Das Cuttermodul kann niemals wissen, wann ein Datensatz komplett ist. Das kann nur der Programmierer selbst entscheiden.

Da es im fraglichen Datensatz kein konstantes (!!!) Ende-Kriterium gibt, kann das Cuttermodul hier seine Augfgabe nicht erfüllen.

Gruß
HJH

Hallo Thilo,

Dein Skript muss leicht geändert werden. Der Wert darf natürlich nur dann abgespeichert werden, wenn die Bedingung erfüllt ist:

$z_data = $IPS_VALUE;                           // Daten aus "FTDIdata"
if ((strpos($z_data, "\x81\x0c\x04") == 0) and (strpos($z_data, "\x01\x01\xa0\x01") == 4))
{
 $fuellstand = ord($z_data[13]);                // Füllstand an Position 13 extrahieren
 // ab hier $fuellstand weiter verarbeiten
 SetValue(38546 /*[Fuellstand1]*/,$fuellstand); // statt 12345 Deine ID eingeben!!
}

Gruß
HJH

Hallo HJH,

ich bin von einer konstanten Stringlänge ausgegangen. In diesem Fall 14 byte, sodaß ab der Abgefragten Position noch 10 byte kommen „müßten“. Zusätzlich kann man noch einen Timeout angeben, für den Fall das der Datenstring nicht komplett empfangen wird, damit in diesem Fall der nicht komplett empangene Teil verworfen wird.

paresy: ich gehe davon aus das der Timout in ms angegeben wird. Ist das korrekt?

Hallo Paresy,

Zitat:
Zitat von paresy Beitrag anzeigen
Ein bitte: Verwendet in Register Variable die Möglichkeit die Daten in ein Skript umzuleiten - nicht in die Variable!
das habe ich nicht verstanden. Könntest Du diese „Feature“ etwas näher erklären?

Bei dem Empfang der Daten wird das angegebene Script aufgerufen und der Wert in die lokale Variable „$IPS_VALUE“ übergeben.

Gruß
Attain

Hallo HJH,

habe das Script jetzt geändert und werde jetzt mal über einen Zeitraum von 24h die Variable Fuellstand mitschreiben , dann kann man ja die Sprünge sehen und die Genauigkeit abschätzen. Der Sensor liegt auf dem Schreibtisch und misst einen Abstand von ca. 170cm bis zur Decke.
Morgen nachmittag kann ich dann das Diagramm online stellen.

Gruß
Thilo

Hallo Attain,

Du könntest Recht haben. Allerdings weiß ich nicht so recht, wie das Cuttermodul arbeitet. So bleibt unklar, was mit „Sync Zeichen“ gemeint ist, ebenso ob diese Zeichen in der „Eingabelänge“ enthalten sind.

Ich vermute, dass mit „Sync Zeichen“ die Startsequenz gemeint ist (hier: 01 01 0A 01).

Falls das so ist, könnte es tatsächlich funktionieren. Leider kann ich es nicht testen. Wir müssen das wohl Thilo überlassen. Aber der hat sicher ein großes Interesse daran. :slight_smile:

Gruß
HJH

Hallo HJH,

ja das „Sync Zeichen“ ist hier die Startsequenz 01 01 0a 01 und dies ist in dem Ausgabestring enthalten. Getestet habe ich es mit den FHT Daten die mir ja dank Deiner Beschreibung (09 09 0a 01) bekannt sind. Und dann hab ich einfach im Debugfenster geschaut was passiert.

Gruß

Hallo Attain, hallo Thilo,

das sieht ja schon mal sehr gut aus. Dann lautet also die Anweisung für Thilo so:

1.Cutter einrichten

  • Benutze feste Schnitte
  • Eingabelänge: 10
  • Sync Zeichen: 01 01 A0 01
  • Hex ankreuzen
  • Übergeordnete Instanz: FTDI

2.Registervariable einrichten

  • Daten empfangen
  • Benutze Skript <SkriptID> (das bisher verwendete Skript)
  • Übergeordnete Instanz: Cutter

Ich hoffe, ich habe nichts vergessen.

Gruß
HJH

… und das Script benutzen

<?
/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : Zisterne_1.ips.php
Trigger  : RegisterVariable "FTDIdata" OnUpdate overwrite
Interval :
*/

// benötigte Globale Variablen:
// "FTDIdata" (string) als Registervariable zum Abhören des Datenverkehrs



$z_data = $IPS_VALUE;                     // Daten aus "FTDIdata"
$fuellstand = ord($z_data[9]);        // Füllstand an Position 9 extrahieren

// ab hier $fuellstand weiter verarbeiten
SetValue(38546 /*[Fuellstand1]*/,$fuellstand);  //  Deine ID eingeben!!
?> 

da Stringlänge nur noch 10 bytes ist und die „IF“ Bedingungen im Cutter schon abgefangen werden.

Gruß

Hallo Attain,

richtig! Danke. :slight_smile:

Gruß
HJH

Hallo Ihr beiden,

ich habe jetzt mal das neue Script und die Registervarible definiert und siehe da, es funktioniert auch.
Nur irgendwie kommt vor der richtigen Zahl immer noch ein anderer Wert auf die Variable Fuellstand1, die den realen Abstand Sensor - Decke markiert.

Ich habe mal Bilder angehängt, die das zeigen.

Gruß
Thilo

EDIT: Nach dem Neustart von IPS ist der Fehler verschwunden und es kommen nur noch die richtigen Werte.
Wahrscheinlich hat da das alte Script noch mit reingefunkt.
Also alles vorher geschriebene bitte ignorieren, es funktioniert.

Debug.PNG

Cutter debug.PNG

Hallo Thilo,

im linken Bild sieht man, dass da noch „doppeltgemoppelt“ wird.

Der Event mit der ID 52023 ist jetzt natürlich nicht mehr nötig, da die Daten jetzt direkt von der Registervariable dem Skript zugeführt werden (benutze Skript). Die Variable „FTDIdata“ ist nun ebenfalls überflüssig.

Damit sollte es auch nicht mehr zu Mehrfach-Triggerung kommen.

Gruß
HJH