Uhrzeit von IPS in S7 schreiben

Hallo
Ich möchte eine Uhrzeit die ich per OSK (im folg. Format: 20:00) im Webfront eingebe in einen DB der S7 schreiben.
Mit dem folgenden Script schreibe ich die Uhrzeit in eine IPS-Variable:


<?
if ($IPS_SENDER == "WebFront") {
SetValue ($IPS_VARIABLE, $IPS_VALUE);
}   

Bis hierher funktioniert auch alles.
Wie bekomme ich aber die Uhrzeit aus der Variablen in einen S7-Datenbaustein?

MfG
computerpap

Hallo,
das kommt natürlich darauf an wie Du die Zeit in der S7-Verarbeiten willst !!

Ich gehe mal davon aus das in der S7 ein Datenfeld als „DT“ existiert

Muster Systemzeit in den DB9 schreiben:

  
include_once ('./common_function.php');
include_once ('./s7_function.php');

$S7_Instanz_ID       = xxxxxx ;

$ActSysTime = time();
IPS_LogMessage("SETTIME", "Setze aktuelle Uhrzeit: " . date("y-m-d H:i:s", $ActSysTime));

//YEAR ==> DB9.DBB4 
S7_WRITE($S7_Instanz_ID,1,7,9,4,0,intval(hexdec(date("y",$ActSysTime))));

//MONTH ==> DB9.DBB5
S7_WRITE($S7_Instanz_ID,1,7,9,5,0,intval(hexdec(date("m",$ActSysTime))));

//DAY ==> DB9.DBB6
S7_WRITE($S7_Instanz_ID,1,7,9,6,0,intval(hexdec(date("d",$ActSysTime))));

//HOUR ==> DB9.DBB7
S7_WRITE($S7_Instanz_ID,1,7,9,7,0,intval(hexdec(date("H",$ActSysTime))));

//MINUTE ==> DB9.DBB8
S7_WRITE($S7_Instanz_ID,1,7,9,8,0,intval(hexdec(date("i",$ActSysTime))));

//SECOND ==> DB9.DBB9
S7_WRITE($S7_Instanz_ID,1,7,9,9,0,intval(hexdec(date("s",$ActSysTime))));

//Systemzeit gueltig setzen ==> DB9.DBX12.0
S7_WRITE($S7_Instanz_ID,0,7,9,12,0,TRUE);

… dazu die beiden Scripte: S7_FUNCTION.PHP und COMMON_FUNCTION.PHP in den Scriptordner kopieren

tgusi74

S7_FUNCTION.zip (11.1 KB)

Hallo tgusi24
Vielen Dank für Deine Hilfe. Ich bräuchte allerdings noch eine ausführliche Erklärung für deine Scripte, bzw. was in IPS noch einzustellen oder anzulegen ist.
Im SPS-Prog. ist alles soweit klar. Aber was muß ich alles in IPS noch machen?

Die beiden Scripte (S7_FUNCTION.PHP und COMMON_FUNCTION.PHP ) habe ich in den Scriptordner kopiert.
Eine S7-Instanz ist angelegt (Verbindung zur SPS steht). In dem Script von dir habe ich die Instanz-ID der S7-Instanz eingetragen.
Welche Werte sind bei der S7-Instanz einzutragen. Im SPS-Prog. ist der Datenbereich für die Uhrzeit genauso, wie von dir vorgegeben, also DB9.DBB4.
Wie muß ich das Script starten? Starte ich es per Hand, kommen jede Menge Fehlermeldungen. Wo wird denn die Uhrzeit eingetragen? Viele Fragen, ich hoffe du kannst mir helfen.

Dann hab ich noch ein Problem gefunden, was ich mir nicht erklären kann:
Wenn ich einen Integer-Wert in einen DB schreiben will und in der S7-Instanz folgende Einstellungen mache:
Datentyp: Integer
Area: Datablock
Area Adresse: 1
Adresse: 0

Dann sollte der Integer-Wert doch eigentlich nach DB1.DBW0 geschrieben werden. Wenn ich den DB anschaue, steht der Wert aber in DB1.DBW2, wie ist das zu erklären?

MfG
computerpap

Hallo,
die Beschreibung der Function steht im Script :wink:

S7_WRITE schreibt einen Wert an die S7 ueber die angegeben S7-Instanz

Paramter:   INSTANZ      Gibt die Instanz an ueber die geschrieben wird
            TYP          (0=bit, 1=byte, 2=word, 3=dword,
                          4=ShortInt, 5=SmallInt, 6=Integer, 7=Real)
            AREA         (0=SystemInfo, 1=SystemFlags,
                          2=AnalogInput CPU200, 3=AnalogOutput CPU200,
                          4=Input, 5=Output, 6=Flags, 7=Datablock,
                          8=InstanzDaten, 9=LokaleDaten, 10=UnknownedArea
                          11=Zaehler, 12=Timer, 13=PEW/PAW)
            AREAADDRESS  (Baustein)
            ADDRES       (StartByte)
            BIT          (Bit = wird nur bei TYP=0 verarbeitet)

            VALUE        Wert der geschrieben werden soll

Example:    S7_WRITE(123456,0,6,0,0,1,true);  //M0.1=1 setzen

Die Function S7_WRITE konfiguriert zuerst die S7-Instanz und löst dann den Schreibvorgang aus !! (Verbindung muss aufgebaut sein)

siehe auch
http://www.ip-symcon.de/forum/f53/ip-symcon-variablenzugriffe-ueber-namen-7231/#post59700
http://www.ip-symcon.de/forum/f41/s7-kommunikation-langsam-7214/#post59681

Zum Testen das Script manuell ausführen !! (Später den Code an entsprechender Stelle durch Events ausführen)

Welche Fehler kommen ???
Welche IPS-Version wird genutzt ???

Das Muster schreibt eben die aktuelle Systemuhrzeitzeit zur S7

$ActSysTime = time();

//da eben die Zeitwerte in der PLC in HEX sind muss eben enstprechend gewandelt werden 
//(z.B. 13 muss eben mit Decimal 19 in die Steuerung geschrieben werden um dann eben wieder HEX 13 zu haben) 

//DAY ==> DB9.DBB6
S7_WRITE($S7_Instanz_ID,1,7,9,6,0,intval(hexdec(date("d",$ActSysTime))));


Wenn Du eben deine Eingabe aus dem WF (20:00) schreiben willst musst Du dir dann zuerst die Zeit mit MKTIME zusammenbauen

zu 2.:
hast Du schon mal versucht mit ShortInt zu schreiben, bin mir jetzt nicht sicher aber vermutlich ist dann INTEGER in der S7 (4Byte lang) und eben dann auch noch nach dem SIEMENS Muster verdreht (LowByte / HighByte und LowWord/HighWord)

tgusi74

OK, soweit hab ich das verstanden, werd es morgen mal testen.
Danke für die Hilfe.

MfG
computerpap

Hallo,
hier ein „Actionscript“ um die Uhrzeit aus dem Webfront eingeben zu können

Weiters wird auch mit MKTIME die „Eingabe“ so aufbereitet das man diese zur PLC im Format „DATE_AND_TIME“ schreiben kann

tgusi74

WF_UHRZEIT_EINGEBEN.jpg

Hallo tgusi74

Mit

OK, soweit hab ich das verstanden
war ich wohl etwas voreilig. Kannst du mir nochmal genau erklären, welche Variablen ich anlegen muß und wo in deine Scripten noch Änderungen gemacht werden müssen. Wie schon weiter oben geschrieben, will ich die Zeit in den DB9 ab DBB4 schreiben.
Ich habe bisher die Variablen

Uhrzeit1 als String mit Actionsscript „WEBFRONT_TIME.php“
Uhrzeit1_FORMATED als String
Uhrzeit1_SYSTIME als String

angelegt.

MfG
computerpap

Hallo computerpap,
Du brauchst nur die „UHRZEIT1“ die beiden anderen Variablen sind nur zu verdeutlichen was im Actionscript passiert

Du kannst jetzt aber schon die Uhrzeit im Wf einegeben, oder ??

… im Actionscript, die ID der WF-Variable eintragen und eben mit S7_WRITE an die gewünschte Stelle schreiben

      $SysTimeInput = mktime ((int) $_hour ,(int) $_minute, 0, date("n"),$_day, date("Y"));


		 //* hier koennte man das schreiben zur PLC einfuegen
		 
		 if ($_IPS['VARIABLE'] == 15436 )
			 {
			  //SetValueStringByNameCC("AAA/BBB/CCC/UHRZEIT1_SYSTIME", $SysTimeInput);
			  //SetValueStringByNameCC("AAA/BBB/CCC/UHRZEIT1_FORMATED", date("d.m.Y H:i:s", $SysTimeInput));
			  //S7_WRITE(....);
			 }
		 //****************************************************

Ich hoffe es ist verständlich

Frage, Du hast oben geschrieben das Fehler kommen !! ==> was ist mit diesen ??

tgusi74

Hallo tgusi74

Hab die Variable „Uhrzeit1“ als String-Variabele angelegt, Profil „~Textbox“, und als Actionsscript „WEBFRONT_Time.php“ ausgewählt. Im Webfront kann ich per OSK eine Uhrzeit eingeben. Dann kommt eine Fehlermeldung, „Undefinierte Variable in Zeile 17“ !

Edit: Undefinierte Variable in Zeile 17 -> Problem gelöst

Wenn ich nun die Uhrzeit eingebe, kommen die Fehler wie sie auf dem angehängten Bild zu dehen sind.

Hallo,
Du benutzt offensichtlich eine IPS-Version <=2.4, den meine Funktionen ist alle auf IPS2.5 >= umgestellt :rolleyes:

Migration (V2.4->V2.5)

Neu: $IPS_* ist nun per $_IPS[li] verfügbar-Neu: RegisterGlobals ist off. Das bedeutet, dass alle Variablen vom WebServer nur noch per $_GET abrufbar sind. (PHP5.4 erfordert dies!)[/li]```


P.S.: habe den Actionscript oben ausgetauscht, da hier noch "alte" Variablenschreibweise enthalten war (Vorbereitung auf IPS3.0 :loveips: ), bitte neu herunterladen

tgusi74

Hallo tgusi74
Habe mein IPS auf 2.5 hochgezogen, kannst du das Actionsscript für die V2.5 nochmal zum Download bereitstellen?
Mit dem Actionsscript was im Moment zum Download bereitsteht, wird schon mal die Uhrzeit in die Variable „Uhrzeit_1“ geschrieben.
Was genau muß in den folgenden Zeilen stehen?

{ 
              //SetValueStringByNameCC("AAA/BBB/CCC/UHRZEIT1_SYSTIME", $SysTimeInput); 
              //SetValueStringByNameCC("AAA/BBB/CCC/UHRZEIT1_FORMATED", date("d.m.Y H:i:s", $SysTimeInput)); 
              //S7_WRITE(....); 
             } 

Hallo computerpap,
habe das Actionscript jetzt nochmals erweitert, das Script checkt nun auch ob die Verbindung zur S7 besteht und versucht nötigenfalls die Verbindung aufzubauen

Muster:
DB9 ab DBB4 ein Datenfeld als „DATE_AND_TIME“ (DB9.DBB4 - DBB11)


//im Script anzupassen auf jeden Fall die beiden IDs anpassen !!!

//hier die S7-InstanzID eintragen die zu schreiben verwendet werden soll
$S7_Instanz_ID       = 49043;



//* hier koennte man das schreiben zur PLC einfuegen
		 
if ($_IPS['VARIABLE'] == 18127)
  {
   //ID der STRING Variable eintragen die durch Webfront geandert wurde und das schreiben zur S7 ausloesen soll !!
   //
   //als Muster wird hier die Variable welche ueber das Webfront eingeben wurde an die S7 geschrieben,
   //es wir davon ausgegangen das in der S7 ein DB9 mit eine Datefeld "DATE_AND_TIME" von DBB4-DBB11 besteht

   IPS_LogMessage("WEBFRONT_TIME", "Schreibe Zeitstempel zur S7: " . date("y-m-d H:i:s", $SysTimeInput));

   //YEAR ==> DB9.DBB4
   S7_WRITE($S7_Instanz_ID,1,7,9,4,0,intval(hexdec(date("y",$SysTimeInput))));

   //MONTH ==> DB9.DBB5
   S7_WRITE($S7_Instanz_ID,1,7,9,5,0,intval(hexdec(date("m",$SysTimeInput))));

   //DAY ==> DB9.DBB6
   S7_WRITE($S7_Instanz_ID,1,7,9,6,0,intval(hexdec(date("d",$SysTimeInput))));

   //HOUR ==> DB9.DBB7
   S7_WRITE($S7_Instanz_ID,1,7,9,7,0,intval(hexdec(date("H",$SysTimeInput))));

   //MINUTE ==> DB9.DBB8
   S7_WRITE($S7_Instanz_ID,1,7,9,8,0,intval(hexdec(date("i",$SysTimeInput))));

   //SECOND ==> DB9.DBB9
   S7_WRITE($S7_Instanz_ID,1,7,9,9,0,intval(hexdec(date("s",$SysTimeInput))));
}

//****************************************************


[EDIT] Script aus beitrag gelöscht ==> bitte Downlaod aus Beitrag 16 benutzen

tgusi74

WF_STRING_VARIABLE.jpg

DB9_VARIABLENTABELLE_1437.jpg

IPS_MELDUNGEN.jpg

Hallo tgusi74
Habe dein neues Actionsscript eingebunden, die ID der S7-Instanz und die ID der WF-Variable angepaßt. Wenn ich im Webfront die Uhrzeit eingebe hagelt es Fehlermeldungen (siehe Anhang). Die Verbindung zur S7 steht definitiv, das habe ich getestet. Kannst du mal ein Bild von den Einstellungen deiner S7-Instanz anhängen, vielleicht habe ich da noch einen Fehler. Der DB9 ist angelegt und DB9.DBD4 hat als Datentyp „Date_and_Time“ zugewiesen bekommen.

Hallo,
hast Du wirklich die InstanzID angepasst ???

//hier die S7-InstanzID eintragen die zu schreiben verwendet werden soll
$S7_Instanz_ID       = xxxxxx;

tgusi74

Ja, hab ich gemacht. Habe auch mal versucht mit „Wert setzen“ in der S7-Instanz auf den DB zu schreiben, funzt einwandfrei. Welchen Datentyp hast du in der S7-Instanz ausgewählt?

Edit: Hab jetzt nochmal die S7-Instanz mit allen auswählbaren Datentypen getestet. Wenn ich die Datentypen „Bit, Byte oder Word“ auswähle, kann ich problemlos Werte in die S7 schreiben. Bei alle anderen Datentypen findet kein Schreibvorgang statt. Ich denke, dass hier das Problem versteckt sein kann. Nur warum funktionieren Datentypen wie Integer, DWORD oder Real nicht?

Was noch zu sagen wäre, ich verwende ein absolut „jungfreuliches“ IPS V2.5. Habe die V2.5 neu installiert und außer der S7-Instanz (mit Variablen und Scripten) gibt es noch nichts, außer Webfront mit den entsprechenden Variablen und Scripten.

Hallo,
habe nochmals das Script etwas umgebaut

… das Script war leider erst nach dem einfügen der Verbindungsueberwachung unter IPS2.6 lauffähig da beim ermitteln der Verbindungsinstanz zur S7-Instanz bei der Version 2.6 die „ConnectionID“ verwendet wird und <=2.5 die „ParentID“

Ich hoffe das jetzt alles in Ordnung ist

tgusi74

WEBFRONT_TIME.zip (1.99 KB)

Hallo tgusi74

Hab das neue Script eingebunden, aber es kommt immer noch ein Fehler (siehe Bild). Mit dem Fehler kann ich nichts anfangen, meine PHP-Kenntnisse halten sich in Grenzen.

Kannst du was zu dem Problem sagen, dass ich außer Bit, Byte und Word keine anderen Datentypen in die S7 schreiben kann?

Edit: Fehler gefunden, „ConnectionID“ mit „ParentID“ getauscht. Jetzt funzt es.
Super, vielen Dank.

Hallo,
tausche bitte auch noch die S7_FUNCTION.PHP hier ist der selbe „Fehler“ drin

tgusi74

S7_FUNCTION.zip (3.1 KB)