prisme-flow
Version:
prisme platform flow engine
360 lines (326 loc) • 14.4 kB
HTML
<!--
Created by prisme.io on 09/06/2017.
@author <a href="mailto:hello@prisme.io">savane vamara</a> (prisme.io)
-->
<script type="text/javascript">
RED.nodes.registerType('modbus-client', {
category: 'config',
defaults: {
name: {value: ""},
clienttype: {value: "tcp", required: true},
bufferCommands: {value: true},
stateLogEnabled: {value: false},
tcpHost: {value: "127.0.0.1", required: true},
tcpPort: {value: 502, required: true, validate: RED.validators.number()},
tcpType: {value: "DEFAULT", required: true},
serialPort: {value: "/dev/ttyUSB", required: true},
serialType: {value: "RTU-BUFFERD", required: true},
serialBaudrate: {value: 9600, required: true, validate: RED.validators.number()},
serialDatabits: {value: 8, required: true, validate: RED.validators.number()},
serialStopbits: {value: 1, required: true, validate: RED.validators.number()},
serialParity: {value: "none", required: true},
serialConnectionDelay: {value: 100},
unit_id: {value: 1},
commandDelay: {value: 1},
clientTimeout: {value: 1000},
reconnectTimeout: {value: 2000}
},
label: function () {
let node = this
if (node.clienttype == "tcp") {
return node.name || "modbus-tcp@" + node.tcpHost + ":" + node.tcpPort
} else {
return node.name || "modbus-serial@" + node.serialPort + ':' + node.serialBaudrate
}
},
oneditprepare: function () {
let previous = null
let node = this
node.ports = []
let clientTypeSelector = $('#node-config-input-clienttype')
let inputsSerial = $("#node-inputs-modbus-serial")
let inputsSerialExtras = $("#node-inputs-modbus-serial-extras")
let inputsTCP = $("#node-inputs-modbus-tcp")
clientTypeSelector.on('focus', function () {
previous = this.value
}).change(function () {
if (previous == null) {
previous = $("#node-config-input-clienttype").val()
}
if (node.unit_id) {
node.unit_id = parseInt(node.unit_id)
}
if (node.commandDelay) {
node.commandDelay = parseInt(node.commandDelay)
}
if (node.clientTimeout) {
node.clientTimeout = parseInt(node.clientTimeout)
}
if (node.reconnectTimeout) {
node.reconnectTimeout = parseInt(node.reconnectTimeout)
}
switch (clientTypeSelector.val()) {
case 'tcp':
inputsSerialExtras.hide()
inputsSerial.hide()
inputsTCP.show()
if (node.tcpHost) {
node.tcpHost.required = true
node.tcpPort.required = true
if (node.tcpType) {
node.tcpType.required = true
}
}
if (node.serialPort) {
node.serialPort.required = false
if (node.serialType) {
node.serialType.required = false
}
node.serialBaudrate.required = false
}
if (node.serialDatabits) {
node.serialDatabits.required = false
node.serialStopbits.required = false
node.serialParity.required = false
}
break
case 'serial':
case 'simpleser':
if (clientTypeSelector.val() === 'simpleser') {
inputsSerialExtras.hide()
node.serialDatabits.value = 8
node.serialStopbits.value = 1
node.serialParity.value = 'none'
} else {
inputsSerialExtras.show()
}
inputsSerial.show()
inputsTCP.hide()
if (node.tcpHost) {
node.tcpHost.required = false
node.tcpPort.required = false
if (node.tcpType) {
node.tcpType.required = false
}
}
if (node.serialPort) {
node.serialPort.required = true
if (node.serialType) {
node.serialType.required = true
}
node.serialBaudrate.required = true
}
if (node.serialDatabits) {
node.serialDatabits.required = true
node.serialStopbits.required = true
node.serialParity.required = true
}
break
default:
break
}
})
try {
$("#node-config-input-serialPort").autocomplete("destroy")
}
catch (err) {
}
$("#node-config-lookup-serial").click(function () {
$("#node-config-lookup-serial").addClass('disabled')
$.getJSON('serialports', function (data) {
$("#node-config-lookup-serial").removeClass('disabled')
node.ports = []
$.each(data, function (i, port) {
node.ports.push(port.comName)
})
$("#node-config-input-serialPort").autocomplete({
source: node.ports,
minLength: 0,
close: function (event, ui) {
$("#node-config-input-serialPort").autocomplete("destroy")
}
}).autocomplete("search", "")
})
})
}
})
</script>
<script type="text/x-red" data-template-name="modbus-client">
<div class="form-row">
<label for="node-config-input-name"><i class="icon-tag"></i> <span>Name</span></label>
<input type="text" id="node-config-input-name" placeholder="Name">
</div>
<div class="form-row">
<label for="node-config-input-clienttype"><i class="icon-bookmark"></i><span>Type</span></label>
<select type="text" id="node-config-input-clienttype" style="width:140px;">
<option value="tcp" select>TCP</option>
<option value="simpleser">Serial</option>
<option value="serial">Serial Expert</option>
</select>
</div>
<hr>
<div id="node-inputs-modbus-tcp">
<div class="form-row">
<label for="node-config-input-tcpHost"><i class="icon-bookmark"></i> <span>Host</span></label>
<input type="text" id="node-config-input-tcpHost">
</div>
<div class="form-row">
<label for="node-config-input-tcpPort"><i class="icon-bookmark"></i> <span>Port</span></label>
<input type="text" id="node-config-input-tcpPort">
</div>
<div class="form-row">
<label for="node-config-input-tcpType"><i class="icon-bookmark"></i> <span>TCP Type</span></label>
<select type="text" id="node-config-input-tcpType" style="width:140px;">
<option value="DEFAULT" select>DEFAULT</option>
<option value="TPC-RTU-BUFFERED">RTU-BUFFERED</option>
<option value="TELNET">TELNET</option>
<option value="C701">C701</option>
</select>
</div>
</div>
<div id="node-inputs-modbus-serial">
<div class="form-row">
<label for="node-config-input-serialPort"><i class="fa fa-random"></i><span>Serial port</span></label>
<input type="text" id="node-config-input-serialPort" style="width:60%;" placeholder="/dev/ttyUSB or COM4">
<a id="node-config-lookup-serial" class="btn"><i id="node-config-lookup-serial-icon" class="fa fa-search"></i></a>
</div>
<div class="form-row">
<label for="node-config-input-serialType"><i class="icon-bookmark"></i> <span>Serial port</span></label>
<select type="text" id="node-config-input-serialType" style="width:140px;">
<option value="RTU-BUFFERD" select>RTU-BUFFERD</option>
<option value="RTU">RTU</option>
<option value="ASCII">ASCII</option>
</select>
</div>
<div class="form-row">
<label for="node-config-input-serialBaudrate"><i class="icon-bookmark"></i> <span>Baud rate</span></label>
<select id="node-config-input-serialBaudrate" style="max-width:140px">
<option value="115200">115200</option>
<option value="57600">57600</option>
<option value="38400">38400</option>
<option value="19200">19200</option>
<option value="9600">9600</option>
<option value="4800">4800</option>
<option value="2400">2400</option>
<option value="1200">1200</option>
<option value="300">300</option>
<option value="110">110</option>
<option value="75">75</option>
</select>
</div>
</div>
<div id="node-inputs-modbus-serial-extras">
<div class="form-row">
<label for="node-config-input-serialDatabits"><i class="icon-bookmark"></i> <span>Data Bits</span></label>
<select id="node-config-input-serialDatabits" style="max-width:80px">
<option value="8">8</option>
<option value="7">7</option>
<option value="6">6</option>
<option value="5">5</option>
</select>
</div>
<div class="form-row">
<label for="node-config-input-serialStopbits"><i class="icon-bookmark"></i> <span>Stop Bits</span></label>
<select id="node-config-input-serialStopbits" style="max-width:80px">
<option value="1">1</option>
<option value="1.5">1.5</option>
<option value="2">2</option>
</select>
</div>
<div class="form-row">
<label for="node-config-input-serialParity"><i class="icon-bookmark"></i> <span>Parity</span></label>
<select id="node-config-input-serialParity" style="max-width:80px">
<option value="none">None</option>
<option value="even">Even</option>
<option value="mark">Mark</option>
<option value="odd">Odd</option>
<option value="space">Space</option>
</select>
</div>
<div class="form-row">
<label for="node-config-input-serialConnectionDelay">
<i class="fa fa-random"></i>
<span>Connection delay (ms)</span>
</label>
<input type="text" id="node-config-input-serialConnectionDelay" style="max-width:80px" placeholder="500">
</div>
</div>
<hr>
<div class="form-row">
<label for="node-config-input-unit_id"><i class="icon-bookmark"></i><span>Unit-Id</span></label>
<input type="text" id="node-config-input-unit_id" placeholder="1" style="max-width:80px">
</div>
<div class="form-row">
<label for="node-config-input-clientTimeout"><i class="icon-time"></i><span>Timeout (ms)</span></label>
<input type="text" id="node-config-input-clientTimeout" placeholder="1000" style="max-width:80px">
</div>
<div class="form-row">
<label for="node-config-input-reconnectTimeout">
<i class="icon-time"></i>
<span>Timeout (ms)</span>
</label>
<input type="text" id="node-config-input-reconnectTimeout" placeholder="2000" style="max-width:80px">
</div>
<hr>
<div class="form-row">
<label style="min-width:160px" for="node-config-input-stateLogEnabled">
<i class="fa fa-th"></i>
<span>Log states changes</span>
</label>
<input type="checkbox" id="node-config-input-stateLogEnabled" style="max-width:30px">
</div>
<div class="form-row">
<label style="min-width:160px" for="node-config-input-bufferCommands"><i class="fa fa-th"></i>
<span>Queue commands</span></label>
<input type="checkbox" id="node-config-input-bufferCommands" style="max-width:30px">
</div>
<div class="form-row">
<label style="min-width:160px" for="node-config-input-commandDelay"><i class="icon-time"></i> <span>Queue commands</span></label>
<input type="text" id="node-config-input-commandDelay" placeholder="1" style="max-width:80px">
</div>
</script>
<script type="text/x-red" data-help-name="modbus-client">
<p><strong>
If you have many nodes on this communication (see configuration nodes),
think about multiple connections to your Modbus device, please!
Many devices are able to connecting multiple.
</strong></p>
<p>
Add a catch to your flow:
<pre>
[{"id":"cdd076d5.dab728","type":"catch","z":"b245d3e4.b52de","name":"","scope":null,"x":1020,"y":40,
"wires":[["8516d63d.1c29a8"]]},{"id":"8516d63d.1c29a8","type":"debug","z":"b245d3e4.b52de","name":"",
"active":true,"console":"false","complete":"true","x":1170,"y":40,"wires":[]}]
</pre>
</p>
<p>Uses ModbusRTU ('modbus-serial') to read/write by ethernet host:port or TTY register/coil/input addresses.</p>
<p>The Stately machine ('stately.js') organizing the states to work with reconnects and a queue of commands.</p>
<p>
<h3>Basics</h3>
<ul>
<li>Type (TCP/Serial)</li>
<li>Queue commands (true/false) - with true it buffers incoming Modbus commands and send them with
delay</li>
<li>Queue Work Delay (default 0 ms) - ms interval to delay sending commands from queue (sumOfWaiting=requestsPerCycle*delay)</li>
<li>Unit-ID (default 1) - to set one Unit-ID for all nodes without Unit-ID.
Set the Unit-ID of the Read/Write/Getter node's to empty for using this ID</li>
<li>Timeout (default 1000 ms) - ms for the command timeout on ModbusRTU command</li>
<li>Reconnect timeout (default 2000 ms) - time to wait on reconnect before next sending</li>
</ul>
<h3>TCP</h3>
<ul>
<li>Host - IP address</li>
<li>Port (default 502)</li>
</ul>
<h3>Serial</h3>
<ul>
<li>Serial Port (/dev/tty.usbserial | COM[1..n])</li>
<li>Serial Baud rate</li>
<li>Serial Databits</li>
<li>Serial Stopbits</li>
<li>Serial Parity</li>
<li>Serial Type</li>
<li>Serial Connection delay (default 500 ms) - time to delay first command sending after reconnect</li>
</ul>
</p>
</script>