node-red-contrib-plcs
Version:
Mentor Monitor Project Plcs Modbus Controllers
304 lines (262 loc) • 10.4 kB
JavaScript
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);
};