Siemens LOGO!8 mit PHP auslesen

Begonnen von fepple, 21 Oktober 2021, 15:21:17

Vorheriges Thema - Nächstes Thema

fepple

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_INETSOCK_STREAMSOL_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_logostrlen($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$buf500MSG_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=;$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