serial port über Variablen ansteuern

Hallo liebe IP-Symcon-User,
ich steuere schon seit Jahren einen Wechselrichter über den Com-Port an. Ein script sendet eine Folge von Befehlen zur Sollwertvorgabe, gemäß Protokoll des Herstellers. Ein typische Befehl sieht folgendermaßen aus:

COMPort_SendText($comport_ID, "\xC4");	//an COMPort 0xC4 senden \x

Bislang hatte ich den entsprechenden Sollwert direkt in verschieden an sonsten gleiche Scripte direkt eingegeben.
Jetzt möchte ich aber nur noch ein Scrpit verwenden, wo der entsprechende Sollwert eingelesen und dann variabel an die Stelle plaziert wird. Prinzipiell soll das dann folgendermaßen aussehen:

$comport_ID=17242 /*[Serial Port]*/ ; //ID des Comports
$neg_hex=256;
$I_S_B=0;
$I_S_hex=`00`;
$I_S_vorz=`00`;
$I_S_plus=`00`;
$I_S_minus=`FF`;
$I_S=-100;   //GetValueInteger(21577 /*[Steuerung\Sontime\I_Sontime_soll]*/);
if ($I_S>=0)
	{
	$I_S_vorz=$I_S_plus;
	$I_S_B=$I_S;
	//$I_S_vorz=sprintf("%'02X
", $I_S_plus);
	}
elseif ($I_S<0)
	{
	$I_S_vorz=$I_S_minus;
	$I_S_B=$I_S+$neg_hex;
	//$I_S_vorz=sprintf("%'02X
", $I_S_minus);
	}
$I_S_hex=sprintf("%02s", $I_S_B);
print($I_S_hex);


IPS_Sleep(5);
COMPort_SendText($comport_ID, "\x00");	//an COMPort 0xcc senden \x
IPS_Sleep(5);
//Datenpuffer loeschen
COMPort_SendText($comport_ID, "\x0C");	//an COMPort 0xcc senden \x
IPS_Sleep(5);
// Pointer resetten
COMPort_SendText($comport_ID, "\xFA");	//an COMPort 0xcc senden \x
IPS_Sleep(5);
// Sollwert senden
COMPort_SendText($comport_ID, "\x08");	//an COMPort 0xcc senden \x
IPS_Sleep(5);
COMPort_SendText($comport_ID, "\x11");	//an COMPort 0xcc senden \x
IPS_Sleep(5);
// Adresse senden
COMPort_SendText($comport_ID, "\xC4");	//an COMPort 0xcc senden \x
IPS_Sleep(5);
COMPort_SendText($comport_ID, "\x60");	//an COMPort 0xcc senden \x
IPS_Sleep(5);
//Batteriestrom Sollwert
//COMPort_SendText($comport_ID, "\x$I_S_minus");	//an COMPort 0xcc senden \x
//COMPort_SendText($comport_ID, "\x$I_S_vorz");	//an COMPort 0xcc senden \x
COMPort_SendText($comport_ID, "\xFF");	//an COMPort 0xcc senden \x
IPS_Sleep(5);
//COMPort_SendText($comport_ID, "\x9C");	//an COMPort 0xcc senden \x
COMPort_SendText($comport_ID, "\x$I_S_hex");	//an COMPort 0xcc senden \x  Variable in Funktion !!!!

Leider ist es mir bislang nicht gelungen die Variable so zu formatieren, dass sie korrekt gesendet wird.
Im Debug der Schnittstelle stehen an der Stelle auch vier 2-Stellige Blöcke anstatt ein 2stelliger Block so wie es auch sein sollte. Es scheint sich vielleicht um ein Datentypproblem zu handeln.
Hat jemand eine Idee?

Vielen Dank und viele Grüße

hololoy

Hallo hololoy,

kannst du den Code bitte in PHP Tags setzen, dann kann man ihn wesentlich besser lesen.

Grüße,
Kai

Man kann das Problem vielleicht auch besser fassen:
zwei comport-Befehle sollen im Prinzip gleich funktionieren, den gleichen Binärcode zum Empfäger senden:


COMPort_SendText($comport_ID, "\x9C");    //an COMPort 0x9C senden
COMPort_SendText($comport_ID, "\x$I_S_hex");    //an COMPort 0x9C senden  Variable in Funktion !!!!

In der zweiten Zeile entspricht das Ergebnis in der vorherigen Berechnung ebenfalls dem Wert 9C, was auch über den echo Befehl im Ausgabefenster so dargestellt wird.
Beim debug Fesnster steht aber folgendes(siehe unten):

Der Fehler ist dort zu erkennen, wo die vier Blöcke in einer Zeile stehen. Wenn man die entsprechenden Zeichen direkt in die
Funktion schreibt, steht dort nur ein Zweierblock, wie bei den anderen TRANSMIT Zeilen.

Ich hoffe, dass das Problem jetzt klarer erkennbar ist.

Viele Grüße

hololoy

Debug_serial.jpg

Wenn du das wirklich so gemacht hast schickt er dir ja nicht den Inhalt der Variablen $I_S_hex sondern er schickt \x$I_S_hex als Zeichenkette.
Was passiert denn wenn du
COMPort_SendText($comport_ID, „\x“ . $I_S_hex);
da rein schreibst? Der . ist glaub ich der concat Befehl in PHP ohne da jetzt nachzuschauen.

Sent from my SM-G935F using Tapatalk

Hallo teichhei,
hat leider nicht geklappt, es werden im Debug Fenster drei Dopppelblöcke angezeigt.
Ich habe aber noch eine weitere Frage: kann man mit einer if oder case Abfrage prüfen, ob eine Zahl in einem Interval liegt oder muss man 2 Abfragen verschachteln?

Vielen Dank und viele Grüße

hololoy

Hallo,
die letzte Frage hat sich erledigt:

if (($I_S_B<=45) && ($I_S_B>35))

Es müsste so klappen, ich hatte beim ersten Test die äußeren Klammern vergessen.

Viele Grüße

Udo

Hi,

Müssen ja drei Blöcke sein, jeder Buchstabe einer oder?


x
Wert von Variable

Oder hab ich da was falsch verstanden?
Willst du einfach das Zeichen 9C schicken? Das wäre dann nur ein block.

Sent from my SM-G935F using Tapatalk

Hallo teichhei,

ich spreche den Ser-Port wie folgt an um einen String an einen IR Lesekopf zu senden und damit Daten abzufragen.
Das funktioniert, vielleicht hilft es Dir weiter.

SPRT_SendText(43536 /*[Ser Port eHz IR Lesekopf 300,7,1,E   4RI    USB 1]*/, chr(0x2f).chr(0x3f).chr(0x21).chr(0x0d).chr(0x0a)); // ersten String an IR schnittstelle senden

Mir nicht, meins geht ja.
Aber das ist eventuell der Knackpunkt für Hololoy, chr($variable). Dann wird nur ein ASCII Zeichen gesendet.

Sent from my SM-G935F using Tapatalk

Hallo IPS-User,
ich habe den letzten Vorschlag gerade getestet und es hat so erstmal funktioniert. Ich muss das jetzt nochmal komplett testen, aber ich glaube, dass es klappt.

Vielen Dank und viele Grüße

Hololoy