hier das write
<?
/*
FUNCTION: Script welches von der WRITE - RegisterVariable der COM-Schnittstelle
zugewiesen ist
CHANGELOG:
18.04.2009 Gusenbauer
+ Erste funtionierendes Script
*/
//echo "das WRITE-Script wurde getriggert";
?>
hier das read
<?
print_r($_IPS);
/*
FUNCTION: Script welches von der READ - RegisterVariable der COM-Schnittstelle
zugewiesen ist
CHANGELOG:
18.04.2009 Gusenbauer
+ Erste funtionierendes Script
*/
//** CONFIG ******************************************************************
// hier die InstanzIDs zuweisen
$ComPortID = 18262 /*[Serial Port 2]*/ ;
$RegVar_COM3_READ = 54778 /*[Versuch\Logo\Register Variable]*/ ;
$RegVar_COM3_WRITE = 41210 /*[Versuch\Logo\Register Variable]*/ ;
//****************************************************************************
//--------------------------------------------------
//BUFFER FUELLEN --> Daten lesen von COM-Port
$buf = RegVar_GetBuffer($RegVar_COM3_READ);
$buf .= $_IPS['VALUE'];
RegVar_SetBuffer($RegVar_COM3_READ,$buf);
//--------------------------------------------------
if (strlen($buf)>= 2)
{
if (ord($buf[0]) == 21)
{
switch (ord($buf[1]))
{
case 1:
echo "ERROR: LOGO! kann kein Telegramm annehmen";
break;
case 3:
echo "ERROR: LOGO! nicht zulässiger Zugriff";
break;
case 4:
echo "ERROR: LOGO! Paritäts-, Überlauf- oder Telegramfehler";
break;
case 5:
echo "ERROR: LOGO! unbekanntes / unzulaessiges Kommando";
break;
case 6:
echo "ERROR: LOGO! XOR-Summe fehlerhaft";
break;
case 7:
echo "ERROR: LOGO! Simulationsfehler";
break;
default:
echo "ERROR: LOGO! Unbekannter Fehlercode oder UEBERTRAGUNGSFEHLER";
break;
}
echo " --> Fehler im LESEROUTINE
";
}
}
//+ + + + + + + + + + + + + + + + + + + + + + + + + + +
//+ + + + + + + + + + + + + + + + + + + + + + + + + + +
$ReadingBytesForLogoTyp = 71;
if (strlen($buf)>= 8)
{
//Festlegen wieviele Bytes fuer den LOGO-Typ zu lesen sind !!!
switch (ord($buf[8]))
{
case 17: //LOGO!-Typ: 0BA4 / 0BA5
$ReadingBytesForLogoTyp = 71;
break;
case 25: //LOGO!-Typ: 0BA4 / 0BA5
$ReadingBytesForLogoTyp = 81;
break;
default:
$ReadingBytesForLogoTyp = 71;
break;
}
}
//+ + + + + + + + + + + + + + + + + + + + + + + + + + +
// # # # # # # # # # # # # # # # # # # # # # # # # # #
// WENN ALLE ZEICHEN EMPFANGEN
// # # # # # # # # # # # # # # # # # # # # # # # # # #
if (strlen($buf)>= $ReadingBytesForLogoTyp)
{
//--------------------------------------------
// START USERCODE - HIER DIE VERARBEITUNG DURCHFUHREN
include_once ('./common_function.php');
$LOGO_Path = "LOGO/ELEMENTE/";
LOGO_Element("Q",1,$LOGO_Path ."Q1");
LOGO_Element("I",1,$LOGO_Path ."I1");
LOGO_Element("AQ",1,$LOGO_Path ."AQ1");
LOGO_Element("B",1,$LOGO_Path ."/BLOECKE/B1");
LOGO_Element("B",2,$LOGO_Path ."/BLOECKE/B2");
LOGO_Element("B",3,$LOGO_Path ."/BLOECKE/B3");
LOGO_Element("B",4,$LOGO_Path ."/BLOECKE/B4");
if (LOGO_Element("I",3) == true)
{
echo "I3=1 --> Einbruch erkannt !!!";
}
// ENDE USERCODE
//--------------------------------------------
}
/*
F U N K T I O N E N - F U N K T I O N E N - F U N K T I O N E N - F U N K T I O N E N
*/
/****************************************************************************
LOGO_Element,
extrahiert aus den BUFFER das gewünschte Element
Example: LOGO_Element("I",4,"LOGO/INPUT/I4");
Parameter: $Typ --> Bezeichner welche aus dem LOGO-Bezeichner entsprechen
Unterstuetze TYPEN: B = Blöcke
I = Eingänge
F = Funktionstasten
Q = Ausgänge
M = Merker
S = Schieberegister
C = Cursortasten
AI = Analogeingang
AQ = Analogausgang
AM = Analogmerker
$Element --> Elementenummer des Typ (z.B. 1-16)
$VariableString --> wenn "" dann nur als Rueckgabewert
--> wenn ungleich "", dann wird der Wert auf die
Variable "$VariablenString" zugewiesen, existiert
die Variable nicht wird diese erzeugt, notigenfalls
auch die CategoryHierachie
Info aus dem SIEMENS-Forum:
da bei mir der Puffer auch das ACK enhält verschiebt sich da ganze +1
Byte Bedeutung
0 Start = 85 (0x55)
1 Kommando = 17 (0x11)
2 Kommando = 17 (0x11)
3-4 Anzahl folgender Bytes
5-6 Prüfsumme des Programms
7 Länge des Bereichs Blöcke in Byte
8 Länge des Bereichs Eingänge bis Analoge Merker in Byte
9 Länge des Bereichs mit den Aktualwerten der Blöcke in Byte
0BA4, 0BA5:
10-26 Blöcke B1 - B130
27-29 Eingänge I1 - I24
30-31 Ausgänge A1 - A16
32-34 Merker M1 - M24
35 Schieberegister
36 Cursortasten
37-52 Analoge Eingänge AI1 - AI8
53-56 Analoge Ausgänge AQ1 - AQ2
57-68 Analoge Merker AM1 - AM6
69 Stopp = 170 (keine Aktualwerte) (0xAA)
0BA6:
10-34 Blöcke B1 - B200
35-37 Eingänge I1 - I24
38 TD-Funktionstasten
39-40 Ausgänge A1 - A16
41-44 Merker M1 - M27
45 Schieberegister
46 Cursortasten
47-62 Analoge Eingänge AI1 - AI8
63-66 Analoge Ausgänge AQ1 - AQ2
67-78 Analoge Merker AM1 - AM6
79 Stopp = 170 (keine Aktualwerte) (0xAA)
ReleaseNotes:
18.04.2009 Gusenbauer
+ Function erstellt und geprüft (jedoch alle ANALOGWERTE nicht getestet !!!)
*****************************************************************************/
function LOGO_Element($Typ,$Element,$VariableString="")
{
global $buf;
switch (ord($buf[8]))
{
case 17: //LOGO!-Typ: 0BA4 / 0BA5
$LogoTyp = "0BA5";
break;
case 25: //LOGO!-Typ: 0BA6
$LogoTyp = "0BA6";
break;
default:
$LogoTyp = "0BA3";
break;
}
$MinElement = 0;
$MaxElement = 0;
$ByteOffset = 0;
$VariablenTyp = 0;
$BytesProElement = 0;
switch (strtoupper($Typ))
{
case "B": //BLOECKE
$MinElement = 1;
$MaxElement = 130;
$VariablenTyp = 0; //Boolean
if ($LogoTyp = "0BA5")
{
$MaxElement = 130;
$ByteOffset=11;
}
else
{
$MaxElement = 200;
$ByteOffset=11;
}
break;
case "I": //EINGAENGE
$MinElement = 1;
$MaxElement = 24;
$VariablenTyp = 0; //Boolean
if ($LogoTyp = "0BA5")
{
$ByteOffset=28;
}
else
{
$ByteOffset=36;
}
break;
case "F": //FUNKTIONSTASTEN nur an OBA6
$MinElement = 1;
$MaxElement = 4;
$VariablenTyp = 0; //Boolean
if ($LogoTyp = "0BA5")
{
$MinElement = 0;
$MaxElement = 0;
$ByteOffset=0;
}
else
{
$ByteOffset=39;
}
break;
case "Q": //AUSGAENGE
$MinElement = 1;
$MaxElement = 16;
$VariablenTyp = 0; //Boolean
if ($LogoTyp = "0BA5")
{
$ByteOffset=31;
}
else
{
$ByteOffset=40;
}
break;
case "M": //MERKER
$MinElement = 1;
$MaxElement = 27;
$VariablenTyp = 0; //Boolean
if ($LogoTyp = "0BA5")
{
$ByteOffset=33;
}
else
{
$ByteOffset=42;
}
break;
case "S": //SCHIEBEREGISTER
$MinElement = 1;
$MaxElement = 8;
$VariablenTyp = 0; //Boolean
if ($LogoTyp = "0BA5")
{
$ByteOffset=36;
}
else
{
$ByteOffset=46;
}
break;
case "C": //CURSORTASTEN
$MinElement = 1;
$MaxElement = 4;
$VariablenTyp = 0; //Boolean
if ($LogoTyp = "0BA5")
{
$ByteOffset=37;
}
else
{
$ByteOffset=47;
}
break;
case "AI": //ANALOGEINGANG
$MinElement = 1;
$MaxElement = 8;
$VariablenTyp = 1; //Integer
$BytesProElement = 2;
if ($LogoTyp = "0BA5")
{
$ByteOffset=38;
}
else
{
$ByteOffset=48;
}
break;
case "AQ": //ANALOGAUSGANG
$MinElement = 1;
$MaxElement = 2;
$VariablenTyp = 1; //Integer
$BytesProElement = 2;
if ($LogoTyp = "0BA5")
{
$ByteOffset=54;
}
else
{
$ByteOffset=63;
}
break;
case "AM": //ANALOGMERKER
$MinElement = 1;
$MaxElement = 6;
$VariablenTyp = 1; //Integer
$BytesProElement = 2;
if ($LogoTyp = "0BA5")
{
$ByteOffset=58;
}
else
{
$ByteOffset=68;
}
break;
default:
echo "ERROR: Typ unbekannt --> " . strtoupper($Typ) ."
";
break;
}
if (($Element < $MinElement) || ($Element > $MaxElement))
{
echo "ERROR: Elementennummer unzulaessig --> " . strtoupper($Typ) . $Element . " (nur " . $MinElement . " - " . $MaxElement . " erlaubt)
";
}
else
{
$VariableString = str_replace(chr(92),"/",$VariableString);
//Check ob sich die Variable in einer Objekthierachie befinden soll
if (strrpos($VariableString, "/") !== false)
{
$PathString = substr($VariableString,0,strrpos($VariableString, "/")+1);
//Check ob eine Objekthierachie exitiert (Egal ob Objekt/Script/..)
$ret = CheckObjektHierachie($PathString);
if ($ret <= 0)
{
//existiert die Objekthiearachie nicht wird eine Categoryhierachie erzeugt
CheckCreateCategory($PathString);
}
}
if($VariablenTyp == 0) //Boolean
{
$ByteOffset += floor(($Element-1)/8);
$BitOffset = fmod(($Element-1),8);
//echo "BYTEOffeset = " . $ByteOffset . " / BitOffset = " . $BitOffset;
$ElementValue = (ord($buf[$ByteOffset]) & pow(2, $BitOffset)) >> $BitOffset;
if($VariableString != "")
{
//Check ob Variable existiert bzw. erzeugen (BOOLEAN)
$VarID = CheckCreateVariable($VariableString,0);
//Wert auf ElementenVariable zuweisen
SetValueBoolean($VarID,ConvertToBoolean($ElementValue));
}
return(ConvertToBoolean($ElementValue));
}
else
{
$ByteOffset += ($Element-1)*$BytesProElement;
//echo "BYTEOffeset = " . $ByteOffset ."
";
$ElementValue = 0;
for ($i=$BytesProElement-1;$i>=0;$i--)
{
$ElementValue = ($ElementValue << 8);
$ElementValue = $ElementValue + ord($buf[$ByteOffset+$i]);
//Wert ist negativ
if ($ElementValue > 32767)
{
$ElementValue = $ElementValue - 65536;
}
}
if($VariableString != "")
{
//Check ob Variable existiert bzw. erzeugen (INTEGER)
$VarID = CheckCreateVariable($VariableString,1);
//Wert auf ElementenVariable zuweisen
SetValueInteger($VarID,$ElementValue);
}
//echo "elemetenWert = " . $ElementValue ."
";
return($ElementValue);
}
}
}
//****************************************************************************
?>
hier das logo read
<?
/*
FUNCTION: Script welches den REQUEST zum Datenlesen ausloest
CHANGELOG:
18.04.2009 Gusenbauer
+ Erste funtionierendes Script
+ COM-Port muss mit konfiguriert sein 9600,8,1,E
*/
//** CONFIG ******************************************************************
// hier die InstanzIDs zuweisen
$ComPortID = 18262 /*[Serial Port 2]*/ ;
$RegVar_COM3_READ = 54778 /*[Versuch\Logo\Register Variable]*/ ;
$RegVar_COM3_WRITE = 41210 /*[Versuch\Logo\Register Variable]*/ ;
//****************************************************************************
if (COMPort_GetOpen($ComPortID) == True)
{
if ((COMPort_GetBaudRate($ComPortID) != 9600) ||
(COMPort_GetDataBits($ComPortID) != 8) ||
(COMPort_GetStopBits($ComPortID) != 1) ||
(COMPort_GetParity($ComPortID) != "Even"))
{
echo "WARNING: COM-Port ist nicht mit 9600,8,1,E verbunden !! --> " . $ComPortID . ": '" .IPS_GetName($ComPortID) . "' --> bitte manuell korrigieren !!
";
}
else
{
COMPort_SetRTS ($ComPortID,false);
COMPort_SetDTR($ComPortID,false);
IPS_Sleep(50);
COMPort_SetDTR($ComPortID,true);
COMPort_SetRTS ($ComPortID,true);
//LeseBuffer leeren bevor neuen Request
RegVar_SetBuffer($RegVar_COM3_READ,"");
IPS_Sleep(50);
//Schreibe BEFEHL an die LOGO! --> 0x55 0x13 0x23 0x00 0xAA
RegVar_SendText($RegVar_COM3_WRITE, chr(hexdec("55")).chr(hexdec("13")).chr(hexdec("13")).chr(hexdec("00")).chr(hexdec("AA")));
}
}
else
{
echo "WARNING: COM-Port ist nicht verbunden !! --> " . $ComPortID . ": '" .IPS_GetName($ComPortID) . "' --> bitte manuell verbinden !!
";
}
?>
danke für deine Mühe
Gruß
Remo