UNPKG

node-red-contrib-plcs

Version:

Mentor Monitor Project Plcs Modbus Controllers

304 lines (262 loc) 10.4 kB
var async = require('async'); module.exports = function(RED) { "use strict"; function digitalInput(config) { RED.nodes.createNode(this,config); var node = this; this.log = RED.log; this.device = config.device || "Unknown"; this.unitid = parseInt(config.unitid, 10) || 1; this.context = this.context().flow; this.devicetype = config.devicetype; this.defer = parseInt(config.defer, 10) || 0; this.initialdefer = parseInt(config.initialdefer, 10) || 0; this.retries = parseInt(config.retries, 10) || 1; this.on('input', function(msg) { var inMsg = JSON.parse(msg.payload); var timeStamp = inMsg.payload; if (timeStamp != "") { sendMsg(node, msg, true); sendAsyncMsg(node, msg); } }); } function sendMsg(node, msg, timeout) { //node.log.error(node.devicetype); switch(node.devicetype) { case "PM850": sendMessagesPM850(node, msg, timeout); break; case "PM5100": sendMessagesPM5100(node, msg, timeout); break; case "PM700": sendMessagesPM700(node, msg, timeout); break; case "CVMC10": sendMessagesCVMC10(node, msg, timeout); break; default: break; } } function sendAsyncMsg(node, msg) { async.during( function (callback) { return callback(null, node.context.get(node.device).timeout <= node.retries + 1 && node.context.get(node.device).timeout > 0); }, function (callback) { if (node.context.get(node.device).timeout > 0) { var value = node.context.get(node.device); msg.try = value.timeout; if (value.timeout === 1) { node.status({fill:"green",shape:"ring",text:"Initial Defer " + node.initialdefer + " msecs. "}); setTimeout(callback, node.initialdefer); } else { node.status({fill:"yellow",shape:"ring",text:"Defer " + node.defer + " msecs. Try " + (value.timeout - 1) + " of " + node.retries}); //node.send([msg, null]); sendMsg(node, msg, false); value.n = value.chunks; setTimeout(callback, node.defer); } value.timeout++; node.context.set(node.device, value); } }, function (err) { if (node.context.get(node.device).timeout > 0) { var msgResult = {payload: JSON.stringify({"code":node.device, "time": msg.payload, "head": ["initialdefer","defer", "retries"], "data":[node.initialdefer, node.defer, node.retries], "text":"Timeout!"})}; node.send([null, msgResult]); node.status({fill:"red",shape:"ring",text:"Timeout!! " + "Retries " + node.retries + " (" + node.defer + " msecs.)"}); //node.error("Timeout!! " + "Retries " + node.retries + " (" + node.defer + " msecs.)"); } else node.status({}); } ); } function sendMessagesCVMC10(node, msg, timeout) { if (timeout) { var count = {"n": 3, "time":msg.payload, "device":node.device, "chunks": 3, "data":new Array(3),timeout:1}; node.context.set(node.device,count); return; } setTimeout(function () { var msg1 = {}; msg1.topic = {"time": msg.payload, "group": 1, "device" : node.device, "devicetype" : node.devicetype, "try":msg.try} msg1.payload = { 'fc': 3, 'unitid': node.unitid, 'address': 0, 'quantity': 60 }; node.send([msg1,null]); }, node.initialdefer * 1) setTimeout(function () { var msg2 = {}; msg2.topic = {"time": msg.payload, "group": 2, "device" : node.device, "devicetype" : node.devicetype, "try":msg.try} msg2.payload = { 'fc': 3, 'unitid': node.unitid, 'address': 60, 'quantity': 40 }; node.send([msg2,null]); }, node.initialdefer * 2) setTimeout(function () { var msg3 = {}; msg3.topic = {"time": msg.payload, "group": 3, "device" : node.device, "devicetype" : node.devicetype, "try":msg.try} msg3.payload = { 'fc': 3, 'unitid': node.unitid, 'address': 220, 'quantity': 20 }; node.send([msg3,null]); }, node.initialdefer * 3) } function sendMessagesPM700(node, msg, timeout) { if (timeout) { var count = {"n": 3, "time":msg.payload, "device":node.device,"chunks": 3, "data":new Array(3),timeout:1}; node.context.set(node.device,count); return; } setTimeout(function () { var msg1 = {}; msg1.topic = {"time": msg.payload, "group": 1, "device":node.device, "devicetype" : node.devicetype, "try":msg.try} msg1.payload = { 'fc': 3, 'unitid': node.unitid, 'address': 999, 'quantity': 30 }; node.send([msg1,null]); }, node.initialdefer * 1) setTimeout(function () { var msg2 = {}; msg2.topic = {"time": msg.payload, "group": 2 , "device":node.device, "devicetype" : node.devicetype , "try":msg.try} msg2.payload = { 'fc': 3, 'unitid': node.unitid, 'address': 1019, 'quantity': 40 }; node.send([msg2,null]); }, node.initialdefer * 2) setTimeout(function () { var msg3 = {}; msg3.topic = {"time": msg.payload, "group": 3 , "device":node.device, "devicetype" : node.devicetype , "try":msg.try} msg3.payload = { 'fc': 3, 'unitid': node.unitid, 'address': 1083, 'quantity': 20 }; node.send([msg3,null]); }, node.initialdefer * 3) } function sendMessagesPM5100(node, msg, timeout) { if (timeout) { var count = {"n": 4, "time":msg.payload, "device":node.device,"chunks": 4, "data":new Array(4),timeout:1}; node.context.set(node.device,count); return; } setTimeout(function () { var msg1 = {}; msg1.topic = {"time": msg.payload, "group": 1, "device":node.device, "devicetype" : node.devicetype , "try":msg.try } msg1.payload = { 'fc': 3, 'unitid':node.unitid, 'address': 2999, 'quantity': 30 }; node.send([msg1,null]); }, node.initialdefer * 1) setTimeout(function () { var msg2 = {}; msg2.topic = {"time": msg.payload, "group": 2, "device":node.device, "devicetype" : node.devicetype , "try":msg.try} msg2.payload = { 'fc': 3, 'unitid':node.unitid, 'address': 3059, 'quantity': 70 }; node.send([msg2,null]); }, node.initialdefer * 2) setTimeout(function () { var msg3 = {}; msg3.topic = {"time": msg.payload, "group": 3, "device":node.device, "devicetype" : node.devicetype , "try":msg.try} msg3.payload = { 'fc': 3, 'unitid':node.unitid, 'address': 21299, 'quantity': 20 }; node.send([msg3,null]); }, node.initialdefer * 3) setTimeout(function () { var msg4 = {}; msg4.topic = {"time": msg.payload, "group": 4, "device":node.device , "devicetype" : node.devicetype, "try":msg.try} msg4.payload = { 'fc': 3, 'unitid':node.unitid, 'address': 3199, 'quantity': 30 }; node.send([msg4,null]); }, node.initialdefer * 4) } function sendMessagesPM850(node, msg, timeout) { if (timeout) { var count = {"n": 3, "time":msg.payload, "device":node.device,"chunks": 3, "data":new Array(3),timeout:1}; node.context.set(node.device,count); return; } setTimeout(function () { var msg1 = {}; msg1.topic = {"time": msg.payload, "group": 1, "device": node.device, "devicetype" : node.devicetype, "try":msg.try} msg1.payload = { 'fc': 4, 'unitid': node.unitid, 'address': 1099, 'quantity': 100 }; node.send([msg1,null]); }, node.initialdefer * 1) setTimeout(function () { var msg2 = {}; msg2.topic = {"time": msg.payload, "group": 2, "device":node.device, "devicetype" : node.devicetype, "try":msg.try} msg2.payload = { 'fc': 4, 'unitid': node.unitid, 'address': 1199, 'quantity': 20 }; node.send([msg2,null]); }, node.initialdefer * 2) setTimeout(function () { var msg3 = {}; msg3.topic = {"time": msg.payload, "group": 3, "device":node.device, "devicetype" : node.devicetype, "try":msg.try} msg3.payload = { 'fc': 4, 'unitid': node.unitid, 'address': 1715, 'quantity': 120 }; node.send([msg3,null]); }, node.initialdefer * 3) } RED.nodes.registerType("Legacy Input",digitalInput); };