2013-09-24 55 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事务。