Praxis – LCD Multimeter

Das folgende Beispiel zeigt, wie Messwerte von einem LCD Multimeter über die
serielle Schnitstelle eingelesen werden und anschließend auf die Festplatte abgespeichert werden.

Lösung:
Wir fügen in „Instances“ das I/O Modul „COM Port“ ein und verbinden dies mit dem
Splitter „Register Variable“. Die Settings für das u.g. Multimeter lauten: 9600,8,N,1

Die „Split Using Cutchars“ stellen wir auf SOT und EOT weil der Datenstrom mit ASC(02)
beginnt und mit ASC(03) endet. Weitere Informationen entnehmen Sie bitte dem anliegenden PDF-Dokument.
Das Flag: „Flag_GDM_Log“ dient der Steuerung der Log-Datei.

Dieses Beispiel soll nur als Anregung für eigene Ideen dienen.
In unserem Haus setzen wir preiswerte Multimeter mit serieller Schnitstelle ein um die Leistungsdaten
der Solaranlage zu erfassen.
IP-Symcon speichert sie ab und gibt sie auf einer LED Anzeige (10cm hohe Zeichen) aus.

Bezugsquelle:
Conrad Electronic / Artikel-Nr.: 120700 / ca. € 130,-


<?
/*
*******************************
 IP-SYNCOM Event Scripting
*******************************
*/
// (C) by CSS / MST April 2005
//File: GDM704.ips.php
// Trigger: Variable "IN_GDM"
$inbuf = Trim(GetValueString("IN_GDM"));
// sollen die Daten aud die Festplatte gespeichert werden?
$gdm_log = GetValueBoolean("Flag_GDM_Log");
if($inbuf=="") {
   exit;
}
// nach "BB" suchen > DCV Track > siehe GDM Schnittstellenbeschreibung
if( (substr($inbuf, 0, 2)==  "BB") && ($gdm_log == True)) {
   // 3. Zeichen / Länge 5
   $wert = substr($inbuf, 3, 5);
   echo $wert ;
   $handle=fopen("D:\Daten\Log\GDM.txt", "a");
   fwrite($handle, date("d.m.y").";". date("H:i:s").";".$wert."
");
   fclose($handle);
}
//clear buffer
SetValueString("IN_GDM", "");
?>

PS:
Die im o.g. Skript verwendete Instance–ID muß für Ihre Umgebung angepasst werden. Benutzen Sie die Tastenkombination CTRL + I um InstanceID Selector zu öffnen und wählen Sie die entsprechende Instance aus.

gdm.zip (341 KB)

gdm704.gif

Hallo Steiner

Ich hab das Script mal mit meinen Multimeter (Metex M-3850M) ausprobiert. Irgendwie funzt das ganze nicht. In der Beschreibung meines Multimeters steht, das ein „D“ Befehl vom PC benötigt wird, wie sende ich diesen an das Multimeter und wo muß in den Script die Instanz-ID rein? Für deine Hilfe wäre ich dankbar.

MfG
computerpap

http://www.ipsymcon.de/wiki/index.php/ComPort_SendText

Hallo,
hier gibt es Infos, was beachtet werden muss, damit die Geräte an V24
Ports Daten liefern.

http://home.arcor.de/bernd_kunze/selfprog.htm

LG Manfred

Hallo
Ich versuch jetzt schon 2 Tage das Script zum Laufen zu bringen, aber ich kriegs nicht hin. Wie schon gesagt benötigt mein Messgerät ein „D“-Befehl um Daten senden zu können.
Das habe ich so gelöst:

Comport_SendText (62305, „D“);

Welche Variable muß in die Instanz „RegisterVariable“ geschrieben werden? Ich hab da IN_GDM als Variable reingeschrieben. Wenn ich das Script ausführe, bekomme ich als Kernel-Meldung

ScriptError:.currentscript~Sender Execute~Result
Execute Thread ID: 3744

Was mach ich denn da noch falsch, in der Comport Instanz ist alles richtig eingetragen und der Status ist Open und grün hinterlegt.

Mfg
computerpap

Hallo,

ich denke Du willst Daten empfangen oder?

Ich versuch jetzt schon 2 Tage das Script zum Laufen zu bringen, aber ich kriegs nicht hin. Wie schon gesagt benötigt mein Messgerät ein „D“-Befehl um Daten senden zu können.
Das habe ich so gelöst:

Comport_SendText (62305, „D“);

was soll das bringen. Damit sendet du Daten zum Messgerät und empfängst keine.

Wie schon gesagt benötigt mein Messgerät ein „D“-Befehl um Daten senden zu können.

Da ist Sache von deinem Messgerät und nicht von IPS.

Comport anlegen nach CutChars verbinden und nach Registervariable verbinden.
In CutChars die entsprechenden Befehle vom Messgerät eingeben. z.B. STX-ETX und in Registervariable auswerten. Variable mit String anlegen und sehen was ankommt.

Auswertung ist dann jenachdem(messgerät) wie im angegebenen Link anzupassen.

Hallo

Damit das Messgerät Daten senden kann, braucht es diesen „D“-Befehl. Im Link ist ein Basic-Beispiel, da wird dieser Befehl an das Meßgerät gesendet und dann kann das Meßgerät erst Daten liefern.
Instanzen habe ich angelegt und miteinander verbunden, aber in der Variable „IN_GDM“ kommt nix an.

Gruß
computerpap

Bin grad dran, einen Moment Geduld. :slight_smile:

So, :slight_smile:

Hilfreich wäre es, wenn Du mal das Datenformat posten würdest.

Ich gehe jetzt mal von meinem Messgerät aus, MXD 4660A.

Baud 9600
Zeichen nach ASCII 7 Bit
Parität, keine
Stop Bits-2

Datenrahmen ist 14 bytes, wobei das 14te Byte mit CR abgeschlossen wird.

Eine Übertragung mit D, wie Du schon geschrieben hast, eingeleitet wird.

Comport auf entsprechende Daten einstellen, CutChars mit CR(13) abschliessen. Das ist dann wohl wieder ein Timing, wo Profis ranmüssen :smiley:

Das Thema hatten wir letzte Woche schon mal mit dem Timing.

Ich denke mal HJH kann dir(uns) bestimmt weiterhelfen.

Aber poste mal dein Datenrahmen.

Folgendes steht im Handbuch des Meßgerätes:

Übertragungsgeschwindigkeit: 1200 baud
Übertragubgsformat: 7-bit ASCII
Parität: keine
Stop-Bits: 2

Das Datenformat ist in der angehängten Textdatei ersichtlich

Ich glaube die Übertragungsgeschwindigkeit ist aber laut obigen Link 9600 und nicht wie im Handbuch 1200.

Gruß
computerpap

Datenformat.txt (287 Bytes)

Hallo,

ich habe grade nochmal Rücksprache mit HJH gehalten.

Die Einstellungen im Comport sind wie beschrieben. Zusätzlich ist auszuwählen DTR.

COMPort_SendText(54363, "D");

ID anpassen.

Nach ausführen des Scripts mit Execute stehen die Daten in der Registervariable.

Das auslesen und zuordnen, bleibt dann Dir selbst überlassen.

Sollte dann aber auch kein Problem mehr sein.

Ansonsten frag einfach nach.

Hier auch Dank an Hans-Jörg :slight_smile:

PS: Anpassen an deine Baudrate:

zur Info:

$id = 12345;
COMPort_SendText($id, "Hallo Welt" .chr(13).chr(10)); // CRLF

Hallo
Danke für deine Hilfe, jetzt kommen Daten rein, ENDLICH!!!

Mal sehen ob ich es hinkriege, die Daten zu speichern, aber bei der Hilfe hier im Forum dürfte das kein Problem sein. Danke für eure Geduld.

Gruss
computerpap

Hallo
Alles funzt soweit, ich bin begeistert. Zwei Fragen hätte ich noch,eine zu Cutcharts, was macht dieses Teil eigentlich so richtig, in der Wiki habe ich nichts gefunden und gebraucht wird es bei mir auch nicht, die Daten kommen einwandfrei rüber ? Die zweite Frage wäre, kann man das Script so triggern, dass es nur dann ausgeführt wird, wenn sich der Meßwert ändert?

Gruß computerpap

Hallo,

Zwei Fragen hätte ich noch,eine zu Cutcharts, was macht dieses Teil eigentlich so richtig, in der Wiki habe ich nichts gefunden und gebraucht wird es bei mir auch nicht, die Daten kommen einwandfrei rüber ?

CutChars, bereitet Daten auf. Jenachdem wie Daten vom Sender empfangen werden, kann man damit z.B, Steuerzeichen trennen.

Man ist nicht unbedingt auf CutChars angewiesen.

Die zweite Frage wäre, kann man das Script so triggern, dass es nur dann ausgeführt wird, wenn sich der Meßwert ändert?

Wenn es unkritisch ist, mit OnChange, Sonst mal mit $IPS_Value probieren.

http://www.ipsymcon.de/~hjh/HelpStudio/html/IPS-Manual/webframe.html

Sorry, entweder spinnt mein Opera, aber linken will grad nicht

Hallo Rainer

Mit $IPS_Value hab ich noch nichts gemacht, kannst du das mal etwas näher erklären, was ich da genau machen muß, ich hatte einen Beitrag hier im Forum gelesen, dass du mit Hilfe von $IPS_VALUE eine Lösung zu eines deiner Scripte gefunden hast.

Gruß
computerpap

Hallo computerpap,

die Variable $IPS_VALUE ist, wie alle $IPS_xxx Variablen, eine System-Variable. Sie wird vom System gesetzt (daher der Name) und steht für das Skript sofort zur Verfügung, muss also nicht erst eingelesen werden.

$IPS_VALUE enthält den Wert der Trigger-Variablen zum Zeitpunkt des Triggers.

Nehmen wir an, eine Registervariable namens „Data“ nimmt die Meldungen einer Seriellen Schnittstelle auf. Bei 9600 Baud benötigt ein Byte ca. 1ms. Das bedeutet, dass in 100ms etwa 100 Bytes übermittelt sein können. Wann der Trigger tatsächlich ausgelöst wird, hängt davon ab, wann das Betriebssystem (Windows) wieder einmal ein paar Bytes aus dem Puffer der Schnittstelle in die Registervariable verschiebt und ist daher ein bisschen vom Zufall abhängig.

Während der Abarbeitung des Skripts können weitere Daten eintreffen. Wenn das Skript nach einer Laufzeit von einigen Millisekunden die Registervariable mit GetValueString(…) ausliest, kann ihr Inhalt bereits wieder überschrieben sein. Man erhält also Daten, mit denen man noch gar nicht gerechnet hat, schlimmer noch: die erwarteten Daten sind verloren.

Diesem Datenverlust kann man vorbeugen, indem man die Trigger-Variable (hier „Data“) nicht selbst ausliest, sondern die System-Variable $IPS_VALUE verwendet.

Gruß
HJH

Nochmal ne Frage zu CutChars

Wie muss das Ding verbunden werden?

COM <—> Cutchars <----> Register Variable ?
COM <----> Register Variable <—> Cutchars ?

Hallo Jürgen,

COM —> Cutchars ----> Register Variable

  • Zeichen auf der COM-Schnittstelle empfangen
  • mit Cutchars bearbeiten
  • an Registervariable (Puffer) weitergeben