Hallo zusammen,
ich scheitere gerade dabei die Logo! mittels PHP-Skript auszulesen.
Habe bereits das PHP-Skript aus dem Forum
Logo PHP über Netzwerk - Beiträge - Forum - Industry Support - Siemens
getestet, jedoch erhalte ich keine Werte.
Leider kann ich im Siemens Forum, trotz Login, keine Beiträge erstellen, deshalb
versuche ich hier mein Glück.
Ich versuche mit dem Befehl \x55\x13\x13\x00\x00\xAA die Daten abzurufen, evtl.
ist dieser bei dieser Version falsch... musste auch den Port von 10001 auf 8080 ändern.
Hat hier jemand eine Lösung oder ein anderes PHP-Skript?
Evtl. fehlt mir auch nur eine Einstellung in der Logo.
Geräteserie LOGO!8 6ED1052-xxx08 0BA0
Gerätetyp 24CE
FW-Version 1.83.01
<?php
error_reporting(E_ALL);
/* Die IP-Adresse und Port */
$address = "192.168.0.40";
$service_port = "8080";
$an_logo = "\x55\x13\x13\x00\x00\xAA";#liest Logo Daten
/* Einen TCP/IP-Socket erzeugen. */
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false)
{
echo "socket_create() fehlgeschlagen: Grund: " . socket_strerror(socket_last_error()) . "\n";
echo "<br>";
}
else
{
echo " OK, socket create: " . $address.":" .$service_port . "\n";
echo "<br>";
}
$result = socket_connect($socket, $address, $service_port);
if ($result === false)
{
echo "socket_connect() fehlgeschlagen.\nGrund: ($result) " . socket_strerror(socket_last_error($socket)) . "\n";
echo "<br>";
}
else
{
echo " OK, socket connect.\n";
echo "<br>";
}
/* Die Anfrage senden. */
$sent = socket_write($socket, $an_logo, strlen($an_logo));
if ($sent === false)
{
echo "socket_write) fehlgeschlagen.\nGrund: ($result) " . socket_strerror(socket_last_error($socket)) . "\n";
echo "<br>";
exit;
}
else
{
echo " OK, socket write.\n";
echo "<br>";
}
sleep(1);
/* Die Daten empfangen */
$buf="";
if (!defined('MSG_DONTWAIT')) { define('MSG_DONTWAIT', 0x20); }
if (false !== ($bytes = socket_recv($socket, $buf, 500, MSG_DONTWAIT)))
{
echo "OK, $bytes Bytes von socket_recv() empfangen. Schliesse Socket...\n";
echo "<br>";
socket_close($socket);
echo " OK, socket geschlossen.\n";
echo "<br>";
$ausgabe=preg_split('//',$buf,-1,PREG_SPLIT_NO_EMPTY) ;
// Hier gibt es die Möglichkeit die Rohdaten zu sehen
echo "<br>";
echo "Hier die Rohdaten aus der LOGO 0BA7:";
echo "<br>";
for ($i=1;$i<$bytes;$i++)
{
echo $i." = ".ord($ausgabe[$i])." | \n";
}
# LOGO muss als erstes "6" senden als Bestätigung das das angeforderte auch kommt
if (ord($ausgabe[0])!==6)
{
exit("keine Daten EXIT!\n");
echo "<br>";
}
}
else
{
echo "socket_recv() schlug fehl; Grund: " . socket_strerror(socket_last_error($socket)) . "\n";
echo "<br>";
exit;
}
echo "<br>";
echo "<br>";
echo "Hier die Daten aus der LOGO 0BA7 (analoge Merker-Ausgaenge -> Byte 99 + Byte 98):";
echo "<br>";
# Zwei Bytes (Byte 99/Bayte98) werden für die analoge Merker-Ausgaenge gewandelt und in Zustände mit 0 bis 1000 für $AMQ1 und $AMQ16
for ($i=1 ;$i <= 29;++$i)
{
$AMQ[$i]= (( ord($ausgabe[99+$i]) *256) + ord($ausgabe[98+$i]));
}
$AMQ3 =((( ord($ausgabe[99+3] ) *256) + ord($ausgabe[98+3] ))/10); // Aussentemperatur
$AMQ23=((( ord($ausgabe[99+23]) *256) + ord($ausgabe[98+23]))/10); //Max Aussentemperatur heute
$AMQ25=((( ord($ausgabe[99+25]) *256) + ord($ausgabe[98+25]))/10); //Min Aussentemperatur heute
$AMQ27=((( ord($ausgabe[99+27]) *256) + ord($ausgabe[98+27]))/10); //Max Aussentemperatur Jahr 2014
$AMQ29=((( ord($ausgabe[99+29]) *256) + ord($ausgabe[98+29]))/10); //Min Aussentemperatur Jahr 2014
function strToInt($string, $flag = 'v', $position = 0) {
$s = substr($string,$position);
$arr = unpack($flag,$s);
return isset($arr[1]) ? $arr[1] : false;
}
function int2signshort($val){
return $val < 0x8000 ? $val : $val - 0x10000;
}
//Ein Teil des Buffers zum Test
//$buf = "\x0E\x01\xE1\xFF"; //$buf wird schon beim Einlesen der Daten verwendet
//$buf = "\14\1\225\255";
$i99 = (ord($ausgabe[99]));
$i98 = (ord($ausgabe[98]));
$byte99 = sprintf( "%08d", decbin($i99));
echo "<br>";
echo "Byte 99 binaer: " .$byte99;
echo "<br>";
$byte98 = sprintf( "%08d", decbin($i98));
echo "<br>";
echo "Byte 98 binaer: " .$byte98;
echo "<br>";
echo "<br>";
$max = strToInt($AMQ27,'v',0);
$max = int2signshort($max)/10;
$min = strToInt($AMQ29,'v',2);
$min = int2signshort($min)/10;
var_dump($max,$min); //int(27) float(-3.1)
?>
Vielen Dank für eure Hilfe.
Gruß
Florian