Ich habe heute nach einer Funktion gesucht, um die „dynamischen Texte“ bei LCN GT-Displaytastern setzen zu können. Da ich keine finden konnte, habe ich selbst eine geschrieben.
Genauer gesagt sind es mittlerweile zwei Funktionen. Eine, die den „korrekten“ Weg über den Befehl LCN_SendCommand und die Modulinstanz geht (SetGTTextLineI) und eine, bei der man direkt und dreckig über den CSCK_SendText der Client Socket geht (SetGTTextLineS).
Warum gibt es zwei unterschiedliche?
Eigentlich sollte man vorsichtshalber die „saubere“ Version einsetzen, da diese Probleme mit dem Befehlslimit der PCHK umgeht.
Allerdings ist die „dirty“ Version leider vom Effekt her schöner. Sendet man die Daten direkt über die Socket, erscheint der Text mehr „am Stück“, ansonsten setzt er sich leider etwas sehr stückelig zusammen.
Muss man überlegen, was einem wichtiger ist.
$socket = die ID der Client Socket für LCN
$seg = das Segment in dem das Modul hängt
$mod = die ID-Nummer des Moduls im Bus
$line = die Zeile (1…4)
$text = ein bis zu 58 Zeichen langer Text
function SetGTTextLineI($instance, $line, $text)
{
$text = utf8_encode(substr($text, 0, 58));
for($part = 0; $part < ceil(strlen($text) / 12); $part++)
{
if(!@LCN_SendCommand($instance, 'GT',
'DT' .
$line .
($part + 1) .
substr($text, $part * 12, 12) .
"
")) return;
}
}
function SetGTTextLineS($socket, $seg, $mod, $line, $text)
{
$text = utf8_encode(substr($text, 0, 58));
$data = '';
for($part = 0; $part < ceil(strlen($text) / 12); $part++)
{
$data .=
'>M' .
str_pad($seg, 3, '0', STR_PAD_LEFT) .
str_pad($mod, 3, '0', STR_PAD_LEFT) .
'.' .
'GTDT' .
$line .
($part + 1) .
substr($text, $part * 12, 12) .
"
";
}
CSCK_SendText($socket, $data);
}