'Inteligenty' dom ze sterownikiem PLC

 Language:
Szukanie zaawansowane  

Aktualności:

Powrót do strony głównej: www.edom-plc.pl

Autor Wątek: Czemu to cholerstwo nie działa?  (Przeczytany 4327 razy)

Tom01

  • Full Member
  • ***
  • Wiadomości: 101
    • Zobacz profil
Czemu to cholerstwo nie działa?
« dnia: Września 09, 2016, 07:01:41 pm »

Pewnie straszne głupoty próbuję robić, ale to są początki początków js.

Jest plik:

<html>
<head>
<script type="text/javascript" src="/js/jquery.min.js"></script>
<script type="text/javascript" src="/js/jquery.e-dom.2.0.js"></script>
<script type="text/javascript">
var ServerName='http://tu jest oczywiście prawdziwa domena/getdata.php/';
 
$(window).load(function(){
    $('#Button1').ReadValue({
address: 'QX1.0'
    });
 
$(‘#Field1).bind(‘OnReadSuccess’, function(event, data) {
    alert(data);
});

    $.StartRefreshing();
});
</script>

</head>
<body>
    <div id ="Button1" class="Button">$data</div>
</body>
</html>

Oraz getdata.php:

<?php
IF ($_REQUEST['TYPE']=='READPI') {
    
$url "http://192.168.0.61/READPI?ADR=" $_REQUEST['ADR'] ."&FORMAT=" $_REQUEST['FORMAT'] ;
};
 
IF (
$_REQUEST['TYPE']=='WRITEPI') {
    
$url "http://192.168.0.61/WRITEPI?ADR1=" $_REQUEST['ADR1'] .
    
"&VALUE1=" $_REQUEST['VALUE1'] . "&FORMAT1=" $_REQUEST['FORMAT1'] ;
};
 
$handle fopen($url,"r") ;
$contents stream_get_contents($handle) ;
fclose($handle) ;
echo 
$contents;
?>

Wtyczka jQuery admina przerobiona wg opisu. Celem jest po prostu odczytanie wartości adresu QX1.0 za pośrednictwem pliku php i wypisanie w przeglądarce. Zapytanie żywcem o konstrukcji http://192.168.0.61/READPI?ADR=QX1.0 daje wartość jak trzeba. Podobnie programik php wykorzystujący phpmodbus daje wyniki jak powinien, spokojnie mogę sobie wylistować echo odczytanych wartości, ale wywołanie tego samego z pliku html z js, za chorobę nie działa. Testowałem wszystkie sposoby podane przez admina. Nie działa i już. Niestety w tym porąbanym js nic nie jest oczywiste. Język jest tak nieczytelny i niezrozumiały, że chyba bardziej nie może.
« Ostatnia zmiana: Września 09, 2016, 07:08:51 pm wysłana przez Tom01 »
Zapisane

Tom01

  • Full Member
  • ***
  • Wiadomości: 101
    • Zobacz profil
Odp: Czemu to cholerstwo nie działa?
« Odpowiedź #1 dnia: Września 09, 2016, 10:10:16 pm »

Jeszcze jedno podejście do skryptów admina i SSI z odczytem przez php działa. W skrypcie html jest błąd. Poniżej poprawna wersja:

<html>
<head>
    <script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>
 
    <script type="text/javascript">
        $(document).ready(function() {
            $('#Button1').click(function() { //action on the button click
                var address = $('#address').text().replace(/ /g,''); //take the address from the filed and trim all spaces
                $.ajax({
                    type: 'POST',
                    url: 'getdata.php',
                    data: {ADR: address}, //send to the PHP file the address
                    success: function(data){ //what to do if data received
                        if (data.charAt(0) == '<') { //if reply starts with "<" it means that the address was wrong, and WAGO returns structured html
                            $('#Result').html(data.substring(4)); //show the WAGO message but without the initial "<br>"
                        }
                        else { //otherwise the data received is what we wanted
                            $('#Result').text('Reply: ' + address + ': ' + data); //show the result
                        }
                    },
                    error: function(jqXHR, textStatus, errorThrown) { //in case of connection error, print whatever you can get from the server
                        $('#Result').text(jqXHR.statusText+', '+textStatus+', '+errorThrown);
                    }
                }); //End of AJAX
            }); //End of Button.click()
        }); //End of document.ready()
    </script>
    <style type="text/css">
        .Button {height: 30px; width: 300px; border: gray dotted 2px; padding: 2px; text-align: center; line-height: 30px;}
    </style>
</head>
<body>
    <div id="addressField" style="width: 300px;"> Address to check: <div id="address" contenteditable="true" style="float: right; border: 1px solid black">QX0.0</div></div>
    <br>
    <div id ="Button1" class="Button">Click to read!</div>
    <br>
    <div id ="Result" class="Button"></div>
</body>
</html>

Skrypt php jest poprawny:

<?php
    
if(isset($_POST['ADR'])) {
        
$url "http://192.168.0.61/READPI"//change the IP to your WAGO's IP
        
$data = array('ADR' => $_POST['ADR'], 'FORMAT' => '%d');
 
        
$options = array(
            
'http' => array(
                
'header' => "Content-type: application/x-www-form-urlencoded\r\n",
                
'method' => 'POST',
                
'content' => http_build_query($data)
            ),
        );
 
        
$context stream_context_create($options);
        
$result file_get_contents($urlfalse$context);
 
        echo 
$result;
    }
?>


Teraz będę się biedził nad przerobieniem skryptu php z ssi na wersję modbus. Może ktoś miałby ochotę pomóc? Zastanawiam się jak rozwiązać translację wejść/wyjść/zmiennych na adresy pamięci, tak, aby w skryptach posługiwać się nazwami zmiennych a nie numerami komórek.
Zapisane

Tom01

  • Full Member
  • ***
  • Wiadomości: 101
    • Zobacz profil
Odp: Czemu to cholerstwo nie działa?
« Odpowiedź #2 dnia: Września 09, 2016, 10:31:34 pm »

No i, jak to co powyżej, zrobić w drugą stronę, czyli WRITEPI?
Zapisane

Tom01

  • Full Member
  • ***
  • Wiadomości: 101
    • Zobacz profil
Odp: Czemu to cholerstwo nie działa?
« Odpowiedź #3 dnia: Września 10, 2016, 01:14:14 pm »

W międzyczasie "walki" z JS, zająłem sie czymś innym. Wzorując się na skryptach admina przerobiłem funkcję odczytującą wartość zadanego adresu z odświeżaniem wartości, bez migotania widocznego przy odświeżaniu z czym się biedziłem cały dzień. Czy mógłby ktoś rzucić okiem i powiedzieć czy to jest zgodne ze sztuką?

    <script type="text/javascript">
$(window).ready(function () {
            var address = 'QX1.0';
    setInterval(function() {
$.ajax({
                    type: 'POST',
                    url: 'getdata.php',
                    data: {ADR: address},
                    success: function(data){
                            $('#Result').text(data);
    },
});
    },1000);
});
    </script>
Zapisane

admin

  • Administrator
  • Sr. Member
  • *****
  • Wiadomości: 313
    • Zobacz profil
Odp: Czemu to cholerstwo nie działa?
« Odpowiedź #4 dnia: Września 10, 2016, 09:08:32 pm »

Cześć

widzę, że przegryzasz się przez js :)  To, co zaproponowałeś, jest generalnie ok.  Problem, jaki widzę, to możliwość nakładania się na siebie zapytań do getdata.php.  Jeśli serwer będzie zajęty i nie zdąży w ciągu 1 sekundy odpowiedzieć, otrzyma kolejne takie samo zapytanie, potem kolejne itd.  Urośnie lawina. 

Żeby temu przeciwdziałać, możesz przypisać zapytanie $.ajax do zmiennej i przed kolejnym zapytaniem sprawdzać stan poprzedniego zapytania, czyli:

<script type="text/javascript">
   var updater;
   $(window).ready(function () {
            var address = 'QX1.0';

       setInterval(function() {
      var skip = false;
      if (typeof updater.readyState !== 'undefined') {
         if (updater.readyState > 0 && updater.readyState < 4) {
            skip = true;
         }
      }
      if (!skip) {
         updater = $.ajax({
                       type: 'POST',
                       url: 'getdata.php',
                       data: {ADR: address},
                       success: function(data){
                               $('#Result').text(data);
             },
         });
      }
       },1000);
   });
    </script>
Zapisane

Tom01

  • Full Member
  • ***
  • Wiadomości: 101
    • Zobacz profil
Odp: Czemu to cholerstwo nie działa?
« Odpowiedź #5 dnia: Września 11, 2016, 01:27:18 am »

No, admin, dołożyłeś do pieca. Ledwo zrozumiałem to co napisałem i dowaliłeś mi jakieś abrakadabry. Wrócę do rematu jak rozszyfruję co tej skrypt robi. :)
Zapisane

Tom01

  • Full Member
  • ***
  • Wiadomości: 101
    • Zobacz profil
Odp: Czemu to cholerstwo nie działa?
« Odpowiedź #6 dnia: Września 11, 2016, 02:33:03 pm »

Wiedziałem o ryzyku nakładania się niewykonanych zapytań, ale odkładałem rozwiązanie na później. Dziękuję za prostą podpowiedź. Rozumiem działanie. Kluczem jest wartość .readystate, która dotyczy obiektu updater (zwanego nie wiem czemu w js "dokumentem"). Jeśli wartość .readystate istnieje ale wskazuje na brak zapytania/request, wówczas dokument updater się wykonuje.

Sam warunek myślę, że krócej zrobić tak. Jedna linijka zamiast pięciu. Wszak, interesuje nas wyłącznie stan 0 lub 4:

if (updater.readyState == 0 | updater.readyState == 4) {
         updater = $.ajax({
                       type: 'POST',
                       url: 'getdata.php',
                       data: {ADR: address},
                       success: function(data){
                               $('#Result').text(data);
                       },
         });
}
« Ostatnia zmiana: Września 11, 2016, 02:36:26 pm wysłana przez Tom01 »
Zapisane