Siemens S7 Variablen gruppieren

Hallo Forum,

Ich habe mir gestern das IP Symcon Professional geleistet da ich meine Heimautomatisierung jetzt auch Komfortabel Visualisieren möchte. :slight_smile:

Ich habe eine Siemens S7 315-2DP mit einem CP343-1 lean im einsatz. Mittlerweile sind auch so ziemlich alle Rolläden Markiesen und die Heizung darüber gesteuert. Funktioniert alles super nur an der Visualisierung hat es bisher gehapert.

Heute habe ich angefangen Variablen in IPS zu erstellen. Leider habe ich es noch nicht geschafft mehrere Variablen anzulegen ohne Jedesmal eine neue Instanz anzulegen. Das Problem was ich habe ist im Webfront dann Jede Variable einzeln steht und das ganze dann doch recht unübersichtlich wird.

Oder muss ich hier nochmal Variablen anlegen und diese dann Umkopieren!?

Hier noch ein paar Screenshots:

Wenn mir hier Jemand helfen könnte wäre das echt Klasse. Ich hoffe ich habe das Thema in der richtigen rubrik erstellt, falls nicht bitte Verschieben. :slight_smile:

Jein. Du kannst die Instanzen so wie sie sind erstmal so lassen. Die Variablen kannst du auch ruhig beim Namen „Value“ belassen.

Was du machen willst, um das ganze optisch schicker zu gestalten:

  • Erstell dir mal ein neue Instanz vom Typ Dummy Modul, die du unter „Sonstige“ findest.
  • Dann klick auf eine Variable mit rechter Maustaste und „verlinken“.
  • Als Ziel wählst du dann das neu erstellte Dummy Modul
  • Den Link kannst du dann benennen wie du magst

Dadurch kannst du beliebige Variablen zu richtigen „Gerätegruppen“ zusammenstellen. Durch die Links kannst du das auch jederzeit umändern, umbiegen und für die mobilen Apps anpassen. Ist am Anfang ein wenig mehr arbeit, aber auf lange Sicht wirst du es dir danken :slight_smile:

paresy

Habe es mal in die Rubrik WebFront geschoben.

paresy

Danke für die Schnelle Hilfe!!!

Das habe ich hinbekommen. Manche Variablen habe ich einfach untereinander Verknüpft so habe ich mir das Dummy Modul gespart.
Schade nur das man jede Variable von Hand anlegen muss. Das ist ein ganz schönes geklicke.
Gibt es eigentlich die Möglichkeit Variabelen zu Kopieren!? Bis jetzt konnte ich nur die ID Kopieren.
Da ich 11 Räume mit relativ gleichen Variabeln habe nur jeweils in anderen DB´s gespeichert wäre das ein großer Vorteil. :confused:

Du kannst die Links beliebig zusammenfassen. Ob nun in eine Kategorie oder ein Dummy-Instanz oder beides, bleibt Dir überlassen. Die Darstellung unterscheidet sich leicht.
Dummy ist ganz nett zum Zusammnfassen.

Hier was zum Links kopieren

Hallo,

Vielleicht verstehe ich das jetzt ja auch Falsch ich bin in sachen PHP und IPS ja noch ein Neuling aber das Skript Kopiert Links in einen Ordner/Knoten den ich angebe?:confused:

Kann ich so auch „Instanzen“ Kopieren?
Ich muss ja für jede Variable eine Instanz angeben da ich ansonsten ja den Zugriff in der SPS nicht ändern kann. Wenn das so Funktioniert kann ich die kopierten Instanzen auf den Passenden DB anpassen das währe genau das was ich Suche.

Vielleicht hilft Dir das hier.

Wenn Du die Links gruppiert hast, dann bringt Dich das hierweiter.

Hier noch ein nettes Beispielaus der Praxis.

Als Beispiel wie man eingige Scripte und mehrere Variablen auf einmal anlegt könnte auch das Zauberscript der Einbindung meines HID-Funksteckdosenmodules, von BerndJ als Vorlage für Erweiterungen dienen.

Ab Zeile ~75 wird hier eine Variable angelegt, muß man nur mehrfach tun, zB mit 'nem Array oder ein Schleifchen.

Scripte werden hier mehrfach angelegt.

Bernd hat recht gut kommentiert, Script löschen am Ende würde ich mal zum anschauen Remen:

Gruß Helmut

<?
/*	*******************************************************************************************************
  	*                                                                                                     *
	* BJ´s und Helmut präsentieren:                                                                       *
  	*                                                                                                     *
  	* Skript: Installation von zusätzlichen Schaltsteckdosen                                              *
  	* Version: V1.03a vom 29.11.2009                                                                       *
  	*                                                                                                     *
  	* Voraussetzung ist ein vorhandenes USB HID Modul mit einem programmierten PIC,                       *
  	* programmiert von unserem Helmut, dem Kühlen aus dem Norden                                          *
  	* welches mit 3 Drähten (der dritte folgt noch für die Batterieüberwachung) mit der Fernbedienung von *
  	* sogenannten "Low-cost" Schaltsteckdosenset´s zu verbinden ist.                                      *
  	*                                                                                                     *
  	* Die Leiterplatte kann demnächst bezogen werden bei: http://bjes.dyndns.org/002/index.php            *
  	* Weitere Info´s folgen ebenfalls demnächst auf der Site.                                             *
  	*                                                                                                     *
  	*                                                                                                     *
  	* Automatisches Anlegen mehrerer Skripte und einer Variablen für Helmut´s Schaltsteckdosen            *
  	*                                                                                                     *
  	* Vorgehensweise:                                                                                     *
  	*                                                                                                     *
  	* In dem Raum, in welchem eine Schaltsteckdose hinzugefügt werden soll, einen neuen Skript erstellen. *
  	* Diesen Skript dort hinein kopieren.                                                                 *
  	* Die 4 Daten der Konfiguration anpassen                                                              *
  	* (Achtung! um Überschneidungen im Hauscode und Steckdosencode zu verhindern,                         *
  	* empfehlen wir den Einsatz einer Tabellenkalkulation,                                                *
  	* entsprechendes .ODS Musterfile ist auf der Site zu finden), und                                     *
  	*                                                                                                     *
  	* auf "Ausführen" klicken, das war´s.                                                                 *
  	*                                                                                                     *
  	* Im Anschluss löscht es sich selber, hinterlässt aber in den drei Skripten eine Nachricht,           *
  	* an der ein aktuelles Skript herunter geladen werden kann.                                           *
  	*                                                                                                     *
  	*******************************************************************************************************/

		//***** Konfiguration *****

		//***** Vorgaben zum Einrichten *****

		$HIDModulID = 42538 /*[Helmut´s 433 MHz Modul]*/;    // ID des anzusprechenden HID Modules von Helmut
		$Name = "Bärchen Treppe";				    					// Name der zu schaltenden Angelegenheit
		$HausCode = 25;    											// Hauscode als Dezimalzahl
		$Steckdosencode = 8;    									// Steckdosencode als Dezimalzahl

//***** Programmcode (ab hier nichts mehr verändern) ******************************************************

		$Info = "created by Script Install_Schaltsteckdose from http:bjes.dyndns.org/002/indexa.php";
		$InfoScriptePrefix = "<?

		/***************************************************************************************
		* Achtung, dieses Script wurde durch ein Installationsskript automatisch erstellt.     *
		* Um das System sauber zu halten, und weil es ein Skript mit einem Aufräumfimmel war,  *
		* hat es sich nach der Arbeit selbst entsorgt.                                         *
		* Ein neues, und dadurch aktuelles, Installationsskript gibt es unter:                 *
		*                                                                                      *
		* http:/bjes.dyndns.org/002/index.php                                                  *
		*                                                                                      *
		* Install_Schaltsteckdosen V 1.03a vom 29.11.2009                                       *
		*                                                                                      *
		***************************************************************************************/";

		$InfoScripteSuffix = "?>";

	//*** Anlegen einer neuen DummyModul Instanz mit dem Namen der oben definierten Variable $Name ***

		$ModID = IPS_CreateInstance("{485D0419-BE97-4548-AA9C-C083EB82E61E}");   	// Dummy Modul anlegen, ID festhalten
		IPS_SetName($ModID, $Name);                                                // Dummy Modul den Namen verpassen
      $o = IPS_GetObject($IPS_SELF);                                       // ******so lüppt dat in der IPS V 2.1 auch******
      $ParentID = $o['ParentID'];                                          // **********************************************
//		$ParentID = IPS_GetParent($IPS_SELF);                                      // Parent ID ermitteln, $IPS_SELF gibt ID des eigenen Skriptes aus
		IPS_SetParent($ModID, $ParentID);                                          // Dummy Modul diesem unterordnen
		IPS_SetInfo($ModID, "$Info");                                              // Info zur Variable hinzufügen
		IPS_ApplyChanges($ModID);                                                  // Änderungen speichern

	//*** Anlegen einer Zustandsvariablen mit dem Namen der oben definierten Variable $Name ***

		$Vid = IPS_CreateVariable(0);   															// neue Variable anlegen, ID festhalten
		IPS_SetName($Vid, $Name." eingeschaltet");                                 // dieser den Namen verpassen
		IPS_SetParent($Vid, $ModID);                          							// die Variable im Hierarchiebaum richtig plazieren
		IPS_SetInfo($Vid, "$Info");                                              	// Info zur Variable hinzufügen
		IPS_SetVariableCustomProfile($Vid, "~Switch");                             // diese Variable dem Variablenprofil Switch zuordnen

	/************************************************************************************
	*                                                                                   *
	* Inhalte der neu zu erzeugenden Skripte in ein zweidimensionales Array befördern   *
	*                                                                                   *
	*************************************************************************************/

$Scripteanlegen = array();          															// öffnet das eindimensionale Array
$i = 0;                             															// init des Zählers
//                    *********** Skript 1 hinterlegen ***********
$Scripteanlegen [$i][1] = "";							                                 // ScriptNamePrefix 1
$Scripteanlegen [$i][2] = "
HID_SendEvent($HIDModulID, 0, chr($HausCode).chr($Steckdosencode).chr(0x01).chr(0x00).chr(0x00).chr(0x00).chr(0x00).chr(0x00).chr(0x7D).chr(0x7D).chr(0x00).chr(0x00));
SetValue($Vid,1);";                                     									// ContentScript 1
$Scripteanlegen [$i][3] = " einschalten";                                  		// ScriptNameSuffix 1
$i = $i + 1;                                                                     // Zähler einen ruff
//                    ***********  nächsten Skript hinterlegen ***********
$Scripteanlegen [$i][1] = "";							                                 // ScriptNamePrefix next
$Scripteanlegen [$i][2] = "
HID_SendEvent($HIDModulID, 0, chr($HausCode).chr($Steckdosencode).chr(0x00).chr(0x00).chr(0x00).chr(0x00).chr(0x00).chr(0x00).chr(0x7D).chr(0x7D).chr(0x00).chr(0x00));
SetValue($Vid,0);";                                     									// ContentScript next
$Scripteanlegen [$i][3] = " ausschalten";                                  		// ScriptNameSuffix next
$i = $i + 1;                                                                     // Zähler einen ruff
//                    ***********  nächsten Skript hinterlegen ***********
$Scripteanlegen [$i][1] = ".";							                              // ScriptNamePrefix next, !!!! ACHTUNG! Dieser Script wird unten mit der Schaltvariablen verknüpft, daher auch . ausgeblendet
$Scripteanlegen [$i][2] = "
\$var = GetValueBoolean($Vid);
\$var = !\$var;
SetValueBoolean($Vid,\$var);
if(\$var === true)
   {
HID_SendEvent($HIDModulID, 0, chr($HausCode).chr($Steckdosencode).chr(0x01).chr(0x00).chr(0x00).chr(0x00).chr(0x00).chr(0x00).chr(0x7D).chr(0x7D).chr(0x00).chr(0x00));
  }
   else
   {
HID_SendEvent($HIDModulID, 0, chr($HausCode).chr($Steckdosencode).chr(0x00).chr(0x00).chr(0x00).chr(0x00).chr(0x00).chr(0x00).chr(0x7D).chr(0x7D).chr(0x00).chr(0x00));
  }";
$Scripteanlegen [$i][3] = " umschalten";                                  			// ScriptNameSuffix next
$i = $i + 1;                                                                     // Zähler einen ruff
/*	***********************************************************************************************************************************
	*                                                                                                                                 *
	* weitere Scripte erforderlich??,                                                                                                 *
	* kein Problem, den Bereich von ... nächsten Skript.. bis zum darauffolgendem markieren, kopieren, und hierüber einfügen.         *
	* Der Rest geht automatisch. Den Code kann man übrigens auch bei den Variablen mit einbauen, falls dort mehrere benötigt werden.  *
	*                                                                                                                                 *
	***********************************************************************************************************************************
	*                                                                          *
	*                           Anlegen der Skripte                            *
	*                                                                          *
	****************************************************************************/

for($i=0; $i < count($Scripteanlegen); $i++)                                                          // For Schleife einklingeln
   {
		$Scripteanlegen [$i][0] = IPS_CreateScript(0);                           								// neuen Script anlegen und ID merken
		IPS_SetName($Scripteanlegen [$i][0], $Scripteanlegen [$i][1].$Name.$Scripteanlegen [$i][3]);    // dem Skript den neuen, aussagekraeftigen, Namen verpassen
		IPS_SetParent($Scripteanlegen [$i][0], $ModID);                          								// den Skript im Hierarchiebaum richtig plazieren
		IPS_SetInfo($Scripteanlegen [$i][0], "$Info");                           								// Info zur Variable hinzufügen
		$Scripteanlegen [$i][4] = $Scripteanlegen [$i][0]. ".ips.php"; 											// Skriptdateinamen zusammenhäkeln
				$handle = fopen($Scripteanlegen [$i][4], "w");                         							// diesen Befehl findet man nicht im IPS Manual, da hilft nur das Suchen im PHP Handbuch
				fwrite( $handle,
				$InfoScriptePrefix.chr(13).chr(10).$Scripteanlegen [$i][2].chr(13).chr(10).chr(13).chr(10). $InfoScripteSuffix);
				fclose( $handle);
		IPS_SetScriptFile($Scripteanlegen [$i][0], $Scripteanlegen [$i][4]);                				// ohne das Zuweisen zur Datei lüppt dat nich
   }                                                          														// For Schleife beenden

/* ****************************************************************************
	*                                                                          *
	*                        Restarbeiten                                      *
	*                                                                          *
	****************************************************************************/

	IPS_SetVariableCustomAction($Vid, $Scripteanlegen [2][0]);							// Das Variablenprofil mit dem auslösenden Skript verbinden (Dann kann man schön schalten im WebFront)

/* ****************************************************************************
	*                                                                          *
	*  ein bißchen Service kann nicht schaden (obwohl es träge und dumm macht) *
	*                                                                          *
	****************************************************************************/

	function dec2bin_mitxStellenunddasandersrum($Dec,$Stellen)                    // kleine Funktion um die Stellung der DIP zu errechnen
		{
			$DIPCode = strrev(decbin($Dec));                                  		// dezimal zu bin wandeln und den Senf anders rum (weil 2 hoch null links steht und dann rechts weiter gezählt wird)
      	$DIPStellung = str_pad($DIPCode, $Stellen, chr(48));                   	// auf der rechten Seite ergänzen um die fehlenden Stellen mit 0
  			return $DIPStellung;
		}                                                                          // Ende der Funktion

	echo "DIP Schalter: " . dec2bin_mitxStellenunddasandersrum($HausCode,5) . dec2bin_mitxStellenunddasandersrum($Steckdosencode,5) . chr(10) . chr(13) . chr(10) . chr(13);   // Ausgabe
	echo "Bitte schön, viel Spass damit" .chr(10).chr(13) .chr(10).chr(13);
	echo "wünschen BJ´s und Helmut";

/*	**********************************************************************
	*                                                                    *
	*       Finale: dieses Skript löscht sich selber und räumt auf       *
	*                                                                    *
	**********************************************************************	*/

IPS_DeleteScript($IPS_SELF, true); 																						// Skript inklusive Datei loeschen

?>

Hallo Helmut, ich habe im Forum mal ein Script gefunden, welches ich immer noch verwende, um S7-Instanzen anzulegen.

z.B. Temperatur

<?
//function createS7Instance($intGroup, $intParent, $strName)
$name="'Sollwert Büro";
$Area=7;
$AreaAdress=101; //DB-Baustein
$Adress=156; //Adresse in DB
$bit=0;


$ObjektID = @IPS_GetObjectIDByName($name,0);
if ($ObjektID === false)
{  echo "Objekt nicht gefunden! Objekt wird erstellt";

    // Instanz erzeugen (Parameter: ModulID)
   $intInst=IPS_CreateInstance("{932076B1-B18E-4AB6-AB6D-275ED30B62DB}");

    // Erzeugte Instanz öffnen und weitere Werte setzen
    $objInst=IPS_GetInstance($intInst);

    IPS_SetName($intInst,($name));
    S7_SetType($intInst,7);
    S7_SetArea($intInst, $Area);
    S7_SetAreaAddress($intInst, $AreaAdress);
    S7_SetAddress($intInst, $Adress);
    S7_SetPoller($intInst, 1000);
    IPS_ApplyChanges($intInst);
$variable=IPS_GetStatusVariableID($intInst, "value");
IPS_SetVariableCustomProfile($variable, "ccitmp");
Settype($variable,"float");
//print_r ($variable);
$AC = @IPS_GetObjectIDByName("Archive Handler",0);
AC_SetLoggingStatus ($AC,$variable,true);
    IPS_ApplyChanges($AC);
}
else
  {echo "Die Objekt-ID lautet: ". $ObjektID," ";};

//print_r ($AC);
?>

oder Merker

<?
//S7Bit_Instanzen_Anlegen
$name="43.0";
$Area=6;
$AreaAdress=0;
$Adress=43;
$bit=0;
{

    // Instanz erzeugen (Parameter: ModulID)
   $intInst=IPS_CreateInstance("{932076B1-B18E-4AB6-AB6D-275ED30B62DB}");

    // Erzeugte Instanz öffnen und weitere Werte setzen
    $objInst=IPS_GetInstance($intInst);

    // Allgemeine Parameter
    // Name der Instanz  (aus den Übergabeparametern der Funktionn)
    IPS_SetName($intInst,($name));
    // Übergeordnete Instanz (aus den Übergabeparametern der Funktionn)
// IPS_SetParent($intInst,$intParent);
	IPS_ConnectInstance($intInst,44812 /*[Siemens S7]*/);
    // Änderungen speichern
    S7_SetType($intInst, 0);
    S7_SetArea($intInst, $Area);
    S7_SetAreaAddress($intInst, $AreaAdress);
    S7_SetAddress($intInst, $Adress);
    S7_SetBit($intInst/*[Container Heizung1]*/, $bit);
    S7_SetPoller($intInst/*[Container Heizung1]*/, 1000);
    IPS_ApplyChanges($intInst);

//$variable=IPS_GetStatusVariableID($intInst, "value");
//IPS_SetVariableCustomProfile($variable, "~switch");


}
?>

oder Eingänge

<?
//S7Bit_Instanzen_Anlegen
$name="Tür Garagenseite";
$Area=4;
$AreaAdress=0;
$Adress=1;
$bit=2;
{

    // Instanz erzeugen (Parameter: ModulID)
   $intInst=IPS_CreateInstance("{932076B1-B18E-4AB6-AB6D-275ED30B62DB}");

    // Erzeugte Instanz öffnen und weitere Werte setzen
    $objInst=IPS_GetInstance($intInst);

    // Allgemeine Parameter
    // Name der Instanz  (aus den Übergabeparametern der Funktionn)
    IPS_SetName($intInst,($name));
    // Übergeordnete Instanz (aus den Übergabeparametern der Funktionn)
   //IPS_SetParent($intInst,$intParent);
	IPS_ConnectInstance($intInst,20596 /*[Siemens S7]*/);
    // Änderungen speichern
    S7_SetType($intInst, 0);
    S7_SetArea($intInst, $Area);
    S7_SetAreaAddress($intInst, $AreaAdress);
    S7_SetAddress($intInst, $Adress);
    S7_SetBit($intInst/*[Container Heizung1]*/, $bit);
    S7_SetPoller($intInst/*[Container Heizung1]*/, 1000);
    IPS_ApplyChanges($intInst);

$variable=IPS_GetStatusVariableID($intInst, "value");
IPS_SetVariableCustomProfile($variable, "Window.Oeffner");


}
?>

und was super toll ist, ist das Script zum Erstellen von Links,
Ich lasse das einfach laufen und lösche die Sachen, die ich nicht brauche, das ist schneller als immer einzeln zu klicken :slight_smile:

<?

/*
Skript zum Links erstellen

Autor: Smokey
Datum: 13.11.2011

Das Skript erstellt für alle Objekte unter dem angegebenen Quellknoten einen Link und hängt diesen
unter den angegebenen Zielknoten (z.B. eine Webfrontkategorie). Dabei kann man angeben, welche Objekttypen
berücksichtigt werden sollen (z.B. nur Variablen).

*/

$Quellknoten = 52136 /*[Komponenten\Container\Container_Temperaturen]*/ ;   /* Welcher Knoten soll druchsucht werden? */
$Zielknoten = 25724 /*[Temperaturen]*/;    /* Wohin sollen die Links erstellt werden? */


// Welche Objekttypen sollen verlinkt werden?

//$SelectedObjectTypes[] = 0; /* Kategorie */
//$SelectedObjectTypes[] = 1; /* Instanz */
$SelectedObjectTypes[] = 2; /* Variable */
//$SelectedObjectTypes[] = 3; /* Skript */
//$SelectedObjectTypes[] = 4; /* Ereignis */
//$SelectedObjectTypes[] = 5; /* Media */
$SelectedObjectTypes[] = 6; /* Link */

//ab hier nichts mehr ändern!

$IPSObjects = IPS_GetObjectList ();

foreach ($IPSObjects as $IPSObjectID) {
   if (IPS_IsChild($IPSObjectID, $Quellknoten, true)) {
      $IPSObject = IPS_GetObject($IPSObjectID);
        if (in_array($IPSObject['ObjectType'],$SelectedObjectTypes,true)){
            $LinkID = IPS_CreateLink();       //Link anlegen
            IPS_SetName($LinkID, $IPSObject['ObjectName']); //Link benennen
 				IPS_SetName($LinkID, IPS_GetName(IPS_GetParent($IPSObjectID)).': '.$IPSObject['ObjectName']); //Link benennen
            IPS_SetName($LinkID, IPS_GetName(IPS_GetParent($IPSObjectID))); //Link benennen
				IPS_SetLinkChildID($LinkID, $IPSObjectID);     //Link verknüpfen
            IPS_SetParent($LinkID, $Zielknoten);   //Link unter Zielknoten hängen
        }
   }
}

?>

SUPER!!!

Vielen Dank das sind ja echt klasse Scripte! :slight_smile:

Zum Thema S7 Eingänge habe ich noch eine Frage Ich kann bei der Auswahl ja folgende sachen eintragen:

$Area=4;
$AreaAdress=0;
$Adress=1;
$bit=2;

Ist das jetzt der Eingang 4.2? Oder der Eingang 1.2? Das habe ich leider noch nicht rausfinden können.

Gibt es eigentlich eine Funktion mit der man sich die noch freien Variablen anzeigen lassen kann?
Ich habe ja die Professional Version mit max 1000 Variablen. ( was ja auch schon ne Menge Holz ist ).

Verwaltungskonsole öffnen. „Über“ in der Menüleiste anklicken. Lesen. :smiley:

Eingang 1.2