Anlegen von Instanzen aus S7 Symboltabelle

Hallo Zusammen,

ich würde gerne aus einer exportieren Symboltabelle (ASCII-Format) Instanzen anlegen.
Ich verwende das Script hier aus dem Forum, um Namen,Adressen etc. anzulegen.

//S7Bit_Instanzen_Anlegen
$name="Pumpe HK4";
$Area=6;
$AreaAdress=0;
$Adress=2;
$bit=7;
{

    // 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,22728 /*[Komponenten\Halle 8A\Heizung]*/);
	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);

Händisch geht dies auch. Nun wollte ich versuchen aus der vorhandenen Textdatei ein Array zu machen, die Namen und Adressen in die Platzhalter zu schreiben und dann mit einer Schleife das für alle Zeilen durchlaufen zu lassen.

das Exportfile sieht wie folgt aus :

126,AM Lampe 14.20KücheDeckeM 15.1 BOOL Merker für Deckenlampe Küche
126,AM Lampe 14.21.1KüchentkM 15.0 BOOL Merker für Decken/Hängelampe Küchentheke
126,AM Lampe 14.22Runddusch M 17.7 BOOL Merker für Runddusche Küche
126,AM Lampe 14.5HängeschranM 16.6 BOOL Merker für Einbaulampen Hängeschrank Küche

Später sollte das z.B. für die erste Zeile so aussehen :

$name=„Lampe 14.20KücheDeckeM“;
$Area=6;
$AreaAdress=0;
$Adress=15;
$bit=1;

Hat da jemand einen Idee oder einen Link mit eine Beschreibung für Dummies, wie man eine Textdatei zerlegt und dann entsprechend weiterverarbeitet?

Vielen Dank im Voraus

bastelfrosch

So,

nun bin ich schon mal ein kleines Stück weiter. Ich hab es geschafft, aus einer Datei die Daten einzulesen und weiter zu verarbeiten. Nun fehlt mir die Schleife, mit der ich Zeile für Zeile abarbeiten kann

<?
$dir = IPS_GetKernelDir()."S7";
$files = scandir($dir,1);
//print_r($files1);
//$zaehler = count ($files);
//echo $zaehler;

$File = $files[0];
//echo "$File"."
";
$filestring = file_get_contents("$dir//$File"); // gesamte Datei in einen String einlesen
$lines = explode("\r", $filestring);      // String in Zeilen zerlegen und in ein Array schreiben
$zeilennummer=100;
//print_r($lines[100]);
$data = explode (",",$lines[$zeilennummer]);
//print_r($data);
//$name = explode (",",$data[0]);
$name =(str_replace('"', '', $data[0]));
//rint_r($name);
$adresse = explode ("M",$data[1]);
//print_r($adresse);
$byte =explode (".",$adresse[1]);
//print_r($byte);
$byte2 =(str_replace('/t', '', $byte[0]));
//print_r($byte2);
$bit =(str_replace('"', '', $byte[1]));
//print_r($bit);

//S7Bit_Instanzen_Anlegen
//$name="Pumpe HK4";
$ArchiveHandlerID = 25852  /*[Archiv]*/;
$Area=6;
$AreaAdress=0;
$Adress=$byte2;
//$bit=7;
$parent=47085  /*[S7]*/ /*[S7]*/;




    // 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,$parent );

    S7_SetType($intInst, 0);
    S7_SetArea($intInst, $Area);
    S7_SetAreaAddress($intInst, $AreaAdress);
    S7_SetAddress($intInst, $Adress);
    S7_SetBit($intInst, $bit);
    S7_SetPoller($intInst, 1000);
    IPS_ApplyChanges($intInst);
$variable=IPS_GetStatusVariableID($intInst, "Value");
IPS_SetVariableCustomProfile($variable, "~Switch");
AC_SetLoggingStatus($ArchiveHandlerID, $variable, true);
IPS_ApplyChanges($intInst);

?>

jetzt muss ich es irgendwie hinbekommen die Variable $zeilennummer immer mit einem Wert +1 je Durchlauf zu füllen.
Hat hier vielleicht jemand einen Tip für mich ?

Vielleicht ohne Zeilennummer ?
Mit Logdatei als Beispiel.

	$zeilen = file (IPS_GetKernelDir().'\\logs\\logfile.log');

	foreach ($zeilen as $zeile)
		{

    	echo $zeile;

		}

Hallo 1007,

perfekter Anstoss ! Herzlichen Dank! nun klappt es

Hier das Ergebnis (falls das mal jemand benötigt) :

<?
$datei = (IPS_GetKernelDir().'S7\	est.txt');  //Pfad und Dateiname
$ArchiveHandlerID = 25852 /*[Archiv]*/  ;
$parent=13250 /*[S7]*/   ;                      //vorhandene Kategorie wo die Instanten rein sollen


$filestring = file_get_contents("$datei"); // gesamte Datei in einen String einlesen



$lines = explode("\r", $filestring);      // String in Zeilen zerlegen und in ein Array schreiben


//Schleife für jede Zeile

    foreach($lines as $line)
    {


$data = explode (",",$line);
$name =(str_replace('"', '', $data[0]));
$adresse = explode ("M",$data[1]);
$byte =explode (".",$adresse[1]);
$byte2 =(str_replace('/t', '', $byte[0]));
$bit =(str_replace('"', '', $byte[1]));



//Abrage ob vorhanden, sonst S7Bit_Instanzen_Anlegen

$Area=6;
$AreaAdress=0;
$Adress=$byte2;

$ObjektID = IPS_GetObjectIDByName($name,$parent);
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);

    // Allgemeine Parameter
    // Name der Instanz  (aus den Übergabeparametern der Funktionn)
    IPS_SetName($intInst,($name));
    // Übergeordnete Instanz (aus den Übergabeparametern der Funktionn)
   IPS_SetParent($intInst,$parent );

    S7_SetType($intInst, 0);
    S7_SetArea($intInst, $Area);
    S7_SetAreaAddress($intInst, $AreaAdress);
    S7_SetAddress($intInst, $Adress);
    S7_SetBit($intInst, $bit);
    S7_SetPoller($intInst, 1000);
    IPS_ApplyChanges($intInst);
    
$variable=IPS_GetStatusVariableID($intInst, "Value");
IPS_SetVariableCustomProfile($variable, "~Switch");
AC_SetLoggingStatus($ArchiveHandlerID, $variable, true);
IPS_ApplyChanges($intInst);
}


else
  {echo "Die Objekt-ID lautet: ". $ObjektID," ";};


	 }



?>

Vielen Herzlichen Dank!!

bastelfrosch

Gut das es funktioniert , aber das

$filestring = file_get_contents("$datei"); // gesamte Datei in einen String einlesen
$lines = explode("\r", $filestring);      // String in Zeilen zerlegen und in ein Array schreiben 

ist eigentlich nicht noetig.
Mit

    $zeilen = file ($datei);


wird schon die Datei zeilenweise in ein Array gelesen.

Schoenen Abend

ist eingebaut :slight_smile:

Hab auch noch eine Abfrage drin, ob die Kategorie existiert.

<?
$datei = (IPS_GetKernelDir().'S7\	est.txt');  //Pfad und Dateiname
$kategorie = "S7";
$ArchiveHandlerID = 25852 /*[Archiv]*/  ;






$parent=IPS_GetCategoryIDByName($kategorie,0)   ;                      //vorhandene Kategorie wo die Instanten rein sollen
		if ($parent === false)

				{  echo ("Kategorie nicht gefunden!  wird erstellt");
				$CatID = IPS_CreateCategory();       // Kategorie anlegen
				IPS_SetName($CatID, $kategorie); // Kategorie benennen

				}


				else
 				 {echo ("Die Kategorie-ID lautet:  ".$parent);
  
 				 
// ab hier geht es um die Daten


$lines = file ($datei);

//Schleife für jede Zeile

    foreach($lines as $line)
    {


$data = explode (",",$line);
$name =(str_replace('"', '', $data[0]));
$adresse = explode ("M",$data[1]);
$byte =explode (".",$adresse[1]);
$byte2 =(str_replace('/t', '', $byte[0]));
$bit =(str_replace('"', '', $byte[1]));



//Abrage ob vorhanden, sonst S7Bit_Instanzen_Anlegen

$Area=6;
$AreaAdress=0;
$Adress=$byte2;

$ObjektID = IPS_GetObjectIDByName($name,$parent);
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);

    // Allgemeine Parameter
    // Name der Instanz  (aus den Übergabeparametern der Funktionn)
    IPS_SetName($intInst,($name));
    // Übergeordnete Instanz (aus den Übergabeparametern der Funktionn)
   IPS_SetParent($intInst,$parent );

    S7_SetType($intInst, 0);
    S7_SetArea($intInst, $Area);
    S7_SetAreaAddress($intInst, $AreaAdress);
    S7_SetAddress($intInst, $Adress);
    S7_SetBit($intInst, $bit);
    S7_SetPoller($intInst, 1000);
    IPS_ApplyChanges($intInst);

$variable=IPS_GetStatusVariableID($intInst, "Value");
IPS_SetVariableCustomProfile($variable, "~Switch");
AC_SetLoggingStatus($ArchiveHandlerID, $variable, true);
IPS_ApplyChanges($intInst);
}


else
  {echo "Die Objekt-ID lautet: ". $ObjektID," ";};


     }

}

?>

Schönes Restwochenende !