2013-09-24 83 views
0

我需要在Node中使用Modbus模塊,並且我發現了一個輕量級的解決方案,可以很好地工作。其通過TooTallNate爲其節點提供Modbus-Stack。 (https://github.com/TooTallNate/node-modbus-stack節點Modbus堆棧ECONNREFUSED

我實現了它,它似乎工作。使用我的瀏覽器,我打電話給我的節點服務器,然後使用Wireshark我看到Modbus數據包從我的節點服務器(modbus master)轉到另一個設備(modbus slave),然後我看到另一個Modbus數據包從設備轉移到節點服務器。

但服務器永遠無法將數據返回到我的瀏覽器。發現它的Node服務器正在偵聽並準備好處理'響應'事件,但得到'錯誤'事件。當我處理的 '錯誤' 事件中,我看到了以下(字符串化):

{ 「代碼」: 「ECONNREFUSED」, 「錯誤號」: 「ECONNREFUSED」, 「系統調用」: 「連接」}

節點代碼:

var http = require("http"); 
    var querystring = require("querystring"); 
    var url = require("url"); 
    var fs = require("fs"); 
    var RIR = require("modbus-stack").FUNCTION_CODES.READ_HOLDING_REGISTERS; 

    http.createServer(onRequest).listen(8080); 
    function onRequest(request, response) { 

     var query = url.parse(request.url).query; 
     var path = url.parse(request.url).pathname; 
     var wants; 

     if(path == '/mbust'){  
      mbReturn(function(data){ 
      response.writeHead(200,{"content-Type":"text"}); 
      response.end(data); 
     }); 
     } 
     else{ 
      wants = 'unknown request'+" "+path+" "+query; 
      response.end(wants); 
     } 

    } 

    function mbReturn(pasd){ 
     var client = require("client").createClient(502,'192.168.1.199'); 
     var req = client.request(RIR,2000,1); 
     req.on('response',function(registers){ 
      pasd(registers); 
      client.end(); 
     }); 
     req.on('error',function(e){ 
      pasd(JSON.stringify(e)); 
      client.end(); 
     }); 
    } 

這就是我卡住的地方。任何關於如何調試的想法/提示都會有幫助。對我來說,這是一種陌生的領域,所以任何事情都會有所幫助。

TIA!

尼科

更新:我叫e.stack看到錯誤調用的血統,這就是我的了:

Error: connect ECONNREFUSED 
     at errnoException (net.js:776:11) 
     at Object.afterConnect [as oncomplete] (net.js:767:19) 

回答

0

原來,我只是需要確保有沒有其他設備試圖成爲modbus設備的主設備; modbus從站只能有一個主站。

此外,我必須將創建客戶端代碼移出被調用的函數,每當向服務器發出HTTP調用時,Node就會創建一個客戶端作爲modbus slave,並依賴於所有後續modbus事務。