UNPKG

prisme-flow

Version:

prisme platform flow engine

169 lines (141 loc) 4.2 kB
/** * Created by prisme.io on 09/06/2017. */ /** * Modbus Getter node. * @module NodeRedModbusGetter * * @param RED */ module.exports = function (RED) { 'use strict' let mbBasics = require('./modbus-basics') let internalDebugLog = require('debug')('node_red_contrib_modbus') function ModbusGetter (config) { RED.nodes.createNode(this, config) this.name = config.name this.unitid = config.unitid this.dataType = config.dataType this.adr = config.adr this.quantity = config.quantity this.showStatusActivities = config.showStatusActivities this.showErrors = config.showErrors this.connection = null let node = this let modbusClient = RED.nodes.getNode(config.server) setNodeStatusTo('waiting') node.onModbusInit = function () { setNodeStatusTo('initialize') } node.onModbusConnect = function () { setNodeStatusTo('connected') } node.onModbusActive = function () { setNodeStatusTo('active') } node.onModbusError = function (failureMsg) { setNodeStatusTo('failure') if (node.showErrors) { node.warn(failureMsg) } } node.onModbusClose = function () { setNodeStatusTo('closed') } modbusClient.on('mbinit', node.onModbusInit) modbusClient.on('mbconnected', node.onModbusConnect) modbusClient.on('mbactive', node.onModbusActive) modbusClient.on('mberror', node.onModbusError) modbusClient.on('mbclosed', node.onModbusClose) node.on('input', function (msg) { if (!modbusClient.client) { return } if (msg.payload) { msg = { topic: node.id, payload: { unitid: node.unitid, fc: node.functionCodeModbus(node.dataType), address: node.adr, quantity: node.quantity } } if (node.showStatusActivities) { setNodeStatusTo(modbusClient.statlyMachine.getMachineState()) verboseLog(JSON.toString(msg)) } modbusClient.emit('readModbus', msg, node.onModbusReadDone, node.onModbusReadError) } }) node.functionCodeModbus = function (dataType) { switch (dataType) { case 'Coil': return 1 case 'Input': return 2 case 'HoldingRegister': return 3 case 'InputRegister': return 4 default: return dataType } } node.onModbusReadDone = function (resp, msg) { if (node.showStatusActivities) { setNodeStatusTo('reading done') } node.send(buildMessage(resp.data, resp, msg)) } node.onModbusReadError = function (err, msg) { setModbusError(err, msg) } node.on('close', function () { setNodeStatusTo('closed') }) function verboseLog (logMessage) { if (RED.settings.verbose) { internalDebugLog(logMessage) } } function buildMessage (values, response, msg) { return [{payload: values, responseBuffer: response, input: msg}, {payload: response, values: values, input: msg}] } function setNodeStatusTo (statusValue) { let statusOptions = mbBasics.set_node_status_properties(statusValue, node.showStatusActivities) node.status({ fill: statusOptions.fill, shape: statusOptions.shape, text: statusOptions.status }) } function setModbusError (err, msg) { let working = false if (err) { switch (err.message) { case 'Timed out': setNodeStatusTo('timeout') working = true break case 'FSM Not Ready To Read': setNodeStatusTo('not ready to read') working = true break case 'Port Not Open': setNodeStatusTo('reconnect') modbusClient.emit('reconnect') working = true break default: setNodeStatusTo('error: ' + JSON.stringify(err)) if (node.showErrors) { node.error(err, msg) } } } return working } } RED.nodes.registerType('modbus-getter', ModbusGetter) }