node-plc
Node.js module to communicate with PLCs.
At the moment only the Siemens LOGO! PLC (0BA7
and 0BA8
) is supported.
Usage
npm install --save plc
var plc = require("plc");
Logo class
var myLogo = new plc.Logo("192.168.0.1", {
markers: 6,
inputs: 4,
timeout: 500
});
myLogo.on("error", function(err){
console.error(err.message);
});
myLogo.on("connect", function(){
var result = myLogo.getInputs();
if (result instanceof Error){
return console.error(result.message);
}
console.log(result);
result = myLogo.getMarkers();
if (result instanceof Error){
return console.error(result.message);
}
console.log(result);
result = myLogo.setMarker(2);
if (result instanceof Error){
return console.error(result.message);
}
myLogo.disconnect();
});
myLogo.connect();
Simulation
var plc = require("plc");
var myVirtualLogo = new plc.Logo("192.168.0.1", { simulate: true });
myLogo.on("connect", function(){
myVirtualLogo.setSimulatedInput(2);
myLogo.getInput(2);
myVirtualLogo.clearSimulatedInput(2);
myLogo.getInput(2);
myVirtualLogo.setMarker(1);
myVirtualLogo.getMarker(1);
myVirtualLogo.clearMarker(1);
myVirtualLogo.getMarker(1);
});
myVirtualLogo.connect();
Comfort features
The LOGO! can be configured with state and action schemata.
A states could be described like this:
var myStates = {
stateOne: { input: 0 },
stateTwo: { marker: 2 },
stateThree: { input: 2 }
};
An action consists of an array with defined desired states:
var actions = {
actionOne:
[
{ type: 'clear', marker: 1 },
{ type: 'set', marker: 3 }
],
actionTwo:
[ { type: 'set', marker: 2 } ],
actionThree:
[ { type: 'alias', actions: ['actionOne','actionTwo'] } ]
};
This is a full example:
var config = {
timeout: 500
interval: 250
states: {
x: { input: 0 },
y: { input: 2 },
foo: { marker: 0 },
bar: { input: 1 }
actions: {
switchOne:
[
{ type: 'set', marker: 3 }
],
switchTwo:
[
{ type: 'set', marker: 1 },
{ type: 'alias', switches: ['switchOne'] }
]
}
}
};
var dev1 = new Device("192.168.0.201", config);
dev1.on("connect", function(){
console.log("Device 1 connected");
});
dev1.on("timeout", function(){
console.log("Device 1 connection timeout occoured");
});
dev1.on("disconnect", function(){
console.log("Device 1 disconnected");
});
dev1.on("error", function(err){
console.error("something went wrong: ", err.message);
});
dev.on('state-change', function(state){
console.log(state);
});
dev1.connect();
dev1.startWatching();
dev1.stopWatching();
dev1.disconnect();
API
Constructor
new require("plc").Logo(ipAddress, options);
Following options are available
inputs
- number of used inputsmarkers
- number of used markerssimulate
- simulation modetimeout
- the socket timeout
Properties
Methods
connect()
disconnect()
setMarker(nr)
clearMarker(nr)
getMarker(nr)
getMarkers()
getInput(nr)
getInputs()
setSimulatedInput(nr)
clearSimulatedInput(nr)
getState()
setSimulatedState(stateName, value)
setVirtualState(stateName, value)
triggerAction(action)
startWatching
stopWatching
Events
error
connect
disconnect
timeout
state
state-change
Test
npm test
License
This project is licensed under the LGPL license.