Nano-Terminal unter V2.x

Hallo,

wollte gerade unter V2 beta das Nano-Terminal testen.

Bekomme aber beim debuggen folgenden Fehler:

>>
Warning: Skript mit Namen „LCD_Functions2.php“ existiert nicht in C:\IP-Symcon\scripts\LCD_Beispiel2.ips.php on line 49

Warning: Skript #0 exisitert nicht in C:\IP-Symcon\scripts\LCD_Beispiel2.ips.php on line 49

Fatal error: require_once() [function.require]: Failed opening required ‚‘ (include_path=’.;C:\php5\pear’) in C:\IP-Symcon\scripts\LCD_Beispiel2.ips.php on line 52
>>

Die Datei LCD_Functions2.php ist aber im richtigen Verzeichnis.

:frowning: Leider sind meine PHP-Kenntnisse noch recht dürftig …

Was mache ich falsch?

Lukky

:confused:

Ich bekomme die folgende Fehlermeldung:

Fatal error: Maximum execution time of 30 seconds exceeded in [Nano Terminal\Textausgabe] on line 185

LINE 181  {
LINE 182  $s = substr($motion, $i%4, 1);
LINE 183  $lcd->SendLCDText(0, 10, $s); // 1. Zeile, 11. Spalte
LINE 184  IPS_Sleep(100);
LINE 195  }

Wer weis Rat?

Lukky

** Hat sich erledigt!

z.B. Sleep Befehle geben solche Fehlermeldungen aus, wenn die in PHP festgelegte Ablaufzeit des Scriptes überschritten wurde. Poste mal bitte etwas mehr von dem Script und gebe diesen Code in PHP Tags an.

Danke für die Rückantwort.

Skript ist das Beispielskript von HJH`s Nano Terminal Skript V2

Da ich wie gesagt ein PHP Anfänger bin, lerne ich am besten durch die Analyse bestehender Skripte.

Nur das mit der Fehlermeldung bei dem Sleep Befehl kann ich nicht nachvollziehen

Lukky

Sieh mal in deiner php.ini nach was dort bei dir steht.

max_execution_time = 180

Wie Rainer schon geschrieben hat gibt es einen Wert welcher festlegt wie lang ein Script laufen darf bevor es die von Dir genannte Fehlermeldung bringt. Gerne gemachte Fehler sind for, while Schleifen, besonders aber Sleep Befehle, welche das Script anhalten. Dies sollte vermieden werden. Eine Verlängerung dieser Laufzeit über den Standardwert, welcher mit max_execution_time in der php.ini festgelegt werden kann, ist nicht zu empfehlen. Eine saubere Programmierweise ist hier besser, wir helfen gern.

Hallo Thomas, hallo Rainer.

danke für die Hilfe.

Die ersten Schritte sind immer etwas schwer.

Aber so langsam dämmerts :smiley:

Lukky

Hallo Lucky,

ich hatte vergleichbare probleme. Von HJH gab es dazu mal einige Beiträge.
Weis nicht mehr genau was er damals verändert hat, aber wenn du willst kann ich dir mal mein verwedetes Skript schicken.

Grüße
andrge

Hallo andrge,

super wäre ich interessiert.

Mail bitte an andreas.laasch at siegertts.de

Danke

Lukky

Hallo Andreas,

wie wäre es wenn Du es der Allgemeinheit zur Verfügung stellst :smiley:

Hallo Lukky,

ich verwende folgende Skript von HJH unter IPS 2.1

/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : LCD_Functions.ips.php
Trigger  :
Interval :
Author   : HJH
Project  : Utilities
Date     : 03.07.08
*/

//==============================================================================
//============================== Include File ==================================
//================= Dieses Skript ist allein nicht lauffhig! ==================
//==== Die Funktionen mssen von einem Hauptprogramm aus aufgerufen werden =====
//==============================================================================

//******************************************************************************
// Class OneWireLCD
//******************************************************************************
class OneWireLCD
{
 private static $Stndrd = "\x33\x32\x20\x0c\x01\x06";                         // InitString fr Standard 1-zeilig
 private static $KS0073 = "\x33\x32\x24\x00\x20\x0c\x01\x06";                 // InitString fr KS0073   1-zeilig
 private static $ST7036 = "\x33\x32\x21\x1c\x52\x69\x74\x20\x0c\x01\x06";     // InitString fr ST7036   1-zeilig
 private static $sol1   = array(0, 64, 20, 84);                               // Zeilenstartadressen fr Standard
 private static $sol2   = array(0, 32, 64, 96);                               // Zeilenstartadressen fr KS0073
 private static $sol3   = array(0, 16, 32,  0);                               // Zeilenstartadressen fr ST7036
 private static $ctab1  = array(''=>0x01, ''=>0x03, ''=>0x05,
                                ''=>0x02, ''=>0x04, ''=>0x06, ''=>0x07);  // Umlaut-bersetzungstabelle fr Standard
 private static $ctab2  = array(''=>0x7b, ''=>0x7c, ''=>0x7e,
                                ''=>0x5b, ''=>0x5c, ''=>0x5e, ''=>0xbe);  // Umlaut-bersetzungstabelle fr KS0073
 private static $ctab3  = array(''=>0x84, ''=>0x94, ''=>0x81,
                                ''=>0x8e, ''=>0x99, ''=>0x9a, ''=>0x07);  // Umlaut-bersetzungstabelle fr ST7036
 private static $asumlt = "\x0a\x00\x0e\x01\x0f\x11\x0f\x00";                 // Zeichendefinition ''
 private static $acumlt = "\x11\x04\x0a\x11\x1f\x11\x11\x00";                 // Zeichendefinition ''
 private static $osumlt = "\x0a\x00\x0e\x11\x11\x11\x0e\x00";                 // Zeichendefinition ''
 private static $ocumlt = "\x11\x0e\x11\x11\x11\x11\x0e\x00";                 // Zeichendefinition ''
 private static $usumlt = "\x0a\x00\x11\x11\x11\x13\x0d\x00";                 // Zeichendefinition ''
 private static $ucumlt = "\x11\x00\x11\x11\x11\x11\x0e\x00";                 // Zeichendefinition ''
 private static $ssharp = "\x06\x09\x11\x12\x11\x11\x16\x10";                 // Zeichendefinition ''
 private $Controller;
 private $InitString;
 private $InstanceID;
 private $rows;
 private $cols;

 // public functions ===========================================================

 // Constructor ----------------------------------------------------------------
 public function __construct($InstanceID, $ControllerType, $rows, $cols)
 {
  $this->InstanceID = $InstanceID;
  $this->rows = $rows;
  $this->cols = $cols;
  $this->Controller = $ControllerType;
  switch ($this->Controller)
  {
   case "KS0073":
    $this->InitString = self::$KS0073;
    if ($rows > 1)
    {
     $this->InitString[2] = chr(0x2c);                 // InitString-Ergnzung fr 2-zeilige Displays
     $this->InitString[4] = chr(0x28);
    }
    if ($rows == 4) $this->InitString[3] = chr(0x09);  // InitString-Ergnzung fr 4-zeilige Displays
   break;

   case "ST7036":
    $this->InitString = self::$ST7036;
    if ($rows > 1)
    {
     $this->InitString[2] = chr(0x29);                 // InitString-Ergnzung fr 2-zeilige Displays
     $this->InitString[7] = chr(0x28);
    }
    if ($rows == 3) $this->InitString[3] = chr(0x1d);  // InitString-Ergnzung fr 3-zeilige Displays
   break;

   case "Standard":
   default:
    $this->InitString = self::$Stndrd;
    if ($rows > 1) $this->InitString[2] = chr(0x28);   // InitString-Ergnzung fr mehrzeilige Displays
   break;
  }
 }



 // LCD-Initialisierung --------------------------------------------------------
 public function SendLCDInit()
 {
  TMEX_F29_SetStrobe($this->InstanceID, TRUE);
  IPS_Sleep(100);
  $sendbuf = $this->MakeCmd($this->InitString);
  // Init-String ausgeben
  $this->WriteLCDData($sendbuf);
  // deutsche Sonderzeichen definieren
  switch ($this->Controller)
  {
   case "KS0073":
    // keine Definition erforderlich
   break;

   case "ST7036":
    $this->SendLCDCharDef(7, self::$ssharp); //
   break;

   default:
   $this->SendLCDCharDef(1, self::$asumlt);  //
   $this->SendLCDCharDef(2, self::$acumlt);  //
   $this->SendLCDCharDef(3, self::$osumlt);  //
   $this->SendLCDCharDef(4, self::$ocumlt);  //
   $this->SendLCDCharDef(5, self::$usumlt);  //
   $this->SendLCDCharDef(6, self::$ucumlt);  //
   $this->SendLCDCharDef(7, self::$ssharp);  //
  }
 }



 // Display lschen ------------------------------------------------------------
 public function SendLCDClear()
 {
  $sendbuf = $this->ClearDisplay();
  // Befehl ausgeben
  $this->WriteLCDData($sendbuf);
 }



 // Cursor ein-/ausschalten ----------------------------------------------------
 public function SendLCDCursor($cstate)
 {
  $sendbuf = $this->SwitchCursor($cstate);
  // Befehl ausgeben
  $this->WriteLCDData($sendbuf);
 }



 // Cursor positionieren -------------------------------------------------------
 public function SendLCDCpos($row, $col)
 {
  if (($row >= $this->rows) || ($col >= $this->cols)) return;

  $sendbuf = $this->CalcCursorPos($row, $col);
  // Befehl ausgeben
  $this->WriteLCDData($sendbuf);
 }



 // Text an bestimmter Cursor-Position ausgeben --------------------------------
 // Zeilenberlauf wird nicht bercksichtigt!
 public function SendLCDText($row, $col, $text)
 {
  if (($row >= $this->rows) || ($col >= $this->cols)) return;

  $sendbuf = "";
  // Cursor-Position setzen
  $sendbuf .= $this->CalcCursorPos($row, $col);
  // Text-String erzeugen
  $sendbuf .= $this->MakeTxt($text);
  // Text-String ausgeben
  $this->WriteLCDData($sendbuf);
 }



 // Ausgabe auf das gesamte LCD ------------------------------------------------
 public function SendLCDScreen($text)
 {
  $sendbuf = "";
  $currentline = 0;
  $lines = explode("|", $text);

  // Display lschen
  $sendbuf .= $this->ClearDisplay();

  // Cursor ausschalten
  $sendbuf .= $this->SwitchCursor(false);

  foreach($lines as $line)
  {
   // Cursor positionieren
   $sendbuf .= $this->CalcCursorPos($currentline, 0);

   // Text-String erzeugen
   $line = substr($line, 0, $this->cols);
   $sendbuf .=  $this->MakeTxt($line);

   $currentline++;
   if ($currentline >= $this->rows) break;
  }
  // Text-String ausgeben
  $this->WriteLCDData($sendbuf);
 }



 // eigene Zeichen definieren --------------------------------------------------
 public function SendLCDCharDef($num, $data)
 {
  $str = "";
  if ($this->Controller == "ST7036") $str .= chr(0x28);// instruction table 0

  // Speicherposition setzen (0...7)
  $str .= chr((($num & 0x07) << 3) | 0x40);
  $sendbuf = $this->MakeCmd($str);
  // Zeichendaten erzeugen
  $sendbuf .= $this->MakeTxt($data);
  // Command-String ausgeben
  $this->WriteLCDData($sendbuf);
 }



 // Kontrasteinstellung beim ST7036-Controller ---------------------------------
 function SendLCDContrast($ContrastValue)
 {
  // Diese Funktion ist nur bei diesem Controller verfgbar!
  if ($this->Controller != "ST7036") return;

  $contrast = $ContrastValue & 0x3f;
  $byte1 = ($this->rows == 1) ? 0x21 : 0x29; // umschalten auf Befehlstabelle 1
  $byte2 = ($contrast >> 4) | 0x50;
  $byte3 = ($contrast & 0x0f) | 0x70;
  $byte4 = ($this->rows == 1) ? 0x20 : 0x28; // zurckschalten auf Befehlstabelle 0
  $cstrg = chr($byte1). chr($byte2). chr($byte3). chr($byte4);
  $sendbuf = $this->MakeCmd($cstrg);
  // Command-String ausgeben
  $this->WriteLCDData($sendbuf);
 }



 // private functions ==========================================================
 // interne Funktionen
 // nicht fr externe Aufrufe verfgbar ========================================

 // Cursor-Position berechnen --------------------------------------------------
 private function CalcCursorPos($row, $col)
 {
  switch ($this->Controller)  // Auswahl der Zeilenstartadressen
  {
   case "KS0073":
    if ($this->rows > 2)
     $la = self::$sol2;       // Sonderadressen bei 4 Zeilen
    else
     $la = self::$sol1;       // sonst Standardadressen
   break;

   case "ST7036":
    if ($this->rows > 2)      // Sonderadressen bei 3 Zeilen
     $la = self::$sol3;
    else
     $la = self::$sol1;       // sonst Standardadressen
   break;

   default:
    $la = self::$sol1;        // sonst Standardadressen
   break;
  }
  $adr = $la[$row] + $col;
  $cpos  = chr($adr | 0x80);
  $sendbuf = $this->MakeNibbles($cpos, true);
  return $sendbuf;
 }

 // Cursor ein-/ausschalten ----------------------------------------------------
 private function SwitchCursor($cstate)
 {
  $cmd = ($cstate) ? chr(0x0f) : chr(0x0c);
  return $this->MakeNibbles($cmd, true);
 }

 // Display lschen ------------------------------------------------------------
 private function ClearDisplay()
 {
  return $this->MakeNibbles(chr(0x01), true);
 }

 // Command-String erzeugen ----------------------------------------------------
 private function MakeCmd($string)
 {
  return $this->MakeNibbles($string, true);
 }

 // Text-String erzeugen -------------------------------------------------------
 private function MakeTxt($string)
 {
  return $this->MakeNibbles($string, false);
 }

 // Bytes in Nibbles (Halb-Bytes) umwandeln -------------------------------------------------
 // R/S-Bit fr Text setzen, fr Befehle lschen
 private function MakeNibbles($string, $cmd)
 {
  $rs = ($cmd) ? 0 : 0x10;
  $sendbuf = "";
  for ($i=0; $i<strlen($string); $i++)
  {
   $s = ord($string[$i]);
   if (!$cmd && ($s >= 0xc0))
    switch ($this->Controller)
    {
     case "KS0073":
      $s = self::$ctab2[chr($s)];
     break;
     case "ST7036":
      $s = self::$ctab3[chr($s)];
     break;
     default:
      $s = self::$ctab1[chr($s)];
    }
   $sendbuf .= chr(($s >> 4) | $rs);
   $sendbuf .= chr(($s & 0x0f) | $rs);
  }
  return $sendbuf;
 }

 // Ausgabe der Befehls- oder Text-Sequenz -------------------------------------
 private function WriteLCDData($string)
 {
  if ($string != "")
   TMEX_F29_WriteBytesMasked($this->InstanceID, $string, 0x1f);
 }
}
?>


…und das als Testskrip

/*
*******************************
 IP-SYMCON Event Scripting
*******************************
File     : LCD_Test.ips.php
Trigger  : 
Interval : 
*/

$InstanceID = 33836;  hier deine ID des DS2408 eingeben
$ControllerType = "Standard";
$Zeilen = 2;
$Spalten = 16;


$includeFile =  IPS_GetScriptFile("LCD_Functions");
require_once "LCD_Functions.ips.php";

$lcd = new OneWireLCD($InstanceID, $ControllerType, $Zeilen, $Spalten);
//$lcd = new OneWireLCD($id, $ControllerType, $Zeilen, $Spalten);

$lcd->SendLCDInit();

$t1 = "Hallo ";
$t2 = "Andi";
$t3 = "Haussteuerung/";
$t4 = "IP-Symcom";
$text = $t1.$t2."|".$t3.$t4;
Echo " $text";

// | ist der Trenner 1. und 2. Zeile

$lcd->SendLCDScreen($text);

Hallo andrge,

danke für die Skripte.

Genau die gleichen habe ich auch verwendet.

In der org. Version von HJH hatte ich den Fehler, verursacht durch den wait- Befehl.

Danke.

Lukky

Hallo,

ein kleines Problem habe ich aber noch bei der Ausgabe von Temperaturen


<?

$text = "Raumtemp.- Labor ";
$lcd->SendLCDScreen($text);
$text = GetValueFormatted(53086); // Variable auslesen und der Temp Variable zuweisen
$lcd->SendLCDText(1, 5, $text); // und in der 2. Zeile, 6. Spalte ausgeben
?>

ergibt die Anzeige

Raumtemp. - Labor
10,8 -C

wie ersetze ich das - durch das ° Zeichen ?

Sorry, wie gesagt absoluter PHP-Newbie :confused:

Danke

Andreas

Hallo Andreas,

ich konvertiere den eingelesenen Temperaturwerte jeweils in einem kleinem Skript, dass u.A. eine Variable für die Displayausgabe füllt. Trigger ist jeweils der Temperaturwert.

Hier ein Beispiel:


$TempBuegelzimmer = GetValueFloat(50072);       // abholen aktueller Wert
//Hatte der Sensor eine Spannungsunterbrechung? Wenn ja, dann gibt dieser 85°C aus.
if ($TempBuegelzimmer < 80) //Ist der eingelesene Wert größer 80°C = Sensor hatte Spannungsunterbrechung
   {
	$RoundTempBuegelzimmer= round ($TempBuegelzimmer, 1);
	$RoundTempBuegelzimmer_1 = sprintf("%2.1f", $RoundTempBuegelzimmer); // Umrechung auf 2+1 Nachkommastelle

	SetValueString (37040, $RoundTempBuegelzimmer_1. chr(0x00). "C");  //Ausgabe für Display
	SetValueString (23120, $RoundTempBuegelzimmer_1. "°C"); //Ausgabe für Dashboard
	SetValueFloat (25132, $RoundTempBuegelzimmer);  //Ausgabe für Logging
	
	}
else
	{
	SetValueString (23120, "--°C");
	echo "Temperatur größer 80°C = Spannungsunterbrechung"; //Ausgabe
	}


Danach kann ich in meinem Displayskript die Werte direkt verwenden.

Hier ein Beispiel für mein Displayskript:

//Display 4x20

//Displayparameter
//***************************************
$InstanceID = 34349;
$ControllerType = "Standard";
$Zeilen = 4;
$Spalten = 20;

//Displayscript für IPS V2
require_once ".\\LCD_Functions.ips.php" ;
$lcd = new OneWireLCD($InstanceID, $ControllerType, $Zeilen, $Spalten);

//Variablen
//***************************************
$Garagentor = GetValueBoolean (15227);
$Regen = GetValueBoolean (31616);
$Licht_Schuppen = GetValueBoolean (23347);
$Status_Drucker = GetValueBoolean (17035);

$Zeit = GetValueString(46781);

//Variablen Buero
$TempBuero = GetValueString(43134);
$FeuchteBuero = GetValueString(12793  );
$ATemp = GetValueString(24877);

//Variablen Wohnzimmer
$TempWohnzimmer = GetValueString(43134   );
$FeuchteWohnzimmer = GetValueString(50129   );

//Variablen Heizung
$Server = GetValueString(54161);
$TempSpeicher  = GetValueString(30128);
$Temp_Werkstatt  = GetValueString(59324);

//Verbrauch Hausstrom, Leistung Solaranlage
$Leistung= GetValueString(36817);
$Verbrauch  = GetValueString(44889);

//Timer
//***************************************
IPS_SetScriptTimer($IPS_SELF, 15); //Wiederholrate Displaydurchlauf
$Textzaehler = 26463 ;
$Text = GetValueInteger($Textzaehler );

//Textausgabe
//***************************************
//Text 0
   if ($Text == 0)
      {
      $Text++ ; //Textzähler um eins erhöhen
      SetValueInteger($Textzaehler, $Text );
      $text0 = "$Zeit Uhr      |Buero:  $TempBuero     |Luftfeuchte: $FeuchteBuero          |                                ";
      $lcd->SendLCDScreen($text0);
      }

//Text 1
   elseif ($Text == 1)
      {
      $Text++ ; //Textzähler um eins erhöhen
      SetValueInteger($Textzaehler, $Text );
      $text1 = "$Zeit Uhr      |Temperatur Speicher:      | $TempSpeicher           |                  ";
      $lcd->SendLCDScreen($text1);
      return;
      }

//Text 2
   elseif ($Text == 2)
      {
      $Text++ ; //Textzähler um eins erhöhen
      SetValueInteger($Textzaehler, $Text );
      $text2 = "Solaranlage:          |Leistung:  $Leistung       |Hausstrom:         |Verbrauch: $Verbrauch  ";
      $lcd->SendLCDScreen($text2);
      }

//Text 3
   elseif ($Text == 3)
      {
      $Text++ ; //Textzähler um eins erhöhen
      SetValueInteger($Textzaehler, $Text );
      $text3 = "$Zeit Uhr|Aussentemperatur:  | $ATemp                    |                         ";
      $lcd->SendLCDScreen($text3);
      return;
      }

//Text Ende
else
      {
      $text4 = "$Zeit Uhr|Betriebsart Server:  |$Server                     |                         ";
      $lcd->SendLCDScreen($text4);
      //IPS_SetScriptTimer($IPS_SELF, 0); //Wiederholrate Displaydurchlauf
      SetValueInteger($Textzaehler , 0);
      echo "Textausgaben ausgegeben";
      }


Grüße
andrge

P.s: Achja, meine Displays hab ich auf diesen Platinen aufgebaut

Hallo andrge,

danke für die Rückantwort.

Ist auf die schnelle etwas zu viel input für mich. Muß ich mir heute Abend in Ruhe ansehen.

Leider ist deine Platine zu groß für meine Sensorgehäuse.
Die von mir entwickelte Leiderplatte ist nur 53x63mm groß und einseitig mit SMD bestückt. Ein Projekt von mir im Betrieb für unsere Praktikanten, damit die mal was sinnvolles zum Bauen (Layout, ätzen, bohren und bestücken) während ihres Praktikums bekommen.

Die 1-wire Sensoren sind auf 3 Stränge von ca. 100m verteilt (Abzweige bis zu 4 Meter.

Zur Zeit sind 25 sog. Nano-Terminals mit Display 2x16 Zeichen und einem DS2438Z+ für Temp. und Luftfeuchte HIH-4000

Haben am Samstag den neuen Con… Business Catalog bekommen darin ist ein neuer Feuchtesensor von Honeywell in SMD-Bauweise enthalten HIH-4030-001. Wenn ich mich nicht irre, sind die baugleich zum HIH-4000.

Muss ich mir mal ein Sample zum Testen bestellen.

Danke für das Skript

Lukky (Andreas)

Hallo Lukky,

ich hatte auch vor einiger Zeit angefangen ein kleines Display für das Sensorgehäuse zu entwerfen. Ist aus verschiedenen Gründen eingeschlafen.
Wäre vielleicht, jetzt im Zusammenhang mit den Shop, eine gute Idee das Display wieder aufzugreifen. Ich werds mal auf meine Liste nehmen.

Meine Platine im Shop ist gedacht um einfache 2x16 Displays in Betrieb zu nehmen. Hab so ein Display in einem Schaltschrank eingbaut.
Die andere Platine ist für DIP-Displays gedacht (4x20). Dieses habe ich bei mir in einem schönen Alugehäuse mit gefräster Frontplatte am laufen.

Grüße
andrge