lostyazilim
tr.link

Offline Error Hatası

3 Mesajlar 541 Okunma
lstbozum
tr.link

anesteziker anesteziker WM Aracı Kullanıcı
  • Üyelik 20.09.2016
  • Yaş/Cinsiyet 40 / E
  • Meslek sağlık
  • Konum Ankara
  • Ad Soyad U** K**
  • Mesajlar 45
  • Beğeniler 4 / 4
  • Ticaret 0, (%0)

Merhaba NodeJS kullanarak TCP portu üzerinden req, resp çalışan bir kod bloğum var. Interval ile server'a 200 milisaniyede bir sorgu gönderip yanıt alıyorum ve MYSQL'e kaydediyorum. Kodlarım çalışırken bir sorun yok yanlız bir süre sonra aşağıdaki hatayı almaya başlıyorum. Hatada server offline görünüyor ama aslında cihaz açık ve başka Clientler bağlanıp data çekmeye devam ediyor. Benim yapmak istediğim bu hata geldiğinde interval içindeki kodları yeniden çalıştırabilmek veya bu hatayı nasıl geçebilirim? Yardımcı olursanız sevinirim.

//HATA
[Arguments] {

  '0': UserRequestError {

    err: 'Offline',

    message: 'no connection to modbus server',

    response: undefined

  }

}


//KODLARIM
    let Modbus = require("jsmodbus");
    let net = require("net");
    let socket = new net.Socket();
    let client = new Modbus.client.TCP(socket);
    let mysql = require("mysql");
    let options = {
      host: "192.168.1.12",
      port: 502,
      autoReconnect : true,
      timeout       : 5000,
      unitId      : 0
    };



    socket.on("connect", function() {
      client


            setInterval(function () {
                client.readHoldingRegisters(6, 1)
                    .then(function (resp) {
                       console.log(resp.response._body._values);
                       oku = resp.response._body._values;
                        // socket.end()
                        var con = mysql.createConnection({
                            host: "localhost",
                            user: "root",
                            password: "NKoo0074",
                            database: "deneme"
                          });
                        con.connect(function(err) {
                            if (err) throw err;
                            var sql = "UPDATE tablo SET deger=" + oku + " WHERE id=" + 1;
                            
                            con.query(sql, function (err, result) {
                              if (err) throw err;
                              console.log(result.affectedRows + " kayıt eklendi.");
                              con.end();
                            });
                          }); 
                    }).catch(function () {
                    console.error(arguments)
                    clearTimeout()
                })
            }, 200)
            socket.on('disconnect',function(socket){
                console.log('socket disconnect');
                client.close();
                delete client;
            });


    });

   
    
    socket.on("error", console.error);
    socket.connect(options);

 

 

 

wmaraci
reklam

caneraltinel caneraltinel WM Aracı Kullanıcı
  • Üyelik 30.10.2013
  • Yaş/Cinsiyet 28 / E
  • Meslek Girişimci & Web Developer
  • Konum İstanbul Avrupa
  • Ad Soyad C** A**
  • Mesajlar 252
  • Beğeniler 33 / 35
  • Ticaret 26, (%100)

Merhaba,

 

Hatanın nedeni, TCP bağlantısının kesilmesi veya Modbus sunucusunun yanıt verememesi olabilir. Bu tür hatalarla karşılaşıldığında, bağlantı yeniden kurulmadığı sürece işlem devam edemez.

 

Sorununuzun çözümü, işlemin devam edebilmesi için yeniden bağlanma mekanizması eklemek olacaktır. Bunun için, catch bloğunu düzenleyebilirsiniz. Aşağıdaki kodda, catch bloğu içinde bir fonksiyon tanımlanmıştır. Bu fonksiyon, belirli bir süre sonra tekrar çalışır ve bağlantı yeniden kurulana kadar çalışmayı sürdürür.

setInterval(function () {

  client.readHoldingRegisters(6, 1)

    .then(function (resp) {

      console.log(resp.response._body._values);

      oku = resp.response._body._values;

      // socket.end()

      var con = mysql.createConnection({

        host: "localhost",

        user: "root",

        password: "NKoo0074",

        database: "deneme"

      });

      con.connect(function (err) {

        if (err) throw err;

        var sql = "UPDATE tablo SET deger=" + oku + " WHERE id=" + 1;



        con.query(sql, function (err, result) {

          if (err) throw err;

          console.log(result.affectedRows + " kayıt eklendi.");

          con.end();

        });

      });

    }).catch(function (error) {

      console.error(error)

      setTimeout(function () {

        socket.connect(options);

      }, 5000);

    })

}, 200)

Yukarıdaki kodda, catch bloğunda bir hata olduğunda, setTimeout fonksiyonu kullanarak belirli bir süre bekledikten sonra socket.connect fonksiyonunu tekrar çağırıyoruz. Bu, belirli bir süre sonra tekrar bağlanma girişiminde bulunacağı anlamına gelir.

 

Umarım bu yardımcı olur.

anesteziker

kişi bu mesajı beğendi.

anesteziker anesteziker WM Aracı Kullanıcı
  • Üyelik 20.09.2016
  • Yaş/Cinsiyet 40 / E
  • Meslek sağlık
  • Konum Ankara
  • Ad Soyad U** K**
  • Mesajlar 45
  • Beğeniler 4 / 4
  • Ticaret 0, (%0)

Çok teşekkür ederim. Çalıştı....

caneraltinel

kişi bu mesajı beğendi.

Site Ayarları
  • Tema Seçeneği
  • Site Sesleri
  • Bildirimler
  • Özel Mesaj Al