• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Mehrere Datenwerte von SPS gleichzeitig abfragen

JoGi65

Mitglied
Hallo,
Status: Haus mit SPS. SPS verfügt intern über einen Webserver, wo man Seiten draufladen kann.
Datenabfrage von SPS funktioniert mit einem Datenwert, aber ich hab keine Ahnung, wie ich das jetzt auf mehere Werte ausdehne, ohne die ganze Anweisung zu wiederholen und mehrere Seiten zu machen. Hab mir die Teile im Netz zusammengesucht, was heißt, ich kann abschreiben (nicht besonders gut) und Text ändern.

Code:
<html>
<head>
<script type="text/jscript" src = "jquery-3.2.1.min.js" ></script>
</head>

<div align="left">
  <table border="0" cellspacing="0" cellpadding="3">
    <tr>
      <td>EG Bad</td>
      <td><label id="EG_Bad">0</label></td> <!-- Abfrage der Bool Variablen mit dem js-->
    </tr>
    <tr>
      <td>EG Ostzimmer</td>
      <td><label id="EG_Oz">0</label></td> <!-- Abfrage der Bool Variablen mit dem js-->
    </tr>
    <tr>
      <td>EG K&uuml;che Ost</td>
      <td>:="DB_WWW".Fenster.EG_Kueche_Ost:</td> <!-- Abfrage der Bool Variablen mit HTML-->
    </tr>
  </table>
</div>

<p><b><a href="index.htm">&Uuml;bersicht</a></b></p>

</body>
      <script type = "text/javascript">
         $(document).ready(function(){
             $.ajaxSetup({ cache: false });
         setInterval(function() {
             $.get("FensterIO.htm", function(result){
                 $('#EG_Bad').text(result.trim());
                 $('#EG_Oz').text(result.trim());
             });
         },1000);
         });
     </script>
</html> <!-- #EG_Bad enthält jetzt beide Bool Var, zB 1 1 genauso wie EG_Oz-->

In der FensterIO.htm Stehen jetzt nur die Variablen :
HTML:
:="DB_WWW".Fenster.EG_Bad:
:="DB_WWW".Fenster.EG_Oz:

In der SPS steht im Datenbaustein "DB_WWW".Fenster.EG_Bad" der Wert 1 oder 0 für offen oder zu.

Im Prinzip funktioniert das ganze mit einer Variblen einwandfrei, aber wenn ich die zweite $('#EG_Oz').text(result.trim()); hinzufüge (natürlich auch in der FensterIO.htm) dann enthält jede der Var. beide Werte. Also entweder auseinanderglauben, oder richtig abfragen. Insgeasmmt sind es 14 Fenster.

Die Werte mit HTML abzufragen, und die Seite automatisch zu rloaden funktioniert zwar auch, aber schaut nicht sauber aus.

Vielleicht gibt es hier den einen oder anderen Tip. Danke Euch!
 
Werbung:
Herzlichen Dank, funktioniert perfekt! :D

Darf ich noch fragen was die einfachste Methode wäre, die jeweilige Tabellenzelle die jetzt 0 oder 1 enthält im Hintergrund rot bzw. grün zu färben. Ich denke zwar, das ich das prinzipiell schaffe, (if then hab ich in der Hilfe schon gefunden) aber die Frage ist wie es am "einfachsten und effizientesten" in "diesen" Code integriert wird. Das werd ich sicher lange nicht schaffen. Der Webserver Speicher der SPS ist scheinbar sehr beschränkt.
 
Werbung:
Also nochmals Danke! Auch das funktioniert einwandfrei.

Für diese Funktion noch zwei Kleinigkeiten:
Mit der "colorise Function" schreib ich jetzt auch einen anderen Text zurück. Funktioniert, aber ich bekomme in den Text kein Leerzeichen. "Closed" " Closed " ergibt das gleiche Ergebnis.
Weiters sollte es ja möglich sein, mit einer if Abfrage zwei Var gleichzeitig zu definieren, und nicht zwei Abfragen zu machen, so wie jetzt. hab schon mit Beistrich, Strichpunkt und Leerzeichen versucht.
Kannst Du mir das vielleicht noch sagen?

Ich hab keine Beispiele gefunden, und muß leider bei jeder kleinsten Änderung mit der SPS alles neu übersetzen und laden, und jedesmal ist das ganze Haus finster. Hab leider kein Testsystem, deswegen ist es etwas mühsam. Für die nächsten Dinge werd ich dann eine Demo ohne echte Var machen.


Edit: Leerzeichen hab ich doch noch ergoogelt - schon merkwürdig, wenn ich die Frage ins Forum stelle, kann ich sie auf einmal auch bei Google eingeben. :rolleyes:


Code:
         $(document).ready(function(){
             $.ajaxSetup({ cache: false });
         setInterval(function() {
             $.get("FensterIO.htm", function(result){
             var variables = result.split("|");
                 $('#EG_Bad').text(variables[0].trim()).colorise();
                 $('#EG_Oz').text(variables[1].trim()).colorise();
             });
         },1000);
         });
            jQuery.fn.colorise = function () {
            if ($(this).text() == "1") var color = "#00ff00"; else var color = "#ff0000";
            $(this).css("background-color", color);
            $(this).css("color", "white");
            if ($(this).text() == "1") var Text = " Closed "; else var Text = " Open   ";
            $(this).text(Text);
            return ($(this));
        }
 
Zuletzt bearbeitet:
Ich hoffe die letzte "Kleinigkeit" fürs auslesen.
das negative Vorzeichen von einem abgefragten Wert - $('#P_V_W').text(variables[0].... - , wird als Code dargestellt. Siehe Bild.

Gefunden hab ich folgendes:
response.setContentType("application/json");
response.setCharacterEncoding("ISO-8859-1");

Nur hat das irgendwie nicht funktioniert. Ich hab im Head noch andere Zeichensätze versucht. UTF8 und einen anderen Iso.
Aber da fehlt mir wieder komplett der Durchblick. Kann mir nochmals wer helfen?

P.S. Gibts keine Möglichkeit einer Kaffee Spende oder sowas im Forum?
 

Anhänge

  • Fehler_minus.jpg
    Fehler_minus.jpg
    14,1 KB · Aufrufe: 3
Werbung:
Ok, auch das hat funktioniert. Hab mir vorher die 'get' Parameter angeschaut, aber da 'real' oder sowas nicht dabei war, hätte ich das jetzt nicht erwartet. So gesehen, hast Du jetzt alle Lese Funktionen für mich geschrieben. :rolleyes: . Jetzt gehts an die 'schreib Funktionen'.

Danke - schon wieder.
 
Hallo nochmal,
es hat sich gezeigt, das die Kommunikation mit der SPS beim lesen von vielen Variablen schneckenlangsam wird. Besser funktioniert es ein DWord zu übergeben und zu zerlegen. Prinzipiell funktionierts, aber wenn ich meinen Code anschaue, werde ich traurig.

Was ist die einfachste einfachste Methode ein 64 Bit DWord in die einzelnen Bits zu zerlegen, und diese jeweils einer Var zuzuordnen?

'For' hab ich gefunden, aber die Syntax im Beispiel überfordert mich ein bisschen.
Gibt es da einen einfacheren Befehl, oder eine Sinnvollere Lösung als den ganzen Teil linear zu tippen? (Rechenteil - Beispiel - nicht komplett) Anfang wäre bei Bit 63 bis hinunter zu Bit 0 oder umgekehrt hinauf. Die Variable kann einfach eine Zahl sein ohne 'L_'

Code:
$(document).ready(function(){
            $.ajaxSetup({ cache: false });
             setInterval(function() {   // Abfrage Interval 1000msec
                $.get("LichtRead1.htm", function(result){   // 64Bit Wert lesen aus "LichtRead1.htm"
                    var DWord = result; 
                    $('#Wz_XY').html(DWord);  // Nur zur Kontrollanzeige
//Rechenteil -----------------------------------------------------------------
                    if (DWord / 32 >= 1) {   //MSB - Bit 63 (Dez. 2147483648 oder (2 hoch 31))
                        $('#L_6').html(1).Farbe(); 
                        (DWord = DWord - 32);
                     } else {
                         $('#L_6').html(0).Farbe()}; 
                 
                     if (DWord / 16 >= 1) {
                        $('#L_5').html(1).Farbe();
                        (DWord = DWord - 16);
                     } else {
                         $('#L_5').html(0).Farbe()};

                     if (DWord / 8 >= 1) {
                        $('#L_4').html(1).Farbe();
                        (DWord = DWord - 8);
                     } else {
                         $('#L_4').html(0).Farbe()};

                     if (DWord / 4 >= 1) {  //LSB - Bit 0 (Dez. 1 oder (2 hoch 0))
                         $('#L_3').html(1);
                        (DWord = DWord - 4);
                     } else {
                         $('#L_3').html(0)};
//Rechnteil Ende-------------------------------------------------------------------
                    });
             },1000);
         });
 
Getestet hab ichs, und es hat mit den 4 Werten funktioniert. Ich hab in dem Beispiel aber nur bis Bit 5 (Wert dez 32 wenn man mit 0 zählen anfängt) reingeschrieben und entsprechend ausgelesen. Ausserdem hab ich nur herunter bis Bit 2 (wert dez 4) ausgewertet.

Und "Danke!" wieder. Bin schon gespannt, aber ich werd mir die zwei Beispiele morgen anschauen. (heute geht nix mehr) Es sind übrigens 64Bit gesamt, aber ich denke die richtigen Zahlen werde ich reinbekommen.
Ich hoffe die Rechnung geht sich dann in einer Sekunde am Tablet aus.
 
Werbung:
Die Bits sind in der SPS einzelne Bool Werte und werden in der SPS zu diesem DWord zusammengebaut, und ergeben dann einfach eine Zahl, wie immer man die darstellt. Das DWord brauch ich auf der Webseite gar nicht darstellen. Ich brauch nur die einzelnen Bits wieder davon. Ich habs nur auf der Webseite zum Testen eingeblendet, ob überhaupt der richtige Wert ankommt.
 
Ja, genau - dewegen hab ich im Remark auch die Anmerkung mit den richtigen Zahlen gemacht.
//MSB - Bit 63 (Dez. 2147483648 oder (2 hoch 31))
//LSB - Bit 0 (Dez. 1 oder (2 hoch 0))
 
Hm, ok. Keine Ahnung wie JS die Variable 'DWord' definiert. Von der SPS kommt ein Zahlenwert. Dort kann ich im Trace die Variable beliebig anschauen. (Binär Hex und Dez etc.) In JS wird dieser Zahlenwert wie definiert? Kann man da einfach eine # oder was vorstellen, das es als Hex gilt? Theoretisch müßte ich die Var auch - #20 rechnen können statt dez 32, oder?
 
Werbung:
Hallo, und wieder ein Danke für die Lösung.
Lösung 1 funktioniert perfekt. Habs jetzt mit 32Bit DWord versucht.
Lösung 3 hat nicht funktioniert, aber ich hab nicht gesucht warum, weil ich es zu wenig verstehe.
Lösung 2 hab ich (noch) nicht versucht. Villeicht versuch ich die noch später, da sie vermutlich schneller ist als Lösung 1.

Alle 32 Werte sind in der Sekunde da. Werde das jetzt mal auf die Heizungsseiten etc. umsetzen.

Schreiben für die Lichter hab ich tatsächlich selbst zusammengebracht. Immerhin 4 Zeilen und die Buttons:rolleyes:.

Code:
 function Licht(Inhalt){
           url="LichtWrite.htm";
           sdata=(Inhalt); // Inhalt = Bez. und Stat. vom Licht (Tastfunktion immer 1) die vom Button übergeben wird
           $.post(url,sdata,function(result){});
}

Jetzt muß ich noch schauen, wie mit den 1ern ein Gif sichtbar gemacht wird. Derzeit schauts noch so aus, aber immerhin kann man schon mit Klick auf die Lampen Ein/Aus schalten. Und Eingerichtet ist auch noch nicht fertig. :(
 

Anhänge

  • 01.jpg
    01.jpg
    102,6 KB · Aufrufe: 3
Weiter gehts mit den Fragen.

das zerlegen von 64 Bit LWord funktioniert Perfekt - Beispiel unten (die Zahl ist etwas groß :eek:, aber die Funktion trotzem schnell)

erste Frage: jetzt müssen aber den Bit Werten verschiedene Texte zugewiesen werden.
.TH und .Fenster

Ist der Code unten richtig, oder geht das einfacher? (ich kann heute leider nicht testen, da TV geguckt wird und dadurch kann ich die SPS nicht laden)

Code:
$(document).ready(function(){
            $.ajaxSetup({ cache: false });
             setInterval(function() {
                $.get("HeizungRead.htm", function(result){
                    var LWord = result;
                    for (var teiler = 9223372036854775808, idnr = 64; teiler >= 1; teiler /= 2, idnr--) {
                        if (LWord / teiler >= 1) {
                            $("#L_" + idnr).html(1);
                            LWord -= teiler;
                        } else {
                            $("#L_" + idnr).html(0);
                        }

//----------------------Funktioniert der Teil ab hier, oder kann ich das besser lösen-----------------------------  
                    
                        if (idnr > 0 && idnr < 52) {
                            $("#L_" + idnr).html().TH();
                        } else if (idnr > 51 && idnr < 60) {
                            $("#L_" + idnr).html().Fenster();
                        }
                     };
                    });
             },1000);
         });

zweite Frage:
die 'label id="L_36"' zB. soll in zwei verschiedenen Zellen angezeigt werden.
Das funktioniert aber nicht. In der zweiten Zelle mit 'label id="L_36"' bleibt das 'x' stehen.
Wie kann ich den Wert in eine zweite Zelle schreiben?
Gibts da einen Trick, oder muß ich eine zweite Variable erstellen?

HTML:
<tr>
         <td class="auto-style2">EG Wz S&uuml;d</td>
         <td class="auto-style4"><strong><label id="L_36">x</label></strong></td>
         <td class="auto-style4"></td>
         <td class="auto-style4"><strong><label id="L_36">x</label></strong></td>
         <td></td>
         <td class="auto-style4"><strong><label id="L_14">x</label></strong></td>
         <td class="auto-style4"><strong><label id="HK_EG_Wz_S_P_W">x</label></strong></td>
         <td class="auto-style4"><strong><label id="HK_EG_Wz_S_Ph">x</label></strong></td>
         <td class="auto-style4"></td>
         <td class="auto-style4"></td>
    </tr>
 
Werbung:
Alle klar. Ich kann ja oben direkt "\u00A0 Offen \u00A0" oder "\u00A0 Ein \u00A0" reinschreiben, und muß es nur mit "if (LWord / teiler >= 1)" mit der idnr verunden also so:
Code:
$(document).ready(function(){
            $.ajaxSetup({ cache: false });
             setInterval(function() {
                $.get("HeizungRead.htm", function(result){
                    var LWord = result;
                    for (var teiler = 9223372036854775808, idnr = 64; teiler >= 1; teiler /= 2, idnr--) {
                        if (LWord / teiler >= 1) and (idnr > 0 && idnr < 52) {
                            $("#L_" + idnr).html(\u00A0 Ein \u00A0);
                            LWord -= teiler;
                        } else {
                            $("#L_" + idnr).html(\u00A0 Aus \u00A0);
                        }
                        else if (LWord / teiler >= 1) and (idnr > 51 && idnr < 60).....................
                    };
                    });
             },1000);
         });



Der Code vom einfärben:

Code:
jQuery.fn.TH = function () {
            if ($(this).html() == "1") {
                var color = "#ff0000";
                var Text = "\u00A0 Ein \u00A0";
            } else {
                var color = "#00FF00";
                var Text = "\u00A0 Aus \u00A0";
            }
            $(this).css({"color": "white", "background-color": color});
            $(this).text(Text);
            return ($(this));
            };
            jQuery.fn.Fenster = function () {
            if ($(this).html() == "0") {
                var color = "#FF0000";
                var Text = "\u00A0 Offen \u00A0";
            } else {
                var color = "#ffffff";
                var Text = "\u00A0 \u00A0 Zu \u00A0 \u00A0";
            }
            $(this).css({"color": color});
            $(this).text(Text);
            return ($(this));
            };
 
Nein, noch nicht. Aber ich muß jetzt umstellen, und die Syntax ohne SPS entwickeln. Das geht einfach nicht, das ich wegen jedem Punkt und Beistrich Hilfe bzw. Deine Zeit brauche. Das Reinladen bei jeder kleinsten Änderung ist einfach nicht praktikabel.
Werde versuchen eine ähnliche Lösung mit Offline Variablen zu machen, und nur wenn ich die Lösung dann nicht Umsetzen kann, oder Zweifel an der Funktion habe, melde ich mich. Sonst lerne ich die Syntax nie.

Danke nochmals für Deine Hilfe. Wenn der Heizungsleseteil fertig ist poste ich den Code zur Kontrolle.
 
So, jetzt hab ich 8 Stunden versch... damit ich draufkomme das 64 Bit schon gerundet werden oder was auch immer. Hatte schon einen Verdacht, aber lt. Inet Recherche rechnet JS bis 64Bit.

Übertragen wird 18446744073709551615

Im Code steht 'teiler = 9223372036854775808'

Im Log (Anhang) steht LWord '9223372036854776000' - sein sollte es '9223372036854775807'

Kannst Du mir bitte sagen ob das mit 2 hoch x funktionieren würde oder nicht (ich bin echt zu blöd um die Syntax für diese Funktion zu testen). Ich nehme zwar an, dass es auch nicht geht, aber vielleicht weißt Du das, dann würde ich versuchen den Code zu ändern. Das mit der TH Funktion ist noch nicht sauber, weil es mir nicht gelungen ist, gleich in der Oberen Schleife die Zelle zu färben (Text Ein/Aus statt 1 ist klar aber wie ich der $#L_ + x eine Hintergrundfarbe gebe ist mir ein Syntax Rätsel :rolleyes:)

Code:
<script type = "text/javascript">
         $(document).ready(function(){
            $.ajaxSetup({ cache: false });
             setInterval(function() {
                $.get("HeizungRead.htm", function(result){
                    var LWord = result;
                    $('#Wz_XY').html(LWord);
//-------------------------------------------------------------------- 9223372036854775808                 
                    for (var teiler = 9223372036854775808, idnr = 64; teiler >= 1; teiler /= 2, idnr--) {
                        if (LWord - teiler >=1) {
                            $("#L_" + idnr).html(1).TH();
                            LWord -= teiler;
                            console.log(LWord);
                        } else {
                            $("#L_" + idnr).html(0).TH();
                            console.log(LWord);
                        }
                    };
//-----------------------------------------------------------------------------------------         
                    });
             },1000);
         });
//----------Funktionen ausserhalb der Zeit------------------------------------------
            jQuery.fn.TH = function () {
            if ($(this).html() == "1") {
                var color = "#ff0000";
                var Text = "\u00A0 Ein \u00A0";
            } else {
                var color = "#00FF00";
                var Text = "\u00A0 Aus \u00A0";
            }
            $(this).css({"color": "white", "background-color": color});
            $(this).text(Text);
            return ($(this));
            };
</script>

Wenns nicht geht, muß ich den String halt auf 2x32 Bit teilen. Schon in der SPS vermutlich, da er sich ja rechnerisch nicht mehr trennen läßt.
 

Anhänge

  • Rechenfehler.jpg
    Rechenfehler.jpg
    17,1 KB · Aufrufe: 1
Zuletzt bearbeitet:
Werbung:
Du meinst also, dass die Rechnung stimmt?
das hab ich ja zuerst auch gedacht, aber dann hab ich gesehen, wenn man mit den Maximal Zahlen rechnet, das es zu unerklärlichen Bit verschiebungen kommt. Also entweder ist die Rechnung an sich falsch, oder die Rundung ist schuld, würde ich meinen.
Versuch diese Zahl 18446744073709551615 (= 64 Bit FFFF FFFF FFFF FFFF FFFF wenn es die SPS richtig anzeigt) und ändere das LSB Bit auf 0 = 18446744073709551614. Bei mir bleibt das Ergebnis gleich. Wenn man die oberen Bits nicht nutzt ist es aber richtig. Ich glaub deswegen hab ich so lange gesucht. Hast Lust das zu prüfen?
 
Zurück
Oben