UNPKG

node-red-contrib-plcs

Version:

Mentor Monitor Project Plcs Modbus Controllers

308 lines (260 loc) 13.5 kB
<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>