PHP + Siemens PLC

Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

ich habe in meinem AJAX-Script noch ne sleep()-function entdeckt...
Ich habe diese entfernt und nun geht´s richtig schnell!

Sogar mit S7 open() und close() je Datenabruf komme ich auf 50ms runter... (bei einem DatenWort lesen)

Nun wollte ich trotzdem die Idee von Thomas realisieren und die Verbindung offen lassen und später per Maus-Klick zu schließen...

Ich will dem PHP-Script einen Parameter übergeben und mit SWITCH zu OPEN(), READ() oder CLOSE() springen...

Das Problem ist, dass das Script ja zuerste das Objekt S7PLC erzeugt und wenn ich es später wieder aufrufen möchte um zu lesen oder die Verbindung zu schließen dann weiß das Script nicht mehr zu welchem Socket es gehört.. oder os ähnlich?!?!

Warning: socket_write() expects parameter 1 to be resource, null given in C:\xampp\xampp\htdocs\s7plc\website\s7plc\s7plc.php on line 266

Parameter1 ist : $this->mSocket

Der verliert die Socket-Einstellungen bzw. weiß er nicht mehr welcher socket offen ist, oder?
Wie kann ich denn das Objekt speichern?

Gruß Mike
 
hey...

Hi Leute,

ich wollte dieses Thema auffrischen denn ich bin dabei das Script von Thomas zu testen, bekomme aber nix hin.
Ich bekomme entweder garkeinen Wert oder mein index.php script läuft erst garnicht bis zum Ende. (Aber ohne Fehlermeldung vom Firefox)!

Ich bin kompletter php Neuling muss ich aber vorweg sagen.

Die letzte Version von Thomas's Script liegt im web ordner, eine index.php habe ich wie folgt erstellt:

PHP:
<?
require ('html.inc');
require ('s7plc.php');
//require ('ips7lnk_php_test.php');


  BeginHTML ();
  
  echo "</div>";
  echo "<p>";
  echo "Test";                            // eigentliche Ausgabe
  echo "</p>";
  echo "</div>";
  
  
      $plc = new S7PLC("S7300", "192.168.178.200", 0, 2, "TestSPS");
        Open ();
        
  // Daten lesen 
    $db = 1;
    $plcdata = $plc->ReadBytes("DB" , $db, 0, 2 ); 
      Close ();
  
  echo "</div>";
  echo "<p>";
  echo "Daten:".$plcdata[0];                            // eigentliche Ausgabe
  echo "</p>";
  echo "</div>";
 
  EndHTML ();
?>
Meine CPU ist eine frisch-geöffnete CPU315-2 PN/DP FW V1.1, ich habe nichts ausser einem Ethernet Netzwerk Projektiert und die IP eingestellt. Mit der Siemens Software klappt die Kommunikation auf die IP Stamm.200,
mit dem php script bekomme ich leider noch nix zurück.

Lediglich im Baustein FC1 wird ein Zählerwert in den DB1 als Word an der ersten Stelle geschrieben. Er zählt schnell aufwärts, sodass ich versch. Werte an immer der selben Stelle auslesen kann, wenn es denn irgendwann funktioniert was ich mache ^^

Im grossen ganzen weiß ich nicht mal ob ich die "ansteuerung" des php scripts richtig mache. Ich teste seit 3 Nachtmittagen verschiedenste Dinge, aber ich komme nicht weiter. :confused:

Hat jemand Tips für mich was ich unternehmen könnte um wenigstens heraus zu finden WO mein Fehler liegt?

Mit bestem Dank im voraus,
Sascha:)
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei dir fehlen so ein paar Dinge, z.B. wird die Verbindung zur SPS garnicht aufgebaut.

Ich habe mal ein kleines Beispiel inklusive HTML-Ausgabe geschrieben.
Es wird versucht 5 Integer-Werte aus DB100 und 5 Real-Werte aus DB110 zu lesen. Die Werte werden dann in Tabellenform ausgegeben.

Um das zu testen müsstest du also diese DBs in deiner SPS anlegen, oder die Adressen anpassen.

PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
	<head>
	<title>s7plc.php Testseite</title>
	<style type="text/css">

body {
	background-color:#EFEFEF;
	font-family: "Trebuchet MS",sans-serif;
}

#main {
	width:90%;
	border: #000000 1px solid;
	margin: 0 auto;
	background-color:#FEFEFE;
}
	
h1 {
	size:30px;
	vertical-align:middle;
	text-align:left;
	margin: 10px 20px 0 20px;
	font-family: Impact, Arial, Helvetica, sans-serif;
}

table.data {
	table-layout:fixed;
	width:60%;
	font-size: 12px;
	text-align: center;
	border:1px dotted #CCCCCC;
	border-collapse:collapse;
          margin-left: auto;
         margin-right: auto;
}

table.data tr {
	font-size: 12px;
	border-right:1px dotted #CCCCCC;
	border-top:1px dotted #CCCCCC;
	background-color:#F6F6F6;
	padding:2px 0;
}

table.data th {
	font-size: 12px;
	border-right:1px dotted #CCCCCC;
	border-top:1px dotted #CCCCCC;
	background-color:#A6A6A6;
	padding:2px 0;
}
</style>
	</head>
	<body>
	<div id="main">
	<h1>s7plc.php Testseite</h1>	
<?php
include ("s7plc.php");

$PLC_IP = "192.168.1.10";   // IP-Adresse der SPS
$Db_num_ints = 100;         // Datenbausteinnummer eines DBs mit Integer-Werten
$Anz_ints = 5;              // Anzahl der Integes-Werte
$Db_num_reals = 110;        // Datenbausteinnummer eines DBs mit Real-Werten
$Anz_reals = 5;             // Anzahl der Real-Werten

$plc = new S7PLC("S7300",  $PLC_IP, 0, 2, "TestPLC");

try {
	if ($plc->Open() == 0) {
		echo "<p>Verbindung zur SPS (IP:". $PLC_IP . ") wurde erfolgreich hergestellt!</p>";
		
		$plcdata = $plc->ReadBytes("DB" , $Db_num_ints, 0, $Anz_ints * 2 );
		if ($plcdata != null) {
			echo "<table class=\"data\">\n";
			echo "<tr><th>Adresse</th><th>Datentyp</th><th>Wert</th></tr>";
			for ($i = 0; $i < strlen($plcdata); $i += 2) {
				$iVal = $plc->getS16At($plcdata, $i);
				echo "<tr><td>DB".$Db_num_ints.".DBW".$i."</td><td>INT</td><td>" . $iVal . "</td></tr>\n";
			}
			echo "</table><br />";
		} else {
			echo "<p><b>Fehler beim Lesen der Daten aus Datenbaustein DB". $Db_num_ints ."</b></p>";
		}
		
		$plcdata = $plc->ReadBytes("DB" , $Db_num_reals, 0, $Anz_reals * 4 );
		if ($plcdata != null) {
			echo "<table class=\"data\">\n";
			echo "<tr><th>Adresse</th><th>Datentyp</th><th>Wert</th></tr>";
			for ($i = 0; $i < strlen($plcdata); $i += 4) {
				$rVal = $plc->getFloatAt($plcdata, $i);
				echo "<tr><td>DB".$Db_num_reals.".DBD".$i."</td><td>REAL</td><td>"; 
				printf ("%.2f", (float)$rVal);
				echo "</td></tr>\n";
			}
			echo "</table><br />";
		} else {
			echo "<p><b>Fehler beim Lesen der Daten aus Datenbaustein DB". $Db_num_reals ."</b></p>";
		}
	} else {
		echo "<p>Konnte keine Verbindung zur SPS (IP:".$PLC_IP.") aufbauen!</p>\n";
	}
} catch (Exception $e) {
	echo "<p>Konnte keine Verbindung zur SPS (IP:".$PLC_IP.") aufbauen!</p>\n";
}
?>
</div>
</body>
</html>

Sollte dann so ähnlich wie im Anhang aussehen.
 

Anhänge

  • s7plc-html-testseite.png
    s7plc-html-testseite.png
    181,3 KB · Aufrufe: 179
Hi Leute,

ich wollte dieses Thema auffrischen denn ich bin dabei das Script von Thomas zu testen, bekomme aber nix hin.
Ich bekomme entweder garkeinen Wert oder mein index.php script läuft erst garnicht bis zum Ende. (Aber ohne Fehlermeldung vom Firefox)!

Ich bin kompletter php Neuling muss ich aber vorweg sagen.

Die letzte Version von Thomas's Script liegt im web ordner, eine index.php habe ich wie folgt erstellt:

PHP:
<?
require ('html.inc');
require ('s7plc.php');
//require ('ips7lnk_php_test.php');


  BeginHTML ();
  
  echo "</div>";
  echo "<p>";
  echo "Test";                            // eigentliche Ausgabe
  echo "</p>";
  echo "</div>";
  
  
      $plc = new S7PLC("S7300", "192.168.178.200", 0, 2, "TestSPS");
        Open ();
        
  // Daten lesen 
    $db = 1;
    $plcdata = $plc->ReadBytes("DB" , $db, 0, 2 ); 
      Close ();
  
  echo "</div>";
  echo "<p>";
  echo "Daten:".$plcdata[0];                            // eigentliche Ausgabe
  echo "</p>";
  echo "</div>";
 
  EndHTML ();
?>
Meine CPU ist eine frisch-geöffnete CPU315-2 PN/DP FW V1.1, ich habe nichts ausser einem Ethernet Netzwerk Projektiert und die IP eingestellt. Mit der Siemens Software klappt die Kommunikation auf die IP Stamm.200,
mit dem php script bekomme ich leider noch nix zurück.

Lediglich im Baustein FC1 wird ein Zählerwert in den DB1 als Word an der ersten Stelle geschrieben. Er zählt schnell aufwärts, sodass ich versch. Werte an immer der selben Stelle auslesen kann, wenn es denn irgendwann funktioniert was ich mache ^^

Im grossen ganzen weiß ich nicht mal ob ich die "ansteuerung" des php scripts richtig mache. Ich teste seit 3 Nachtmittagen verschiedenste Dinge, aber ich komme nicht weiter. :confused:

Hat jemand Tips für mich was ich unternehmen könnte um wenigstens heraus zu finden WO mein Fehler liegt?

Mit bestem Dank im voraus,
Sascha:)

Da du nur open und close geschrieben hast, und nicht wie Thomas $plc->open() hat das script doch sicher einen fehler ausgegeben, oder? Oder hast du die fehlerausgabe in der php.ini deaktiviert?
 
Wooow!

Also erstmal besten, allerbesten Dank an Thomas! :ROFLMAO:*vde*

Also dein Quelltext ist wirklich erste Sahne! Tut was es soll...

Ich versteh auch schon ein paar Dinge die darin ablaufen, habe schon sehr viele versch. Sprachen gesehen...
Allerdings reicht es nicht mir das ganze jetzt schon an zu passen, aber vllt werde ich hier noch etwas geholfen falls ich mich mal wieder schwierig tue???

Jochen:
Ich bekam keinerlei Fehlermeldung. Ausserdem, wo finde ich eine php.ini? Auf meinem Webserver irgendwo? Ich habe eine Synology DS210j Diskstation als Server, nur für die Info...


Besten Gruß und vielen Dank an alle :)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Super Sache

Hallo Leute,

das mit der PHP Schnittstelle finde ich echt super - hab das Ding mal ausporbiert und geht optimal.

Jetzt hab ich auch ein bissschen mit Ajax und PHP rumgespielt damit ich wie oben beschrieben das flackern rausbekomme. Funktionert soweit auch - nur da lade ich halt immer wieder den kompletter Code mit dem Verbindungsaufbau rein.

Gibts da schon was neues von dem Ajax-Script das einmal den Verbidungsaufbau erledigt, nur die Daten aktualisiert ?

Könnte da jemand eventuell mal ein Bsp. posten, da ich noch nicht fit bin mit Ajax.

Danke
 
Word anstatt Byte

Hallo,
erstmal vieln Dank an die die sich hier arbeit machen und unterstützen.
Hab hier ein kleines Projekt und will aus einer Anlagensteuerung Werte auslesen. Nur Zahlen !!
Und da scheitert es ein wenig, zumal ich nicht genau weiss an welchem Rädchen ich drehen muss um anstatt 1 Byte 1 Wort zukönnen.

ich nutze das recht simple Script (und doch zu schwer für mich)
Code:
<?php
//include ("hexdump.php");
error_reporting(E_ALL);

/*****************************************************************************
 *
 * Reading data from a Siemens S7 PLC
 * 
 * Author: Thomas Wiens
 * Date  : 2010/01/03
 *****************************************************************************/

/*****************************************************************************/
/* Testprogramm
 */
$plcdata = Array();

$db         = 516;
$startbyte     = 0;
$numBytes     = 2;

$plc = new S7PLC("S7400", "121.11.58.10", 0, 3, "TestSPS");
if ($plc->Open() == 0) {
    echo "Versuche " . $numBytes . " Bytes im Datenbaustein DB ". $db . " ab DBB " . $startbyte . " zu lesen.\n";

    $plcdata = $plc->ReadBytes(0, $db, $startbyte, $numBytes);
    if ($plcdata != null) {
        for ($i = 0; $i < count($plcdata); $i++) {
            // Rohdaten ausgeben
            //printf("0x%02X ", $plcdata[$i]);
//            printf("0x%", $plcdata[$i]);
//            printf("0x%d", $plcdata[$i]);
//            printf("0x%e", $plcdata[$i]);
//            printf("0x%E", $plcdata[$i]);
//            printf("0x%u", $plcdata[$i]);
//            printf("0x%f", $plcdata[$i]);
//            printf("0x%F", $plcdata[$i]);
//            printf("0x%o", $plcdata[$i]);
//            printf("0x%s", $plcdata[$i]);
//            printf("0x%x", $plcdata[$i]);
//            printf("0x%G", $plcdata[$i]);
            printf("%d", $plcdata[$i]);
            
        }
    } else {
        echo "Fehler beim Lesen der Daten!\n";
    }
} else {
    echo "Konnte keine Verbindung zur SPS aufbauen!\n";
}
$plc->Close();

/*****************************************************************************/
/*****************************************************************************/
/*****************************************************************************/

class S7PLC {
    public $IP;    
    public $CPU;
    public $Rack;
    public $Slot;
    
    public $Name;
    public $Tag;

    public $lastErrorCode = 0;        // ErrorCode
    public $lastErrorString;        // string

    public $IsConnected = false;    // bool
    public $LastReadTime = 0;        // int
    public $LastWriteTime = 0;        // int
    
    // Privates
    private $mSocket;                // Socket
    
    private $CPU_Type = array ("S7200" => 0, "S7300" => 10,"S7400" => 20);  
    /*****************************************************************************/
    // construction
    public function S7PLC($cpu, $ip, $rack, $slot, $name)
    {
        if ($cpu == '') {
            $this->CPU = "S7300";
        } else {
            $this->CPU = $cpu;
        }
        
        if ($ip == '') {
            $this->IP = "127.0.0.1";
        } else {
            $this->IP = $ip;
        }

        if ($rack == '') {
            $this->Rack = 0;
        } else {
            $this->Rack = $rack;
        }
        
        if ($slot == '') {
            $this->Slot = 2;
        } else {
            $this->Slot = $slot;
        }
        
        $this->Name = $name;
        $this->Tag = "foo";
    }

    /*****************************************************************************/    
    public function Open()
    {
        $bReceive = array();

        try {
            $this->mSocket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);            
            /* set socket receive and send timeout to 1 second */
            socket_set_option($this->mSocket, SOL_SOCKET, SO_RCVTIMEO, array("sec" => 1, "usec" => 0));
            socket_set_option($this->mSocket, SOL_SOCKET, SO_SNDTIMEO, array("sec" => 1, "usec" => 0));            
            
            if ($this->mSocket == false) {
                $this->lastErrorCode = 2; //ErrorCode.ConnectionError;
                $this->lastErrorString = socket_strerror(socket_last_error());
                return 2; // ErrorCode.ConnectionError
            } 
            
            $result = socket_connect($this->mSocket, $this->IP, 102);
                
            if ($result == false) {
                $this->lastErrorCode = 2; //ErrorCode.ConnectionError;
                $this->lastErrorString = socket_strerror(socket_last_error($this->mSocket));
                return 2; // ErrorCode.ConnectionError
            } 

        } catch (Exception $e) {
            $this->lastErrorCode = 2; //ErrorCode.ConnectionError;
            $this->lastErrorString = $e->getMessage();
            return 2; // ErrorCode.ConnectionError
        }
        
        // Connect Request
        $bSend1 = array(     3, 0, 0, 22, 17, 224, 0, 0, 0, 46, 
                            0, 193, 2, 1, 0, 194, 2, 3, 0, 192, 
                            1, 9 );
        
        switch ( $this->CPU ) {
            case ("S7200"):
                //S7200: Chr(193) & Chr(2) & Chr(16) & Chr(0) 'Eigener Tsap
                $bSend1[11] = 193;
                $bSend1[12] = 2;
                $bSend1[13] = 16;
                $bSend1[14] = 0;
                //S7200: Chr(194) & Chr(2) & Chr(16) & Chr(0) 'Fremder Tsap
                $bSend1[15] = 194;
                $bSend1[16] = 2;
                $bSend1[17] = 16;
                $bSend1[18] = 0;
                break;
            case ("S7300"):
                //S7300: Chr(193) & Chr(2) & Chr(1) & Chr(0)  'Eigener Tsap
                $bSend1[11] = 193;
                $bSend1[12] = 2;
                $bSend1[13] = 1;
                $bSend1[14] = 0;
                //S7300: Chr(194) & Chr(2) & Chr(3) & Chr(2)  'Fremder Tsap
                $bSend1[15] = 194;
                $bSend1[16] = 2;
                $bSend1[17] = 3;
                $bSend1[18] = $this->Rack * 2 * 16 + $this->Slot;
                break;
            case ("S7400"):
                //S7400: Chr(193) & Chr(2) & Chr(1) & Chr(0)  'Eigener Tsap
                $bSend1[11] = 193;
                $bSend1[12] = 2;
                $bSend1[13] = 1;
                $bSend1[14] = 0;
                //S7400: Chr(194) & Chr(2) & Chr(3) & Chr(3)  'Fremder Tsap
                $bSend1[15] = 194;
                $bSend1[16] = 2;
                $bSend1[17] = 3;
                $bSend1[18] = $this->Rack * 2 * 16 + $this->Slot;
                break;
            default:
                return 1; //ErrorCode.WrongCPU_Type;
        }
        
        $msg = "";
        for ($i = 0; $i < count($bSend1); $i++) {
            $msg  .= chr($bSend1[$i]);
        }
        
        socket_write($this->mSocket, $msg, strlen($msg));
        
        $buf = "";
        $buf = socket_read($this->mSocket, 22);
        if ( strlen($buf) != 22) {
            throw new Exception("WrongNumberReceivedBytes");
        }
        
        // Data Packet with PDU size
        $bSend2 = array(    3, 0, 0, 25, 2, 240, 128, 50, 1, 0, 
                            0, 255, 255, 0, 8, 0, 0, 240, 0, 0, 
                            3, 0, 3, 0, 240 ); // 240 ist die PDU size
        
        $msg = "";
        for ($i = 0; $i < count($bSend2); $i++) {
            $msg  .= chr($bSend2[$i]);
        }
        
        socket_write($this->mSocket, $msg, strlen($msg));
        
        $buf = socket_read($this->mSocket, 27);
        if ( strlen($buf) != 27) {
            throw new Exception("WrongNumberReceivedBytes");
        }
        $this->IsConnected = true;    
        
        return 0; //ErrorCode.NoError;
    }
    /*****************************************************************************/        
    function Close()
    {
        socket_close($this->mSocket);
        $this->IsConnected = false;
    }
    
    /*****************************************************************************/        
    function ReadBytes($DataType, $DB, $StartByteAdr, $count)
    {
        $bytes = Array(); //evtl. SplFixedArray
        try {
            $packageSize = 31;
            // Header
            $package = "\x03\x00\x00";
            $package .= Chr($packageSize);
            $package .= "\x02\xf0\x80\x32\x01\x00\x00\x00";
            $package .= "\x00\x00\x0e\x00\x00\x04\x01\x12";
            $package .= "\x0a\x10";
            $package .= "\x02";        // Type: Byte
                
            // Anzahl der zu lesenden Bytes        
            $b = pack("V", $count);
            $package .= $b[1] . $b[0];

            // Datenbaustein nummer
            $b = pack("V", $DB);
            $package .= $b[1] . $b[0];
            // Area
            $package .= Chr(132); // 0x84 = Datenbaustein
            // Startadresse
            // unterste 3 Bits sind für die Bitadresse
            $bytead = $StartByteAdr * 8;
            $b = pack("V", $bytead);            
            $package .= $b[2] . $b[1] . $b[0];
            
            // Anfrage senden
            socket_write($this->mSocket, $package, strlen($package));
            
            // Antwort auswerten
            $recv = "";
            $recv = socket_read($this->mSocket, 512);
            
            if (Ord($recv[21]) != 0xff) {
                throw new Exception("WrongNumberReceivedBytes");
            }
            for ($i = 0; $i < $count; $i++) {
                $bytes[$i] = Ord($recv[$i+ 25]);
            }
            return $bytes;
            
        } catch (Exception $e) {
            $this->lastErrorCode = 50; //ErrorCode.WriteData;
            $this->lastErrorString = $e->getMessage();
            return null;
        }
    }
}

?>

Kann ich das mit diesem Script denn?
 
Hi,
verwende mal den letzten Stand der s7plc-Klasse aus diesem Post:
http://www.sps-forum.de/showthread.php/32409-PHP-Siemens-PLC?p=317937#post317937

Dort sind diverse Konvertierungsfunktionen wie getS16At() enthalten um die Roh-Daten als Werte anderen Datentyps zu interpretieren.
Den Funktionen musst du die gelesenen Roh-Daten und die Position im übergeben, ab der die Funktion die Daten als ein anderen Datentyp interpretieren soll. Wenn du z.B. einen ganzen DB aus der SPS liest, kannst du für die Interpretier-Funktionen die Anfangsadressen verwenden die du in Step7 angezeigt bekommst.

Wenn du nur ein einziges Word lesen und dieses in php als vorzeichenbehafteten Integerwert interpretieren willst, musst du 2 Bytes aus der SPS lesen und dann mit der Funktion getS16At($plcdata, 0) in einen Integer wandeln.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin,

wäre es eigentlich auch irgendwie möglich diese PHP Seite auf einem IPAD oder Android laufen zu lassen?
Der Hintergrund ist der, dass man dann evtl. eine Seite basteln könnte zb mit der Maschine als Übersichtsbild, und dann Produktionsdaten von der SPS auf dem Tablet anzeigen zu lassen.
Müsste ich dann praktisch so etwas wie XAMPP für Android under IPAD installieren?
Oder benötige ich noch mehr?
 
Käse,
der Webserver läuft ja weiterhin auf einem PC. Du musst im iPad nur die Seite vom entsprechenden Webserver aufrufen. PHP generiert ja serverseitig nichts anderes als HTML/JS.
Allerdings werden bei vielen Clients mit dem Code hier ständig Verbindungen geöffnet und geschlossen, das halte ich für nicht so toll.
Ich verwende deswegen einen eigenen WebService den ich von meinen Webseiten aus mit JavaScript und JSON anspreche.
 
Das Problem dabei ist aber, das ich kein PC habe. Ich habe eine SPS, ein Touchpanel und ein WLAN Router.
Damit bräuchte ich dann doch ein Webserver auf dem Tablet oder nicht?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Alles klar,
dennoch keine Lösung für iPad.

Genau, für das Samsung funktioniert es :ROFLMAO:. Was mach ich mit dem IPad? Jailbreak will ich nicht. Ich kann den Kunde ja nicht sagen, er müsse erstmal sein IPad bearbeiten :ROFLMAO: oder doch:confused:. Deswegen hab ich Privat keinen Apfel!!!!
 
um einzelne Bits zu lesen musst du aus einem gelesenen Byte das entsprechende Bit ausmaskieren. Am einfachsten machst du dir eine eigene ReadBit Methode welche Readbyte aufruft und das entsprechende Bit ausmaskiert. Es gibt zwar im S7-Protokoll extra Funktionen um einzelne Bits zu lesen, aber das Lesen eines einzelnen Bits "kostet" (im Sinne von Bandbreite und Zeit) genausoviel wie das Lesen eines ganzen Bytes.

Hallo
gibt es dazu irgendwo ein Beispiel, bekomme das mit dem Bit ausmaskieren einfach nicht hin (hab auch schon Dr. Google gefragt)

mfg
Christian
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo
Habs jetzt so gelöst:

Code:
function binary_encode($binary) 
{
$setting20=0;
$setting19=0;
$setting18=0;
$setting17=0;
$setting16=0;
$setting15=0;
$setting14=0;
$setting13=0;
$setting12=0;
$setting11=0;
$setting10=0;
$setting9=0;
$setting8=0;
$setting7=0;
$setting6=0;
$setting5=0;
$setting4=0;
$setting3=0;
$setting2=0;
$setting1=0;
  if ($binary >= 524288) {$setting20 = 1; $binary = $binary - 524288;}
  if ($binary >= 262144) {$setting19 = 1; $binary = $binary - 262144;}
  if ($binary >= 131072) {$setting18 = 1; $binary = $binary - 131072;}
  if ($binary >= 65536) {$setting17 = 1; $binary = $binary - 65536;}
  if ($binary >= 32768) {$setting16 = 1; $binary = $binary - 32768;}
  if ($binary >= 16384) {$setting15 = 1; $binary = $binary - 16384;}
  if ($binary >= 8192) {$setting14 = 1; $binary = $binary - 8192;}
  if ($binary >= 4096) {$setting13 = 1; $binary = $binary - 4096;}
  if ($binary >= 2048) {$setting12 = 1; $binary = $binary - 2048;}
  if ($binary >= 1024) {$setting11 = 1; $binary = $binary - 1024;}
  if ($binary >= 512) {$setting10 = 1; $binary = $binary - 512;}
  if ($binary >= 256) {$setting9 = 1; $binary = $binary - 256;}
  if ($binary >= 128) {$setting8 = 1; $binary = $binary - 128;}
  if ($binary >= 64) {$setting7 = 1; $binary = $binary - 64;}
  if ($binary >= 32) {$setting6 = 1; $binary = $binary - 32;}
  if ($binary >= 16) {$setting5 = 1; $binary = $binary - 16;}
  if ($binary >= 8) {$setting4 = 1; $binary = $binary - 8;}
  if ($binary >= 4) {$setting3 = 1; $binary = $binary - 4;}
  if ($binary >= 2) {$setting2 = 1; $binary = $binary - 2;}
  if ($binary == 1) {$setting1 = 1; $binary = 0;}
  $returnbinary = array($setting9,$setting10,$setting11,$setting12,$setting13,$setting14,$setting15,$setting16);
 
  return $returnbinary;
 }
 
Hallo,

ich habe dazu mal eine Sicherheitsfrage. Ich finde es erschreckend das ich einfach so auf eine SPS zugreifen kann ohne vorher eine Verbindung in der SPS parametrieren zu müssen.

Theoretisch kann jeder mit wenig Programmierkenntnissen Werte in einer SPS die z.B. eine ganze Produktion steuert abschiessen. Wie kann ich so etwas blocken?

Gruß
 
Zurück
Oben