LOGO LOGO!8 mit PHP auslesen

fepple

Level-1
Beiträge
5
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich scheitere gerade dabei die Logo! mittels PHP-Skript auszulesen.
Habe bereits das PHP-Skript aus dem Forum


getestet, jedoch erhalte ich da folgende Fehlermeldung:

Warning: socket_connect(): unable to connect [10061]: Es konnte keine Verbindung hergestellt werden, da der Zielcomputer die Verbindung verweigerte. inLOGO.phpon line106
socket_connect() fehlgeschlagen. Grund: () Es konnte keine Verbindung hergestellt werden, da der Zielcomputer die Verbindung verweigerte.
Warning: socket_write(): unable to write to socket [10057]: Eine Anforderung zum Senden oder Empfangen von Daten wurde verhindert, da der Socket nicht verbunden ist und (beim Senden über einen Datagrammsocket mit einem sendto-Aufruf) keine Adresse angegeben wurde. inLOGO.phpon line116
socket_write) fehlgeschlagen. Grund: () Eine Anforderung zum Senden oder Empfangen von Daten wurde verhindert, da der Socket nicht verbunden ist und (beim Senden über einen Datagrammsocket mit einem sendto-Aufruf) keine Adresse angegeben wurde.

Leider kann ich im Siemens Forum, trotz Login, keine Beiträge erstellen, deshalb
versuche ich hier mein Glück.

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

Vielen Dank für eure Hilfe.

Gruß
Florian
 
Das ist mein aktuelles PHP-Skript:

Code:
<?php
error_reporting(E_ALL);
/* Die  IP-Adresse und Port */
$address = "192.168.0.40";
$service_port = "8080"; #Vorgegeben!!

$an_logo = "\x55\x13\x13\x00\x00\xAA";#liest Logo Daten
if (!defined('MSG_DONTWAIT')) { define('MSG_DONTWAIT', 0x20); }

/* 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 (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)

?>
 
Keine Ahnung, ich kenne mich mit PHP nicht aus. Ich habe in den dem Script für gesehen, dass die Portnummer von der 0BA7 eingetragene war.
 
Zurück
Oben