node-red-contrib-plcs
Version:
Mentor Monitor Project Plcs Modbus Controllers
308 lines (260 loc) • 13.5 kB
HTML
<script type="text/x-red" data-template-name="Generic In">
<div class="form-row">
<label for="node-input-name"><i class="icon-bookmark"></i> Device Name</label>
<input type="text" id="node-input-name">
</div>
<div class="form-row">
<label for="node-input-mentorConfiguration"><i class="icon-globe"></i> Mentor Id</label>
<input type="text" id="node-input-mentorConfiguration">
</div>
<div class="form-row">
<label for="node-input-devicetype"><i class="icon-tag"></i> Device Type</label>
<select id="node-input-devicetype">
<option value="universal">Universal</option>
<option value="m221">M221</option>
<option value="m251">M251</option>
<option value="pm850">PM850</option>
<option value="pm700">PM700</option>
<option value="pm5100">PM5100</option>
<option value="cvmc10">CVMC10</option>
</select>
</div>
<div class="form-row">
<label for="node-input-unitid"><i class="fa fa-arrow-down"></i>Unit ID</label>
<input type="number" id="node-input-unitid" placeholder="Unit ID" style="width: 150px;">
</div>
<div class="form-row">
<label for="node-input-byteorder"><i class="icon-tag"></i> Byte Order</label>
<select id="node-input-byteorder">
<option value="ABCD">High order byte first</option>
<option value="BADC">Big endian with byte swap</option>
<option value="CDAB">Little endian with byte swap</option>
<option value="DCBA">Low order byte first</option>
</select>
</div>
<div class="form-row">
<label for="node-input-fc"><i class="icon-tag"></i> Registers</label>
<select id="node-input-fc">
<option value="4">Read Input Registers (3x)</option>
<option value="3">Read Holding Registers (4x)</option>
</select>
</div>
<div class="form-row">
<label for="node-input-valueformat"><i class="icon-tag"></i> Format </label>
<select id="node-input-valueformat" value=-1>
<option value=-1 selected="selected">None</option>
<option value=0>0</option>
<option value=1>0.0</option>
<option value=2>0.00</option>
<option value=3>0.000</option>
</select>
</div>
<div class="form-row" id="undefinedHash-div">
<input type="checkbox" id="node-input-individual" style="display: inline-block; width: auto; vertical-align: top;">
<label for="node-input-individual" style="width:48%;"> Read variables individuality</label>
<input type="checkbox" id="node-input-send_group" style="display: inline-block; width: auto; vertical-align: top;">
<label for="node-input-send_group" style="display: inline-block; width: auto; vertical-align: top;"> Group variables to send</label>
</div>
<div class="form-row" id="offsetbased-div">
<input type="checkbox" id="node-input-offsetbased" style="display: inline-block; width: auto; vertical-align: top;">
<label for="node-input-offsetbased" style="width:70%;"> Offset Based Address Variables</label>
<input type="number" style="width:25%;" placeholder="Address" id="node-input-baseaddress">
</div>
<!--
<div class="form-row" id="baseaddress-div" style="margin-left:200px; ">
<label for="node-input-baseaddress"><i class="fa fa-history"></i> Address</label>
</div>
-->
<div class="form-row">
<label for="node-input-columns"><i class="icon-envelope"></i> Columns </label>
<!-- <a href="#" class="editor-button editor-button-small" id="node-input-add-group" style="margin-top: 4px; margin-left: 250px;"><i class="fa fa-plus"></i> <span>Add Group</span></a> -->
<ol id="node-input-columns-container" style=" list-style-type:none; margin: 0;"></ol>
</div>
<div class="form-row">
<label for="node-input-initialdefer" style="width:40%;"><i class="fa fa-history"></i> Initial Defer (msecs)</label>
<input type="number" id="node-input-initialdefer" style="display: inline-block; width: auto; vertical-align: top;">
</div>
<div class="form-row">
<label for="node-input-defer" style="width:40%;"><i class="fa fa-history"></i> Retry Defer (msecs)</label>
<input type="number" id="node-input-defer" style="display: inline-block; width: auto; vertical-align: top;">
</div>
<div class="form-row">
<label for="node-input-retries" style="width:40%;"><i class="fa fa-history"></i> Retries</label>
<input type="number" id="node-input-retries" style="display: inline-block; width: auto; vertical-align: top;">
</div>
<div class="form-row">
<label for="node-input-group_name" style="width:40%;"><i class="icon-bookmark"></i> Group Name</label>
<input type="text" id="node-input-group_name" style="display: inline-block; width: auto; vertical-align: top;">
</div>
</script>
<script type="text/x-red" data-help-name="Generic In">
PLC Device Input to Mentor<br/>
</script>
<style>
.flex-container {
display: flex;
align-items: center; /* Use another value to see the result */
width: 100%;
/*background-color: #1faadb;*/
}
.flex-container > div {
width: 25%;
margin: 1px;
border-radius: 1px;
/*background-color: #8ebf42;*/
}
</style>
<script type="text/javascript">
RED.nodes.registerType('Generic In', {
category: 'Mentor Plcs',
defaults: {
name: {value: ''},
byteorder: {value: ''},
columns:{value:[{name:"",address:"1",size:"integer",opt:"*1"}]},
initialdefer: {value: 0},
defer: {value: 5000},
retries: {value: 5},
devicetype: {value: 'universal'},
fc: {value: '4'},
group_name: {value: ''},
unitid: {value: 1},
individual: {value: false},
send_group: {value: true},
offsetbased: {value: false},
baseaddress: {value: 0},
mentorConfiguration: {value: "", type: "mentor-config"},
valueformat: {value: -1}
},
inputs: 1,
outputs: 2,
inputLabels: "timestamp from interval timer",
outputLabels: ["stdout to Modbus TCP flexible input","stdout to Mentor SaveDB timeout"],
icon: "iconDI.png",
align: 'left',
color: '#EBEDEC',
paletteLabel: 'Generic In',
label() {
if (!this.group_name || this.group_name === "" )
return this.name || 'Generic In';
else
return ((this.name !="" ? this.name : 'Generic In') + " ("+ this.group_name + ")");
},
oneditprepare() {
function setDeviceTypeUI()
{
var deviceType = $("#node-input-devicetype").val();
$("#node-input-byteorder").removeAttr('disabled');
switch (deviceType) {
case "m221":
case "m251":
$("#node-input-byteorder").val('CDAB');
$("#node-input-byteorder").attr('disabled', 'disabled');
$("#node-input-fc").val('3');
$("#node-input-fc").attr('disabled', 'disabled');
break;
case "pm700":
case "pm5100":
case "pm850":
$("#node-input-byteorder").val('ABCD');
$("#node-input-byteorder").attr('disabled', 'disabled');
$("#node-input-fc").val('4');
$("#node-input-fc").attr('disabled', 'disabled');
break;
case "cvmc10":
$("#node-input-byteorder").val('ABCD');
$("#node-input-byteorder").attr('disabled', 'disabled');
$("#node-input-fc").val('3');
$("#node-input-fc").attr('disabled', 'disabled');
break;
case "universal":
$("#node-input-fc").removeAttr('disabled');
$("#node-input-byteorder").val('ABCD');
$("#node-input-byteorder").removeAttr('disabled');
break;
}
}
//$("#node-input-valueformat").val(-1);
//$("#node-input-fc").val('4');
$('#node-input-columns-container').css('min-height', '300px').css('min-width', '400px').editableList({
sortable: true,
removable: true,
addItem: (container, i, data) => {
container.css({
overflow: 'hidden',
whiteSpace: 'nowrap'
});
container.addClass('flex-container');
var row = $('<div/>',{style: "width:40%"}).appendTo(container);
var row2 = $('<div/>',{style: "width:13%"}).appendTo(container);
var row3 = $('<div/>',{style: "width:18%"}).appendTo(container);
var row4 = $('<div/>',{style: "width:17%"}).appendTo(container);
var propertyName = $('<input/>',{class:"node-input-column-name",style:"width:100%; margin-right:1px",type:"text", placeholder:"Name"}).appendTo(row);
var propertyAddress = $('<input/>',{class:"node-input-column-address",style:"width:100%; margin-right:1px",type:"text", placeholder:"Address"}).appendTo(row2);
var selectSize = $('<select/>',{class:"node-input-column-size",style:"width:100%; margin-right:1px;", default:"none"} ).appendTo(row3);
var selectSizes = [{v:"integer",l:'Word 16 +'},{v:"decimal",l:'Decimal 16 +/-'},{v:"long",l:'DWord 32 +'},{v:"long32",l:'Long 32 +/-'},{v:"float",l:'Float 32'}];
for (var i=0; i<selectSizes.length; i++) {
selectSize.append($("<option></option>").val(selectSizes[i].v).text(selectSizes[i].l));
}
var selectField = $('<select/>',{class:"node-input-column-opt",style:"width:100%; margin-right:1px;", placeholder:"Operation", default:"none"} ).appendTo(row4);
var selectOptions = [{v:"none",l:'None'},{v:"x*1",l:'x*1'},{v:"x/10",l:'x/10'},{v:"x/100",l:'x/100'},{v:"x/1000",l:'x/1000'}];
for (var i=0; i<selectOptions.length; i++) {
selectField.append($("<option></option>").val(selectOptions[i].v).text(selectOptions[i].l));
}
if (data.opt==null)
{
data.opt = selectOptions[0].v;
}
if (data.size==null)
{
data.size = selectSizes[0].v;
}
selectField.val(data.opt);
selectSize.val(data.size);
propertyName.val(data.name);
propertyAddress.val(data.address);
selectField.change();
selectSize.change();
}
});
$("#node-input-add-group").click(function() {
var column = {
opt:"x*1",
name:"group",
size:"double",
address:151
};
$("#node-input-columns-container").editableList('addItem',column);
});
for (var i=0; i<this.columns.length; i++) {
var column = this.columns[i];
$("#node-input-columns-container").editableList('addItem',column);
}
// When the initialWindowStartType combobox value changes, only the corresponding field(s) input fields should be displayed
$("#node-input-devicetype").change(function() {
// When the router type changes, probably some elements should be hidden or showed
setDeviceTypeUI();
});
$("#node-input-offsetbased").change(function() {
if ($("#node-input-offsetbased").is(':checked'))
$("#node-input-baseaddress").show();
else
$("#node-input-baseaddress").hide();
});
},
oneditsave() {
var columns = $("#node-input-columns-container").editableList('items');
var node = this;
node.columns= [];
columns.each(function(i) {
var column = $(this);
var r = {
opt:column.find(".node-input-column-opt").val(),
name:column.find(".node-input-column-name").val(),
size:column.find(".node-input-column-size").val(),
address:column.find(".node-input-column-address").val()
};
node.columns.push(r);
});
}
});
</script>