S7 Byte schreiben nur per Script möglich

Hallo zusammen,

ich habe mich in den letzten Wochen ein wenig in IPS in Verbindung mit einer S7-315 2DP versucht.
Dabei ist mir ein Problem aufgefallen: Wenn ich eine Instanz als Bit anlege, wird diese im Webfront angezeit und kann auch steuernd verändert werden. Lege ich nun allerdings z.B. ein Byte oder Float an, bekomme ich den Wert im Webfront angezeigt, kann diesen allerdings nicht verändern. Wenn ich als „Eigene Aktion“ ein entsprechendes Skript einbinde, kann ich damit den Wert auch auf die Instanz schreiben. Ist das normal, dass man für alles außer Bool Variablen Scripte zum schreiben braucht?

Bin über jeden Tipp dankbar.

Gruß Marc

So, ich denke die Urlaubszeit sollte jetzt so langsam rum sein…
Leider hat noch niemand auf meine Frage geantwortet :frowning:
Ich wäre echt über jeden Tipp dankbar. Wenn ich mich unverständlich ausgedrückt habe bzw. noch etwas nachliefern soll, einfach melden…

Gruß Marc

Hallo Marc,

so ganz verstehe ich nicht was Du machen möchtest…

Vielleicht postest Du mal ein paar Screenshots, Skripte, Variablen?

Joachim

Hallo Marc,
wenn ich Dich richtig verstehe hat das nichts mit S7-Zugriffen zu tun sondern nur mit dem WF !!

… im WF werden eben die Variablen immer entsprechend des „VARIABLENPROFILES“ (Userprofil) angezeigt und das sich eine Variable im WF ändern lässt muss eben auch ein „ACTIONSCRIPT“ zugeordnet sein


<?
//WF-Actionscript
SetValue($_IPS['VARIABLE'], $_IPS['VALUE']);
?>

… ein klassisches Variableneditierfeld gibts im WF nur für „STRING“ ==> das ist vermutlich was Du suchts !!

Spiel doch zuerst mal mit Testvariablen im WF und wenn Du damit soweit klar kommst versuche in die S7 zu schreiben/lesen

==> letztendlich wird immer über ein Script „ACTIONSCRIPT“ die Variable verändert bzw. kann natürlich dann auch das Script in ein Subsystem (SIEMENS S7) schreiben

tgusi74

Hallo zusammen,

erstmal besten Dank für die Antworten. :wink:

Ich denke der Beitrag von tgusi74 geht in die richtige Richtung.

Habe gerade mal ein paar Screenshots gemacht:

Anzeige im Webfrontend. Wir konzentrieren uns hier nur auf die Variablen „Licht Decke“ und „Solltemperatur“.

Das Licht wird als Bool Variable in IP-Symcon angelegt, die Solltemperatur als Float:

Die Instanz für das Licht ist ein Bit in einem S7-Datenbaustein:

Im Variablenprofil ist kein eigenes Script hinterlegt:
Variable_Licht.jpg

Die Instanz für die Solltemperatur ist ein Real in einem S7-Datenbaustein:

Im Variablenprofil für die Solltemperatur ist ein Script hinterlegt:
Variable_Solltemperatur.jpg

Hier der Inhalt des Scriptes

<?
S7_WriteReal(13323 /*[Küche\Solltemperatur]*/  , $_IPS['VALUE']);
 //Fügen Sie hier Ihren Skriptquellcode ein
?>

Jetzt zu meiner Frage/meinem Problem:
Ist es normal, dass ich ohne ein eigenes Script die Solltemperatur nicht zur S7 schreiben kann?
Das ist eigentlich kein Problem, wird allerdings bei einer großen Anzahl an Variablen sehr unübersichtlich. Zudem ist es meiner Meinung nach recht sinnfrei sol viele Scripte mit lediglich einer Zeile Code zu schreiben…

Gruß Marc

Habe zwar nicht so den Plan von S7… aber

Wähle in diesem Fenster den Reiter Statusvariablen und kontrolliere ob hier benutze Standardaktionen ausgewählt ist.
Dann sollte es auch ohne eigene Aktion gehen, so wie beim Bit.
Michael

Der Haken „Benutze Standardaktion“ ist gesetzt:

Kann man denn irgendwo nachsehen was „Standardaktion“ im Detail bedeutet?
Evtl. liegt da ja der Fehler…

Gruß Marc

Nein, das ist im Modul der S7-Instanz fest hinterlegt.
‚Eigentlich‘ sollte diese Standardaktion selber merken was für einen Wert wie geschrieben wird.
Zumal es bei Bit ja auch geht.
Könnte das ein Bug im S7 Modul sein :confused:
Michael

Danke für die Antworten. :wink:
Habe im Bug-Tracker mal einen entsprechenden Eintrag gemacht…

Gruß Marc

Jetzt zu meiner Frage/meinem Problem:
Ist es normal, dass ich ohne ein eigenes Script die Solltemperatur nicht zur S7 schreiben kann?
Das ist eigentlich kein Problem, wird allerdings bei einer großen Anzahl an Variablen sehr unübersichtlich. Zudem ist es meiner Meinung nach recht sinnfrei sol viele Scripte mit lediglich einer Zeile Code zu schreiben…

Hallo Marc,
was hintert Dich daran eine Actionscript zuzuordnen welches den Schreibbefehl über die dazugehörige S7-Instanz durchführt ??

<?
/*
WEBFRONT-ACTION-SCRIPT fuer S7-Instanzen

Release: 0.1
ReleaseDate: 16.01.2014

ReleaseNote:
16.01.2014 - R0.1 - Gusenbauer
 + Scriptmuster erstellt

*/


if($_IPS['SENDER'] == "WebFront")
{
 $S7_Instanz_ID = IPS_GetParent($_IPS['VARIABLE']);

 if ($S7_Instanz_ID >= 1)
    {
     if (IPS_GetInstance($S7_Instanz_ID)['ModuleInfo']['ModuleID'] = "{932076B1-B18E-4AB6-AB6D-275ED30B62DB}")
         {
         //SIEMENS ADDRESS - Objekt

         //Hier gehoert eigentlich zuerst geprueft ob die Verbindung zur PLC ueberhaupt besteht,
         //ansosnten kommen dann Fehler beim Schreibversuch !!!


         $S7_DataType = IPS_GetProperty($S7_Instanz_ID,"DataType");

            if ($S7_DataType == 0)
                {
                 $ret = S7_WriteBit($S7_Instanz_ID, _ConvertToBoolean($_IPS['VALUE']));
                }
            else if ($S7_DataType == 1)
                {
                 $ret = S7_WriteByte($S7_Instanz_ID, $_IPS['VALUE']);
                }
            else if ($S7_DataType == 2)
                {
                 $ret = S7_WriteWord($S7_Instanz_ID, $_IPS['VALUE']);
                }
            else if ($S7_DataType == 3)
                {
                 $ret = S7_WriteDWord($S7_Instanz_ID, $_IPS['VALUE']);
                }
            else if ($S7_DataType == 4)
                {
                 $ret = S7_WriteShortInt($S7_Instanz_ID, $_IPS['VALUE']);
                }
            else if ($S7_DataType == 5)
                {
                 $ret = S7_WriteSmallInt($S7_Instanz_ID, $_IPS['VALUE']);
                }
            else if ($S7_DataType == 6)
                {
                 $ret = S7_WriteInteger($S7_Instanz_ID, $_IPS['VALUE']);
                }
            else if ($S7_DataType == 7)
                {
                 $ret = S7_WriteReal($S7_Instanz_ID, $_IPS['VALUE']);
                }
            else
                {
                 $ret = false;
                }

            if ($ret == true)
                {
                 //Schreiben erfolgreich

                 S7_RequestRead($S7_Instanz_ID);

                 //somit muesste ja jetzt die Variablenaktualisierung im WF passieren,
                 //wie wenn SetValue($_IPS['VARIABLE'], $_IPS['VALUE']) gemacht wird !!

                }
            else
                {
                 //Fehler bei Schreiben der S7
                 IPS_LogMessage($_IPS['SELF'], 
                                "Fehler bei schreiben zur S7 mit Typ " . $S7_DataType . " - Wert = " . $_IPS['VALUE']);

                 //InfoBox ans ERSTEN Webfront zu schreiben !!! (Testweise)
                 WFC_SendNotification(IPS_GetInstanceListByModuleID("{3565B1F2-8F7B-4311-A4B6-1BF1D868F39E}")[0],
                                      $_IPS['SELF'] . " - " . IPS_GetName($_IPS['SELF']),
                                      "Fehler bei schreiben zur S7 mit Typ " . $S7_DataType . " - Wert = " . $_IPS['VALUE'],
                                      "Information",
                                      3);
                }
         }
     else
         {
          IPS_LogMessage($_IPS['SELF'], "Instanz ist kein SIEMENS ADDRESS - Objekt");
         }
    }
 else
    {
      IPS_LogMessage($_IPS['SELF'], "Objekt hat keine Elternobjekt");
    }

}


//SUBFUNCTIONS !!!!

function _ConvertToBoolean($Value)
 {
     $Value = strtoupper($Value);

     if (in_array($Value,array('TRUE', 'YES', 'Y', '1', 'ON', 'EIN', 'J', 'JA', true, 1), true))
        {
         return true;
        }
     else
        {
         return false;
        }
  }

?>

Habe das mal Testweise probiert und funktioniert aus meiner Sicht

tgusi74

WF_Screenshot_02.jpg

WF_S7_ACTIONSCRIPT.zip (1.25 KB)