# ILC 150 ETH Webserver



## Portisch (19 April 2012)

Hallo,

ich habe hier eine ILC 150 ETH die ja einen Webserver hat.
Mit WebVisit habe ich mir auch schon etwas zusammengebaut.

Nun frage ich mich aber, ob es nicht möglich ist eine eigene Homepage mit Java zu erstellen und diese dann auch auf dem Webserver zu betreiben.
Geht das überhaupt, oder ist das nur mit Webvisit möglich? Wie kann man dann auf die Variabeln der SPS (PDD) zugreifen?

Danke!


----------



## Portisch (19 April 2012)

Noch also Info dazu:
Ich habe Sensordaten die ich gerne beim Webserver anzeigen will.
Dazu möchte ich gerne amCharts einsetzen. Ein einfacher Test mit einem Example läuft ohne Probleme auf dem WebServer.

Nun stehe ich aber vor dem nächsten Problem:
Ich kann auf dem FTP keinen Ordner erzeugen!?
Ich gehe auf: ftp://<ip>/WEBS/
Eingeloggt als Anonymous.

Gibt es da ein anderes Login damit ich Ordner erzeugen kann?
Es kommt immer Error 500, Command not supported.


----------



## Portisch (24 April 2012)

Habe es rausgefunden! Mann muss ein XML an die Steuerung schicken.
Das Response XML enthält dann den Wert der Variable.

Auch geht das nicht nur vom WebServer sondern von irgendwo im Netzwerk. 


```
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  <meta http-equiv="content-type" content="text/html; charset=windows-1250">
  <meta name="generator" content="PSPad editor, [URL="http://www.pspad.com"]www.pspad.com[/URL]">
  <title>Read PPO from ILC 150 ETH</title>
  <script type="text/javascript">
        var xmlReqList;
        var xhttp;      
        
        // Function creates from Array of variables an XML file in WebVisit format
        function createGetHTTPlist(list)
        {
         var xhttpsend="<body><version>1.0</version><client>IMasterPhoenix5_14_05</client><client_ver>5.14.0501</client_ver><item_list_size>";
         var item_list=list.length;
         var i;
         xhttpsend = xhttpsend + item_list ;
         xhttpsend = xhttpsend + "</item_list_size><item_list></item_list></body>";
         xmlReq=loadXMLString(xhttpsend);
         for (i in list){
          newel=xmlReq.createElement("i");
          x=xmlReq.getElementsByTagName("item_list");
          x[0].appendChild(newel);
          newel=xmlReq.createElement("n");
          newtext=xmlReq.createTextNode(list[i]);
          newel.appendChild(newtext);
          x=xmlReq.getElementsByTagName("i");
          x[i].appendChild(newel);
         }
         return(xmlDoc);
        }
        
        //Create from String an XML file with browser detection
        function loadXMLString(txt)
        {
        if (window.DOMParser)
          {
          parser=new DOMParser();
          xmlDoc=parser.parseFromString(txt,"text/xml");
          }
        else // Internet Explorer
          {
          xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
          xmlDoc.async="false";
          xmlDoc.loadXML(txt);
          }       
        return xmlDoc;
        }       
      
        function createXMLHttpRequest() {
           if (window.ActiveXObject) { 
                try { 
                   // IE 6 and higher
                   xhttp = new ActiveXObject("MSXML2.XMLHTTP");
                } catch (e) {
                    try {
                        // IE 5
                        xhttp = new ActiveXObject("Microsoft.XMLHTTP");
                    } catch (e) {
                        xhttp=false;
                    }
                }
            }
            else if (window.XMLHttpRequest) {
                try {
                    // Mozilla, Opera, Safari ...
                    xhttp = new XMLHttpRequest();
                } catch (e) {
                    xhttp=false;
                }
            }
        }
        
        function sendRequest() {
            
            if (!xhttp) {
                alert("An Error occured when trying to initialize XMLHttpRequest!");
                return; // exit
            }
            xhttp.open("POST","/cgi-bin/ILRReadValues.exe",true);
            xhttp.onreadystatechange=sendRequest_callback;
            xhttp.send(xmlReqList);
        }            
        
        function sendRequest_callback() {             
            if (xhttp.readyState==4) {
                GetData();
            }
        }
        
        //Is executed if the confirmation from the webserver is recived
        function GetData(){
            var PLC_SYS_TICK_CNT;
            xmlDoc=xhttp.responseXML; //Convert respnse into xml document
            PLC_SYS_TICK_CNT = xmlDoc.getElementsByTagName("v")[0].childNodes[0].nodeValue; //Get first variable value
            document.getElementById("PLC_SYS_TICK_CNT").innerHTML = PLC_SYS_TICK_CNT;
        }         
        
  
        function init() {
            createXMLHttpRequest();
            xmlReqList = createGetHTTPlist(["@GV.PLC_SYS_TICK_CNT"]);
            sendRequest();
        }
        </script> 
  </head>
  <body>
    <input type="button" style="height: 23px; width: 20%;font-size:98%;text-align:center" onclick="init()" value="Get Data" width="50%" align="middle"/></br></br>
    <p id="PLC_SYS_TICK_CNT"></p>
    
  </body>
</html>
```


----------



## Phoenix Contact (24 April 2012)

Hallo Portisch,

da machst du uns ja bald Konkurrenz mit deiner eigenen Lösung 

Die jetzige Generation unserer Kleinsteuerungen unterstützt FTP bisher leider nur recht eingeschränkt. Die neuen 1xx1 Geräte können jedoch verschiedene FTP Nutzer mit verschiedenen Rechten einrichten.


Ich wünsche dir noch viel Glück mit deinem Vorhaben.


Mit freundlichem Gruß
Mark Schäfermann


----------



## Vaninger (29 Mai 2012)

Hallo Portisch,

ich benutze auch eine Phoenix ILC und finde deine Lösung sehr interessant. Leider kann ich aber nicht nachvollziehen, wie das funktionieren soll. Kannst du mir hierzu evtl. ein Beispiel oder weitere Informationen zukommen lassen?

Vielen Dank für deine Hilfe und Antwort

Grüße
Daniel


----------



## Portisch (29 Mai 2012)

Hallo!

Ich kann wenn erlaubt einmal ein Java Beispiel hochladen.
Ich habe ein Java Class für die Abfrage der Variabeln gemacht.
Diese Class kann dann in einem eigenen Java Applet oder einfach per HTML geladen werden.

Ich muss es erst aber noch etwas zusammenräumen...


----------



## Vaninger (29 Mai 2012)

Hallo Portisch,

das wäre echt klasse von dir. Würde mir das gerne mal anschauen, vielleicht kann ich es auch irgendwie nutzen...

Danke und schöne Grüße
Daniel


----------



## Portisch (30 Mai 2012)

Also hier einmal meine Basteleien!

Es ist der Java Source und ein Beispiel dabei.
Die "HTTPRequest.class" kümmert sich um den Datenaustausch zwischen Java Applet und der SPS.
Derzeit ist nur lesen der Vars eingebaut. Für ein Schreiben der Vars habe ich noch keine Zeit gehabt.
Die "SPS_JInterface.class" ist das eigentliche Java Applet und muss über die "entry.html" geladen werden.

Wenn man auf dem FTP der SPS in den Ordner WEBS den Inhalt des ZIP Files kopiert sollte es schon gehen.
Vielleicht muss in der "entry.html" die IP Adresse der Steuerung eingegeben werden.
Hier im Firmennetzwerk geht wegen Firewall usw. die 127.0.0.1 nicht. Muss man probieren!

Die Java Files können einfach mit dem Java-Editor bearbeitet werden.
Die PPOs sind in der "SPS_JInterface.java" anzupassen und neu zu kompilieren.
Die PPOs Bezeichnung holt man sich aus der Datei "PDD.csv".
Diese ist hier zu finden: "..\ProjektName\ProjektName\C\STD_CNF\R\STD_RES\PDD.csv"
Über die Java Console kann man sich ansehen ob man Erfolg hat.

Auch habe ich meine Sachen zu dem amCharts mit beigelegt.
Das ist eine Aufzeichnung von Temperaturen, Luftdruck, Luftfeuchtigkeit,...

Für das ganze ist kein WebVistit erforderlich!
Es ist halt nicht Drag & Drop sondern man muss selbst etwas Java programieren.
Ist aber nicht so schwierig! Das ganze habe ich in ca. 1 Woche ohne Java Kentnisse zusammengebaut... 




Anhang anzeigen ILC_SPS_Java_Interface.zip


----------



## Mobi (31 Mai 2012)

Super. Das kann ich ja glatt für meine selbstgebaute Visu nehmen. Muss man sich nicht noch Visu+ zulegen oder WebVisit.
Wenn ich das schon gewusst hätte, dass das so einfach ist. Woher hast du denn die Info Portisch, das das über XML geht?


----------



## Portisch (31 Mai 2012)

Mobi schrieb:


> Woher hast du denn die Info Portisch, das das über XML geht?


Nach langem Googeln... 

Google einfach nach "ILRReadValues.exe". Dann findest du den Java Script Source von _www.ilc150.net.
_Nachdem mir das Java Script zu wenig war habe ich es für echtes Java umgesetzt.


----------



## Vaninger (31 Mai 2012)

Hallo Portisch, hallo Mobi,

@ Portisch
schon mal vielen Dank für das Bereitstellen deiner Daten/Beispiele. Werde auch mal versuchen, mir hier eine Visu oder dergleichen selbst zu stricken. Leider muss ich mich hierzu erst einmal in Java einarbeiten...

@Mobi
Hast du dir wohl bereits eine eigene Visu erstellt? Hab dir übrigens eine Mail bezüglich deiner Hausautomatisation mittels Phoenix SPS geschickt, vielleicht hättest du hier noch ein paar Infos für mich. Danke!

Möchte später versuchen, über mein Android Tablet PC die Visualisierung zu machen und nicht immer einen PC als Server laufen zu lassen...

Schöne Grüße
Daniel


----------



## Portisch (1 Juni 2012)

> Möchte später versuchen, über mein Android Tablet PC die Visualisierung zu machen und nicht immer einen PC als Server laufen zu lassen...



Das ist auch mein Plan!
Ich liebäugle mit dem Flytouch 3:
http://www.amazon.de/Flytouch-Super...=sr_1_1?s=ce-de&ie=UTF8&qid=1338528747&sr=1-1
Das hätte auch einen echten LAN Anschluss für Wandmontage.

Nur zur Info: das Java Applet kann auf irgendeinen PC ausgeführt werden. Es muss nicht auf dem Webserver der ILC laufen. Einfach die IP Adresse anpassen. Man kann mit jeder beliebiger Programmiersprache (C++, Delphi, C#,...) einfach per HTTP Post Request sich die Daten von der SPS holen.

Ich habe es halt als Java umgesetzt damit es mit jedem Beliebigen Browser geöffnet werden kann. Wenn man ein extra Delphi Programm schreibt geht es zwar auch, aber man braucht halt wieder Windows...


----------



## Mobi (1 Juni 2012)

Der HTTP Request kommt mir momentan ganz recht, weil bisher mache ich das über ein Array, welches ich einfach per TCP hin und her schicke.
Mit einem HTTP Request in Form von XML hatte ich schon Bekanntschaft gehabt mit Steuerungen von Reis-Robotern. Das ist bequem zu handhaben.

Android steht bei mir auch auf der ToDo-Liste. Hab mir auch schon Basic4Android runtergeladen und schon "Hello World" gemacht 
Als nächstes werde ich mir dann die Vollversion kaufen, damit ich dann auch Bibliotheken einbinden kann, wegen Netzwerk und so.


----------



## Vaninger (1 Juni 2012)

Hallo Portisch, hallo Mobi,

da bin ich ja mal gespannt, ob es uns gelingt, eine Visualisierung für das Android System und Phoenix zusammen zu basteln. Ich muss mich hierzu leider erst noch ein wenig in die Materie einlesen und -arbeiten. Klingt auf jeden Fall schon mal sehr interessant. 

Soweit ich weiß, sind JavaApplets auf dem Android System nicht möglich, oder? Das Programm Basic4Android werde ich mir auch mal anschauen, interessiert mich auch schon länger...

Falls bei euch neue Erkenntnisse auftauchen, nur her damit 

Gibt ja nicht so viele hier im Forum, die Phoenix ILC Controller verwenden... Bei weiteren Fragen, und die tauchen sicherlich auf, werde ich mich wohl wieder an euch wenden müssen.

Schöne Grüße
Daniel


----------



## Portisch (2 Juni 2012)

> Soweit ich weiß, sind JavaApplets auf dem Android System nicht möglich, oder? Das Programm Basic4Android werde ich mir auch mal anschauen, interessiert mich auch schon länger...



Ich habe noch ein Android Gerät und kann es nicht testen. Aber das Java Applet läuft dann ja auf dem Webserver der SPS und nicht auf dem Android Gerät.
Damit es dann aber Angezeigt werden kann muss aber dann ein Browser benutzt werden (ich teste im Moment mit dem IE9) der Java unterstützt.


----------



## Mobi (2 Juni 2012)

Ich wollte direkt eine App schreiben.


----------



## Vaninger (3 Juni 2012)

@ Mobi: 
Eine direkte App wäre das Nonplusultra, das übersteigt aber meine bisherigen Fähigkeiten bei weitem... Wie hast du dir das gedacht? Habe zumindest mal das Hello World Programm mit Basic4Android gemacht, das hat einigermaßen geklappt.

@ Portisch: 
Habe übrigens heute einmal probiert, die entry.html von dir auf meinem Android Tablet (Asus EEPad) zu starten, leider ohne Erfolg. Ich habe hierzu den Ordner WEBS auf meinen ILC 150 Controller kopiert und dann mittels Firefox auf die Datei zugegriffen. Im Browser taucht dann die Fehlermeldung auf, dass ein Plugin benötigt wird, damit der Inhalt angezeigt werden kann. Hier werden wohl die Probleme mit JavaApplets ihren Teil dazu leisten...

Schöne Grüße
Daniel


----------



## Portisch (3 Juni 2012)

Ja, Firefox braucht ein Java Plugin!
http://support.mozilla.org/de/kb/Das%20Java-Plugin%20mit%20Firefox%20nutzen

Mein Blackberry aber z.b. unterstützt auch Java im Webbrowser.
Am liebsten würde ich mir auch eine eigene App mit Delphi machen.

Das Programm braucht dann aber wieder Windows. Da kann ich dann nicht von einem Handy drauf zugreifen. Auch bräuchte man dann wieder einen extra Server wo die App (wegen Windows) drauf läuft.
Die SPS läuft ja eh immer und darum wäre es eigentlich Blödsinn einen extra Server laufen zu haben der auch wieder Strom braucht...


----------



## Mobi (3 Juni 2012)

Also die App läuft doch dann auf dem Android. Wieso sollte es auf einem Server laufen?

@Daniel: Willst du dir auch die Vollversion kaufen? Ich will sie mir noch in diesem Monat zulegen. Wie die App aussehen soll, weiß ich noch nicht. Ich wollts erstmal zum laufen bringen, sodass ich Werte erhalte und dann mache ich mich ans Aussehen.


Die Visu für den PC ist eine Exe. Da werde ich mich kommende Woche wieder dransetzen.


----------



## Portisch (4 Juni 2012)

> Also die App läuft doch dann auf dem Android. Wieso sollte es auf einem Server laufen?


Naja, ich habe im Moment kein Android Handy sondern ein Blackberry. Deswegen ein Java-Applet das auf dem Webserver der SPS läuft, damit ich Client unabhängig bin.


----------



## Mobi (4 Juni 2012)

Ahh ok. Was läuft denn da für ein OS drauf?

Kannst du auch mal die HTTPRequest.class als txt hochladen?


----------



## Vaninger (4 Juni 2012)

Hallo Mobi,
schau mal unter Antwort #8, da ist unten im Anhang eine Zp-Dtei, aus dieser müsstest du dir die HTTPRequest.class entnehmen können. 
Habe auch vor, mir eine Lizenz für Basic4Android zu kaufen. Das Aussehen der App kan man im Nachhinein ja noch verbessern, wichtig wäre, wie du schon geschrieben hast, erstmal Werte ins App zu bekommen. 

Schöne Grüße
Daniel


----------



## Mobi (4 Juni 2012)

Die class hab ich auch. Nur ich wollte mir jetzt nicht noch extra ein Java-Editor installieren.

Wenn sich noch mehr finden die auch Basic4Android haben wollen, könnte man ja solche Multi-Lizenz kaufen.
Edit: Hier, 30 für 249 Dollar.


----------



## Portisch (4 Juni 2012)

> import org.w3c.dom.*;
> import java.io.*;
> import javax.xml.parsers.DocumentBuilder;
> import javax.xml.parsers.DocumentBuilderFactory;
> ...


_

Die HTTPRequest.java kann man sich einfach mit einem Texteditor ansehen...

Mittlerweile habe ich rausgefunden, dass der Blackberry Internetbrowser zwar Java-Script aber leider kein Java-Applet unterstützt 
Bin nun am überlegen ob ich ein Win32 Delphi Programm mache. Das Programm kann dann die Daten auswerten/speichern/mittelwerte berechnen usw. Über ein Webinterface vom Programm würden die Sachen dann auch Online verfügbar sein.
Ein Windows Server für mein LAN Netzwerk wird sowieso benötigt (Haupsächlich für TV). Dieser müsste dann halt immer laufen...:icon_frown:
Wieder ~30€ im Jahr an Stromkosten..._


----------



## Portisch (4 Juni 2012)

Weil ich gerade Zeit hatte...

Anbei ein kleines Windows Programm um von einer ILC die Werte abfragen zu können.
Einfach in der Settings.xml die IP anpassen.
Dann noch in der PDD.xml die gewünschten Variabeln reinschreiben.

mfg


----------



## Vaninger (4 Juni 2012)

Hallo Portisch,
wollte gerade dein kleines Programm ausprobieren, leider kam die folgende Fehlermeldung:



Was habe ich hier falsch gemacht?

Grüße
Daniel


----------



## Mobi (4 Juni 2012)

Liegt es vielleicht daran, weil du es zweimal gestartet hast?


----------



## Vaninger (4 Juni 2012)

Hallo Mobi,
danke für die Antwort. Habe es gerade nochmal probiert, daran liegt es nicht. Deine Idee mit der Basic4Android Mehruser Idee war sehr gut, leider etwas zu spät. Habe mir heute früh eine Einzellizenz gekauft, die normale für 28,50 €. Gab irgendwie nochmal 30 %. Hast du schon eine Idee, wie man die Werte aus der SPS in ein App bekommen könnte. Werd mich jetzt erstmal in das Programm einlesen...

PS: Die Bilder folgen demnächst...

Schöne Grüße
Daniel


----------



## Mobi (4 Juni 2012)

Ahh gut. Ich werde sie mir in 1-2 Wochen dann auch zulegen. Schau mal hier, die haben echt gute Hilfen.
http://www.basic4ppc.com/android/help/http.html


----------



## Portisch (4 Juni 2012)

Ehrlich gesagt habe ich das schnell und dirty programmiert.
Werde Morgen noch ein paar Absicherungen einbauen.

Vielleicht zum Testen nur einmal einen einzelnen String als PPD im XML eintragen.
Boolean und String habe ich getestet, aber ich weis nicht wie es sich mit Integer und anderen Sachen verhält!

Wenn du meine PDD.xml verwendest müsstest du lauter "var not found..." bekommen.


----------



## Vaninger (4 Juni 2012)

@ Mobi: 
Danke für den Tipp

@Portisch:
Ich werde es morgen nochmals probieren und dir dann Rückmeldung geben. Mit was hast du die Exe erstellt?

Schöne Grüße
Daniel


----------



## Mobi (4 Juni 2012)

Kein Error-Handling, ne ne ne. Du musst immer von einem DAU ausgehen. Eventuell werde ich mein Testprogramm morgen fertig haben.


----------



## Portisch (5 Juni 2012)

Wollte es gestern ja nur schnell probieren und bei mir gab es keinen Fehler. ;-)

Hier nun eine bessere Version. Mal sehen ob nun die Ursache des Fehlers rauskommt.
Bitte neue "Settings.xml" nehmen und die IP wieder eintragen.
Die PDD.xml ist nicht mehr in Verwendung. Stattdessen einfach die "PDD.csv" vom PC WorX Projekt in den gleichen Ordner kopieren.


----------



## Portisch (5 Juni 2012)

Noch ein kleines Update!

Habe noch das Setzen von Vars in der ILC eingebaut.
Dazu einfach eine Var in der Liste markieren und auf "Set value for Var" drücken. Dann kommt ein Eingabefenster.
Aktiv getestet habe ich derzeit nur eine BOOL Var und das geht einwandfrei.
Bei Boolean muss man '0' für False und '1' für True eingeben.


----------



## Mobi (5 Juni 2012)

Hab jetzt mal meine Version gemacht. Schreiben der Vars hab ich (noch) nicht.
Einfach mal testen. PDD.csv in das Verezichnis wo die Exe auch ist. Eine .ini oder .xml hab ich jetzt erstmal noch nicht gemacht zum speichern der IP-Adresse und so.


----------



## Mobi (5 Juni 2012)

@Portisch: Wenn kein AutoUpdate an ist müsstest du nochmal eine Request machen nach dem WriteVal. Damit es auch in der Listview richtig steht oder halt die Listview ändern ohne einen Request.


----------



## Portisch (5 Juni 2012)

Mobi schrieb:


> @Portisch: Wenn kein AutoUpdate an ist müsstest du nochmal eine Request machen nach dem WriteVal. Damit es auch in der Listview richtig steht oder halt die Listview ändern ohne einen Request.


Habe ich auch schon bemerkt... Ist ein kleiner Schönheitsfehler der nun behoben wurde.


----------



## Vaninger (6 Juni 2012)

Hallo Portisch, hallo Mobi,

vielen dank für die Bereitstellung der beiden Programme. Habe diese gestern Abend noch kurz ausprobieren können, leider funktionieren beide nicht bei mir. Mobi´s Programm bekommt keine Values, bei Portisch kommt die bei Antwort #26 bereits schon einmal aufgetauchte Fehlermeldung, dass irgendwas in Zeile 2 nicht stimmt. Habt ihr hierzu irgendwelche Ideen?

Mit welchen Programm(en) habt ihr die Exe erstellt? Vielleicht könntet ihr mir den Code zur Verfügung stellen, damit ich nachvollziehen kann, wie der HTTPRequest zur Steuerung abläuft.

Danke und schöne Grüße

Daniel


----------



## Mobi (6 Juni 2012)

So hab jetzt auch das schreiben mit reingebracht. Dazu ist noch eine Prüfung hinzugekommen, das man keinen falschen Wert eingeben kann, welcher den Datentyp nicht entspricht. Und bei Bollean könnt ihr true, false, 1 und 0 angeben. Auch stimmt was noch nicht mit der Updatezeit. Wenn ich 100ms auswähle habe ich nur ca. 300ms. Schaut mal ob es bei euch auch so ist.
Quellcode ist auch drin.


----------



## Mobi (6 Juni 2012)

@Vaninger: Hast du einen Proxy zwischen?


----------



## Vaninger (6 Juni 2012)

Hallo Mobi,

ich habe die Steuerung über einen WLAN-Router, der als WLAN Accesspoint und in diesem Fall als Switch dient, mit dem PC über Netzwerkkabel verbunden.
Werde es morgen nochmal mit direkter Verbindung probieren, mal schauen, was dann passiert.

Nochmal vielen Dank für die Bereitstellung der Testdatei.

Schöne Grüße
Daniel


----------



## Portisch (6 Juni 2012)

Auch von mir eine Frage für Vaninger:
Ich habe ja extra ein Log Memo eingebaut. Was steht da?



> Wenn ich 100ms auswähle habe ich nur ca. 300ms. Schaut mal ob es bei euch auch so ist.


Ist bei mir so ca. zwischen 99-107ms Real. Also in Ordnung!

So eine Absicherung der SetVar habe ich auch drinnen.
Das mit 'True' == 1 und 'False' == 0 habe ich noch nicht drinnen.

Ich habe eine Funktion bei der ich eine Typenlose Variable übergeben kann. Aus dem Type vom PDD.csv wandelt die Funktion dies dann richtig in einen String um:

```
// convert value to string
  if Pos('BOOL', VarType) > 0 then
  begin
    vValue := AnsiString(BoolToStr(Boolean(NewValue)));
  end
  else
  if Pos('STRING', VarType) > 0 then
  begin
    vValue := AnsiString(NewValue);
  end
  else
  if Pos('REAL', VarType) > 0 then
  begin
    vValue := AnsiString(FormatFloat('0.000000', Extended(NewValue)));
    // correct country settings
    vValue  := StringReplace(vValue, ',', '.', [rfReplaceAll]);
  end;
```

Habe jetzt aber noch nicht alle Typen drinnen. Integer, Word, Dword z.B. fehlt noch...
Meine App ist Delphi 2010.


----------



## Mobi (6 Juni 2012)

Hmm seltsam, naja egal, Hauptsache es funktioniert.
Hab jetzt noch Word mitreinbracht. Man kann entweder den Wert als boolean vorgeben, also 2#11001111, als Hex 16#CF oder als Dezimal einfach den Wert, also 207.
Ich hab jetzt BOOL, INT, DINT, WORD und STRING(80).
Und meins ist immernoch kleiner als deine Exe Portisch.


----------



## Portisch (6 Juni 2012)

Taja, dass liegt an Delphi. Mit einigen Aufwand könnte ich es kleiner bekommen.
Aber wer schaut da heute bei Flatrate Internet und Terrabyte Platten noch drauf...


----------



## Mobi (7 Juni 2012)

Heey auf meinem Vista-Laptop hab ich 100ms! Sch*** XP.

Ich schau noch drauf, ein Laptop hat schon 2-3 Jahre auf dem Buckel.


----------



## Vaninger (7 Juni 2012)

Hallo,

habe beide Programme probiert, leider geht immer noch  keines. Wahrscheinlich passt da bei mir irgendwas nicht, muss ich  nochmal schauen.
Die Fehlermeldung schaut übrigens folgend aus:




Schöne Grüße
Daniel


----------



## Mobi (7 Juni 2012)

Und bei meinem Programm? Geht Request und wenn nein, kommt dann ne Fehlermeldung?


----------



## Vaninger (8 Juni 2012)

Hallo Mobi,

dein Programm läuft zumindest, da die Real Update Time immer aktualisiert wird. Leider wird aber kein Value angezeigt...

Schöne Grüße
Daniel


----------



## Mobi (8 Juni 2012)

Hast du mal nebenbei Wireshark mitlaufenlassen, um zu gucken ob überhaupt was kommt? Am besten ist dann auch, wenn der Debugmode von PC Worx aus ist und der Kontrolldialog geschlossen. Dann kannst du am besten die Pakete auseinanderhalten.


----------



## Mobi (8 Juni 2012)

Hier nochmal ein Update. Jetzt mit Memo. Und kleine Bugs noch bereinigt.

@Portisch: Schau mal was im Memo steht.


----------



## Vaninger (8 Juni 2012)

Hallo,

habe gerade das Firmwareupdate 3.90 auf meinem Controller aufgespielt, jetzt funktionieren die beiden Programme samt Request. Die Updaterate liegt bei ca. 100ms.
Näheres werden die nächsten Tests zeigen...

Vielen Dank für euere Hilfe!

Daniel


----------



## Mobi (8 Juni 2012)

Ich hab jetzt noch den <body> geändert unzwar so:

```
<body><version>1.0</version><client>ILC_PDD_Request</client><client_stamp>1325062961602012</client_stamp>
```
Client ist ILC_PDD_Request, zur eindeutigen Feststellung von wem der Request kommt.
Und 1325062961602012, von wann der Request ist und welche Response zu welchem Request gehört.
Also 13 Uhr, 25 Minuten, 6 Sekunden, 296 Millisek., 160 Tag des Jahres 2012.


----------



## Portisch (9 Juni 2012)

> habe gerade das Firmwareupdate 3.90 auf meinem Controller aufgespielt, jetzt funktionieren die beiden Programme samt Request.


Ok, damit habe ich natürlich nicht gerechnet, dass das Firmware abhängig ist.
Das Log sagt auch: 'ERROR: unknown function ILRReadValues.exe!'...

Da werde ich noch einen Schutz einbauen - mit einem Hinweis: Firmware needs to updated!



> Client ist ILC_PDD_Request, zur eindeutigen Feststellung von wem der Request kommt.


Ist sicher Sinnvoll bei einer Multithreading Anwendung wenn mehrere Anfragen gleichzeitig geschickt werden. Da könnte es sein, dass die SPS je nach Bearbeitungszeit die Antworten in einer anderen Reihenfolge an den Client zurückschickt.


----------



## Portisch (9 Juni 2012)

Jetzt ich nochmal zu diesem Thema.

Als Beispiel habe ich in meine App einen WebServer eingebaut.
Über die 'Settings.xml' kann der Port des Webservers eingestellt werden.

In der 'Index.html' kann man dann seine PDD Werte einbauen.
Wenn man nun z.b. im Internetbrowser 'http://127.0.0.1:8080' eingibt sollte die Html Seite angezeigt werden.

Bei jedem Aktualisieren der Html Seite werden die Werte von der PDD.csv neu an die Html übergeben.

Ich habe es mal mit meinen Daten etwas ausgefüllt um zeigen zu können wie es funktioniert.
Nun kann man sich mit Leichtigkeit eine Html Webpage mit Graphiken, Werten usw. zusammenbauen.
Bekommt man einen neuen PDD Wert dazu braucht nur die Index.html bearbeitet werden.


----------



## Vaninger (12 Juni 2012)

Hallo ihr beiden,
nochmal vielen Dank für die Bereitstellung der Dateien. Hatten am Wochenende ein kleines Fest, konnte mich deshalb nur sehr wenig mit der Steuerung beschäftigen...

@Portisch:
Habe dein kleines Programm herunter geladen, Request funktioniert problemlos. Kurz noch eine Frage zur Index Html. Wo muss diese hin? Muss diese auf den Webserver der ILC abgelegt werden?
In der Index.html schreibe ich dann quasi meine Variablen anstelle der deinigen hinein, beim Aktualisieren aktualisiert sich dann der Wert, oder?

Danke für die Antwort!

Grüße
Daniel


----------



## Mobi (12 Juni 2012)

Der wwwroot Ordner mit der html muss dahin wo die Exe auch ist.
Der Webserver ist mit in der Exe.


----------



## Portisch (13 Juni 2012)

Mobi schrieb:


> Der wwwroot Ordner mit der html muss dahin wo die Exe auch ist.
> Der Webserver ist mit in der Exe.


Genau! Einfach den Inhalt des Zip-Files entpacken und es sollte gehen.

Anbei noch eine erweiterte Version, wo man nun auch Werte über den WebServer setzen kann.
Derzeit wird alles aus String aus der Html Seite an die ILC geschickt.
Ausser Boolean, da wird 'True' und 'False' verlangt da diese dann in 0 und 1 umgewandelt werden.

Bei der 'Main.V004' kann der Wert über den Button oder auch über das 'Icon.gif' gesetzt werden.
Was mir noch fehlt ist ein Togglebutton, der wie ein Taster im Haus funktioniert um nur einen Impuls an die ILC schicken zu können.

Das Index.html zeigt wieder wie man sich etwas zusammen bauen kann...


----------



## Vaninger (3 Juli 2012)

Hallo Leute,

bin gerade dabei, mich noch ein wenig in die Materie einzuarbeiten. Habe mir hierzu mal den Code von Mobi angeschaut und versucht zu verstehen, wie hier der Request gesendet und auch die xml-Datei zusammengebastelt wird. Da ich hiermit noch gar nix gemacht habe, fällt es mir leider etwas schwerer als gedacht...

Was machen eure Versuche? Werde heute Abend mal meine ILC350 mit Strom versorgen, mal schauen ob es hier Probleme gibt oder ob alles funktioniert!

Außerdem würde ich gerne das Projekt mit Basic4Android angehen, hierzu bedarf es aber auch noch einiger Einarbeitungszeit. Habe ein ähnliches Projekt gefunden, wo eine Wago 750-841 über Android gesteuert werden kann.

Hier die Links:
http://www.ituilerie.com/?p=1734#more-1734
http://www.basic4ppc.com/forum/addi...l-updates/12272-library-wagoid.html#post73351

Nun denn, über Neuigkeiten zu eueren Projekten wäre ich sehr erfreut.

Schöne Grüße
Daniel


----------



## Mobi (4 Juli 2012)

Hallo,


xml-Datei?? Das ist nur ein String, welchen ich verschicke.

Bei B4A bin ich noch nicht weitergekommen. Hab momentan andere Projekte am laufen. Ich hoffe aber, dass ich in 2-3 Wochen dazu komme.
Schreibe momentan an einen Logger für eine Uni. Die haben eine Phoenix-Steuerung und dort setzte ich die Request-Technik ein. Und nebenbei ein bisschen an meiner Visu.


----------



## Vaninger (4 Juli 2012)

Hallo Mobi,

danke für die Antwort. Ich hatte leider auch noch nicht die Zeit, mein Projekt weiter zu machen, aber was will man machen.
Kurz ein paar Anmerkungen, wie ich die Vorgehensweise bisher verstanden habe, vielleicht kannst du mir ja sagen, ob das so stimmt.

1. Das Auslesen der Variablen geht über einen xml-String, der an die URL: *http://192.168.0.2/cgi-bin/ILRReadValues.exe* gesendet werden muss.
2. Dies geschieht über einen HTTP-Request
3. Der Aufbau des xml-Strings schaut folgend aus: 

<body><version>1.0</version><client>IMasterPhoenix5_14_05</client><client_ver>5.14.0501</client_ver><item_list_size>*2*</item_list_size><item_list><i><n>*@GV.PLCMODE_ON*</n></i><i><n>*@GV.ONBOARD_INPUT_BIT1*</n></i></item_list></body>

  - wobei es sich bei *2* um die Anzahl der Variablen handelt
  - und die Werte zwischen* <i><n>* und *</n></i>* um die Variablen, von denen ich die Werte erhalten will, handelt.

4. Falls der HTTP-Request erfolgreich war, bekomme ich einen xml-String von der Steuerung als Response zurück.
  - Dieser ist genauso aufgebaut wie der Request, beinhaltet aber zwischen <v> und </v> im Anschluss an die Variable den Wert, der an der Steuerung gerade anliegt. Beispiel folgend:

<body><version>1.0</version><client>IMasterPhoenix5_14_05</client><client_ver>5.14.0501</client_ver><item_list_size>*2*</item_list_size><item_list><i><n>*@GV.PLCMODE_ON*</n><v>*0*</v></i><i><n>*@GV.ONBOARD_INPUT_BIT1*</n><v>*1*</v></i></item_list></body>

5. Dein Programm liest dabei die Variablen sowie den Datentyp aus der pdd.csv aus und schreibt diese in eine Liste zur weiteren Bearbeitung. Außerdem wird dabei auch gleich die Anzahl der Variablen gezählt.
6. Mit diesen Daten bastelst du dir dann den oben genannten xml-String durch Aneinanderreihung der Variablen und bekommst dann den Response xml-String zurück, aus dem du dann durch Trennung wieder die Variablenwerte heraustrennst und weiter verarbeitest.   

Stimmt das soweit? Somit müsste ich mittels BAsic4Android zuerst eine Verbindung zur URL herstellen und anschließend einen http-Request abschicken. Anschließend bekomme ich die Response zurück und müsste diese weiter auswerten.
Nun gut, vielleicht bekomme ich ja irgendwas hin 

PS. Hast du dir die Bilder, die ich dir geschickt habe, mal angeschaut?

Schöne Grüße
Daniel


----------



## Mobi (4 Juli 2012)

Erstmal. Die Bilder sind toll, ich hätte auch gerne sowas zu Hause . Ist bestimmt viel Arbeit in solcher Anlage. Aber ich hab noch ein Bild vermisst von der ILC.


Zum HTTP-Request: Du hast alles genau erklärt und aufgefasst. Ich habe aber noch zudem den <client> geändert und ich habe anstatt <client_ver>, <client_stamp> stehen. Und dort schreibe ich meinen generierten Zeit-Datums-String rein. Siehe diesen Beitrag.
Bis <item_list_size> kannst du selber entscheiden was da stehen soll.


----------



## Mobi (4 Juli 2012)

Hier ist mal meine aktuelle Version. Ich hab noch was am Timing gemacht, dass das alles schneller geht. Dazu noch einen Connect und einen Disconnect Button. Jetzt kann man auch anstatt einer IP eine URL eintragen. Z.B. wie in meinem Fall eine DynDNS. Dann kann ich auch von der Arbeit auf drauf. Zudem ist das ganze Fenster auch in der Größe veränderbar.


----------



## Mobi (4 Juli 2012)

Ich hab mal grad nochwas getestet. Bei dem XML-String bis zu den Variablen kann man alles weglassen. Also nur die Variablen mit "<i><n>" und "</n></i>" aufzählen und am Ende "</item_list></body>". Man bekommt trotzdem eine Response mit den Werten. Das ist echt grottig programmiert.


----------



## Vaninger (4 Juli 2012)

Hallo Mobi,

besten Dank für die Info. Somit lautet der xml-String nur noch so, oder?

<i><n>*@GV.PLCMODE_ON*</n></i><i><n>*@GV.ONBOARD_INPUT_BIT1*</n></i></item_list></body>

Deine letzte Version habe ich getestet, funktioniert ebenfalls wunderbar. Vielen Dank dafür. Habe jetzt mal mit Basic4Android angefangen, das Einlesen der pdd.csv hat zumindest schon mal funktioniert, allerdings mit Zeile 1. Muss erst mal den richtigen Befehl raussuchen und anpassen.
Kann dir gerne nochmal Bilder von meiner ILC schicken, muss aber erst welche machen, da diese in einem großen Schaltschrank sitzt...

PS. Wollte gerade meine ILC 350 in Betrieb nehmen, leider funktioniert hier der Netzwerkanschluss nicht und außerdem leuchtet bei IL die Fail Leuchte rot auf. Irgendwelche Ideen hierzu? Kann man die ILC komplett zurück auf Werkseinstellungen setzen?

Schöne Grüße
Daniel


----------



## Mobi (4 Juli 2012)

Genau, so reicht der String. Aber ich mache trotzdem den Anfang mitran, wie von vornerein.

Schicke dann mal die App, wenn sie halbwegs funktioniert.


Ich würde erstmal mit PC Worx verbinden und schauen was es für ein Fehler ist und ggf. rücksetzen.


----------



## Vaninger (4 Juli 2012)

App schicken, kein Problem. Wird aber sicher noch ein Stück dauern...

Ich kann leider keine Verbindung zu PCWorx herstellen, da der Netzwerkanschluss nicht funktioniert. Naja, notfalls ruf ich halt bei deinen Kollegen im Service/Hotline mal an 

Schöne Grüße
Daniel


----------



## Mobi (4 Juli 2012)

Was ist denn passiert mit dem Anschluss? Kaputt gegangen? Schonmal per BootP neue IP zugewiesen oder mit AssignIP. Haste auchmal angepingt.
Ich hab auch schonmal mehrere ILC's wieder zum Leben erweckt, weil irgendwelche Kunden die Firmware wie auch immer zerschossen haben. Neue Firmware drauf und fertig. Aber das hat ein paar Stunden gedauert, weil mir die ILC ab und zu zwischendurch wieder abgekackt ist. Ist wie bei einem Mensch den man reanimiert.


PS: Ich bin nicht mehr bei Phoenix .


----------



## Portisch (5 Juli 2012)

Mobi schrieb:


> Hier ist mal meine aktuelle Version. Ich hab noch was am Timing gemacht, dass das alles schneller geht. Dazu noch einen Connect und einen Disconnect Button. Jetzt kann man auch anstatt einer IP eine URL eintragen. Z.B. wie in meinem Fall eine DynDNS. Dann kann ich auch von der Arbeit auf drauf. Zudem ist das ganze Fenster auch in der Größe veränderbar.



Bei dieser Version bekomme ich immer "PDD.csv" not found.
Die PDD.csv liegt im gleichen Ordner wo auch die EXE ist.


----------



## Mobi (5 Juli 2012)

Ach sorry. er sucht die csv auf dem Desktop.


----------



## Vaninger (6 Juli 2012)

Hallo Leute,

habe gestern endlich meine ILC350 wieder zum Laufen gebracht...
Außerdem habe ich mit der Basic4Android App begonnen und habe hier immerhin schon einmal die pdd.csv einlesen können sowie einen POST Request mit Antwort erhalten.

Falls es jemanden interessiert, hier ist der Link zum Thread:
http://www.basic4ppc.com/forum/german-forum/19283-http-request-zu-sps-xml-string-2.html#post111422

Da ich nicht so der Programmierer bin, habe ich hier noch einige Probleme. Naja, wird schon irgendwie werden 

Schöne Grüße
Daniel


----------



## Mobi (6 Juli 2012)

Nabend,

es wird ja keiner als Programmierer geboren, das wird noch .


App: ui chic. Mehr als ich bis jetzt hatte . Bin mal gespannt auf die apk.


----------



## Vaninger (21 Juli 2012)

Hallo Mobi,
ich arbeite imme noch an meiner App und hätte hier noch eine Frage bezüglich des Schreiben eines Wertes an dich, die du mir vielleicht beantworten kannst.
Zum Lesen der Werte muss ich ja an diese Adresse  "http://192.168.3.150/cgi-bin/ILRReadValues.exe" den bereits erläuterten XML-Strings als Post Request an die SPS schicken, von welcher ich dann in der Response die Werte zurück erhalte und weiter auswerten kann.

Jetzt zu meiner Frage. Wie schaut das ganze beim Schreiben eines Wertes aus? 
Hier lautet die Adresse ja folgend: "http://192.168.3.150/cgi-bin/writeVal.exe?", gefolgt vom Variablennamen einem +-Zeichen sowie des neuen Wertes, oder? Dies dürfte dann so ausschauen:

"http://192.168.3.150/cgi-bin/writeVal.exe?" & "Variable" & "+" & "1" (bei einer boolschen Variable). Ist das so richtig? Benötige ich hier im Anschluss noch den XML-String oder wird hier ohne XML-String geschickt? Vielleicht könntest du mir hierzu noch ein paar Hintergrundinformationen geben...

Danke und einen schönen Tag.

Daniel


----------



## Vaninger (21 Juli 2012)

*Hat sich erledigt, funktioniert soweit...*

Hallo Mobi,
habe in der Zwischenzeit die Lösung bereits gefunden...


----------



## Mobi (21 Juli 2012)

Ohne XML-String und als GET-Anfrage. Was hast du?


----------



## Vaninger (22 Juli 2012)

Auch ohne XML-String, wahrscheinlich auch eine Get Anfrage. Nutze die von Basic4Android bereitgestellte Library HttpUtils2, hier den Befehl 

```
job.Download("http://192.168.3.150/cgi-bin/writeVal.exe?" & sVar & "+" & sValue)
```
.

Funktioniert soweit ganz gut, bekomme die Werte per Request problemlos aufs Tablet, auch das Schreiben eines Bool Wertes habe ich jetzt hin bekommen. Hier kann man ganz gut die vorgefertigten Buttons bzw. ToogleButtons verwenden und unter Tag den Variablennamen hinterlegen und dann auswerten...

Bei dir soweit alles klar? 

Schöne Grüße
Daniel


----------



## Jens944S2 (11 August 2012)

Hallo Allerseits!!

Ich setze auch einen ILC-150ETH als Haussteuerung ein. Die Visualisierung mache ich bis jetzt mit Webvisit. Problem dabei: Java läuft auf keinem Smartphone-Browser. Also wollte ich selbst was mit Javascript programmieren.

Ich habe mal das Beispiel aus Post #3 in eine HTM-Datei geschrieben und per FTP auf den ILC in den /WEBS Ordner geschoben. Wenn ich auf den Button klicke, bekomme ich den Fehler: "550 Unable to find flash:\cfroot\cgi-bin\ILRReadValues.exe".
Hat jemand eine Idee, was das sein könnte?


----------



## Portisch (13 August 2012)

Aktuelle Firmware auf der Steuerung? Schau einmal ein paar Seiten vorher.


----------



## Jens944S2 (13 August 2012)

Guter Hinweis. Ich habe die neueste Firmware drauf gezogen -> selbes Problem.
Ich glaube, das ich irgendetwas grundsätzlich falsch mache.
So habe ich es gemacht:
- Code aus Post #3 aus diesem Threat in eine .htm Datei kopiert
- Datei per FTP-Tool auf den ILC geladen -> ftp://<ip>/webs/test.htm
- Die Datei im Browser gestartet: ftp://<ip>/webs/test.htm
- Es wird die Seite mit dem Button angezeigt
- Klicke ich auf den Button -> "550 Unable to find flash:\cfroot\cgi-bin\ILRReadValues.exe"

Muss ich noch etwas mit der Entry.htm machen? Muss ich die Datei an eine andere Stelle kopieren?
In Post #3 steht, das die Datei nicht unbedingt auf dem ILC liegen muss, man kann sie auch von wo anders im Netzwerk starten. Woher kennt das Javascript dann die Adresse des ILC?


----------



## Portisch (14 August 2012)

Das Javascript von Post #3 funktioniert so nur auf der Steuerung selber.
Wenn man es von einem anderen PC Ausführt muss die IP hier eingetragen werden:
xhttp.open("POST","/cgi-bin/ILRReadValues.exe",true);

neu:
xhttp.open("POST","http://<ilc_ip>/cgi-bin/ILRReadValues.exe",true);

Geht es mit dem Programm von hier oder hier?


----------



## Mobi (15 August 2012)

Normalerweise muss die Seite Entry.htm heißen und nicht test.htm.


----------



## Jens944S2 (15 August 2012)

@Mobi
Das war wohl der Fehler. Nachdem ich die Datei umbenannt hatte, lief es. Bedeuted das, ich kann Zugriffe auf die Steuerung NUR von dieser Seite aus machen?

@Portisch
Das funktioniert leider nicht. Ich habe die Zeile:
xhttp.open("POST","/cgi-bin/ILRReadValues.exe",true);
geändert in:
xhttp.open("POST","http://192.168.0.2/cgi-bin/ILRReadValues.exe",true);
Es passiert nichts, wenn ich auf den Button klicke.

mfg Jens


----------



## Jens944S2 (30 August 2012)

Ich habe ein paar neue Erkenntnisse. Man kann Zugriffe auf die Steuerung von jeder Datei machen, die auf dem ILC liegt. Dazu muss man nur, wie von Portisch beschrieben, die IP-Adresse mit angeben.
Ich hatte bei mir eine Stelle im Code übersehen und die Adresse dort nicht eingetragen, deshalb kam es zu dem Fehler.
Als nächstes habe ich die Dateien von Festplatte aus gestartet. Von dort aus kann ich beliebige Werte zum ILC schreiben (writeVal.exe). Nur beim Lesen (ILRReadValues.exe) gibt es einen Fehler. Firebug meldet den Fehler, das das Objekt "xmlDoc" = null ist.
Ich teste übrigens immer noch mit dem Code aus Post #3.

Ihr müsst es doch auch irgendwie geschafft haben. Liegt es irgendwie an meinem Netzwerk? Das schreiben funktioniert doch auch?????


----------



## Jens944S2 (30 August 2012)

Kleiner Nachtrag: Mit dem Internet Explorer 8 geht es, mit Firefox, Opera und Chrome nicht!!! Selbe Seite, alles gleich: funktioniert...
Das Problem muss also da liegen, wo im Code zwischen IE und Firefox unterschieden wird!!!


----------



## Vaninger (7 September 2012)

*Erste Ergebnisse Android App*

Hallo,

habe die letzten Tage mal wieder etwas an meinem Android App zur Visualisierung/Bedienung gearbeitet, anbei deshalb ein paar Sreenshots.
Kann jetzt Werte auslesen und auch schreiben, funktioniert soweit schon mal ganz gut. 

Hier ein paar erste Eindrücke:



Schöne Grüße
Daniel


----------



## Jens944S2 (11 September 2012)

Hallo Daniel!

Sieht gut aus, was Du machst.

Warum machst Du das nicht als Webseite mit einem Framework wie JQeury Mobile? Dabei gibt es einige Vorteile:
- Javascript läuft mittlerweile in jedem Browser (auch von Smartphones)
- Die Seite kann auf dem ILC liegen und jeder im Netzwerk kann darauf zugreifen
- Wahlweise kann die Seite aber auch auf der lokalen Festplatte eines Rechners im Netz liegen
- Man kann die Seite mit Hilfe eines Wrappers (z.B. PhoneGap) in eine App konvertieren, dabei werden Apps für die meisten Smartphones generiert (Android, IOS, Symbian, Windows Phone, Bada, ...)

Meine Tests verliefen bisher recht erfolgreich, obwohl es noch ein paar kleine Probleme gibt.

Ideal wäre ein Tool (wie z.B. WebVisit von Phoenix), mit dem man Javascript-Webseiten automatisch für den ILC erstellen könnte.

mfg Jens


----------



## Vaninger (11 September 2012)

*Sehr interessant -  Beispiel?*

Hallo Jens,

deine Idee hört sich auch nicht schlecht an, würde mich auch interessieren.
Kannst du mir hierzu mal ein kleines Beispiel geben. Wie funktioniert dann deine Verbindung zur ILC? Ich sende zur Zeit immer einen xml-Request an die Steuerung, diese gibt mir dann die Werte zurück...

Bist du dir sicher, dass JavaScript mittlerweile auf jedem Smartphone läuft. Bin mir da nicht so sicher...

Meine App programmiere ich übrigens mit Basic4Android, falls du diese zu Testzwecken mal haben willst, kein Problem.

Schöne Grüße
Daniel


----------



## Portisch (12 September 2012)

Ich habe mir nun das JQeury Mobile etwas angesehen und habe auch Interesse daran!
Ich will den Zugriff für SPS auf jeden Fall per Browser realisieren um Platform unabhängig bleiben zu können.

@Jens944S2: kannst du mal eine Demo deiner Entwicklung zur Verfügung stellen?
Also da wo lesen und setzen einer Variabel mit JQeury funktioniert?

Am Anfang wollte ich ja alles per Java-Applet machen. Nachdem sich aber dann rausgestellt hat, dass z.B. Blackberry keine Java Applets unterstützt habe ich das wieder verworfen.


----------



## Jens944S2 (12 September 2012)

@Vaninger
Javascript/Jquery/Jquery Mobile läuft eigentlich in jedem Browser. Getestet habe ich selbst schon auf IE, Firefox, Android, IOS, Opera, Symbian Browser. Das einzige Problem ist manchmal, die etwas unterschiedliche Darstellung einiger Elemente, was sich aber mit Jquery Mobile in Grenzen hält.

@Portisch
Java Applets kann man komplett vergessen, die laufen auf (so weit ich weiss) KEINEM Smartphone. Und damit es auf dem PC läuft, muss man die JAVA Runtime installiert haben:sm10:.

Beispielprojekt:
Der Zugriff auf den ILC funktioniert per Javascript -> XMLHttpRequest. Die Infos, um den Zugriff zu machen, habe ich aus Post #3 aus diesem Thread und von hier: http://www.ilc150.net/PCWorxExamples/WEB/entry.txt
Ich kann mal mein ganzes Projekt zur Verfügung stellen, falls es euch interessiert. Erst mal hier ein Basis-Beispiel für euch, um Variablen zu lesen/schreiben:


```
<!DOCTYPE html>
<html> 
    <head> 
        <title>ILC Test</title> 
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1">    
        <link rel="stylesheet" href="http://code.jquery.com/mobile/1.2.0-alpha.1/jquery.mobile-1.2.0-alpha.1.min.css" />
        <script src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
        <script src="http://code.jquery.com/mobile/1.2.0-alpha.1/jquery.mobile-1.2.0-alpha.1.min.js"></script>
        
        <script type="text/javascript">
            var xmlReqList;
            // Function creates from Array of variables an XML file in WebVisit format
            function createGetHTTPlist(list)
            {
                var xhttpsend="<body><version>1.0</version><client>IMasterPhoenix5_14_05</client><client_ver>5.14.0501</client_ver><item_list_size>";
                var item_list=list.length;
                var i;
                xhttpsend = xhttpsend + item_list ;
                xhttpsend = xhttpsend + "</item_list_size><item_list></item_list></body>";
                xmlReq=loadXMLString(xhttpsend);
                for (i in list){
                    newel=xmlReq.createElement("i");
                    x=xmlReq.getElementsByTagName("item_list");
                    x[0].appendChild(newel);
                    newel=xmlReq.createElement("n");
                    newtext=xmlReq.createTextNode(list[i]);
                    newel.appendChild(newtext);
                    x=xmlReq.getElementsByTagName("i");
                    x[i].appendChild(newel);
                }
                return(xmlDoc);
            }
        
            //Create from String an XML file with browser detection
            function loadXMLString(txt)
            {
            if (window.DOMParser)
              {
              parser=new DOMParser();
              xmlDoc=parser.parseFromString(txt,"text/xml");
              }
            else // Internet Explorer
              {
              xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
              xmlDoc.async="false";
              xmlDoc.loadXML(txt);
              }
            return xmlDoc;
            }
        
            // Send the xHTTPRequest to the server in the browser adress
            function fhttprequest(xmlReqList)
            {
                if (window.XMLHttpRequest)
                  {
                    xhttp=new XMLHttpRequest();
                    xhttp.open("POST","http://192.168.0.11/cgi-bin/ILRReadValues.exe",true);
                    xhttp.send(xmlReqList);
                    if (window.XMLHttpRequest){
                        xhttp.onreadystatechange = function() {
                        if(this.readyState == 4) {
                            GetData(this);
                            }
                        }
                    }
                  }
                else // Internet Explorer 5/6
                  {
                    msXHTTP = new ActiveXObject("Microsoft.XMLHTTP");//Msxml2.XMLHTTP.3.0");
                    msXHTTP.onreadystatechange = doHttpReadyStateChange;
                    msXHTTP.open("POST","http://192.168.0.11/cgi-bin/ILRReadValues.exe",true);
                    msXHTTP.send(xmlReqList);
                  }
            }
            // Only need for old IExplorer Get Event new data
            function doHttpReadyStateChange() {
               if (xhttp.readyState == 4) {
                  GetData(this);
               }
            }
            function fuGetData() {
                // Create List of variables and convert by function "createGetHTTPlist" into xml
                xmlList = createGetHTTPlist(["@GV.PLC_SYS_TICK_CNT","@GV.ONBOARD_OUTPUT_BIT0"]);
                // Send xml request
                fhttprequest(xmlList);
            }
        
            //Is executed if the confirmation from the webserver is recived
            function GetData(xhttp){
                xmlDoc=xhttp.responseXML; //Convert respnse into xml document
    
                document.getElementById("idPlcSysTickCnt").innerHTML = xmlDoc.getElementsByTagName("v")[0].childNodes[0].nodeValue; //Get first variable value
                document.getElementById("OnboardInput1").innerHTML = xmlDoc.getElementsByTagName("v")[1].childNodes[0].nodeValue;
            }
        
            function SetData(vValue){
    
                if (window.XMLHttpRequest)
                  {
                  xhttpSet1=new XMLHttpRequest();
                  }
                else // Internet Explorer 5/6
                  {
                  xhttpSet1=new ActiveXObject("Microsoft.XMLHTTP");
                  }
                 var command="http://192.168.0.11/cgi-bin/writeVal.exe?" + "@GV.ONBOARD_OUTPUT_BIT0" + "+" + vValue
                xhttpSet1.open("GET",command,false);
    
                xhttpSet1.send(command);
            }
            </script>

    </head> 
    <body> 
        <div data-role="page"  data-theme="a">
            <div data-role="header"></div><!-- Ende header -->
            <div data-role="content">
                <h2>ILC Test</h2>
                <button id="btnSetOnboardOutput1ON" data-icon="refresh" data-iconpos="right">Set onboard output 1: ON</button>
                <button id="btnSetOnboardOutput1OFF" data-icon="refresh" data-iconpos="right">Set onboard output 1: OFF</button>

                <button id="btnGetValues" data-icon="refresh" data-iconpos="right">Get Values</button>
                <br/><br/>
                <a>PLC SysTick Cnt = </a><a id="idPlcSysTickCnt"></a></br>
                <a>Onboard Input 1= </a><a id="OnboardInput1"></a></br>

            </ div ><!-- Ende content --> 
        </ div ><!-- Ende page -->
        
        <script type="text/javascript">
            //Events
            $('#btnSetOnboardOutput1ON').mousedown(function(e){ e.preventDefault();SetData(1)});
            $('#btnSetOnboardOutput1OFF').mousedown(function(e){ e.preventDefault();SetData(0)});
            $('#btnGetValues').mousedown(function(e){ e.preventDefault();fuGetData()});
        </script>

    </body>    
</html>
```

Den Code in eine entry.html speichern und per FTP in das /webs/ Verzeichnis des ILC's kopieren. Die IP-Adresse im Code muss natürlich durch die passende ersetzt werden. Das Netzwerk, indem der ILC hängt, muss im Internet sein, damit die Jquery/Jquery Mobile Bibliotheken heruntergeladen werden können.

mfg Jens


----------



## Jens944S2 (12 September 2012)

Übrigens: Ich habe noch folgende Probleme bei der Realisierung per Jquery Mobile:

1.: Ich möchte die Bibliotheken gerne aus dem Flash vom ILC laden (damit der ILC nicht immer eine Internet-Verbindung braucht) Allerdings wird dann die CSS-Datei nicht richtig geladen. Es ist scheinbar NICHT möglich, irgendeine CSS-Datei, welche im Flash des ILC liegt, in eine HTML-Seite auf dem ILC einzubinden.
Ich vermute, es liegt an dem Webserver des ILC. Andere Dateien (Bilder, *.js, *.html, ...) funktionieren.

2.: Wenn die Webseiten auf dem ILC liegen, funktioniert der Zugriff auf die Variablen einwandfrei. Liegen die Seiten jedoch entfernt, auf einem PC, geht es nicht mehr. Außer mit dem Internet-Explorer, damit gehts.
Meine Vermutung ist, das Firefox den Zugriff absichtlich blockiert, wegen Sicherheitsbeschränkungen (cross domain request).


----------



## Vaninger (12 September 2012)

*Beispiel Datei wäre super*

Hallo Jens,
ganzes Beispiel wäre klasse, dann kann man die Funktionsweise am Besten nachvollziehen...

Schöne Grüße
Daniel


----------



## Vaninger (12 September 2012)

*Auf meinen Android Geräten getestet - funktioniert*

Hallo Jens,

habe dein Beispiel jetzt mal getestet, funktioniert tatsächlich auf meinen beiden Android Geräten wie auch im Internet Explorer. Ich bin begeistert. Wäre schön, wenn du uns noch ein Beispiel zur Verwendung der JQuery Mobile geben könntest. Blicke da noch nicht richtig durch...

Schöne Grüße und vielen Dank!

Daniel


----------



## Jens944S2 (13 September 2012)

Na klar läuft das...:s12:
Ich habe mal mein ganzes Projekt für die Haussteuerung hochgeladen. Das läuft natürlich nur, wenn man dazu das passende PCWorx Projekt auf dem ILC hat.
Ein gutes Tutorial für JQuery Mobile habe ich hier gefunden: http://t3n.de/news/jquery-mobile-grundlegende-konzepte-funktionsweisen-326279/
Die offizielle Seite http://jquerymobile.com/ ist auch nicht schlecht. Dort gibt es eine Beschreibung zu der ganzen API, außerdem kann man sich eine eigene Seite basteln -> ist nicht schlecht zum testen.

mfg Jens


----------



## Portisch (13 September 2012)

Super! Danke!

Das schaut ja schon gar nicht so schlecht aus! Auch geht es auf meinem Blackberry ohne Probleme.

Einen kleinen Vorschlag habe ich aber noch:
Um den Websource auch in 20 Jahren noch zu verstehen war ich so frei deine Vorlage etwas abzuändern.
Als Beispiel habe ich das Wohnzimmer mal angehängt. Das Setzen funktioniert, das lesen kann ich nicht Überprüfen...

Meine Idee ist es alles nötige über Atributte zu definieren:

```
<th><button name="@GV.EG_Wohnz_DO2_221" data-PDD="Wohnzimmer.W_EG_Wohnz_DI1_IN10" data-obfunc="Licht" data-imgname="imgEveningLight">An</button></th>
```
name: PDD Name zum Einlesen von der SPS
data-PDD: PDD Name zum Schreiben auf die SPS
data-obfunc: Button Funktion, wird in der Javascript benötigt
data-imgname: Zugehöriges Image zum Button

Die events für mousedown und mouseup sind nun auf der aktuellen HTML für alle Buttons gleich:

```
$('button').mousedown(function(e){ e.preventDefault();SetValueToPLC(this.getAttribute("data-PDD"),"1")});
   $('button').mouseup(function(e){e.preventDefault(); SetValueToPLC(this.getAttribute("data-PDD"),"0")});
```

Die dazugehörige Javascript ist nun automatisiert.
Die PDD Liste zum Einlesen holt sich das Script selber über die Button Namen
In GetData sind auch die Button Namen drinnen. Somit kann man sich über den Namen den Button suchen und dann je ob Licht oder Jalousie entscheiden was mit dem Wert gemacht wird.
Die GetData könnte dann auch Global gemacht werden. Natürlich ist es möglich die Objekt Funktionen wie Licht & Jalousie beliebig zu erweitern.

Das Gute daran ist, dass man einfach einen Button hinzufügen kann ohne gross was verändern zu müssen!
Anhang anzeigen wohnzimmer.zip


----------



## Mobi (13 September 2012)

Sehr schön Jens. Da kann ich mir ja was grafischtechnisches abgucken für meine Visu als .exe.
Aber das ganze im Browser ist auch toll.
Werd mir das mal vor Ort angucken, wenn du Zeit hast.


----------



## Vaninger (13 September 2012)

*Vielen dank!*

Hallo Jens, hallo Portisch,

auch von mir ein vielen Dank für eure Beispiele. Werde mir diese heute Abend mal anschauen und hoffe mal, dass ich mich auch ein wenig rein denken kann. Schaut auf jeden Fall schon mal sehr gut aus und ich finde gut, dass man von verschiedenen Gerätschaften (Android, PC, etc)  darauf zugreifen kann...

Bei Fragen werde ich mich wohl oder übel wieder an euch wenden müssen 

@ Jens: Wie hast du deine Verkabelung/Verdarhtung etc. bei deinem Haus und der ILC gelöst? Bin noch (immer) in der Planungsphase, hier sind sämtliche Hinweise/Vorschläge gerne willkommen...

@Mobi: Bei dir auch alles klar? Arbeitest immer noch fleißig an deiner Autoit Visualisierungslösung? Hoffentlich gibt es hier mal ein paar Screenshots zu sehen...

Schöne Grüße
Daniel


----------



## Mobi (13 September 2012)

Ich mach nebenbei ein wenig. Hat nur noch keine Idee für die Grafik, deshalb gabs noch keine Screenshots 
Aber die werden bald folgen.

Beschäftige mich grad hauptsächlich mit Kameraprüfung und Libnodave.


----------



## Jens944S2 (13 September 2012)

@Portisch
Super Idee!!! Ich hatte auch schon angefangen, das ganze etwas generischer zu machen, aber auf Deine Lösung bin ich nicht gemommen.
Ich arbeite zur Zeit daran, alle Seiten in eine HTML-Datei zu packen. Dadurch würden die Ladezeiten der verlinkten Seiten wegfallen. Allerdings funktioniert das noch nicht so, wie ich will.

@Vaninger
Zur Hausautomatisierung: Ich habe für jedes Stockwerk eine Busklemme (Interbus) gesetzt. Da hängen die IO-Module dran. Alle Taster im Haus sind über Telefonleitung (YSTY 8-fach) mit den IO's verbunden. Außerdem hängen an den IO's auch PLC-Relais von Phoenix, an die alle Lampen, Jalousien und Schaltsteckdosen angeschlossen sind.
Bei so einer Sternverdrahtung kommen schon ein paar Kilometer Kabel zusammen. Das meiste habe ich selber gemacht, der Rest hat aber noch ausgereicht, unseren Elektriker in den Wahnsinn zu treiben. :sw14:

@Mobi
Die Grafik ist nicht von mir, es ist ein vorgefertigtes Thema von Jquery Mobile (siehe hier: http://jquerymobile.com/test/docs/api/themes.html). Die Anlage ist zwar noch nicht fertig (wird sie wahrscheinlich nie...) aber Du kannst sie gerne besichtigen.

mfg Jens


----------



## Portisch (13 September 2012)

Habe mir gerade noch den Toggle Switch angesehen. Dann würde man das Image nicht brauchen 

*wohnzimmer.html
*Statt:

```
<tr>
      <td><h3>Hauptbeleuchtung TV-Bereich</h3></td>
      <th><button name="@GV.EG_Wohnz_DO2_411" data-PDD="Wohnzimmer.W_EG_Wohnz_DI1_IN13" data-obfunc="Licht" data-imgname="imgMainLight">An</button></th>
      <th><img src="Aus.png" name="imgMainLight"></th>
     </tr>
```

Das:

```
<tr>
        <td><h3>Hauptbeleuchtung TV-Bereich</h3></td>
      <th>
             <select name="@GV.EG_Wohnz_DO2_411" data-PDD="Wohnzimmer.W_EG_Wohnz_DI1_IN13" data-obfunc="Toggle" data-role="slider">
              <option value="0">Aus</option>
              <option value="1">An</option>
             </select>       
            </th>
     </tr>
```

Bei den Events das dazu:

```
$('select').change(function(e){ e.preventDefault();SetValueToPLC(this.getAttribute("data-PDD"),jQuery(this).val())});
```

*wohnzimmer.js*

LoadDialog_Wohnzimmer:

```
function LoadDialog_Wohnzimmer()
{
  // get all buttons of html
  var d = document.getElementsByTagName('button');
  for (var i = 0; i < d.length; i++)
  {
    btNames[i] = d[i].name;
  }
  
  // get all select sliders of html
  var d = document.getElementsByTagName('select');
  for (var i = 0; i < d.length; i++)
  {
    btNames[btNames.length] = d[i].name;
  }  
 hSiteUpdateActiveWohnzimmer = window.setInterval("UpdateValuesWohnzimmer()",750); 
}
```

Und im switch: switch (document.getElementsByName(ObjectName)[0].getAttribute("data-obfunc"))
das dazu:

```
// Object Toggle Slider
      case 'Toggle':
        switch (xmlDoc.getElementsByTagName('v')[i].childNodes[0].nodeValue)
        {
          case '0': 
            jQuery(document.getElementsByName(ObjectName)[0]).val('0').slider('refresh');
            break;
          case '1':
            jQuery(document.getElementsByName(ObjectName)[0]).val('1').slider('refresh');                         
            break;
        }        
        break;
```

Mal schauen ob ich heute noch dazu komme das zu testen...


----------



## Jens944S2 (13 September 2012)

Ja, der Toggle Switch sieht auch ganz gut aus.
Übrigens: Kannst Du mal testen, ob Du CSS-Dateien (die auf dem ILC liegen) einbinden kannst. Bei mir funktioniert das nicht.

mfg Jens


----------



## Portisch (13 September 2012)

Jens944S2 schrieb:


> Ja, der Toggle Switch sieht auch ganz gut aus.
> Übrigens: Kannst Du mal testen, ob Du CSS-Dateien (die auf dem ILC liegen) einbinden kannst. Bei mir funktioniert das nicht.
> 
> mfg Jens


Habe ich gestern auch gesehen. Die HTML wird zwar mit dem Theme dargestellt, aber die Icons bei den Button fehlen.
Wenn man die CSS im Internet hernimmt passt es!?
Die zwei Scripte haben ohne Probleme Lokal funktioniert.


----------



## Jens944S2 (13 September 2012)

Ja, wird die CSS aus dem Internet geladen, läuft es. 
Liegt sie auf dem ILC, wird sie zwar geladen aber offensichtlich nicht angewendet.
Echt blöd, das das nicht geht, sonst hätte man alle benötigten Dateien auf dem ILC und wäre unabhängig vom Internet.

Hast Du mal Firebug installiert? Auch dort gibt es keine Fehlermeldung, beim Laden der CSS vom ILC.

mfg Jens


----------



## Portisch (13 September 2012)

Ich mache es mit dem IE9. Der hat einen schönen Debugger dabei.
War aber eine 3 Stunden Aufgabe die Option zu finden wo das cross domain zum Einschalten ist 

Ich habe nun etwas herumgespielt und gleich ein paar Fehler gefunden:

```
function GetData(xhttp)
{
  xmlDoc=xhttp.responseXML; //Convert respnse into xml document
  
  for (var i=0; i < xmlDoc.getElementsByTagName('v').length; i++)
  {
    var ObjectName = xmlDoc.getElementsByTagName('n')[i].childNodes[0].nodeValue; //Get variable name
  var actObject = document.getElementsByName(ObjectName)[0];
  
    // check what type of object function
    switch (actObject.getAttribute("data-obfunc"))
    {
      // Object Licht
      case 'Licht':
        switch (xmlDoc.getElementsByTagName('v')[i].childNodes[0].nodeValue)
        {
          case '0':
            ImageSwap(actObject.getAttribute("data-imgname"), 'Aus.png');
            jQuery(actObject).text('Aus');
            break;
          case '1':
            ImageSwap(actObject.getAttribute("data-imgname"), 'An.png');
            jQuery(actObject).text('An');
            break;
        }        
        jQuery(actObject).button('refresh');
        break;
        
      // Object Jalousie
      case 'Jalousie':
        switch (xmlDoc.getElementsByTagName('v')[i].childNodes[0].nodeValue)
        {
          case '0':
            jQuery(actObject).buttonMarkup({ icon: "ArrowUpNonActive" });
            break;
          case '1':
            jQuery(actObject).buttonMarkup({ icon: "ArrowUpActive" });
            break;
        }
        break;  
      // Object Toggle Slider
      case 'Toggle':
        switch (xmlDoc.getElementsByTagName('v')[i].childNodes[0].nodeValue)
        {
          case '0': 
            jQuery(actObject).val('0').slider('refresh');
            break;
          case '1':
            jQuery(actObject).val('1').slider('refresh');                         
            break;
        }        
        break;              
    }
  } 
}
```

Mit ein paar jQuery mehr geht's besser 
Das Toggle funktioniert aber mit dem Button habe ich ein Problem!
Sollange man nicht draufdrückt passt das mit "An", "Aus" und dem Image.
Aber sobald man einmal draufdrückt geht das Update nicht mehr. In der SPS wird die Var gesetzt und es passt alles.

Aber beim switch (xmlDoc.getElementsByTagName('v')_.childNodes[0].nodeValue) kommt nicht gutes mehr raus...
Irgendwas passt da noch nicht...

Das document.getElementsByName(ObjectName)[0] spuckt ein Objekt aus das unendlich in sich verschachtelt ist.
Wie gesagt sollange man nicht draufdrückt passt das Objekt noch. Danach geht es nicht mehr. Ein Refresh der HTML behebt das Problem wieder.

EDIT:
Und auf der ILC bekomme ich diese Meldung wenn wohnzimmer.js die Werte einlesen will:"GetValueFromPLC" ist undefiniert 
_


----------



## Vaninger (13 September 2012)

*Funktioniert leider nocht nicht mit ILC*

Hallo Leute,
habe gerade versucht, die beiden Beispiele mit meiner ILC zu nutzen, leider ohne Erfolg. Habe hierzu in PCWorx ein Projekt mit den aufgeführten Variablen erstellt und versucht, diese über den Internet Explorer zu ändern, leider kein Erfolg. Die Dateien aus Jens Zip-Ordner habe ich natürlich unter WEBS auf die ILC kopiert...

Eventuell könnt auch jemand (vielleicht Portisch?) sein Test Projekt als PCWorx Datei zur Verfügung stellen...

Mit meiner App funktioniert das Ändern und Auslesen der Variablen, somit müsste es mit dieser Lösung auch funktionieren!

@Jens: Habe auch vor, meine Schalter mittels Klingeldraht auf meine DI zu legen. Evtl. nehme ich für jedes Stockwerk eine eigene ILC 150, da ich evtl. das obere Stockwerk vermieten möchte und dadurch auch mal ausprobieren könnte, ohne dass das ganze Haus ausfällt. Schalten wollte ich Steckdosen, Lampen, Jalousien, etc. Außerdem wollte ich zumndest für jeden Raum eine Temperatur aufnehmen. Kannst du mir evtl den Typ deiner Relais von Phoenix sagen? Ich habe bis jetzt eigentlich an Finder Relais gedacht... Naja, mal schauen, wie es weiter geht.

Schöne Grüße
Daniel


----------



## Mobi (13 September 2012)

Als Typ wäre da die PLC-Reihe und empfehlen würde ich dann die Optokopplervariante und PIT zum anschliessen.

Hab mir mal nen Helligkeitssensor gebastelt. Funktioniert auch prima mit dem Analogeingang. Und Temperaturen erfasse ich mit PT-Sensoren (PT100 und 500).


----------



## Portisch (14 September 2012)

Jetzt will ich mal wegen der Hausinstallation nachfragen!

Auch meine Idee ist es Klingeldraht (ich glaube 10 Polig) im Haus zu verwenden und damit die Taster an die SPS anzuschließen.
Als Bewegungsmelder kommt dieser Umbau zum Einsatz: http://www.mikrocontroller.net/topic/258344#new

Meine Planung sieht nun einen größeren Schaltschrank im Keller vor.
Wahrscheinlich noch ein kleinerer daneben wo die SPS untergebracht wird (24V/230V Trennung).

Meine ILC 150 habe ich nun um diese Module erweitert:
1x IL IB CNT (Windsensor Eltako WS) (wenn jemand die Umrechnung braucht um auf m/s zu kommen einfach melden)
2x IB IL 24 DI 32/HD-PAC (Taster und alles mögliche)
3x IB IL 24 DO 32/HD-PAC (30 DO für Beschattung, Rest für Licht usw)

Beide Schränke sind als Aufputz angedacht. Es wird wahrscheinlich daneben auch gleich das Netzwerkzeug seinen Platz finden.
Also alles läuft Zentral im Keller zusammen.
Für die 24V Absicherung habe ich mir DIN-Glassicherungshalter für 5x20mm Sicherungen besorgt.

Generell sollen 16A Finder Relais mit manueller Betätigung zum Einsatz kommen.
Es wird jeder Raum selber abgesichert. Nach dem Automaten wird dann in Licht und Steckdosenkreis aufgeteilt.
Derzeit ist nur die Steuerung von Licht vorgesehen, aber man kann später einmal im Steckdosendraht auch noch ein Relais nachrüsten.

Für die Raffstore und Rolladen habe ich mir eine Platine für je 5 Motoren gemacht (UP und DOWN, also 10 Relais) wo jeder einzeln abgesichert ist.
Bei insgesamt 15 Motoren kommen 3 Platinen zusammen. Der Vorteil dieser Platine gegenüber normalen DIN-Relais ist die gegenseitige Verrigelung und der 4-Polige Anschluss für jeden Motor. Man zieht also einfach ein 4x0,75mm² vom Motor direkt zum Anschluss. Jede dieser Platine wird mit einem 6A Automaten abgesichert.

Ich habe bereits ein Angebot eines Elektrikers. Schlussendlich wenn ich die Verrohrung und Kabelziehen und Schalter/Steckdoseneinbau selber mache kommt es so auf ca. 8000-10000€. Da ist das ganze Material, Schaltschrank, Arbeit des Elektrikers  drinnen - also Fix und Fertig.


----------



## Jens944S2 (14 September 2012)

@Portisch: Bei mir hat das Cross-Domain mit dem IE8 funktioniert, ohne  das ich etwas einstellen musste. Wo gibt es denn diese Einstellung für  IE9? Für den Firefox scheint es das leider nicht zu geben.
Dein Code sieht soweit gut aus, ich müsste es mal testen. Leider scheint gerade Jquery Mobile einige Bugs zu beinhalten, möglicherweise hast Du auch einen gefunden.
Hausautomatisierung: Das wird ein ENORMER Kabelwust, der dann im Keller bei Dir zusammenläuft. Bei mir war der Elektriker entsetzt und meinte, er hätte noch nie so viele Kabel gesehen. Dabei habe ich pro Stockwerk eine IO Station.
Ich habe bis jetzt (noch ohne Keller) für das ganze Haus 96 I/O's benutzt, also jeweils 96 Ein- und 96 Ausgänge.

@Mobi:  Warum empfiehlst Du die Optokopplervariante? Ich habe die normalen  Relais benutzt, bisher läuft alles gut. Ich gebe zu, wenn die  Jalousiemotoren starten gibt es schon einen beachtlichen  Übernahmefunken, welchen man auch durch das weisse Reliasgehäuse gut  sehen kann. Besonders bei Dunkelheit ist das ein interessantes  Schauspiel.

@Vaninger: Bei mir sind die Variablen, welche von der  Webseite gesetzt werden, Eingangsvariablen. In PCWorx werden sie bei  mir auf Ausgänge verbunden. Ich denke, Du müsstest schon genau mein  Projekt (+Busaufbau) auf dem ILC habem damit es richtig läuft.

Die  PLC Relais habe ich genommen, weil sie recht günstig und sehr schmal  sind. Außerdem kann man die Kontakte von nebeneinanderliegenden Relais  per Stromschiene verbinen und spart sich so einige Kabelverbindungen. Das einfachste Relais mit einem Schließer ist vom Typ PLC-RSC-24DC/1ACT (Art.Nr. 2966210).


----------



## Vaninger (14 September 2012)

*Variablen*

Hallo zusammen,
schon mal danke für die Infos bezüglich Hausautomation...

@Jens:

Habe die folgenden Variablen in einer Programminstanz namens Wohnzimmer angelegt:

Eingangsvariablen:
W_EG_Wohnz_DI1_IN13 verbunden mit EG_Wohnz_DO2_411 (alle Global wegen @GV)
W_EG_Wohnz_DI1_IN10 verbunden mit EG_Wohnz_DO2_221
W_EG_Wohnz_DI1_IN10 verbunden mit EG_Wohnz_DO1_OUT12

usw.   

Müsste doch soweit stimmen. Nun müsste doch nach Änderung der IP in der Entry das ganze funktionieren, zumindest für das Wohnzimmer, oder sehe ich das falsch?

Schöne Grüße
Daniel


----------



## Portisch (14 September 2012)

@Vaninger: Du kannst dir aus der PDD.csv die Richtigen Daten deines SPS Projektes raussuchen. Diese Datei findest du in deinem SPS Projekt Ordner. Einfach mal durchsuchen!

@Jens: Das ist eine Option in den Sicherheitstab. Für Internet kann man unter Erweitert weiter unten diese Option von Deaktiviert auf Aktiviert umstellen.
Wegen des Kabelwust: Ich bin mir hier nicht so sicher. Jeder Raum wird mit 230V angefahren. Nur hier halt eine zusätzlich 1,5mm² da Licht und Steckdose getrennt. Also 1 Draht mehr.
Die Schalter werde ich öfters in Unterputz Dosen zusammenfassen müssen. Wenn ich mit ~30 Tastern pro Stockwerk rechne komme ich auf 3-4 10 Polige Leitungen. Die Bewegungsmelder werden parallel zu einem DI zusammen geschaltet. Also der Flur ist z.B. nur ein DI und nicht 3-5.


Es ist mir aber schon klar, dass es mehr Kabel werden, da die ganze 24V Verkabelung extra zur Standard 230V Verkabelung hinzukommt.

Aber eine Frage habe ich noch:
Wenn ich mit dem 10 Poligen Kabel zu die Taster fahre wie habt ihr das gelöst? Pro Ader hängt dann ein Taster. Trenne ich da den Mantel in der Unterputzdose auf und hänge da den Taster an und danach fahre ich weiter zum nächsten Taster? Also 9 Taster/Kabel den 24V braucht man ja auch noch...Oder mache ich z.b. eine 150x150mm Unterputzdose wo ich mit der 10 Poligen Leitung hinfahre und dann 2 adrig weiter zu jedem Taster?



Auch hätte ich die Idee falls Variante 1 besser ist vielleicht eine kleine Platinen zu machen.
Und zwar einfach eine Klemmplatine wo ich die 10 pol zukommend anklemme und 1:1 10 polig den Abgang anklemmen kann.
Zusätzlich noch eine 2 polige Klemme wo ich abzweigen kann. Per Jumper kann man dann von der 10 poligen Klemme die gewünschten pole abzweigen.
Oder einfach eine LAS-Plus Klemme. Also einfach Mantel der Telefonleitung ab und die einzelnen Adern reindrücken:


Wenn man dann noch zusätzlich eine Diode zu der Abzweigung macht kann man mehrere Taster auch auf die gleiche Ader hängen (elektrisches Oder).


----------



## Jens944S2 (14 September 2012)

@Vaninger
Ich habe bei mir zwischen Eingang und Ausgang einen sogenannten "Eltako"-Baustein. Dieser Baustein hält den Ausgang, wenn am Eingang ein Impuls kommt. Den musst Du noch einfügen, sonst wird es nicht funktionieren.

@Portisch
Die meisten Räume haben ja nur einen Ort für die Taster (neben der Eingangstür). Dort habe ich dann immer von der Verteilung aus eine Leitung hingezogen. Verlängert habe ich nie.
Ansonsten sollte es aber keine Probleme geben, wie auch immer Du es machst. Störeinflüsse scheinen keine Wirkung zu haben, ich hatte bis jetzt jedenfalls noch nie Probleme damit. Alles läuft bis jetzt vollkommen Störungsfrei (Gottseidank, sonst hätte ich mir ganz schön was von meiner Frau anhören können...). Dabei muss man bedenken das Abschnittweise sogar Starkstromleitungen direkt neben den Signalleitungen herlaufen!!! Ich hatte deswegen am Anfang grösste Bedenken.
Übrigens: Ich habe den Schirm immer auf - von den 24 Volt gelegt und dann 1 Ader für +24 Volt. Der Rest steht für DI's zur Verfügung.

mfg Jens


----------



## Portisch (14 September 2012)

Ok, danke!

Dann werde ich mir das mal ansehen. Denn wenn 5 Räume nebeneinander liegen ist es ja eigentlich besser von UP-Dose zu UP-Dose weiter zu fahren.
Ich habe mir die LS-Plus Klemmen von Krone mal angesehen:


(Bei Bürklin: 51 F 8000 und 51 F 8002)
Die Platine kommt auf gute 51x13mm. Sollte also super in eine UP-Dose passen.
So könnte man bis zu 9 UP-Dosen durchschleifen. So eine Abzweigung kommt auf ~2€.
Was mir aber gerade einfällt: Bei 2 oder 4 Tastern in einer UP-Dose(Gruppe) wird es schwerer.
Vielleicht wäre es eine Lösung einfach die LSA-Plus hinten und vorne auf die Platine zu machen.
Dann können beliebig viele Taster abgezweigt werden.


----------



## Mobi (14 September 2012)

@Jens: Ich mag die Optokoppler lieber, weil man die nicht hört . Und da die meisten Neubauten heutzutage ohne Keller gebaut werden, ist das besser. Z.B. die "PLC-OSC- 24DC/230AC/ 2/ACT" kann 2A und Kurzzeitig 30A. Ich weiß ja nicht wieviel deine Motoren ziehen, aber das könnte reichen.
Nagut einen Haken ist da, sie sind doppelt so breit. Ich werde die auch bei meinem nächsten Projekt einsetzen bei einem Neubau in Steinheim. Auch gesteuert mit Phoenix .
Übriegens, dein Eltako-Baustein heißt eigentlich Toggle-Flipflop bzw T-Flipflop. Kennst du schon die Oscat-Bibliothek? Die könnte dich auch interessieren.

Achja und Verdrahtung, alles mit flexibler Einzelader.


----------



## Vaninger (19 September 2012)

*Problem gefunden?*

Hallo Leute,

ich mal wieder. Habe gerade mal wieder ein wenig mit den vorhandenen Java Scripts herumgespielt, im Speziellen mit dem von Portisch. Wie Portisch hier schon beschrieben hat 



> Das Toggle funktioniert aber mit dem Button habe ich ein Problem!
> Sollange man nicht draufdrückt passt das mit "An", "Aus" und dem Image.
> Aber sobald man einmal draufdrückt geht das Update nicht mehr. In der SPS wird die Var gesetzt und es passt alles.
> 
> ...


_

geht dies dementsprechend bei mir auch nicht. Hat jemand hierzu schon eine Lösung gefunden, wieso sich der Button und das Image nicht ändern? Wenn ich den Button in Firefox auf dem PC ändere, tritt dieser Effekt auf. Zeitgleich lag mein Handy ebenfalls mit Firefox neben mir, hier änderte sich nach drücken auf dem PC aber der Button und auch das Licht ging an bzw. aus (Image änderte sich).

zur Hausautomatisierung:

Hatte eigentlich auch vor, Finder Relais (Type 97.01; 46.61.9.024.0040; 24 VDC, 16A, 250V) einzusetzen. Dieser Typ hat auch noch eine Handverstelleinrichtung, falls mal die SPS ausfallen sollte und man  Licht braucht...
Schalten wollte ich ebenfalls Licht, Steckdosen, Jalousien und auch jeweils einen Raumtemperatursensor einbauen. Wetterstation und ähnliches kann dann natürlich auch noch folgen...

Vielen Dank für die Antwort.

Schöne Grüße
Daniel_


----------



## Portisch (23 September 2012)

Also ich bin immer noch daran das Problem mit dem Button zu beheben.

Wenn ich die Events so binde:

```
$('button').bind('vmouseup', function () {
    var sValue = this.getAttribute("data-PDD");
    setTimeout(function(){SetValueToPLC(sValue,"1");}, 500);
    setTimeout(function(){SetValueToPLC(sValue,"0");}, 1000);
    alert('Update is working with alert');
    } );
```

Dann geht es ohne Probleme. Sobald das "alert" drinnen ist geht es!
Jetzt ist die Frage was macht das alert genau? Es ist ja nicht so schön jedesmal eine Messagebox beim drücken eines Buttons zu haben...
Kann man das noch anders lösen?

Das manchmal Funktionen nicht definiert sind habe ich in den Griff bekommen. Wenn das mit den Button noch geht lade ich meine Änderungen noch hoch!


----------



## Mobi (23 September 2012)

Um was geht es denn genau?


----------



## Portisch (23 September 2012)

Der Button scheint dann aus dem HTML zu verschwinden:

```
var ObjectName = xmlDoc.getElementsByTagName('n')[i].childNodes[0].nodeValue; //Get variable name
  var actObject = document.getElementsByName(ObjectName)[0];
```
Es wird zuerst über das empfangene XML der Name des Button definiert (ObjectName).
Per getElementsByName sollte dann dieser Button gesucht werden.
Wird er auch solange man nicht auf den Button drückt.

Wenn man diesen Event Code anwendet funktioniert es so lange bis die Mouse losgelassen wird.
Also drauf drücken und den Button nicht loslassen. Dann geht es. Sobald man die Mouse loslässt ist es vorbei.


```
$('button').bind('vmousedown', function (event) {
    event.preventDefault();
    var sValue = this.getAttribute("data-PDD");
    SetValueToPLC(sValue,"1");
    setTimeout(function(){SetValueToPLC(sValue,"0");}, 100);
    } );
```



*EDIT:*
Habe es gefunden!! 
Mit dem Phänomen, dass der Fehler erst beim Loslassen des Button auftritt hat mich auf die Idee gebracht.
Und zwar musste es ein Event das beim loslassen des Button auftritt sein!

Hier nun die Events die in die HTML rein gehören:

```
<script type="text/javascript">
   //Events
   // add to all buttons this events:   
   $('select').change(function() {
    SetValueToPLC(this.getAttribute("data-PDD"),jQuery(this).val());
    } );
   $('button').bind('vmouseup', function () {
    $('button').unbind("vclick");
    var sValue = this.getAttribute("data-PDD");
    SetValueToPLC(sValue,"1");
    setTimeout(function(){SetValueToPLC(sValue,"0");}, 100);
    } );
  </script>
```
Das unbind behebt das Problem.

Ich habe es auf den vMouseUp gebunden, denn so kann man auf den Button clicken und falls falsch gedrückt einfach ohne die Moustaste loszulassen aus dem Button rausziehen und dann erst die Mouse loslassen. Dann wird das Event nicht ausgeführt. Sozusagen so eine Sicherung wie: _Verdammt, da wollte ich nicht draufdrücken.
_Wenn mann nun auf den Button drückt wird sozusagen ein 100ms Impuls an die SPS geschickt. So wie halt auch vom Taster.
Wenn man aber auch lange Tastendrücke simulieren will muss man es so machen:

```
<script type="text/javascript">
   //Events
   // add to all buttons this events:   
   $('select').change(function() {
    SetValueToPLC(this.getAttribute("data-PDD"),jQuery(this).val());
    } );
   $('button').bind('vmousedown', function () {
    $('button').unbind("vclick");
    SetValueToPLC(this.getAttribute("data-PDD"),"1");    
    } );    
   $('button').bind('vmouseup', function () {
    $('button').unbind("vclick");    
    SetValueToPLC(this.getAttribute("data-PDD"),"0");    
    } );    
  </script>
```

Ob das mit Touch auch geht kann ich nicht testen. Aber 'vmousedown' und 'vmouseup' sind von der jQuery Mobile. 

Zusätzlich wird die Wohnzimmer.js nicht mehr gebraucht. Ich habe es in die Globale zusammengefasst. Damit waren dann meine "not defined" Fehler auf dem Webserver der ILC beseitigt. Ansonsten ging es nur bei jedem fünften mal ohne Probleme.

Dazu muss in der Wohnzimmer.html aber dies noch geändert werden:

```
<body onload="ldHMTL()" onunload="uldHTML()">
```

Anhang anzeigen GlobalFunctions.zip


----------



## Mobi (23 September 2012)

Achso das, dass musste ich bei meiner Visu (als exe) auch bedenken. Das ist ja das Verhalten der Windows-Buttons, nur wollte ich es so machen wie ein Taster, das also schon beim drücken der "Befehl" ausgeführt wird. Also das, was du nicht willst. Weil jetzt kann ich nämlich den Button solange gedrückt halten, z.B. bei einer Jalousie, bis sie halt da ist wo ich sie haben möchte. Oder z.B. auch als Dimmer.


----------



## Mobi (24 September 2012)

Hab jetzt mal die Seiten auf den ILC abgelegt. Funktioniert auch. Und die Grafik ist auch geblieben, fehlt nix.


----------



## Portisch (24 September 2012)

Jetzt stehe ich eh schon wieder vor dem nächsten Problem!
Der Http Request bringt mir ja ein XML von der ILC zurück.

Aber es funktioniert leider nicht mit Sonderzeichen!
Also Umlaute, '°',....
Dann kann kein XML aus dem responseXML erzeugt werden...

Was für ein String Encoding hat die ILC? Wie setzt man den XMLHTTPRequest richtig?

Das Spuckt getAllResponseHeaders aus:


> Server: Phoenix-Contact/1.02 (powered by SpiderControl TM)
> X-HitCounter: 22153
> Cache-Control: no-cache
> Pragma: no-cache
> ...


----------



## Mobi (24 September 2012)

Hmm...Also mit meiner Anwendung klappt das. Also eigentlich müsste es zurückkommen auch mit Umlauten.


----------



## Vaninger (24 September 2012)

*Vielen Dank und weitere Fragen/Erkenntnisse*

Hallo ihr zwei,

schon mal vielen Dank für eure fleißigen Programmier- und Teststunden und die Bereitstellung eurer Ergebnisse hier im Forum...
Habe den letzten Stand von Portisch heute endlich ausprobieren können, die Buttons funktionieren soweit schon einmal bei mir. Das Einzige, was nicht zu funktionieren scheint, sind die Änderung des Licht Image von an auf aus sowie die dazugehörige Änderung des Buttons von an auf aus und umgekehrt. Funktioniert das bei euch? Außerdem ist mir noch aufgefallen, dass die Umrandung des Buttons nach dem Drücken weiterhin bläulich schimmert und erst nach Klicken in die Webseite ihre Farbe wieder verliert...

@Portisch:
Wo hast du deine Probleme mit den Umlauten? Wenn du die Variable mit Umlauten benennst oder wie? Kann dies auch gerne nochmal bei mir ausprobieren.

Kurz noch eine andere Frage. Wie kann man sich eigentlich in JQuery bzw. JavaScript einfach einen Wert anzeigen lassen, quasi ein Label mit einem Variablenwert?


```
// check what type of object function
        switch (actObject.getAttribute("data-obfunc"))
```

So wie ich es bisher verstehe, müsste ich hier noch eine Switch Anweisung für ein Label bzw. Textfeld ergänzen, dass dann in der Html aufgerufen bzw. definiert wird, oder? Vielleicht hat dass schon jemand von euch gemacht oder kann mir das entsprechende Stichwort hierzu geben...

Danke und einen schönen Abend

Grüße
Daniel


----------



## Portisch (24 September 2012)

Also es kommt so rein:

in der function GetData(xhttp):


> var responseText = xhttp.responseText;


responseText  = ....Sonnenh?tstand: 12:57:03....



> var responseText = encode_utf8(xhttp.responseText);


responseText  = ....Sonnenhï¿¿tstand: 12:57:03....



> var responseText = decode_utf8(xhttp.responseText);


responseText  = ....Sonnenh?tand: 12:57:03....

Das originale 'xmlDoc = xhttp.responseXML;' geht gar nicht, denn 'xmlDoc.getElementsByTagName('n').length' ergibt 0.
Sollte aber 6 (da sechs Elemente) sein.
Es gibt einen Parse Error: "Im Textinhalt wurde ein ungültiges Zeichen gefunden.\r\n"
Errorcode: -1072896760
Er kommt genau so weit:


> "<body><version>1.0</version><client>IMasterPhoenix5_14_05</client><client_ver>5.14.0501</client_ver><item_list_size>6</item_list_size><item_list><i><n>@GV.ONBOARD_OUTPUT_BIT0</n><v>0</v></i><i><n>Benachrichtigung.bGlobalMessageEnable</n><v>0</v></i><i><n>@GV.Local_Time_Formated</n><v>24.09.2012 20:38</v></i><i><n>@GV.Sun_Rise</n><v>Sonnenaufgang: 6:31:48</v></i><i><n>@GV.Sun_Midday</n><v>Sonnenh"


Also genau da wo dann das 'ö' kommen sollte.

Eigentlich sollte es 'Sonnenhöchststand: 12:57:03' heissen.
Ich komme aber nicht darauf was falsch ist.

Also einfach bei der ILC einen String mit Umlaut auf PDD setzen - dann geht es nicht mehr.
Ich habe auch noch andere Strings wo ein Grad Zeichen ('°')dabei ist, da ist es das gleiche.
In meinem Delphi Programm schicke ich einen UTF8 Encoded String zur ILC.
Mit dem Response Text vom Request mache ich auch wieder ein UTF8 Encode und dann passt es mit den Sonderzeichen und Umlauten.
Bei Javascript schaffe ich es aber nicht...


Ich habe das ganze noch um Strings erweitert, da ist es mir aufgefallen:

Im HTML:


> <ul data-role="listview">
> <li id="@GV.Sun_Rise" data-obfunc="sValues"></li>
> <li id="@GV.Sun_Midday" data-obfunc="sValues"></li>
> <li id="@GV.Sun_Set" data-obfunc="sValues"></li>
> </ul>



In der GlobalFunctions bei der ldHTML Funktion das dazu:


> // get all list items of html
> var d = document.getElementsByTagName('li');
> for (var i = 0; i < d.length; i++)
> {
> ...


_

Und in der GetData das dazu:



			// Object String Value
    case 'sValues':
     jQuery(actObject).text(xmlDoc.getElementsByTagName('v').childNodes[0].nodeValue);       
     break;

Zum Vergrößern anklicken....



Es sind einfach listen in der HTML die mit String Variabeln von der ILC gefüttert werden.

Das 'data-obfunc' Element definiert was das Script in der der GetData Funktion mit den Daten machen soll.
Licht, Jalousie und nun auch sValues machen etwas unterschiedliches._


----------



## Mobi (25 September 2012)

Hmm, also bei mir kommt alles an, siehe Screenshot.


----------



## Vaninger (25 September 2012)

Hallo,

@Portisch: Ich werde das heute Abend auch mal ausprobieren und eine Variable mit Umlaut verwenden. Mal schauen, was bei mir passiert.
Vielen Dank für dein Beispiel für Listview´s, werde ich auch heute bzw. morgen mal ausprobieren.
Welches Programm verwendest du eigentlich so für die JavaScript Sachen?

@Mobi: Schaut ja schon ganz gut aus... 

Schöne Grüße
Daniel


----------



## Portisch (25 September 2012)

@Mobi: Ja, in Delphi habe ich es auch geschafft obwohl ich mich da auch etwas spielen musste. Delphi ist da nicht so einfach mit Ansi, Unicode, PWideChar, UTF8,.... So scheint es mit Javascript auch zu sein.
Vielleicht kannst du bei deinem Programm noch die String Codierung rausfinden?

@Vaninger: Ich mache das mit Ultraedit. Debuggen tu ich dann mit dem internen Debugger vom IE9 (einfach F12 drücken). Leider ist es etwas umständlich, da man immer die Datei lokal ändert und dann auf den FTP der Steuerung kopieren muss. Bei jeder kleinen Änderung ist das extrem Umständlich. Gibt es da einen Weg die Dateien direkt auf dem FTP der SPS zu öffnen und dort zu editieren?


----------



## Mobi (25 September 2012)

Ich nutze die winhttp.dll. Die bekommt die Antwort als Binary, also Hexcode, quasi Raw. Und ich wandel mir das dann nur in einen String um in UTF8.


----------



## Portisch (25 September 2012)

Ok, danke!

Bin nun drauf gekommen, dass bereits das XMLHttpRequest Document einen Parse Error rausspuckt.
Also beim Empfangen von dem XML der ILC hauts schon nicht mehr hin.

Ich bin nun auf das noch gestossen:
http://api.jquery.com/jQuery.post/

Kann das mal jemand zusammenbauen mit den Richtigen Parameter?
Vielleicht geht's damit...


----------



## Vaninger (26 September 2012)

*Umlaute*

Guten Abend,

@Portisch:
Wollte gerade mal dein Umlaut Problem ausprobieren, in PCWorx lässt sich ja gar kein Umlaut als Variable verwenden, geschweige denn ein °-Zeichen...
Habe nach ein wenig Googeln ein paar Links gefunden, evtl. helfen dir diese weiter. Stichwort Encoding und Decoding!

http://www.fundstücke-im-netz.de/2012/03/28/umlaute-mit-ajax-verwenden/
http://www.unseenrevolution.com/jquery-ajax-post/
http://de.selfhtml.org/javascript/objekte/unabhaengig.htm#encode_uri_component
http://www.jquery4u.com/ajax/key-differences-post/#.UGNGyVHP9f9
http://www.ajax-community.de/allgemein/8928-jquery-ajax-sonderzeichen-umlaute.html

Als Programm nutze ich derzeit Notepad++ bzw. PS Pad, allerdings weiß ich gar nicht, ob hier ein Compiler integriert ist...

Das Beispiel mit den Listviews muss ich auch noch ausprobieren, bin leider etwas erkältet und kam gestern auch noch nicht dazu.

@alle: Hat von euch zufällig jemand einen PCWorx Baustein, der zu einem bestimmten Zeitpunkt einen Impuls ausgibt. So eine Art Zeitschaltuhr, die an einem bestimmten Datum (nicht Wochentag) zu einer bestimmten Uhrzeit eine Aktion ausführt?

Danke und schöne Grüße
Daniel


----------



## Portisch (27 September 2012)

> Wollte gerade mal dein Umlaut Problem ausprobieren, in PCWorx lässt sich ja gar kein Umlaut als Variable verwenden, geschweige denn ein °-Zeichen...
> Habe nach ein wenig Googeln ein paar Links gefunden, evtl. helfen dir diese weiter. Stichwort Encoding und Decoding!


Schon klar, nicht der Variable Name selber sondern der Variable Inhalt ist Gemeint!

Das mit dem Encoding habe ich schon 20-mal Probiert. Kein Erfolg!
Ich habe aber noch den Tipp erhalten den Response auf HTML zu setzen. Derzeit habe ich ihn auf XML, aber es wird ja kein XML Header im Response mitgeschickt -> HTML, nicht XML. Muss ich mal probieren.


----------



## Portisch (27 September 2012)

Habe hier einmal eine Entry.html und eine eigene GlobalFunctions.js angehängt.
Einfach in der GlobalFunctions den Variabelnamen anpassen: @GV.Sun_Midday --> zu der eigenen
Diese Variable als String in der ILC anlegen und PDD aktivieren. Dann als Anfangswert z.B. 'Höhe' oder was auch immer zuweisen.
Bei mir kommt dann kein 'ö' an sondern nur Blödsinn. Komme auf keine Lösung...


----------



## Mobi (27 September 2012)

Hast du mal mit Wireshark die Pakete beobachtet?


----------



## Portisch (27 September 2012)

Ne, aber ich habe mir einmal den Rawstring in Delphi angesehen:
000000b4h: 68 *F6 *63 68                                     ; h*ö*ch

Scheint also ISO-8859-1 zu sein!?
XMLHTTPRequest ist es zumindest beim IE9 egal was für ein Encoding ich einstelle...

Wenn ich ein UTF8 Encode fom responseText mache kommt das raus: *ï¿¿*


----------



## Mobi (27 September 2012)

Versuch mal in der .js
so

```
xhttp.setRequestHeader("Content-Type", "application/xml; charset=ISO-8859-1");
xhttp.setRequestHeader("Charset", "ISO-8859-1");
```
oder so

```
xhttp.setRequestHeader("Content-Type", "application/xml; charset=UTF-8");
xhttp.setRequestHeader("Charset", "UTF-8");
```


----------



## Portisch (28 September 2012)

http://channel9.msdn.com/Forums/TechOff/260993-Override-XMLHTTPRequest-charset

Genau so ist es hier! Der XMLHTTPRequest bekommt keinen UTF-8 Response -> Sonderzeichen werden zu 0xFFFF -> unbrauchbar.
Wenn ich den responseText als Byte Array in der Console ausgebe ist das 0xFFFF beim 'ö' zu finden.

Lösung dafür: Keine Sonderzeichen verwenden!
Ich habe auch Spirdercontrol mal angeschrieben ob man den Webserver auf der ILC auf UTF-8 umstellen kann. Mal sehen ob da eine Antwort kommt.


----------



## Mobi (28 September 2012)

Ich habs jetzt mal getestet mit den Umlauten bei mir. Bei mir klappt es.


----------



## Portisch (28 September 2012)

Mit Javascript (XMLHTTPRequest)? Welcher Browser?
Kannst du mir die entry.html und Javascript Datei hochladen?


----------



## Vaninger (28 September 2012)

*umlaut*

Hallo,
konnte es auch gerade testen, bei mir kommt folgende Meldung: var_not_found

Habe eine String Variable umlaut angelegt, als Startwert habe ich böse angegeben...

Mit der Original Datei von Portisch bekomme ich zwar das Ergebnis zurück, das ö von böse ist aber ein Viereck... 
Getestet mit IE9 und Firefox... 


Schöne Grüße
Daniel


----------



## Mobi (28 September 2012)

Variable umlaut wirds auch nicht geben. Wenn dann @GV.Umlaut oder Main.Umlaut oder so, je nachdem obs Global oder Lokal ist.


@Portisch: ne nix von dem. Ohne Browser. Mit meiner exe.


----------



## Vaninger (28 September 2012)

Hi Mobi, 
stimmt, siehe Korrektur meines vorherigen Beitrages. Ist mir dann auch noch aufgefallen 

Das ö wird halt als Viereck angezeigt! 

Gesendet von meinem GT-I9300 mit Tapatalk 2


----------



## Mobi (28 September 2012)

Wie ist das eigentlich bei euch? Bei mir dauert es, wenn ich lokal auf die ILC zugreife, ca. 60ms zwischen Anfrage und Antwort. Wenn ich extern (über DynDns), also über Internet zugreife, ca. 300ms.


----------



## Portisch (29 September 2012)

> @Portisch: ne nix von dem. Ohne Browser. Mit meiner exe.


Hier geht es die ganze Zeit um XMLHTTPRequest mit Javascript.
Mit meiner EXE geht es auch Umlaute oder Sonderzeichen zu übertragen.

Mit Javascript aber  direkt aber nicht!


----------



## Mobi (29 September 2012)

Ich wollte nur damit sagen, dass es somit nicht an den Webserver liegt.


----------



## Portisch (3 Oktober 2012)

> Ich wollte nur damit sagen, dass es somit nicht an den Webserver liegt.


Naja, stimmt nicht ganz.

1. Ist UTF-8 eigentlich heutzutage schon Standard
2. Schickt der Server beim Response keine Encoding Info mit. Somit kann der Client nicht Automatisch das Encoding einstellen

Aber egal: mit Javascript und XMLHTTPReuest sind keine Sonderzeichen möglich!!

@Jens: Auf jeden Fall vielen Dank für die Basic mit jQuery Mobile!! 

Ich habe nun alles zusammen bearbeitet und einsatzbereit. Alle jQuery Pages sind nun in der entry.html.
Bei jedem Öffnen einer Page werden die aktuellen IOs und Strings von nur dieser Page ausgelesen.
Das bedeutet, mann kann Variabeln von der ILC auch mehrmals  auf unterschiedlichen jQuery Pages verwenden (siehe @GV.Local_Time_Formated).

Zusätzlich habe ich noch die Verarbeitung von Checkboxen hinzugefügt (Benachrichtigung.bGlobalMessageEnable).

Standard ist, dass die Listview Items (Strings) nur einmal beim Öffnen der jQuery Page eingelesen werden.
IOs wie 'button', 'select' und 'checkbox' werden im Sekundenintervall von der ILC gelesen.
Will man bestimmte Listview Items trotzdem jede Sekunde einlesen so muss man einfach das 'data-auto' Attribute hinzufügen.

EDIT:
Habe noch einen kleinen Fehler wegen FireFox usw ausgebügelt.
Der IE liefert bei *getElementsByName* immer ein Ergebnis, egal ob 'id' oder 'name'.
Andere Browser sind da nicht so großzügig...
Deswegen die neue Funktion *getElementsByAttribute

*EDIT 2:
Jetzt hat sich doch noch ein FireFox Fehler eingeschlichen!
Habe den Anhang neu hochgeladen!


----------



## Portisch (4 Oktober 2012)

Vielleicht nun das letzte Update von meiner Seite!

Habe das Script noch etwas für den Mobilen Zugriff abgeändert.
Vorher wurde ein Auto Update Timer mit z.B. 1000ms gesetzt.

Wenn die Internetverbindung aber nicht schnell genug ist, haben sich die Updates überschlagen.
Nun wird der Timer bei jeder Abfrage deaktiviert und nachdem alles abgeschlossen ist wieder aktiviert.

Nun geht's auch mit meinem Blackberry bei Edge Verbindung


----------



## Vaninger (8 Oktober 2012)

*Vielen Dank!*

Hallo Portisch,
wollte mich nochmal für das Bereitstellen deiner Dateien bedanken...
Habe deine Dateien jetzt gerade mal ausprobiert, scheint alles gut zu funktionieren. War jetzt eine Woche im Urlaub, sonst hätte ich mich schon früher bei dir für deine Mühen bedankt...

Schöne Grüße
Daniel


----------



## Portisch (9 Oktober 2012)

Ich habe den Source aber noch um einiges bearbeitet und mehr abgesichert.
Es konnte vorkommen, dass man die ganze SPS in den Stop Betrieb stellen konnte.
Das ist natürlich nicht so super :-(

Wenn ich etwas zusammen habe stelle ich die GlobalFunctions.js neu ein.


----------



## Mobi (9 Oktober 2012)

In Stop: Wie denn?


----------



## Vaninger (9 Oktober 2012)

Habe heute noch mal einige Funktionen getestet, bis jetzt läuft alles einwandfrei... Das Einzige was nicht geht, ist das Testen der Html, wenn sie nicht auf der ILC liegt. Dann kommt lediglich eine schwarze Seite mit dem Aktualisieren Zeichen... 

Schöne Grüße 
Daniel 

Gesendet von meinem GT-I9300 mit Tapatalk 2


----------



## Portisch (10 Oktober 2012)

Erstens ist ein Object im Source verwendet für Setzen und Abfragen.
Dann war es auch noch möglich wenn ein Fehler im HTML war, dass die Variable 'null' gesetzt wurde.
Auch wenn der Value auf '' war wurde es gesetzt.

Seit ich das auch abfange hat die SPS zumindest nicht mehr gestoppt.

Das das HTML nur auf der SPS geht ist klar! Es ist ja keine Adresse in der GlobalFunctions.js eingetragen.
Wenn man es extern auf der SPS testen will muss man die IP hinzufügen und einen Browser verwenden, der Cross-Domain-Request zulässt.
Z.b. der Internet Explorer. FireFox kann es z.b. nicht!


----------



## Portisch (10 Oktober 2012)

Hier noch ein Paar Screens von meinen Ideen.
Ist noch lange nicht fertig...


----------



## Vaninger (10 Oktober 2012)

Hallo Portisch, 
Das schaut extrem super aus. Hast du das alles mit Java Script programmiert? 

Gesendet von meinem GT-I9300 mit Tapatalk 2


----------



## Portisch (15 Oktober 2012)

Das ist jQuery Mobile + das GlobalFunctions.js.

Jedoch gibt es mit dem Webserver der ILC einige Probleme. Bei Images egal ob PNG oder GIF werden nicht immer alle übertragen.
Ich habe aber eine Info das Phoenix Contact den Webserver erweitern wird. Mal sehen ob es dann besser wird wenn wirklich was kommen sollte...

Derzeit ist es am besten einen Extra Webserver zu verwenden der richtig funktioniert!


----------



## Vaninger (15 Oktober 2012)

*Fragen zu JQuery*

Hallo Portisch,
vielen dank für die Antwort. Habe mir schon gedacht, dass du das mit jQuery gemacht hast. Habe jetzt auch ein wenig damit gespielt und zumindest schon mal die einfachen Sachen hinbekommen wie z. B. eine Navbar im footer und dergleichen. 

Hätte noch drei kleine Fragen an dich:

1) Wie hast du das Icon im Header erzeugt? Habe jetzt schon verschiedene Varianten durchprobiert, leider nicht mit dem gewünschten Ergebnis.
2) Hast du bei deiner Übersicht "Stockwerk" die Icons selber auf Grundlage des Planes deines Hauses erstellt? Mit welchem Programm funktioniert das?
3) Wenn ich die Dateien auf einem extra Webserver ablege, dann muss ich in der GlobalFunctions.js den Pfad in der function fhttprequest und in der function SetValueToPLC mit der IP der Steuerung ergänzen, oder? 
z. B. "var command="http://192.168.3.3/cgi-bin/writeVal.exe?" + sVariable + "+" + sValue;"



> Ich habe aber eine Info das Phoenix Contact den Webserver erweitern  wird. Mal sehen ob es dann besser wird wenn wirklich was kommen  sollte...



Wird der Webserver dann über ein Update oder dergleichen erweitert oder benötigt man hierzu eine neue Steuerung?

Danke für deine Antwort.

Schöne Grüße
Daniel

PS. Hier noch ein schöner Link zu einem jQuery Tutorial
http://de.slideshare.net/plobacher/jquery-mobile-kompakt-das-kompendium


----------



## Portisch (15 Oktober 2012)

> Wie hast du das Icon im Header erzeugt? Habe jetzt schon verschiedene Varianten durchprobiert, leider nicht mit dem gewünschten Ergebnis.




```
<div data-role="header" data-position="fixed" >
  <img src="homeact.png" style="margin-top: 3px; margin-left: 5px;" ></img>
  <span id="@GV.Local_Time_Formated" data-obfunc="String" data-auto="Update" style="display: inline; position: absolute; top: 11px;" ><span></span></span>  
 </div><!-- /header -->
```



> Hast du bei deiner Übersicht "Stockwerk" die Icons selber auf Grundlage des Planes deines Hauses erstellt? Mit welchem Programm funktioniert das?


Sweet Home 3D



> Wenn ich die Dateien auf einem extra Webserver ablege, dann muss ich in der GlobalFunctions.js den Pfad in der function fhttprequest und in der function SetValueToPLC mit der IP der Steuerung ergänzen, oder?


Ist richtig. Jedoch weis ich noch nicht wie und ob das funktioniert wenn das ganze auf einem anderen Webserver liegt und man dann über das Internet zugänglich macht...



> Wird der Webserver dann über ein Update oder dergleichen erweitert oder benötigt man hierzu eine neue Steuerung?


Sollte per Firmwareupdate gehen. Zumindest war bei der neueren Firmware auch schon Update des Webservers dabei. Ob hier jedoch mal etwas kommt weis ich nicht.

Ich spekuliere eher damit mir auf dem Router mit DD-WRT Firmware mir einen eigenen Webserver einzurichten.


----------



## Vaninger (15 Oktober 2012)

*Webserver*

Hallo Portisch, 
danke für deine schnelle Antwort.
Habe den Header von dir angepasst, funktioniert einwandfrei. Ich habe vorher immer mit Buttons herum experimentiert dabei geht es mit einem image natürlich bedeutend schneller und einfacher...

Das Programm Sweet Home 3D werde ich mir mal anschauen, schaut schon mal sehr vielversprechend aus.

Deine Idee auf einen Router mit dd-wrt einen Webserver zu installieren finde ich gut, habe zur Zeit selber zwei WRT54-GL von Linksys als Access Point im Einsatz, auf denen bereits dd-wrt installiert ist. Als Alternative könnte ich auch meine Synology Diskstation als Webserver einrichten und auf dieser die Dateien ablegen. Mal schauen, wie das technisch umsetzbar ist. 

Nun denn, schöne Grüße
Daniel


----------



## Portisch (18 Oktober 2012)

Noch ein kleiner Tipp nebenbei:

Mann kann auch bei Variabeln die eine Struktur haben oder bei Array das PDD aktivieren.

z.B. habe ich diese Struktur:

```
TYPE
T_T_SENSOR_DATA : STRUCT
 Name : STRING;
 Actual_T : STRING;
 Actual_V : STRING;
 Actual_H : STRING;
 Actual_P : STRING; 
 Serial : STRING;
 Last : STRING;
 Last_Logging : INT;
 SensorTyp : INT;
END_STRUCT;
END_TYPE
(**)
TYPE
T_SENSOR_DATA_L : ARRAY[0..9] OF T_T_SENSOR_DATA;
END_TYPE
```

Nun habe ich in einem Funktionsblock eine Variable MyData : T_SENSOR_DATA_L.
Bei 'MyData' kann das PDD gesetzt werden.

Extern mit HTTP Request kann man dann auf den ganzen Inhalt der Variable, jedoch einzeln zugreifen:
MyData[0].Name, MyData[1].Name, MyData[5].Last, ....

Man muss die Daten einzeln abgreifen. Ein abfragen der 'MyData' Variable direkt geht nicht.


----------



## Vaninger (18 Oktober 2012)

*Interessant*

Hallo Portisch,

klingt sehr interessant, werde ich mal ausprobieren. 
Das von dir angesprochene Problem mit der Darstellung von Bildern bzw. Icons habe ich auch, wenn die entry.html auf dem Webserver der Steuerung liegt. Habe die letzten Tage probiert, ob ich einen Request von der entry.html, die auf meiner NAS (Synology Diskstation mit Apache Webserver) liegt, zur ILC bekomme. Leider ohne Erfolg. Als Fehler taucht immer "access denied" auf. 

Wenn ich die entry.html sowie die GlobalFunctions.js (Pfad in Datei um IP der ILC ergänzt) auf meinem Desktop ablege und dann einen Request sende, bekomme ich ebenfalls keine Antwort von der ILC. 

Funktioniert das eigentlich bei dir? Oder taucht hier wieder das Cross domain Problem auf?

Schöne Grüße
Daniel


----------



## Portisch (19 Oktober 2012)

Habe gerade das gleiche Problem. Es liegt wieder einmal bei dem Thema 'Cross Domain Requests'!

Ich habe nun lighttpd auf meinem Router laufen und wenn ich die Option in der Sicherheitseinstellungen des IE9 aktiviere geht es.
Per Default ist sie aber deaktivert und deswegen geht es nicht. Mit FireFox oder Chrom braucht man gar nicht erst damit anfangen.
Stehe momentan etwas auf dem Schlauch.

Ansonsten ist lighttpd gegenüber dem Webserver der ILC ein riesiger Vortschritt! Bilder gehen und die Geschwindigkeit ist auch um einiges mehr!
Werde noch andere Webserver wie apache usw probieren.


----------



## Portisch (22 Oktober 2012)

Habe nun eine Lösung für das Cross Domain Problem!
:grin:

Meine SPS hat die IP 192.168.0.20
Mein Webserver hat die IP 192.168.0.1
Mein Dummy DNS Name damit der Webserver vom Internet verfügbar ist: myServer.portisch.com

Ich habe auf dem Router DD-WRT mit der IP 192.168.0.1. Dort habe ich den DD-WRT-WebGui Port von 80 auf 81 abgeändert.
Dann auf dem USB-Stick am Router OptWare installiert.
Dann lighttpd aus dem OptWare Package.

In der lighttpd config habe ich den Proxy aktiviert und diese Config eingestellt:

```
$HTTP["host"] =~ "(myServer.portisch.com )" {
$HTTP["url"] =~ "^/cgi-bin/ILRReadValues(.*)$" {
proxy.server = ("" => (
("host" => "192.168.0.20", "port" => 80)
))
}
}
$HTTP["host"] =~ "192.168.0.1" {
$HTTP["url"] =~ "^/cgi-bin/ILRReadValues(.*)$" {
proxy.server = ("" => (
("host" => "192.168.0.20", "port" => 80)
))
}
}
```

Das bedeutet, die Aufrufe die '/cgi-bin/ILRReadValues' beinhalten werden auf die IP 192.168.0.20, Port 80 umgeleitet.
Somit braucht man beim XMLHTTPRequest keine IP mehr eingeben und es kommt zu keinem Cross Domain Fehler:

Alt:

```
xhttp.open("POST",InetAddress + "/cgi-bin/ILRReadValues.exe",false);
```
Neu:

```
xhttp.open("POST", "/cgi-bin/ILRReadValues.exe",false);
```


----------



## Vaninger (22 Oktober 2012)

*Wahnsinn!*

Hallo Portisch,

ich habe mir auch das ganze Wochenende schon verschiedene Internetseiten zum Thema Cross Domain angeschaut, alles sehr interessant, nur leider half mir das nicht weiter...
Welchen Router und welche Firmware verwendest du jetzt?
Hab mir den Lighttpd Web Server auch schon angeschaut, muss ich mir aber wohl mal etwas genauer anschauen... Muss dir übrigens ein großes Kompliment machen, finde echt klasse, wie du dich mit den verschiedensten Dingen auskennst und immer wieder tolle Lösungen hier im Forum präsentierst!!!

Verwendest du jetzt dd-wrt oder OpenWrt, da wäre ja schon ein Webserver dabei, wenn ich das richtig verstanden habe. Die Lösung mit dem Router ist auf jeden Fall die beste Möglichkeit, da dieser ja sowieso immer laufen muss und dadurch ein weiterer Server nicht notwendig ist. 

Werde mal versuchen, deine Lösung nachzubauen und mir hierzu einen neuen Router zulegen...

Deine Hilfe wäre dann natürlich wieder gerne willkommen.

Schöne Grüße
Daniel


----------



## Portisch (22 Oktober 2012)

Danke!

Ich habe den WNR3500L mit DD-WRT.

http://www.dd-wrt.com/wiki/index.php/Optware,_the_Right_Way
http://www.dd-wrt.com/wiki/index.php/WEB_server

Der hat einen USB Port wo ich einen HUB dran habe.

Es ist ja auch noch ein USB Drucker und ein Mobile Stick und ein 16GB USB-Stick als JFFS mit dran.
Gleichzeitig hat man damit ein NAS und auch einen FTP Server.

Ich speichere ja auch gleich die SPS Sensordaten auf dem FTP über die Oscat Bibliothek ab.

EDIT:
Die Proxyumleitung muss man für die WriteVal.exe natürlich auch noch machen.


----------



## Mobi (23 Oktober 2012)

Ah schön. Bei mir läuft die ILC schon seit längeren über meinen Router, damit ich über DynDns von woanders drauf komme. Nur ich habe den Port 5000 von dem Router auf den Port 80 weitergeleitet von der ILC. Damit ich noch ganz normal auf das Webinterface vom Router komme. Ich hab übriegens eine Fritzbox 7270.


----------



## Vaninger (23 Oktober 2012)

*Router ist bestellt - Welche dd-wrt Firmware?*

Hallo,
bei der Visualisierung (Flowchief) meiner Hobbybrauerei kann ich auch über DynDns auf die Bedienoberfläche übers Internet (Internet Explorer) zugreifen, ich verwende hier ebenfalls eine FritzBox 7270. Da diese aber auf Java basiert, kann ich mit meinen Android Geräten bzw. Iphone hier nix damit anfangen...

@Portisch
Hab mir heute den gleichen Rouer bestellt, wird aller Vorraussicht am Freitag geliefert. Welche Firmware Version von dd-wrt hast du benutzt?

Danke und schöne Grüße
Daniel


----------



## Portisch (23 Oktober 2012)

Auf dem WNR3500L habe ich aktuell dieses Image drauf:
ftp://dd-wrt.com/others/eko/BrainSl...dcom_K26/dd-wrt.v24-18777_NEWD-2_K2.6_big.bin

Neuere lassen sich leider nicht einspielen.
Aber auf jeden Fall schön nach Anleitung von der original Firmware auf DD-WRT umsteigen!!

Damit man über den WAN Port (Internet) auf einen internen Webserver zugreifen kann muss man das in das Firwall Script in der Webgui einspeichern:

```
/usr/sbin/iptables -I INPUT 1 -p tcp --dport 80 -j logaccept
```

Für Builds <19969 muss man dies wegen einen Bug reinschreiben:

```
insmod ipt_mark
insmod xt_mark
/usr/sbin/iptables -t mangle -A PREROUTING -i ! `get_wanface` -d `nvram get wan_ipaddr` -j MARK --set-mark 0xd001
/usr/sbin/iptables -t nat -A POSTROUTING -m mark --mark 0xd001 -j MASQUERADE
/usr/sbin/iptables -I INPUT 1 -p tcp --dport 80 -j logaccept
```

Somit kann man über Port 80 dann vom Internet ins Netzwerk rein.
Dann noch den WebGui Port von 80 auf z.B. 81 ändern, JFFS2 einschalten mit USB-Stick, Optware installieren, lighttpd installieren, config einstellen, usw...


----------



## flowchief (24 Oktober 2012)

Hallo Daniel, 

FlowChief funktioniert durchaus auf mobilen Geräten. Hierzu benötigst du serverseitig scadaApp. Dieses FlowChief Modul ermöglicht einen Zugriff auf das vollständige System, auch ohne Java. Prozessbilder oder Leitsystemkonfiguration muss dazu nicht angepasst werden. Einzig eine Lizenzerweiterung ist nötig. 
Als Test kannst Du Dir gerne mal die Demoapplikation unter http://www.flowchief.de/demo/ über Dein IOs/Android Gerät ansehen. 

Viele Grüße
Das FlowChief Support Team


----------



## Vaninger (24 Oktober 2012)

*Flowchief ScadaApp*

Liebes Flowchief Team,
mal wieder vielen Dank für die Antwort und den Hinweis zur neuen ScadaApp. Habe diese auch schon auf euerer Webseite ausprobiert, funktioniert tadellos.
Im Übrigen bin ich auch sehr mit meiner Visualisierung von Flowchief zufrieden und auch der Support bei der Erstinstallation und sonstigen Fragen und Problemen war hervorragend. Großes Lob meinerseits, weiter so!

Schöne Grüße
Daniel


----------



## Portisch (29 Oktober 2012)

Jens944S2 schrieb:


> Übrigens: Ich habe noch folgende Probleme bei der Realisierung per Jquery Mobile:
> 
> 1.: Ich möchte die Bibliotheken gerne aus dem Flash vom ILC laden (damit der ILC nicht immer eine Internet-Verbindung braucht) Allerdings wird dann die CSS-Datei nicht richtig geladen. Es ist scheinbar NICHT möglich, irgendeine CSS-Datei, welche im Flash des ILC liegt, in eine HTML-Seite auf dem ILC einzubinden.
> Ich vermute, es liegt an dem Webserver des ILC. Andere Dateien (Bilder, *.js, *.html, ...) funktionieren.
> ...



Etwas spät aber doch! Habe nun auch dafür eine Lösung um die CSS Datei lokal zu verwenden.
Und zwar lädt man sich diese ZIP Datei runter:
http://code.jquery.com/mobile/1.2.0/jquery.mobile-1.2.0.zip

Der Ordner "images" wird benötigt um bei den Buttons und Listviews die Pfeile anzuzeigen.

Zusätzlich kann ich *lighttpd* nur empfehlen!
Habe den Webserver nun auch so eingerichtet, dass wenn ich von extern über die DYNS Adresse darauf zugreife ein Login Dialog kommt.
Intern im eigenen Netzwerk braucht man kein Login.


----------



## Vaninger (29 Oktober 2012)

Guten Abend,
gut zu wissen, dass das so funktioniert.
Warte immer noch auf meinen Router, nachdem ich bereits zwei Netgear WNR3500L bestellt habe und diese leider immer in v2 Ausführung bekommen habe, werde ich jetzt wohl einen Asus RT-n16 verwenden.
Bin mal gespannt, ob das alles funktioniert 

Schöne Grüße
Daniel


----------



## Vaninger (31 Oktober 2012)

*Installation Optware - Formatierung Stick*

Hallo Portisch, 
habe gestern meinen Router bekommen und bereits mit dd-wrt (svn 19519 mega) geflasht.
Die Installation von Optware hat soweit eigentlich auch funktioniert, jetzt habe ich aber doch noch eine Frage diesbezüglich an dich.
Wie hast du deinen Speicherstick formatiert (Dateiformat, Partitionen). Hast du eine Partition mit JFFS erstellt? 

Vielleicht kannst du mir bei der Einrichtung von Lighttpd noch ein paar Hinweise geben...

Schon mal danke für die bisherige Hilfestellung!

Schöne Grüße
Daniel


----------



## Portisch (1 November 2012)

Also ich habe einen 16GB Stick mit NTFS am Router drann.
 Dieser wird als JFFS gemounted.

Das ist meine lighttpd Config mit nur den Änderungen die ich gemacht habe.
 'your.dyns.address.com' muss natürlich noch durch deine Webadresse geändert werden. Auch die IPs werden nicht zu 100% stimmen.

```
server.modules              = (
 #                               "mod_rewrite",
 #                               "mod_redirect",
 #                               "mod_alias",
 #                               "mod_access",
 #                               "mod_cml",
 #                               "mod_trigger_b4_dl",
                                 "mod_auth",
 #                               "mod_status",
 #                               "mod_setenv",
 #                               "mod_fastcgi",
                                 "mod_proxy",
 #                               "mod_simple_vhost",
 #                               "mod_evhost",
 #                               "mod_userdir",
 #                               "mod_cgi",
 #                               "mod_compress",
 #                               "mod_ssi",
 #                               "mod_usertrack",
 #                               "mod_expire",
 #                               "mod_secdownload",
 #                               "mod_rrdtool",
 #                               "mod_accesslog"
                                 )
 ## a static document-root, for virtual-hosting take look at the
 ## server.virtual-* options
 server.document-root        = "/jffs/www/"
 ## where to send error-messages to
 server.errorlog             = "/jffs/Data/lighttperror.log"
 # files to check for if .../ is requested
 index-file.names            = ( "index.html" )
 ## set the event-handler (read the performance section in the manual)
 # server.event-handler = "freebsd-kqueue" # needed on OS X
 server.event-handler = "poll" # needed on OS X
 proxy.debug         = 0
 #### accesslog module
 accesslog.filename          = "/jffs/Data/lighttpdaccess.log"
 ######### Options that are good to be but not neccesary to be changed #######
 ## bind to port (default: 80)
 server.port                = 80
 
 auth.debug = 0
 #auth.backend = "plain"
 #auth.backend.plain.userfile = "/jffs/opt/etc/lighttpd/pass.TXT"
 auth.backend = "htpasswd"
 auth.backend.htpasswd.userfile = "/jffs/opt/etc/lighttpd/lighttpd-htpasswd.user"
 
$HTTP["host"] =~ "(your.dyns.address.com)" {
   $HTTP["url"] =~ "" {   
    auth.require = ( "" =>
         (
         "method"  => "basic",
         "realm"   => "Bitte geben Sie Benutzername und Passwort für den geheimen Bereich ein. ",
         "require" => "user=sps"
         ),
     )
   }
     $HTTP["url"] =~ "^/cgi-bin(.*)$" {
         proxy.server  = ("" => (
             ("host" => "192.168.0.20", "port" => 80)
         ))
     }
 }
 $HTTP["host"] =~ "192.168.0.1" {
     $HTTP["url"] =~ "^/cgi-bin(.*)$" {
         proxy.server  = ("" => (
             ("host" => "192.168.0.20", "port" => 80)
         ))
     }   
}
 $HTTP["host"] =~ "(router)" {
     $HTTP["url"] =~ "^/cgi-bin(.*)$" {
         proxy.server  = ("" => (
             ("host" => "192.168.0.20", "port" => 80)
         ))
     }    
 }
```
 
Hier noch ein kleiner Geheimtipp:
DD-WRT hat ja auch Samba3 drinnen. Damit kann man sich Netzlaufwerke für Windows machen. Somit kann man auf die Dateien auf dem Router ganz einfach per Windows Explorer zugreifen. Das erleichtert die Bearbeitung der WWW Sachen echt um vieles!

Das als Startup Script im Router eintragen:

```
mount -o bind /jffs/opt /opt
sleep 10
rm /tmp/smb.conf
echo '[global]
netbios name = ROUTER
server string = ROUTER
syslog = 10
encrypt passwords = true
obey pam restrictions = yes
preferred master = yes
os level = 20
security = user
mangled names = no
max stat cache size = 64
workgroup = MSHEIMNETZ
bind interfaces only = Yes
guest account = nobody
map to guest = Bad User
smb passwd file = /var/samba/smbpasswd
private dir = /var/samba
passdb backend = smbpasswd
log file = /var/smbd.log
max log size = 1000
socket options = TCP_NODELAY
printing = none
load printers = No
usershare allow guests = Yes
[USB-Stick]
comment = USB-Stick
path = /jffs/Data
read only = No
guest ok = Yes
force user = root
[jffs]
comment = USB-Stick-Root
path = /jffs
read only = No
guest ok = Yes
force user = root
[www]
comment = WWW
path = /jffs/www
read only = No
guest ok = Yes
force user = root' >> /tmp/smb.conf
```

Im Windows Explorer greife ich dann per '\\router\www' auf den Ordner zu.


----------



## Vaninger (1 November 2012)

Hallo Portisch,
vielen dank für die zusätzlichen Infos. Wie hast du deinen Stick partitioniert oder hast du hier nur eine Partition in NTFS.
Gemäß dem Wiki von dd-wrt braucht man eine Partition Optware in ext3, eine Linuxswap und eine Data bzw mount...
Hast du das auch so gemacht? In die Optware wird dann entsprechend Optware installiert.

Gruß
Daniel


----------



## Portisch (2 November 2012)

Genau, nur eine Partition in NTFS. Das ext3 habe ich auch gelesen, hat aber ohne Probleme funktioniert.
Ich habe auf dem Stick einen Ordner 'opt' angelegt.
Der Stick wird dann beim Starten des Routers alls 'jffs' gemounted.

Dazu diese Zeile im Startupscript:

```
mount -o bind /jffs/opt /opt
```
Dann hat man das benötigte 'opt' Verzeichnis.


----------



## Vaninger (2 November 2012)

Guten Morgen,
okay, dann mach ich das auch mal so. Der Name der Partition ist dann egal, oder? Könnte man dann ja auch noch in Windows ändern...
HAbe jetzt die ganze Zeit entsprechend dem Wiki mit GParted gearbeitet, damit ich auch eine ext3 PArtition erstellen kann.

Schon mal vielen Dank, werde mal versuchen, deine Infos umzusetzen!

Schöne Grüße
Daniel


----------



## Vaninger (2 November 2012)

*Bisherige Einstellungen*

Hallo Portisch,

anbei ein paar Fotos von meiner bisherigen Konfiguration. Vielleicht könntest du diese mal mit deinen vergleichen und mir sagen, was hier noch fehlt bzw. falsch ist...

Startupskript:




Administration:



USB:



Status:




Falls das so stimmt, kann ich dann mit dem ganz normalen Skript aus "Optware - the right way" Optware installieren, oder?

Danke und schöne Grüße 
Daniel


----------



## Vaninger (15 November 2012)

*Paswortabfrage lighttpd*

Hallo Portisch,

entschuldige bitte, dass ich dich nochmals belästige, aber vielleicht kannst du mir hier nochmal einen kleinen Tipp geben. Nachdem ich nun endlich meinen Asus Router so konfiguriert habe, dass endlich auch Lighttpd und der WAN Zugriff funktionieren, wollte ich nun noch die von dir bereits getätigte Passwortabfrage unterbringen.
Leider steh ich etwas auf dem Schlauch, wie ich denn die Passwortdatei erstelle. Hast du hierzu einen Tipp?

Danke und schöne Grüße
Daniel

PS. Was macht deine Visualisierung? Läuft der Lighttpd Server noch problemlos?


----------



## Portisch (16 November 2012)

Bei mir läuft noch alles ohne Probleme!

Ich habe aber schon um einiges Weitergearbeitet.
Wegen dem Login habe ich auch etwas Zeit gebraucht:


Config:

```
auth.backend = "htpasswd"
auth.backend.htpasswd.userfile = "/jffs/opt/etc/lighttpd/lighttpd-htpasswd.user"

$HTTP["host"] =~ "(your.dyns.address.com)" {
   $HTTP["url"] =~ "" {   
    auth.require = ( "" =>
         (
         "method"  => "basic",
         "realm"   => "Bitte geben Sie Benutzername und Passwort für den geheimen Bereich ein. ",
         "require" => "user=sps"
         ),
     )
   }
     $HTTP["url"] =~ "^/cgi-bin(.*)$" {
         proxy.server  = ("" => (
             ("host" => "192.168.0.20", "port" => 80)
         ))
     }
}
```

d.h. Anfragen was über http://your.dyns.address.com reinkommen brauchen einen Login.
Über 'auth.backend.htpasswd.userfile' kann man den Pfad der Passwortdatei wo user und pass drinnen stehen angeben.
Ich hänge mal eine Datei dazu an. Es ist wie bei Apache ein MD5 checksum File.
User: sps
Pass: ilc150eth

Was ich aber noch befürchte ist wenn man per IP von aussen auf den Server zugreift kommt man trotzdem auf den Server ohne ein Login zu brauchen.


----------



## Portisch (21 November 2012)

*Aktueller Stand meiner Automatisierung*

Ich lade hier nun mal mein aktuelles Projekt hoch.
Es hat sich einiges im Javascript verändert.

Das Projekt geht natürlich nur mit den richtigen Variabeln auf der SPS. Es soll nur eine Grundlage dafür sein um sich selber was zusammen basteln zu können.

Die 'luftbefeuchtung.html' ist ausgelagert, da sie später im echtem Einsatz wieder rausfliegen wird.
Somit bleibt die 'index.html' kleiner.

Die 'GlobalFunctions.js' ist nun auch schon etwas mehr ausgereift. Die Element Suche im HTML habe ich komplett umgearbeitet.

Auch sieht man eine Einbindung von AmCharts in das Projekt. Ich habe ja OneWire Sensoren an der SPS per RS232 dranhängen.
Diese werden ausgewertet und die Daten auf einem FTP mitgeloggt.

Viel Spass damit!


----------



## Vaninger (21 November 2012)

Hallo Portisch,
vielen Dank für deine Mühen und deine Dateien, die Screenshots schauen ja hammermäßig aus!!!
Die Passwortabfrage auf meinem Router läuft nun dank dir auch, lediglich die Kommunikation mit der SPS muss ich noch machen/ausprobieren...

Schöne Grüße
Daniel


----------



## Portisch (21 November 2012)

Ich habe mich lighttpd auch noch etwas rumgespielt:


```
auth.debug = 0
auth.backend = "htpasswd"
auth.backend.htpasswd.userfile = "/jffs/opt/etc/lighttpd/lighttpd-htpasswd.user"

$HTTP["remoteip"] !~ "192\.168\." {
 auth.require = ( "" =>
     (
     "method"  => "basic",
     "realm"   => "SPS Steuerung",
     "require" => "user=sps"
     ),
 )
}

$HTTP["url"] =~ "^/cgi-bin(.*)$" {
 proxy.server  = ("" => (
  ("host" => "192.168.0.20", "port" => 80)
 ))
}
```

Mit dieser Config wird von allen Zugriffen die nicht eine IP wie 192.168.x.x haben (also externe Zugriffe vom Internet) ein Login benötigt.
Im internen Netzwerk haben die PCs ja eine IP wie eben 192.168.0.10 usw. und diese brauchen kein Login.

Das zweite ist die Umleitung für die XMLHTTPRequests.

Somit ist man nicht mehr wie vorher auf einen DynDNS oder IP Adresse abhängig. Ansonsten konnte brauchte man ja bei einem Zugriff über die DynDNS ein Login, über Zugriff über die IP nicht und man konnte vom Internet ohne Login auf die Seite!


----------



## ET-SPS (22 November 2012)

Portisch schrieb:


> .... Ich habe ja OneWire Sensoren an der SPS per RS232 dranhängen.
> Diese werden ausgewertet und die Daten auf einem FTP mitgeloggt.


Du hast die 1-Wire Sensoren an der ILC oder an einer WAGO? 

Ich kann das nur das es an einer WAGO mit OSCAT-Bibliothek funktioniert? 
Geht das auch mit ILC? 
Wenn ja köntest du (eventuell in einem eigenen Thread) mal eine Stichpunktartiges HowTo dafür erstellen bitte? 
Ich hatte mal angefangen Sensoren im ganzen Haus zu verkabeln und wollte ursprünglich mit einer FritzBox das ganze auswerten. 
Aber eine SPS wäre mir lieber weil ich hier auch interaktionen mit den Werten dann unproblmatisch durchführen könnte? 

Gruß. 

PS: 
Ein schönes WebFrontEnd hast du da gebaut!


----------



## Mobi (23 November 2012)

In diesem Thread geht es ja um die ILC. Du kannst entweder die Schnittstelle direkt auf der ILC verwenden oder extra eine RS232-Klemme verwenden. Aber er hat noch einen Mikrocontroller dazwischen für die Kommunikation.


----------



## Portisch (23 November 2012)

Ja genau, das Sensor Zeugs häng an der internen RS232 von der ILC.
Das ganze war nicht ohne das auf der ILC zu programmieren. Aber es war gleichzeitig mein ST-Programming Einstieg.

OneWire Sensoren Auswertung:
http://www.siwawi.arubi.uni-kl.de/avr_projects/tempsensor/index.html

CAN Datentransfer:
http://www.mikrocontroller.net/topic/249431#new

Busstruktur:
Der Master passt auf die Hutschiene und wird neben der ILC in den Schaltschrank kommen.
Die Slaves sind rund und passen in eine Unterputzdose.
Die Sensoren werden dann von den Slaves weg im Haus verteilt.
Die Slaves deswegen um die OneWire Leitung kurz zu halten.


----------



## ET-SPS (23 November 2012)

Hi, 

warum hast du den CAN-Bus (kenne ich eigentlichn nur aus dem KFZ-Bereich) mit in das Projekt genommen? 
Kannst du die 1-Wire nicht direkt an dei RS232 der ILC anschlissen? 
Gegenbeefalls über einen 0815 Pegelwandler von TTL auf RS232? 
Oder ist die interne Rs232 bei der ILc eine echte RS232? 

Bei WAGO ist die interne RS232 keine echte RS232 sondern eine TTL-Pegel-RS232, welche um sie mit dem PC oder mit einem 1-Wire zu RS232 Adpater zu verbidnen eben erst noch eine Pegelwander bekommen muß. Welcher aucgh billigen Bauteilen jeder selber zu Hause oder mit Pollin.de Bausatz bauen kann. 

Würde es gehen die 1-Wire direkt an deine ILC anzuschliessen?
Kennst du das Projekt hier?
http://eservice-online.de/Download-Support/OWOS-1-Wire-fuer-WAGO/

http://www.ip-symcon.de/forum/threads/12467-Wago-und-1-wire-neu

Gruß.


----------



## Mobi (23 November 2012)

RS232 ist kein Bus-Protokoll. Das ist nur P2P. Deswegen der Master. Der bekommt die Infos von den Slaves über CAN-Bus (Diesen gibts auch im Roboterbereich, also nicht nur KFZ). Und Der master bündelt dann die Sachen und kommuniziert es zur ILC. Es hängen ja auch nicht nur OneWire-Sensoren dran sondern noch ein IR-Empfänger welcher über IRMP läuft.


----------



## ET-SPS (23 November 2012)

Richtig, RS232 is keine BUS an sich. Für den 1-Wire-Bus gibt es dafür ja auch den 1-Wire-Bus-Master Baustein DS9097U-009.

Dann wäre der Aufbau ja so: 

ILC-RS232-Ausgang <=> DS9097U-009 <=> 1-Wire-Sensor. 

Und wenn man 1-Wire mit Aktiver Stromversorung und nicht Parasitär betreibt ist der Bus stabil und kann sehr lang werden mit vielen Sensoren.

Gruß.


----------



## Mobi (24 November 2012)

Aber wie schon gesagt, es hängen dort nicht nur 1-Wire-Sensoren dran. Und man sollte die 1-Wire-Leitung so kurz wie möglich halten. Und je nach Datenrate kann CAN bis zu mehrere 100m.


----------



## Portisch (24 November 2012)

Mobi schrieb:


> Aber wie schon gesagt, es hängen dort nicht nur 1-Wire-Sensoren dran. Und man sollte die 1-Wire-Leitung so kurz wie möglich halten. Und je nach Datenrate kann CAN bis zu mehrere 100m.



Genau um das geht es eigentlich. Zuerst wollte ich eine reine 1-Wire Lösung.
Jedoch habe ich Angst wegen der Zuverlässigkeit des 1-Wire Systems.
Mit CAN habe ich Erfahrungen und bin davon Überzeugt.

Es sind ja auch nicht nur 1-Wire Sensoren dran. Eben z.B. einen IR Receiver um mit der Fernbedienung z.B. die Raffstore runter zu lassen oder Licht einschalten/ausschalten zu können. Auch habe ich bereits einen Slave gebaut um z.b. ein Codeschloss zu betreiben.
Das wird auch in das System eingeschlossen und man kann dann mehrere Sachen als nur Garage öffnen damit machen.


----------



## Mobi (5 März 2013)

Hat jemand schon Erfahrung mit dem JQuery auf dem iPad?


----------



## Vaninger (5 März 2013)

Hallo Mobi,

leider habe ich kein iPad, auf meinem Asus Transformer funktionierte es zumindest. Hab leider in letzter Zeit wenig Zeit gehabt, hier weiter zu machen...

Schöne Grüße
Daniel


----------



## Mobi (16 März 2013)

Also auf dem iPad sollte es auch funktionieren laut der Deviceliste bei jQuery auf der HP.

Bin jetzt auch schon eifrig dabei eine Visu zu machen.
Ich schaffe es aber gerade nicht den Text vom Listview vertikal mittig zu machen mit dem Toggle Switch.
Gibts da noch ne Option? Und wie kann ich den Switch nach rechts machen?

```
<li>Licht: <select id="*Var*" data-obfunc="Slider" data-role="slider" data-mini="true">
                <option value="off">Aus</option>
                <option value="on">An</option>
            </select></li>
```


----------



## Mobi (16 März 2013)

Ah ok habs 

```
<li>
                <table>
                    <tr valign="middle">
                        <td>Licht:</td>
                        <td><select id="*Var*" data-obfunc="Slider" data-role="slider" data-mini="true">
                            <option value="off">Aus</option>
                            <option value="on">An</option>
                        </select></td>
                    </tr>
                </table>
            </li>
```


----------



## Mobi (18 März 2013)

Morgen,

ich verwende die GlobalFunctions im Anhang. Wie kann ich denn den Wert von einer Variable bekommen, die aber nicht zu einem jQuery-Objekt zugewiesen ist?


----------



## Mobi (22 März 2013)

Also ich bräuchte quasi statt SetValueToPLC, ReadValueFromPLC.


----------



## Vaninger (23 März 2013)

Hallo Mobi,

leider kann ich dir hier auf die schnelle auch nicht weiter helfen, der Beste Ansprechpartner wäre hier Portisch.
Ich versteh aber auch nicht ganz genau, was du machen willst. Vielleicht kannst du das noch etwas genauer erklären?

Liegen die Visualisierungsdaten auf deiner ILC oder ebenfalls auf einem Router mit Stick? Gibt es hier Probleme?


Schöne Grüße
Daniel


----------



## Mobi (23 März 2013)

Die Frage war auch eher an Portisch gerichtet. Ich wollte nur wissen ob er schon eine Funktion hat zum lesen der Variablen. Weil manche gehen nicht über die Update-Funktion.

Im Moment sind die Daten bei mir auf dem Lappi zum testen. Weiß noch nicht ob ich sie später auf die ILC mache oder auf die Fritzbox. Aber damit hab ich momentan kein Problem. Wie kommste darauf?


----------



## Vaninger (23 März 2013)

Hallo Mobi,

habe mir auch mal wieder meine damalige Testkonfiguration zusammen gesucht und wollte halt wissen, wie du deinen Testaufbau hast...
Muss auch erstmal schauen, dass alles auf dem PC klappt, anschließend kann ich es immer noch auf die SPS bzw. auf den USB-Stick des Routers (ASUS RT-N 16) packen. Du hast dir jetzt einen Webserver auf deinen Laptop gepackt, hier drin sind deine Visualisierungsdateien oder wie? Kommunikation mit SPS funktioniert so auch? Muss ich auch mal ausprobieren, somit müsste ich nicht immer den Umweg über den Router nehmen... Welchen Webserver verwendest du?

Schöne Grüße
Daniel

PS. Was macht der Hausausbau? Bin auch gerade noch am planen...


----------



## Portisch (23 März 2013)

Mit der GetValueFromPLC Funktion kann man eine Variable oder auch gleich mehrere Abfragen.
Das Ergebnis wird aber in GetData ausgewertet. Dort wird das Ergebnis dem richtigen Element im HTML zugeordnet.

Aber eine Funktion um nur eine Variable abzufragen und das Ergebnis als String zurück sollte kein Problem sein.
Beschreibe deine Sache näher, dann kann ich vielleicht helfen.

Das mit dem Auto-Update ist nicht für alle HTML Elemente umgesetzt, kann aber auch gemacht werden.

jQuery auf der ILC lief bei mir nicht (zumindest nur zu ~60%, es fehlte immer wieder Images usw.).
Deswegen läuft der Server bei mir auf dem Router mit lighttpd.


----------



## Mobi (23 März 2013)

Die GetValueFromPLC hab ich in meiner GlobalFunctions.js nicht. Kannst du mal deine aktuelle geben?
Ich will ja nur eine Funktion haben um Variablen manuell zu lesen.

Ich hab keinen Webserver. Die Dateien liegen doch auf meinem Laptop. Mal schauen wo sie später hinkommen, wenn alles läuft.

Der Hausbau schreitet voran.


----------



## Mobi (23 März 2013)

Ah ich habs gefunden. GetValueFromPLC().
Mensch war ich blind.

 GetValueFromPLC() gibt ja nun den Wert nicht zurück. Wie muss ich jetzt mit GetData arbeiten?


----------



## Mobi (23 März 2013)

Hmm ich kann nicht connecten. Ich bekomme den Fehler:

```
Error httprequest: [Exception... "Access to restricted URI denied"  code: "1012" nsresult: "0x805303f4 (NS_ERROR_DOM_BAD_URI)"  location: "file:///C:/Users/***/Desktop/jQuery/scripts/GlobalFunctions.js Line: 254"]
```

Was heißt das?


----------



## Vaninger (28 März 2013)

Hallo Mobi,
Hast du dir die entsprechende Zeile mal in der global functions angeschaut?
Habe bei mir jetzt mal die aktuelle jQuery installiert 1.91 und hatte anschließend auch eine Fehlermeldung. Tante Google konnte aber zum Glück helfen...

@Portisch
Bei mir funktioniert das Ganze leider nur mit IE, bei Firefox und Chrome versucht der Browser nach Anwahl der Startseite der Visualisierung immer irgendeine Datei zu speichern. Ist das bei euch auch so?

Schöne Grüße und schöne Ostern

Daniel

Gesendet von meinem Transformer TF101G mit Tapatalk 2


----------



## Mobi (29 März 2013)

Hallo Vani,

mit der aktuellen jQuery sind ja eineige Änderungen gekommen. Musste die GlobalFunctions auch schon abändern.
Angeschaut hab ich mir so einiges, wüsste aber nicht, wie ich das umbauen müsste. Ich hätte es ja gerne als Rückgabewert.

Also bei mir funktioniert das auch nur im IE. Der Firefox kann das nicht wegen Cross Domain. Da bekomme ich ja dauernd den Fehler "Access to restricted URI denied".


----------



## Mobi (2 April 2013)

So habs geschafft mit dem Rückgabewert.

```
//Function to get a value of a variable from the PLC
function GetValueFromPLC(sVariableList)
{
    // clear auto update timer while requesting data
    StopAutoUpdate();

    if ( typeof sVariableList == "string" ) {
        aTmp = new Array;
        aTmp.push( { Element: sVariableList, id:sVariableList } );
        sVariableList = aTmp;
    }

    // Create List of variables and convert by function "createGetHTTPlist" into xml
    var xmlList = createGetHTTPlist(sVariableList);
    // Send xml request
    return(fhttprequest(xmlList));
}
```
natürlich dann in den zuständigen Unterfunktionen auch noch die returns rein.
Funzt super.


----------



## Vaninger (2 April 2013)

Hallo Mobi,

leider versteh ich immer noch nicht ganz, was du mit Rückgabewert eigentlich meinst, finde aber gut, dass du eine Lösung gefunden hast...
Hast du als Grundlage die von Portisch zur Verfügung gestellten Dateien verwendet oder hast du dir mittlerweile selber was gebastelt? Bei mir laufen die Dateien auf dem Webserver auf meinen Router, funktioniert soweit zumindest. Habe aber noch nicht die Zeit gehabt, hier weiter zu machen. Bekomme jetzt aber langsam aber sicher wieder Lust...

Bräuchte halt etwas mehr Zeit wie halt jeder 

Schöne Grüße
Daniel  

PS: Kannst du deine aktualisierte GlobalFunctions mal zur Verfügung stellen?


----------



## dharpers (29 Juli 2013)

Hallo - beim Nachvollziehen hing  es hier:

550 Unable to find \cfroot\cgi-bin\ILRReadValues.exe

Habe eine ILC171, habe den Webserver aktiviert und kann per FTP zugreifen. Es gibt ein Verzeichnis cfroot und WEBS aber keinerlei cgi-bin. Und somit auch kein ILRReadValues.exe

Wo bekomme ich die Exe-Dateien her ?

D.Harpers


----------



## Mobi (29 Juli 2013)

Also eigentlich ist auch der Ordner cgi-bin versteckt und steckt nicht in cfroot. Eigentlich heißt der Pfad http://deineip/cgi-bin/ILRReadValues.exe. Also mit Slash und nicht Backslash.


----------



## dharpers (29 Juli 2013)

Hallo Mobi,

habe nur die XML-Page wie auf Seite 1 angegeben aufgerufen. Darin steht die Zeile


            xhttp.open("POST","/cgi-bin/ILRReadValues.exe",true);


und ich erhalte die gennante Fehlermeldung via Firefox / win7 mit den Backslashes.

Kann aber nicht nachprüfen, ob ein CGI-BIN überhaupt existiert.
Kann keine Verzeichnisse anlegen - nichts.

Bin ich mit dem falsch username unterwegs ?

D.Harpers


----------

