Siemens LOGO! --> IPS

Hallo zusammen,
habe mal eine Routine geschrieben mit der das Prozessabbild der SIEMENS Logo! (>=0BA4) abgefragt werden kann

Leider ist eine Programmbeeinflussung der LOGO! nicht möglich und somit können keine Werte an BLÖCKEN geändert werden bzw. Ausgänge gesetzt werden :frowning: ==> Vieleicht liest ja ein SIEMENS-Entwickler diesen Betrag und intergriert diese Funktionalität in die zukünftige Geräte :smiley:

… die gewünschten Elemente müssen im READ-Sricpt entsprechend angepasst werden

			 //--------------------------------------------
			 // 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 
			 //--------------------------------------------

Viel Spass mit den Script
tgusi74

logo_0ba5_0ba6.zip (103 KB)

Der Thread ist zwar schon Uralt, aber ich möchte mich hiermit für das Script bedanken.
Jetzt kann ich auch auf mein Logo!-Bullerjan Ofensteuerung zugreifen :smiley:
Gruß M.

Hi tgusi74,
ich wollt mich auch für´s Script bedanken. Funktionierte auf Anhieb und ich bekomme alles was ich wollte. Besten Dank!!!

Gruß Udo

Hallo,

Ich habe eine Siemens!Logo 0BA4
Hab es nach der obigen Anleitung durchgeführt und bekomme jetzt eine Notice:


Notice:  Undefined variable: IPS_VALUE in [LOGO\RegisterVariable_COM3_READ\COM3_READ] on line 27

Kann mir da einer Helfen?
Danke

lg pesensie

hat sich erledigt! :wink:

Hallo

Sodala bekomme von der Siemens!Logo RC12/24 die „Temperaturwerte“ zb 277!
Wie bekomme ich das jetzt in Grad Celsius angezeigt?

lg pesensie

Sind das jetzt 277 Grad oder ist das der Analogwert?
Gruß M.

Hallo,

Habs hinbekommen
PT100 -50° bis +200°
Wert 0-1000

der Wert den Siemens!Logo ausgibt /4 -50 rechnen

Script:

<?
$varlevel = GetValue(43775 /*[LOGO\ELEMENTE\Value Ofen]*/) /4 - 50;
$sensorlevel = 16899 /*[LOGO\ELEMENTE\Temp Ofen]*/;
SetValue($sensorlevel, $varlevel);
?>

:loveips:

lg pesensie

Hätteste aber auch in der Logo selbst machen können.
Dann hast du auch den richtigen wert im Display der Logo (falls du das Display nutzt).
Für IP-Symcon dann einfach den Analogverstärker abfragen.
Gruß M.

Hallo

ich muss das hier leider noch mal auffrischen
habe die scripte so angelegt und verändert wie beschrieben
bekomme aber auch die Meldung wie pesensie

Notice: Undefined variable: IPS_VALUE in [LOGO\RegisterVariable_COM3_READ\COM3_READ] on line 27

kann mir bitte jemand helfen steh irgenwie total auf dem schlauch:(

vielen Dank
Remo

Die Schreibweise gibt es in der aktuellen IPS version nicht mehr.

Du musste $IPS_VALUE gegen $_IPS[‚VALUE‘].

Infos dazu findest du in der Doku Systemvariablen — IP-Symcon :: Automatisierungssoftware

vielen Dank für die rasche Antwort

habs geändert aber jetzt kommt

Notice: Undefined index: VALUE in [Versuch\Logo\Register Variable\read] on line 27

hier mal das ganze script, villeicht kannst du mal drüber schauen,
währe dir sehr dankbar

<?
/*
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);
			}
     }

 }
//****************************************************************************

?>

Gruß
Remo

Hallo

ich muss noch ,mal in die Allgemeinheit fragen, ob jemand eine Idee bezüglich des Script hat ???:confused:
ich hab mit PHP noch so meine Probleme und bin dringend auf eure Hilfe angewiesen:)

vielen Dank im voraus

Gruß Remo

Hi Remo,
die spannende Frage ist, was triggert dein Script (wer oder was übergibt hier einen Wert von ausserhalb des Scripts)?
Bau doch mal ein

print_r($_IPS);

ganz am Anfang des Scripts ein. Nachdem es wie üblich getriggert wurde, erscheint der Print im Meldungsfenster der Konsole. Der wäre interessant.

Man du bis echt schnell

Dank dir schon einmal

Array
(
    [SENDER] => Execute
    [SELF] => 12883
    [THREAD] => 9
)

Notice:  Undefined index: VALUE in [Versuch\Logo\Register Variable\read] on line 28

das zeigt er mir
im ersten post #1 ist eine zip angehängt, dort sind alle script die ich verwendet habe drin, vielleicht hilft dir noch etwas

Gruß
Remo

schau ich mir gleich an.
Das Ergebnis sagt schon mal, das im $_IPS-Array der Wert für ‚Value‘ nicht enthalten ist. Das führt auch zu deiner Fehlermeldung. Anders ausgedrückt: der Wert, den Das Script erwartet, wird garnicht übergeben. Wo müsste denn der Wert herkommen?

wenn ich das richtig interpretiere, von einem 2. script, das das Auslesen der Logo regelt

Gruß Remo

zeig mal das Script und am Besten auch ein Screenshot vom Objektbaum, der mind. bei de Scripte und ggf. verlinkte Elemente zeigt

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

ok, das logo read script löst eine Kommunikation aus. Die untere Registervariable bekommt daten von der Siemens und übergibt diese Daten an das read-Script. Da kommen sie scheinbar nicht an.

2 Fragen: ist die (richtige) Regvar mit dem read-Script (Ziel-Script in den RegVar-Einstelungen) verknotet?

kannst du mal einen Dump (mit Kommunikationsdaten) aus dem Debugging-Fenster der regvar machen und hier einstellen?

hab noch mal alle IDs in den scripten und in den Regvar kontrolliert, die passen alle
auch der comPort passt, allerdings hängt jetzt keine Logo dran…

der dump sieht nicht viel versprechend aus



10.10.2012 22:08:07.00 |               Buffer | 
10.10.2012 22:08:14.00 |               Buffer | 


mehr ist nicht

Gruß
Remo