Hallo,
Muss dieses Thema nochmal aufgreifen,
bin über einen Artikel im sps-forum gestolpert, wo jemand einen DB auf einmal auslesen tut.
PHP + Siemens PLC - SPS-Forum
Das auslesen klappt auch,halt nur in bytes , jetzt versuche ich schon seit Stunden irgenwie diese auf Variablen zuverteilen,
Byte 0…3 //Float
Byte 4…7//Float
Byte 8 //Byte ->das zerlegen in Bits hab ich schon.
@tgusi74 vielleicht über deinen Array ansatz.
$S7_VAR_IDs = array("SOLL" =>array(7,7,76,0,0,0),//DB76.DBD0 FLOAT/REAL
"IST" =>array(7,7,76,4,0,0),//DB76.DBD4 FLOAT/REAL
"HAND LMN" =>array(7,7,76,8,0,0),//DB76.DBD8 FLOAT/REAL
"AUTO" =>array(0,7,76,12,0,0),//DB76.DBX12.0 BIT
"AUF" =>array(0,7,76,14,0,0),//DB76.DBX14.0 BIT
"ZU" =>array(0,7,76,14,1,0),//DB76.DBX14.1 BIT
"LMN" =>array(7,7,76,16,0,0));//DB76.DBD16 FLOAT/REAL
Wäre schön wenn jemand ne Idee hätte.
Es muss in ext dies datei php_sockets.dll eingefügt werden.
$plcdata = Array();
$db = 76;
$startbyte = 0;
$numBytes = 100;
$data = "";
$plc = new S7PLC("S7300", "192.168.0.15", 0, 2, "TestSPS");
if ($plc->Open() == 0) {
echo "Versuche " . $numBytes . " Bytes im Datenbaustein DB ". $db . " ab DBB " . $startbyte . " zu lesen.
";
$plcdata = $plc->ReadBytes(0, $db, $startbyte, $numBytes);
if ($plcdata != null) {
for ($i = 0; $i < count($plcdata); $i++) {
// Rohdaten ausgeben
printf("0x%02X ", $plcdata[$i]);
// $data.="0x%02X ". $plcdata[$i];
}
} else {
echo "Fehler beim Lesen der Daten!
";
}
} else {
echo "Konnte keine Verbindung zur SPS aufbauen!
";
}
$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;
}
}
}
?>
Gruß
Michael
PS.: 100Byte in 120ms