12 Commits

Author SHA1 Message Date
Patrick McDonagh
9165f6f222 Starts breaking out VFD Function into new UDT and generic routine 2018-04-10 18:13:55 -05:00
Patrick McDonagh
2a732036b2 Completes #3.
Lambda functions move alarms to alarmlog channel
2018-03-22 15:01:49 -05:00
Patrick McDonagh
2c2cc8bb8d Completes #2 and #1
Adds lifetime and montly totalizer
2018-03-21 15:25:11 -05:00
Patrick McDonagh
4f04584265 Adds initial Installation document 2018-03-20 11:20:39 -05:00
Patrick McDonagh
6dac788e93 File Cleanup 2018-03-15 14:37:49 -05:00
Patrick McDonagh
32923324f0 Adds default value to min speed seconds for fault 2018-02-20 14:54:01 -06:00
Patrick McDonagh
9010cda9a4 Successfully completes MAXH2O-88 2018-01-22 10:48:30 -06:00
Patrick McDonagh
4a2ba7ff9d Completes MAXH2O-87 and MAXH2O-88. Increments driver version 2018-01-16 16:53:50 -06:00
Patrick McDonagh
4f076cae2f Merge branch 'master' of https://github.com/Henry-Pump/Max-Water-System 2017-12-21 16:50:46 -06:00
Patrick McDonagh
053ebcd7d4 Patch for more accurate PID level control {MAXH2O-92} 2017-12-21 16:50:43 -06:00
Patrick McDonagh
bcc56fc342 Corrects NTP Code
Datetime UDT conflict was causing errors.
2017-12-13 13:27:12 -06:00
Patrick McDonagh
2974f4491d Fix and patch for MAXH2O-84 2017-12-01 15:49:46 -06:00
28 changed files with 28150 additions and 67739 deletions

Binary file not shown.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,4 @@
"""Simulate a water well."""
flowrate_in = 100 # GPM, typically unknown and changing

View File

@@ -8,32 +8,31 @@
<!-- Use data-confirm-message to set the exact message that pops up in the alert window. -->
<a href="#"
data-confirm-message="Are you sure you want to remotely start the well?"
data-refreshpause="3"
data-command=""
data-staticsend="[{'com':'1','values':[ ['cmd_Start',1] ] }]"
data-channelId="<%= channels['advvfdipp.modbuswrite'].channelId %>"
data-techname="<%=channels['advvfdipp.modbuswrite'].techName %>"
data-name="<%= channels['advvfdipp.modbuswrite'].name%>"
data-nodechannelcurrentId="<%= channels['advvfdipp.modbuswrite'].nodechannelcurrentId %>"
id="<%= channels['advvfdipp.modbuswrite'].channelId %>"
class="btn btn-large btn-theme animated confirmstatic pad15">
Start</a>
<!-- Two sets were occurring because you had both the confirmstatic and setstatic classes on the button. Use one or the other, but not both. -->
data-confirm-message="Are you sure you want to remotely start the well?"
data-refreshpause="1"
data-command=""
data-staticsend="{'tag': 'cmd_Start', 'val': 1}"
data-channelId="<%= channels["advvfdipp.writeplctag"].channelId %>"
data-techname="<%=channels["advvfdipp.writeplctag"].techName %>"
data-name="<%= channels["advvfdipp.writeplctag"].name%>"
data-nodechannelcurrentId="<%= channels["advvfdipp.writeplctag"].nodechannelcurrentId %>"
id="<%= channels["advvfdipp.writeplctag"].channelId %>"
class="btn btn-large btn-theme animated confirmstatic pad15">
Start</a>
</div>
<div class='col-xs-6 text-center box-me'>
<a href="#"
data-confirm-message="Are you sure you want to remotely stop the well?"
data-refreshpause="3"
data-command=""
data-staticsend="[{'com':'1','values':[ ['cmd_Stop',1] ] }]"
data-channelId="<%= channels['advvfdipp.modbuswrite'].channelId %>"
data-techname="<%=channels['advvfdipp.modbuswrite'].techName %>"
data-name="<%= channels['advvfdipp.modbuswrite'].name%>"
data-nodechannelcurrentId="<%= channels['advvfdipp.modbuswrite'].nodechannelcurrentId %>"
id="<%= channels['advvfdipp.modbuswrite'].channelId %>"
class="btn btn-large btn-theme animated confirmstatic pad15">
Stop</a>
data-confirm-message="Are you sure you want to remotely stop the well?"
data-refreshpause="1"
data-command=""
data-staticsend="{'tag': 'cmd_Stop', 'val': 1}"
data-channelId="<%= channels["advvfdipp.writeplctag"].channelId %>"
data-techname="<%=channels["advvfdipp.writeplctag"].techName %>"
data-name="<%= channels["advvfdipp.writeplctag"].name%>"
data-nodechannelcurrentId="<%= channels["advvfdipp.writeplctag"].nodechannelcurrentId %>"
id="<%= channels["advvfdipp.writeplctag"].channelId %>"
class="btn btn-large btn-theme animated confirmstatic pad15">
Stop</a>
</div>
</div>
@@ -42,171 +41,187 @@
<div class="col-xs-12 text-center">
<h1>PID Settings</h1>
</div>
<div class="col-md-6 box-me entry-top-level" id="flowsetpoint">
<div class="pad15">
<h2>Flow Setpoint
<% if (channels["advvfdipp.pidcontrolmode"].value == "Flow"){ %>
<span class="label label-success">ACTIVE</span>
<% } %>
</h2>
<form class="form-inline">
<div class="form-group">
<input class="form-control val_box"
<div class="col-md-6 box-me">
<div class="entry-top-level" id="flowsetpoint">
<div class="pad15">
<h2>Flow Setpoint
<% if (channels["advvfdipp.pidcontrolmode"].value == "Flow"){ %>
<span class="label label-success">ACTIVE</span>
<% } %>
</h2>
<form class="form-inline">
<div class="form-group">
<input class="form-control val_box"
type="number"
step="any"
value="<%=channels['advvfdipp.flowsetpoint'].value %>">
</div>
<a href="#"
data-refreshpause="3"
</div>
<a href="#"
data-confirm-message="Are you sure you want to do this?"
data-refreshpause="1"
data-command=""
data-staticsend="[{'com':'1','values':[ ['cfg_PID_FlowSP',<%=channels['advvfdipp.flowsetpoint'].value %>] ] }]"
data-channelId="<%= channels['advvfdipp.modbuswrite'].channelId %>"
data-techname="<%=channels['advvfdipp.modbuswrite'].techName %>"
data-name="<%= channels['advvfdipp.modbuswrite'].name%>"
data-nodechannelcurrentId="<%= channels['advvfdipp.modbuswrite'].nodechannelcurrentId %>"
id="<%= channels['advvfdipp.modbuswrite'].channelId %>"
class="btn btn-large btn-theme animated confirmstatic">
<i class="material-icons">send</i></a>
</form>
data-staticsend="{'tag': 'cfg_PID_FlowSP', 'val': <%=channels['advvfdipp.flowsetpoint'].value %>}"
data-channelId="<%= channels["advvfdipp.writeplctag"].channelId %>"
data-techname="<%=channels["advvfdipp.writeplctag"].techName %>"
data-name="<%= channels["advvfdipp.writeplctag"].name%>"
data-nodechannelcurrentId="<%= channels["advvfdipp.writeplctag"].nodechannelcurrentId %>"
id="<%= channels["advvfdipp.writeplctag"].channelId %>"
class="btn btn-large btn-theme animated confirmstatic material-icons">send</a>
</form>
</div>
</div>
<div class="pad15">
<a href="#"
style="width:95%"
data-confirm-message="Are you sure you want to activate Flow Control Mode?"
data-refreshpause="3"
data-command=""
data-staticsend="[{'com':'1','values':[ ['cfg_PID_Flow',1] ] }]"
data-channelId="<%= channels['advvfdipp.modbuswrite'].channelId %>"
data-techname="<%=channels['advvfdipp.modbuswrite'].techName %>"
data-name="<%= channels['advvfdipp.modbuswrite'].name%>"
data-nodechannelcurrentId="<%= channels['advvfdipp.modbuswrite'].nodechannelcurrentId %>"
id="<%= channels['advvfdipp.modbuswrite'].channelId %>"
class="btn btn-large btn-theme animated confirmstatic pad15">
Activate Flow Control</a>
style="width:95%"
data-confirm-message="Are you sure you want to activate Flow Control Mode?"
data-refreshpause="1"
data-command=""
data-staticsend="{'tag': 'cfg_PID_Flow', 'val': 1}"
data-channelId="<%= channels["advvfdipp.writeplctag"].channelId %>"
data-techname="<%=channels["advvfdipp.writeplctag"].techName %>"
data-name="<%= channels["advvfdipp.writeplctag"].name%>"
data-nodechannelcurrentId="<%= channels["advvfdipp.writeplctag"].nodechannelcurrentId %>"
id="<%= channels["advvfdipp.writeplctag"].channelId %>"
class="btn btn-large btn-theme animated setstatic">
Activate Flow Control</a>
</div>
</div>
<div class="col-md-6 box-me entry-top-level" id="fluidlevelsetpoint">
<div class="pad15">
<h2>Fluid Level Setpoint
<% if (channels["advvfdipp.pidcontrolmode"].value == "Fluid Level"){ %>
<span class="label label-success">ACTIVE</span>
<% } %>
</h2>
<form class="form-inline">
<div class="form-group">
<input class="form-control val_box"
<div class="col-md-6 box-me">
<div class="entry-top-level" id="fluidlevelsetpoint">
<div class="pad15">
<h2>Fluid Level Setpoint
<% if (channels["advvfdipp.pidcontrolmode"].value == "Fluid Level"){ %>
<span class="label label-success">ACTIVE</span>
<% } %>
</h2>
<form class="form-inline">
<div class="form-group">
<input class="form-control val_box"
type="number"
step="any"
value="<%=channels['advvfdipp.fluidlevelsetpoint'].value %>">
</div>
<a href="#"
data-refreshpause="3"
</div>
<a href="#"
data-confirm-message="Are you sure you want to do this?"
data-refreshpause="1"
data-command=""
data-staticsend="[{'com':'1','values':[ ['cfg_PID_FluidLevelSP',<%=channels['advvfdipp.fluidlevelsetpoint'].value %>] ] }]"
data-channelId="<%= channels['advvfdipp.modbuswrite'].channelId %>"
data-techname="<%=channels['advvfdipp.modbuswrite'].techName %>"
data-name="<%= channels['advvfdipp.modbuswrite'].name%>"
data-nodechannelcurrentId="<%= channels['advvfdipp.modbuswrite'].nodechannelcurrentId %>"
id="<%= channels['advvfdipp.modbuswrite'].channelId %>"
class="btn btn-large btn-theme animated confirmstatic">
<i class="material-icons">send</i></a>
</form>
data-staticsend="{'tag': 'cfg_PID_FluidLevelSP', 'val': <%=channels['advvfdipp.fluidlevelsetpoint'].value %>}"
data-channelId="<%= channels["advvfdipp.writeplctag"].channelId %>"
data-techname="<%=channels["advvfdipp.writeplctag"].techName %>"
data-name="<%= channels["advvfdipp.writeplctag"].name%>"
data-nodechannelcurrentId="<%= channels["advvfdipp.writeplctag"].nodechannelcurrentId %>"
id="<%= channels["advvfdipp.writeplctag"].channelId %>"
class="btn btn-large btn-theme animated setstatic material-icons">send</a>
</form>
</div>
</div>
<div class="pad15">
<a href="#"
style="width:95%"
data-confirm-message="Are you sure you want to activate Fluid Level Control Mode?"
data-refreshpause="3"
data-refreshpause="1"
data-command=""
data-staticsend="[{'com':'1','values':[ ['cfg_PID_FluidLevel',1] ] }]"
data-channelId="<%= channels['advvfdipp.modbuswrite'].channelId %>"
data-techname="<%=channels['advvfdipp.modbuswrite'].techName %>"
data-name="<%= channels['advvfdipp.modbuswrite'].name%>"
data-nodechannelcurrentId="<%= channels['advvfdipp.modbuswrite'].nodechannelcurrentId %>"
id="<%= channels['advvfdipp.modbuswrite'].channelId %>"
class="btn btn-large btn-theme animated confirmstatic pad15">
data-staticsend="{'tag': 'cfg_PID_FluidLevel', 'val': 1}"
data-channelId="<%= channels["advvfdipp.writeplctag"].channelId %>"
data-techname="<%=channels["advvfdipp.writeplctag"].techName %>"
data-name="<%= channels["advvfdipp.writeplctag"].name%>"
data-nodechannelcurrentId="<%= channels["advvfdipp.writeplctag"].nodechannelcurrentId %>"
id="<%= channels["advvfdipp.writeplctag"].channelId %>"
class="btn btn-large btn-theme animated setstatic ">
Activate Fluid Level Control</a>
</div>
</div>
<div class="col-md-6 box-me entry-top-level" id="tubingpressuresetpoint">
<div class="pad15">
<h2>Tubing Pressure Setpoint
<% if (channels["advvfdipp.pidcontrolmode"].value == "Tubing Pressure"){ %>
<span class="label label-success">ACTIVE</span>
<% } %>
</h2>
<form class="form-inline">
<div class="form-group">
<input class="form-control val_box"
<div class="col-md-6 box-me">
<div class="entry-top-level" id="tubingpressuresetpoint">
<div class="pad15">
<h2>Tubing Pressure Setpoint
<% if (channels["advvfdipp.pidcontrolmode"].value == "Tubing Pressure"){ %>
<span class="label label-success">ACTIVE</span>
<% } %>
</h2>
<form class="form-inline">
<div class="form-group">
<input class="form-control val_box"
type="number"
step="any"
value="<%=channels['advvfdipp.tubingpressuresetpoint'].value %>">
</div>
<a href="#"
data-refreshpause="3"
</div>
<a href="#"
data-confirm-message="Are you sure you want to do this?"
data-refreshpause="1"
data-command=""
data-staticsend="[{'com':'1','values':[ ['cfg_PID_TubingPressureSP',<%=channels['advvfdipp.tubingpressuresetpoint'].value %>] ] }]"
data-channelId="<%= channels['advvfdipp.modbuswrite'].channelId %>"
data-techname="<%=channels['advvfdipp.modbuswrite'].techName %>"
data-name="<%= channels['advvfdipp.modbuswrite'].name%>"
data-nodechannelcurrentId="<%= channels['advvfdipp.modbuswrite'].nodechannelcurrentId %>"
id="<%= channels['advvfdipp.modbuswrite'].channelId %>"
class="btn btn-large btn-theme animated confirmstatic">
<i class="material-icons">send</i></a>
</form>
data-staticsend="{'tag': 'cfg_PID_TubingPressureSP', 'val': <%=channels['advvfdipp.tubingpressuresetpoint'].value %>}"
data-channelId="<%= channels["advvfdipp.writeplctag"].channelId %>"
data-techname="<%=channels["advvfdipp.writeplctag"].techName %>"
data-name="<%= channels["advvfdipp.writeplctag"].name%>"
data-nodechannelcurrentId="<%= channels["advvfdipp.writeplctag"].nodechannelcurrentId %>"
id="<%= channels["advvfdipp.writeplctag"].channelId %>"
class="btn btn-large btn-theme animated setstatic material-icons">send</a>
</form>
</div>
</div>
<div class="pad15">
<a href="#"
style="width:95%"
data-confirm-message="Are you sure you want to activate Tubing Pressure Control Mode?"
data-refreshpause="3"
data-refreshpause="1"
data-command=""
data-staticsend="[{'com':'1','values':[ ['cfg_PID_TubingPressure',1] ] }]"
data-channelId="<%= channels['advvfdipp.modbuswrite'].channelId %>"
data-techname="<%=channels['advvfdipp.modbuswrite'].techName %>"
data-name="<%= channels['advvfdipp.modbuswrite'].name%>"
data-nodechannelcurrentId="<%= channels['advvfdipp.modbuswrite'].nodechannelcurrentId %>"
id="<%= channels['advvfdipp.modbuswrite'].channelId %>"
class="btn btn-large btn-theme animated confirmstatic pad15">
data-staticsend="{'tag': 'cfg_PID_TubingPressure', 'val': 1}"
data-channelId="<%= channels["advvfdipp.writeplctag"].channelId %>"
data-techname="<%=channels["advvfdipp.writeplctag"].techName %>"
data-name="<%= channels["advvfdipp.writeplctag"].name%>"
data-nodechannelcurrentId="<%= channels["advvfdipp.writeplctag"].nodechannelcurrentId %>"
id="<%= channels["advvfdipp.writeplctag"].channelId %>"
class="btn btn-large btn-theme animated setstatic">
Activate Tubing Pressure Control</a>
</div>
</div>
<div class="col-md-6 box-me entry-top-level" id="manualfrequencysetpoint">
<div class="pad15">
<h2>Manual Frequency Setpoint
<% if (channels["advvfdipp.pidcontrolmode"].value == "Manual"){ %>
<span class="label label-success">ACTIVE</span>
<% } %>
</h2>
<form class="form-inline">
<div class="form-group">
<input class="form-control val_box"
<div class="col-md-6 box-me">
<div class="entry-top-level" id="manualfrequencysetpoint">
<div class="pad15">
<h2>Manual Frequency Setpoint
<% if (channels["advvfdipp.pidcontrolmode"].value == "Manual"){ %>
<span class="label label-success">ACTIVE</span>
<% } %>
</h2>
<form class="form-inline">
<div class="form-group">
<input class="form-control val_box"
type="number"
step="any"
value="<%=channels['advvfdipp.manualfrequencysetpoint'].value %>">
</div>
<a href="#"
data-refreshpause="3"
</div>
<a href="#"
data-confirm-message="Are you sure you want to do this?"
data-refreshpause="1"
data-command=""
data-staticsend="[{'com':'1','values':[ ['cfg_PID_ManualFrequencySP',<%=channels['advvfdipp.manualfrequencysetpoint'].value %>] ] }]"
data-channelId="<%= channels['advvfdipp.modbuswrite'].channelId %>"
data-techname="<%=channels['advvfdipp.modbuswrite'].techName %>"
data-name="<%= channels['advvfdipp.modbuswrite'].name%>"
data-nodechannelcurrentId="<%= channels['advvfdipp.modbuswrite'].nodechannelcurrentId %>"
id="<%= channels['advvfdipp.modbuswrite'].channelId %>"
class="btn btn-large btn-theme animated confirmstatic">
<i class="material-icons">send</i></a>
</form>
data-staticsend="{'tag': 'cfg_PID_ManualFrequencySP', 'val': <%=channels['advvfdipp.manualfrequencysetpoint'].value %>}"
data-channelId="<%= channels["advvfdipp.writeplctag"].channelId %>"
data-techname="<%=channels["advvfdipp.writeplctag"].techName %>"
data-name="<%= channels["advvfdipp.writeplctag"].name%>"
data-nodechannelcurrentId="<%= channels["advvfdipp.writeplctag"].nodechannelcurrentId %>"
id="<%= channels["advvfdipp.writeplctag"].channelId %>"
class="btn btn-large btn-theme animated setstatic material-icons">send</a>
</form>
</div>
</div>
<div class="pad15">
<a href="#"
style="width:95%"
data-confirm-message="Are you sure you want to activate Manual Control Mode?"
data-refreshpause="3"
data-refreshpause="1"
data-command=""
data-staticsend="[{'com':'1','values':[ ['cfg_PID_Manual',1] ] }]"
data-channelId="<%= channels['advvfdipp.modbuswrite'].channelId %>"
data-techname="<%=channels['advvfdipp.modbuswrite'].techName %>"
data-name="<%= channels['advvfdipp.modbuswrite'].name%>"
data-nodechannelcurrentId="<%= channels['advvfdipp.modbuswrite'].nodechannelcurrentId %>"
id="<%= channels['advvfdipp.modbuswrite'].channelId %>"
class="btn btn-large btn-theme animated confirmstatic pad15">
Activate Manual Control</a>
data-staticsend="{'tag': 'cfg_PID_Manual', 'val': 1}"
data-channelId="<%= channels["advvfdipp.writeplctag"].channelId %>"
data-techname="<%=channels["advvfdipp.writeplctag"].techName %>"
data-name="<%= channels["advvfdipp.writeplctag"].name%>"
data-nodechannelcurrentId="<%= channels["advvfdipp.writeplctag"].nodechannelcurrentId %>"
id="<%= channels["advvfdipp.writeplctag"].channelId %>"
class="btn btn-large btn-theme animated setstatic">
Activate Manual Frequency Control</a>
</div>
</div>
</div>
@@ -222,21 +237,21 @@
<form class="form-inline">
<div class="form-group">
<input class="form-control val_box"
type="number"
step="any"
value="<%=channels['advvfdipp.pressureshutdownlimit'].value %>">
type="number"
step="any"
value="<%=channels['advvfdipp.pressureshutdownlimit'].value %>">
</div>
<a href="#"
data-refreshpause="3"
data-command=""
data-staticsend="[{'com':'1','values':[ ['AIn_IntakePressure.PSet_LoLim',<%=channels['advvfdipp.pressureshutdownlimit'].value %>] ] }]"
data-channelId="<%= channels['advvfdipp.modbuswrite'].channelId %>"
data-techname="<%=channels['advvfdipp.modbuswrite'].techName %>"
data-name="<%= channels['advvfdipp.modbuswrite'].name%>"
data-nodechannelcurrentId="<%= channels['advvfdipp.modbuswrite'].nodechannelcurrentId %>"
id="<%= channels['advvfdipp.modbuswrite'].channelId %>"
class="btn btn-large btn-theme animated confirmstatic">
<i class="material-icons">send</i></a>
data-confirm-message="Are you sure you want to do this?"
data-refreshpause="1"
data-command=""
data-staticsend="{'tag': 'AIn_IntakePressure.PSet_LoLim', 'val': <%=channels['advvfdipp.pressureshutdownlimit'].value %>}"
data-channelId="<%= channels["advvfdipp.writeplctag"].channelId %>"
data-techname="<%=channels["advvfdipp.writeplctag"].techName %>"
data-name="<%= channels["advvfdipp.writeplctag"].name%>"
data-nodechannelcurrentId="<%= channels["advvfdipp.writeplctag"].nodechannelcurrentId %>"
id="<%= channels["advvfdipp.writeplctag"].channelId %>"
class="btn btn-large btn-theme animated setstatic material-icons">send</a>
</form>
</div>
</div>
@@ -247,21 +262,21 @@
<form class="form-inline">
<div class="form-group">
<input class="form-control val_box"
type="number"
step="any"
value="<%=channels['advvfdipp.pressurestartuplimit'].value %>">
type="number"
step="any"
value="<%=channels['advvfdipp.pressurestartuplimit'].value %>">
</div>
<a href="#"
data-refreshpause="3"
data-command=""
data-staticsend="[{'com':'1','values':[ ['AIn_IntakePressure.PSet_HiLim',<%=channels['advvfdipp.pressurestartuplimit'].value %>] ] }]"
data-channelId="<%= channels['advvfdipp.modbuswrite'].channelId %>"
data-techname="<%=channels['advvfdipp.modbuswrite'].techName %>"
data-name="<%= channels['advvfdipp.modbuswrite'].name%>"
data-nodechannelcurrentId="<%= channels['advvfdipp.modbuswrite'].nodechannelcurrentId %>"
id="<%= channels['advvfdipp.modbuswrite'].channelId %>"
class="btn btn-large btn-theme animated confirmstatic">
<i class="material-icons">send</i></a>
data-confirm-message="Are you sure you want to do this?"
data-refreshpause="1"
data-command=""
data-staticsend="{'tag': 'AIn_IntakePressure.PSet_HiLim', 'val': <%=channels['advvfdipp.pressurestartuplimit'].value %>}"
data-channelId="<%= channels["advvfdipp.writeplctag"].channelId %>"
data-techname="<%=channels["advvfdipp.writeplctag"].techName %>"
data-name="<%= channels["advvfdipp.writeplctag"].name%>"
data-nodechannelcurrentId="<%= channels["advvfdipp.writeplctag"].nodechannelcurrentId %>"
id="<%= channels["advvfdipp.writeplctag"].channelId %>"
class="btn btn-large btn-theme animated setstatic material-icons">send</a>
</form>
</div>
</div>
@@ -272,21 +287,21 @@
<form class="form-inline">
<div class="form-group">
<input class="form-control val_box"
type="number"
step="any"
value="<%=channels['advvfdipp.temperatureshutdownlimit'].value %>">
type="number"
step="any"
value="<%=channels['advvfdipp.temperatureshutdownlimit'].value %>">
</div>
<a href="#"
data-refreshpause="3"
data-command=""
data-staticsend="[{'com':'1','values':[ ['AIn_IntakeTemperature.PSet_HiLim', <%=channels['advvfdipp.temperatureshutdownlimit'].value %>] ] }]"
data-channelId="<%= channels['advvfdipp.modbuswrite'].channelId %>"
data-techname="<%=channels['advvfdipp.modbuswrite'].techName %>"
data-name="<%= channels['advvfdipp.modbuswrite'].name%>"
data-nodechannelcurrentId="<%= channels['advvfdipp.modbuswrite'].nodechannelcurrentId %>"
id="<%= channels['advvfdipp.modbuswrite'].channelId %>"
class="btn btn-large btn-theme animated confirmstatic">
<i class="material-icons">send</i></a>
data-confirm-message="Are you sure you want to do this?"
data-refreshpause="1"
data-command=""
data-staticsend="{'tag': 'AIn_IntakeTemperature.PSet_HiLim', 'val': <%=channels['advvfdipp.temperatureshutdownlimit'].value %>}"
data-channelId="<%= channels["advvfdipp.writeplctag"].channelId %>"
data-techname="<%=channels["advvfdipp.writeplctag"].techName %>"
data-name="<%= channels["advvfdipp.writeplctag"].name%>"
data-nodechannelcurrentId="<%= channels["advvfdipp.writeplctag"].nodechannelcurrentId %>"
id="<%= channels["advvfdipp.writeplctag"].channelId %>"
class="btn btn-large btn-theme animated setstatic material-icons">send</a>
</form>
</div>
</div>
@@ -297,21 +312,21 @@
<form class="form-inline">
<div class="form-group">
<input class="form-control val_box"
type="number"
step="any"
value="<%=channels['advvfdipp.temperaturestartuplimit'].value %>">
type="number"
step="any"
value="<%=channels['advvfdipp.temperaturestartuplimit'].value %>">
</div>
<a href="#"
data-refreshpause="3"
data-command=""
data-staticsend="[{'com':'1','values':[ ['AIn_IntakeTemperature.PSet_LoLim', <%=channels['advvfdipp.temperaturestartuplimit'].value %>] ] }]"
data-channelId="<%= channels['advvfdipp.modbuswrite'].channelId %>"
data-techname="<%=channels['advvfdipp.modbuswrite'].techName %>"
data-name="<%= channels['advvfdipp.modbuswrite'].name%>"
data-nodechannelcurrentId="<%= channels['advvfdipp.modbuswrite'].nodechannelcurrentId %>"
id="<%= channels['advvfdipp.modbuswrite'].channelId %>"
class="btn btn-large btn-theme animated confirmstatic">
<i class="material-icons">send</i></a>
data-confirm-message="Are you sure you want to do this?"
data-refreshpause="1"
data-command=""
data-staticsend="{'tag': 'AIn_IntakeTemperature.PSet_LoLim', 'val': <%=channels['advvfdipp.temperaturestartuplimit'].value %>}"
data-channelId="<%= channels["advvfdipp.writeplctag"].channelId %>"
data-techname="<%=channels["advvfdipp.writeplctag"].techName %>"
data-name="<%= channels["advvfdipp.writeplctag"].name%>"
data-nodechannelcurrentId="<%= channels["advvfdipp.writeplctag"].nodechannelcurrentId %>"
id="<%= channels["advvfdipp.writeplctag"].channelId %>"
class="btn btn-large btn-theme animated setstatic material-icons">send</a>
</form>
</div>
</div>
@@ -328,21 +343,21 @@
<form class="form-inline">
<div class="form-group">
<input class="form-control val_box"
type="number"
step="any"
value="<%=channels['advvfdipp.fluidspecificgravity'].value %>">
type="number"
step="any"
value="<%=channels['advvfdipp.fluidspecificgravity'].value %>">
</div>
<a href="#"
data-refreshpause="3"
data-command=""
data-staticsend="[{'com':'1','values':[ ['cfg_FluidSpecificGravity', <%=channels['advvfdipp.fluidspecificgravity'].value %>] ] }]"
data-channelId="<%= channels['advvfdipp.modbuswrite'].channelId %>"
data-techname="<%=channels['advvfdipp.modbuswrite'].techName %>"
data-name="<%= channels['advvfdipp.modbuswrite'].name%>"
data-nodechannelcurrentId="<%= channels['advvfdipp.modbuswrite'].nodechannelcurrentId %>"
id="<%= channels['advvfdipp.modbuswrite'].channelId %>"
class="btn btn-large btn-theme animated confirmstatic">
<i class="material-icons">send</i></a>
data-confirm-message="Are you sure you want to do this?"
data-refreshpause="1"
data-command=""
data-staticsend="{'tag': 'cfg_FluidSpecificGravity', 'val': <%=channels['advvfdipp.fluidspecificgravity'].value %>}"
data-channelId="<%= channels["advvfdipp.writeplctag"].channelId %>"
data-techname="<%=channels["advvfdipp.writeplctag"].techName %>"
data-name="<%= channels["advvfdipp.writeplctag"].name%>"
data-nodechannelcurrentId="<%= channels["advvfdipp.writeplctag"].nodechannelcurrentId %>"
id="<%= channels["advvfdipp.writeplctag"].channelId %>"
class="btn btn-large btn-theme animated setstatic material-icons">send</a>
</form>
</div>
</div>
@@ -353,21 +368,77 @@
<form class="form-inline">
<div class="form-group">
<input class="form-control val_box"
type="number"
step="any"
value="<%=channels['advvfdipp.sensorheight'].value %>">
type="number"
step="any"
value="<%=channels['advvfdipp.sensorheight'].value %>">
</div>
<a href="#"
data-refreshpause="3"
data-command=""
data-staticsend="[{'com':'1','values':[ ['cfg_DHSensorDistToIntake', <%=channels['advvfdipp.sensorheight'].value %>] ] }]"
data-channelId="<%= channels['advvfdipp.modbuswrite'].channelId %>"
data-techname="<%=channels['advvfdipp.modbuswrite'].techName %>"
data-name="<%= channels['advvfdipp.modbuswrite'].name%>"
data-nodechannelcurrentId="<%= channels['advvfdipp.modbuswrite'].nodechannelcurrentId %>"
id="<%= channels['advvfdipp.modbuswrite'].channelId %>"
class="btn btn-large btn-theme animated confirmstatic">
<i class="material-icons">send</i></a>
data-confirm-message="Are you sure you want to do this?"
data-refreshpause="1"
data-command=""
data-staticsend="{'tag': 'cfg_DHSensorDistToIntake', 'val': <%=channels['advvfdipp.sensorheight'].value %>}"
data-channelId="<%= channels["advvfdipp.writeplctag"].channelId %>"
data-techname="<%=channels["advvfdipp.writeplctag"].techName %>"
data-name="<%= channels["advvfdipp.writeplctag"].name%>"
data-nodechannelcurrentId="<%= channels["advvfdipp.writeplctag"].nodechannelcurrentId %>"
id="<%= channels["advvfdipp.writeplctag"].channelId %>"
class="btn btn-large btn-theme animated setstatic material-icons">send</a>
</form>
</div>
</div>
</div>
<div class="row row-flex">
<div class="col-md-12 text-center">
<h1>Motor Parameters</h1>
</div>
<div class="col-md-6 box-me entry-top-level" id="minvfdfrequency">
<div class="pad15">
<h2>Min Frequency</h2>
<form class="form-inline">
<div class="form-group">
<input class="form-control val_box"
type="number"
step="any"
value="<%=channels['advvfdipp.minvfdfrequency'].value %>">
</div>
<a href="#"
data-confirm-message="Are you sure you want to do this?"
data-refreshpause="1"
data-command=""
data-staticsend="{'tag': 'PowerFlex755.Cfg_MinSpdRef', 'val': <%=channels['advvfdipp.minvfdfrequency'].value %>}"
data-channelId="<%= channels["advvfdipp.writeplctag"].channelId %>"
data-techname="<%=channels["advvfdipp.writeplctag"].techName %>"
data-name="<%= channels["advvfdipp.writeplctag"].name%>"
data-nodechannelcurrentId="<%= channels["advvfdipp.writeplctag"].nodechannelcurrentId %>"
id="<%= channels["advvfdipp.writeplctag"].channelId %>"
class="btn btn-large btn-theme animated setstatic material-icons">send</a>
</form>
</div>
</div>
<div class="col-md-6 box-me entry-top-level" id="maxvfdfrequency">
<div class="pad15">
<h2>Max Frequency</h2>
<form class="form-inline">
<div class="form-group">
<input class="form-control val_box"
type="number"
step="any"
value="<%=channels['advvfdipp.maxvfdfrequency'].value %>">
</div>
<a href="#"
data-confirm-message="Are you sure you want to do this?"
data-refreshpause="1"
data-command=""
data-staticsend="{'tag': 'PowerFlex755.Cfg_MaxSpdRef', 'val': <%=channels['advvfdipp.minvfdfrequency'].value %>}"
data-channelId="<%= channels["advvfdipp.writeplctag"].channelId %>"
data-techname="<%=channels["advvfdipp.writeplctag"].techName %>"
data-name="<%= channels["advvfdipp.writeplctag"].name%>"
data-nodechannelcurrentId="<%= channels["advvfdipp.writeplctag"].nodechannelcurrentId %>"
id="<%= channels["advvfdipp.writeplctag"].channelId %>"
class="btn btn-large btn-theme animated setstatic material-icons">send</a>
</form>
</div>
</div>
@@ -375,63 +446,66 @@
<script>
$('.val_box').each(function(topLevel){
$(this).change(function(){
var id = "#" + $(this).closest(".entry-top-level").attr('id');
if (id !== "#undefined"){
var tagStart = $(id).find('.confirmstatic').attr('data-staticsend').indexOf("[ [") + 3;
var tagStop = $(id).find('.confirmstatic').attr('data-staticsend').indexOf("] ]");
var tag = $(id).find('.confirmstatic').attr('data-staticsend').substring(tagStart, tagStop).split(',')[0].replace(/'/g,"");
var val = $(id).find('.val_box').val();
var newData = "[{'com':'1','values':[ ['" + tag +"'," + val.toString() + "] ] }]"
var tag = $(id).find('.confirmstatic').attr('data-staticsend', newData);
console.log($(id).find('.confirmstatic').attr('data-staticsend'));
}
});
$('.val_box').each(function(topLevel){
$(this).change(function(){
var id = "#" + $(this).closest(".entry-top-level").attr('id');
if (id !== "#undefined"){
// console.log("before parse", $(id).find('.setstatic').attr('data-staticsend').replace(/'/g, '"'));
var jsobj = JSON.parse($(id).find('.setstatic').attr('data-staticsend').replace(/'/g, '"'));
// console.log("after parse", jsobj)
// var tagStart = $(id).find('.setstatic').attr('data-staticsend').indexOf("tag") + 3;
// var tagStop = $(id).find('.setstatic').attr('data-staticsend').indexOf("] ]");
// var tag = $(id).find('.setstatic').attr('data-staticsend').substring(tagStart, tagStop).split(',')[0].replace(/'/g,"");
var val = $(id).find('.val_box').val();
var newData = "{'tag': '" + jsobj.tag +"', 'val': " + val.toString() + "}"
var tag = $(id).find('.setstatic').attr('data-staticsend', newData);
console.log($(id).find('.setstatic').attr('data-staticsend'));
}
});
});
</script>
<style>
.box-me {
position: relative;
padding: 0.5em;
padding-bottom: 1.5em;
border: 1px solid #eee;
/*margin: 1em 0;*/
}
.box-me .gauge-box {
margin-top: -0.25em;
}
.box-me {
position: relative;
padding: 0.5em;
padding-bottom: 1.5em;
border: 1px solid #eee;
/*margin: 1em 0;*/
}
.box-me .gauge-box {
margin-top: -0.25em;
}
.pad15 {
margin: 15px 15px;
}
.pad15 {
margin: 15px 15px;
}
.box-me h2 {
text-transform: uppercase;
font-size: 14px;
color: #666;
font-weight: 400;
letter-spacing: 1px;
z-index: 100;
}
.dynamic-chart-form {
background-color: whiteSmoke;
padding: 1em 0.5em;
margin-top: 1em;
}
.box-me h2 {
text-transform: uppercase;
font-size: 14px;
color: #666;
font-weight: 400;
letter-spacing: 1px;
z-index: 100;
}
.dynamic-chart-form {
background-color: whiteSmoke;
padding: 1em 0.5em;
margin-top: 1em;
}
.row-flex {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
flex-wrap: wrap;
}
.row-flex > [class*='col-'] {
display: flex;
flex-direction: column;
}
.row-flex {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
flex-wrap: wrap;
}
.row-flex > [class*='col-'] {
display: flex;
flex-direction: column;
}
</style>

View File

@@ -1,455 +0,0 @@
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<div class="row row-flex">
<div class="col-xs-12 text-center">
<h1>Control</h1>
</div>
<div class='col-xs-6 text-center box-me'>
<!-- Use data-confirm-message to set the exact message that pops up in the alert window. -->
<a href="#"
data-confirm-message="Are you sure you want to remotely start the well?"
data-refreshpause="1"
data-command=""
data-staticsend="{'tag': 'cmd_Start', 'val': 1}"
data-channelId="<%= channels["advvfdipp.writeplctag"].channelId %>"
data-techname="<%=channels["advvfdipp.writeplctag"].techName %>"
data-name="<%= channels["advvfdipp.writeplctag"].name%>"
data-nodechannelcurrentId="<%= channels["advvfdipp.writeplctag"].nodechannelcurrentId %>"
id="<%= channels["advvfdipp.writeplctag"].channelId %>"
class="btn btn-large btn-theme animated confirmstatic pad15">
Start</a>
</div>
<div class='col-xs-6 text-center box-me'>
<a href="#"
data-confirm-message="Are you sure you want to remotely stop the well?"
data-refreshpause="1"
data-command=""
data-staticsend="{'tag': 'cmd_Stop', 'val': 1}"
data-channelId="<%= channels["advvfdipp.writeplctag"].channelId %>"
data-techname="<%=channels["advvfdipp.writeplctag"].techName %>"
data-name="<%= channels["advvfdipp.writeplctag"].name%>"
data-nodechannelcurrentId="<%= channels["advvfdipp.writeplctag"].nodechannelcurrentId %>"
id="<%= channels["advvfdipp.writeplctag"].channelId %>"
class="btn btn-large btn-theme animated confirmstatic pad15">
Stop</a>
</div>
</div>
<div class="row row-flex">
<div class="col-xs-12 text-center">
<h1>PID Settings</h1>
</div>
<div class="col-md-6 box-me">
<div class="entry-top-level" id="flowsetpoint">
<div class="pad15">
<h2>Flow Setpoint
<% if (channels["advvfdipp.pidcontrolmode"].value == "Flow"){ %>
<span class="label label-success">ACTIVE</span>
<% } %>
</h2>
<form class="form-inline">
<div class="form-group">
<input class="form-control val_box"
type="number"
step="any"
value="<%=channels['advvfdipp.flowsetpoint'].value %>">
</div>
<a href="#"
data-confirm-message="Are you sure you want to do this?"
data-refreshpause="1"
data-command=""
data-staticsend="{'tag': 'cfg_PID_FlowSP', 'val': <%=channels['advvfdipp.flowsetpoint'].value %>}"
data-channelId="<%= channels["advvfdipp.writeplctag"].channelId %>"
data-techname="<%=channels["advvfdipp.writeplctag"].techName %>"
data-name="<%= channels["advvfdipp.writeplctag"].name%>"
data-nodechannelcurrentId="<%= channels["advvfdipp.writeplctag"].nodechannelcurrentId %>"
id="<%= channels["advvfdipp.writeplctag"].channelId %>"
class="btn btn-large btn-theme animated confirmstatic material-icons">send</a>
</form>
</div>
</div>
<div class="pad15">
<a href="#"
style="width:95%"
data-confirm-message="Are you sure you want to activate Flow Control Mode?"
data-refreshpause="1"
data-command=""
data-staticsend="{'tag': 'cfg_PID_Flow', 'val': 1}"
data-channelId="<%= channels["advvfdipp.writeplctag"].channelId %>"
data-techname="<%=channels["advvfdipp.writeplctag"].techName %>"
data-name="<%= channels["advvfdipp.writeplctag"].name%>"
data-nodechannelcurrentId="<%= channels["advvfdipp.writeplctag"].nodechannelcurrentId %>"
id="<%= channels["advvfdipp.writeplctag"].channelId %>"
class="btn btn-large btn-theme animated setstatic">
Activate Flow Control</a>
</div>
</div>
<div class="col-md-6 box-me">
<div class="entry-top-level" id="fluidlevelsetpoint">
<div class="pad15">
<h2>Fluid Level Setpoint
<% if (channels["advvfdipp.pidcontrolmode"].value == "Fluid Level"){ %>
<span class="label label-success">ACTIVE</span>
<% } %>
</h2>
<form class="form-inline">
<div class="form-group">
<input class="form-control val_box"
type="number"
step="any"
value="<%=channels['advvfdipp.fluidlevelsetpoint'].value %>">
</div>
<a href="#"
data-confirm-message="Are you sure you want to do this?"
data-refreshpause="1"
data-command=""
data-staticsend="{'tag': 'cfg_PID_FluidLevelSP', 'val': <%=channels['advvfdipp.fluidlevelsetpoint'].value %>}"
data-channelId="<%= channels["advvfdipp.writeplctag"].channelId %>"
data-techname="<%=channels["advvfdipp.writeplctag"].techName %>"
data-name="<%= channels["advvfdipp.writeplctag"].name%>"
data-nodechannelcurrentId="<%= channels["advvfdipp.writeplctag"].nodechannelcurrentId %>"
id="<%= channels["advvfdipp.writeplctag"].channelId %>"
class="btn btn-large btn-theme animated setstatic material-icons">send</a>
</form>
</div>
</div>
<div class="pad15">
<a href="#"
style="width:95%"
data-confirm-message="Are you sure you want to activate Fluid Level Control Mode?"
data-refreshpause="1"
data-command=""
data-staticsend="{'tag': 'cfg_PID_FluidLevel', 'val': 1}"
data-channelId="<%= channels["advvfdipp.writeplctag"].channelId %>"
data-techname="<%=channels["advvfdipp.writeplctag"].techName %>"
data-name="<%= channels["advvfdipp.writeplctag"].name%>"
data-nodechannelcurrentId="<%= channels["advvfdipp.writeplctag"].nodechannelcurrentId %>"
id="<%= channels["advvfdipp.writeplctag"].channelId %>"
class="btn btn-large btn-theme animated setstatic ">
Activate Fluid Level Control</a>
</div>
</div>
<div class="col-md-6 box-me">
<div class="entry-top-level" id="tubingpressuresetpoint">
<div class="pad15">
<h2>Tubing Pressure Setpoint
<% if (channels["advvfdipp.pidcontrolmode"].value == "Tubing Pressure"){ %>
<span class="label label-success">ACTIVE</span>
<% } %>
</h2>
<form class="form-inline">
<div class="form-group">
<input class="form-control val_box"
type="number"
step="any"
value="<%=channels['advvfdipp.tubingpressuresetpoint'].value %>">
</div>
<a href="#"
data-confirm-message="Are you sure you want to do this?"
data-refreshpause="1"
data-command=""
data-staticsend="{'tag': 'cfg_PID_TubingPressureSP', 'val': <%=channels['advvfdipp.tubingpressuresetpoint'].value %>}"
data-channelId="<%= channels["advvfdipp.writeplctag"].channelId %>"
data-techname="<%=channels["advvfdipp.writeplctag"].techName %>"
data-name="<%= channels["advvfdipp.writeplctag"].name%>"
data-nodechannelcurrentId="<%= channels["advvfdipp.writeplctag"].nodechannelcurrentId %>"
id="<%= channels["advvfdipp.writeplctag"].channelId %>"
class="btn btn-large btn-theme animated setstatic material-icons">send</a>
</form>
</div>
</div>
<div class="pad15">
<a href="#"
style="width:95%"
data-confirm-message="Are you sure you want to activate Tubing Pressure Control Mode?"
data-refreshpause="1"
data-command=""
data-staticsend="{'tag': 'cfg_PID_TubingPressure', 'val': 1}"
data-channelId="<%= channels["advvfdipp.writeplctag"].channelId %>"
data-techname="<%=channels["advvfdipp.writeplctag"].techName %>"
data-name="<%= channels["advvfdipp.writeplctag"].name%>"
data-nodechannelcurrentId="<%= channels["advvfdipp.writeplctag"].nodechannelcurrentId %>"
id="<%= channels["advvfdipp.writeplctag"].channelId %>"
class="btn btn-large btn-theme animated setstatic">
Activate Tubing Pressure Control</a>
</div>
</div>
<div class="col-md-6 box-me">
<div class="entry-top-level" id="manualfrequencysetpoint">
<div class="pad15">
<h2>Manual Frequency Setpoint
<% if (channels["advvfdipp.pidcontrolmode"].value == "Manual"){ %>
<span class="label label-success">ACTIVE</span>
<% } %>
</h2>
<form class="form-inline">
<div class="form-group">
<input class="form-control val_box"
type="number"
step="any"
value="<%=channels['advvfdipp.manualfrequencysetpoint'].value %>">
</div>
<a href="#"
data-confirm-message="Are you sure you want to do this?"
data-refreshpause="1"
data-command=""
data-staticsend="{'tag': 'cfg_PID_ManualFrequencySP', 'val': <%=channels['advvfdipp.manualfrequencysetpoint'].value %>}"
data-channelId="<%= channels["advvfdipp.writeplctag"].channelId %>"
data-techname="<%=channels["advvfdipp.writeplctag"].techName %>"
data-name="<%= channels["advvfdipp.writeplctag"].name%>"
data-nodechannelcurrentId="<%= channels["advvfdipp.writeplctag"].nodechannelcurrentId %>"
id="<%= channels["advvfdipp.writeplctag"].channelId %>"
class="btn btn-large btn-theme animated setstatic material-icons">send</a>
</form>
</div>
</div>
<div class="pad15">
<a href="#"
style="width:95%"
data-confirm-message="Are you sure you want to activate Manual Control Mode?"
data-refreshpause="1"
data-command=""
data-staticsend="{'tag': 'cfg_PID_Manual', 'val': 1}"
data-channelId="<%= channels["advvfdipp.writeplctag"].channelId %>"
data-techname="<%=channels["advvfdipp.writeplctag"].techName %>"
data-name="<%= channels["advvfdipp.writeplctag"].name%>"
data-nodechannelcurrentId="<%= channels["advvfdipp.writeplctag"].nodechannelcurrentId %>"
id="<%= channels["advvfdipp.writeplctag"].channelId %>"
class="btn btn-large btn-theme animated setstatic">
Activate Manual Frequency Control</a>
</div>
</div>
</div>
<div class="row row-flex">
<div class="col-md-12 text-center">
<h1>Shutdown Parameters</h1>
</div>
<div class="col-md-6 box-me entry-top-level" id="pressureshutdownlimit">
<div class="pad15">
<h2>Pressure Shutdown Limit</h2>
<form class="form-inline">
<div class="form-group">
<input class="form-control val_box"
type="number"
step="any"
value="<%=channels['advvfdipp.pressureshutdownlimit'].value %>">
</div>
<a href="#"
data-confirm-message="Are you sure you want to do this?"
data-refreshpause="1"
data-command=""
data-staticsend="{'tag': 'AIn_IntakePressure.PSet_LoLim', 'val': <%=channels['advvfdipp.pressureshutdownlimit'].value %>}"
data-channelId="<%= channels["advvfdipp.writeplctag"].channelId %>"
data-techname="<%=channels["advvfdipp.writeplctag"].techName %>"
data-name="<%= channels["advvfdipp.writeplctag"].name%>"
data-nodechannelcurrentId="<%= channels["advvfdipp.writeplctag"].nodechannelcurrentId %>"
id="<%= channels["advvfdipp.writeplctag"].channelId %>"
class="btn btn-large btn-theme animated setstatic material-icons">send</a>
</form>
</div>
</div>
<div class="col-md-6 box-me entry-top-level" id="pressurestartuplimit">
<div class="pad15">
<h2>Pressure Startup Limit</h2>
<form class="form-inline">
<div class="form-group">
<input class="form-control val_box"
type="number"
step="any"
value="<%=channels['advvfdipp.pressurestartuplimit'].value %>">
</div>
<a href="#"
data-confirm-message="Are you sure you want to do this?"
data-refreshpause="1"
data-command=""
data-staticsend="{'tag': 'AIn_IntakePressure.PSet_HiLim', 'val': <%=channels['advvfdipp.pressurestartuplimit'].value %>}"
data-channelId="<%= channels["advvfdipp.writeplctag"].channelId %>"
data-techname="<%=channels["advvfdipp.writeplctag"].techName %>"
data-name="<%= channels["advvfdipp.writeplctag"].name%>"
data-nodechannelcurrentId="<%= channels["advvfdipp.writeplctag"].nodechannelcurrentId %>"
id="<%= channels["advvfdipp.writeplctag"].channelId %>"
class="btn btn-large btn-theme animated setstatic material-icons">send</a>
</form>
</div>
</div>
<div class="col-md-6 box-me entry-top-level" id="temperatureshutdownlimit">
<div class="pad15">
<h2>Temperature Shutdown Limit</h2>
<form class="form-inline">
<div class="form-group">
<input class="form-control val_box"
type="number"
step="any"
value="<%=channels['advvfdipp.temperatureshutdownlimit'].value %>">
</div>
<a href="#"
data-confirm-message="Are you sure you want to do this?"
data-refreshpause="1"
data-command=""
data-staticsend="{'tag': 'AIn_IntakeTemperature.PSet_HiLim', 'val': <%=channels['advvfdipp.temperatureshutdownlimit'].value %>}"
data-channelId="<%= channels["advvfdipp.writeplctag"].channelId %>"
data-techname="<%=channels["advvfdipp.writeplctag"].techName %>"
data-name="<%= channels["advvfdipp.writeplctag"].name%>"
data-nodechannelcurrentId="<%= channels["advvfdipp.writeplctag"].nodechannelcurrentId %>"
id="<%= channels["advvfdipp.writeplctag"].channelId %>"
class="btn btn-large btn-theme animated setstatic material-icons">send</a>
</form>
</div>
</div>
<div class="col-md-6 box-me entry-top-level" id="temperaturestartuplimit">
<div class="pad15">
<h2>Temperature Startup Limit</h2>
<form class="form-inline">
<div class="form-group">
<input class="form-control val_box"
type="number"
step="any"
value="<%=channels['advvfdipp.temperaturestartuplimit'].value %>">
</div>
<a href="#"
data-confirm-message="Are you sure you want to do this?"
data-refreshpause="1"
data-command=""
data-staticsend="{'tag': 'AIn_IntakeTemperature.PSet_LoLim', 'val': <%=channels['advvfdipp.temperaturestartuplimit'].value %>}"
data-channelId="<%= channels["advvfdipp.writeplctag"].channelId %>"
data-techname="<%=channels["advvfdipp.writeplctag"].techName %>"
data-name="<%= channels["advvfdipp.writeplctag"].name%>"
data-nodechannelcurrentId="<%= channels["advvfdipp.writeplctag"].nodechannelcurrentId %>"
id="<%= channels["advvfdipp.writeplctag"].channelId %>"
class="btn btn-large btn-theme animated setstatic material-icons">send</a>
</form>
</div>
</div>
</div>
<div class="row row-flex">
<div class="col-md-12 text-center">
<h1>Well Parameters</h1>
</div>
<div class="col-md-6 box-me entry-top-level" id="fluidspecificgravity">
<div class="pad15">
<h2>Specific Gravity</h2>
<form class="form-inline">
<div class="form-group">
<input class="form-control val_box"
type="number"
step="any"
value="<%=channels['advvfdipp.fluidspecificgravity'].value %>">
</div>
<a href="#"
data-confirm-message="Are you sure you want to do this?"
data-refreshpause="1"
data-command=""
data-staticsend="{'tag': 'cfg_FluidSpecificGravity', 'val': <%=channels['advvfdipp.fluidspecificgravity'].value %>}"
data-channelId="<%= channels["advvfdipp.writeplctag"].channelId %>"
data-techname="<%=channels["advvfdipp.writeplctag"].techName %>"
data-name="<%= channels["advvfdipp.writeplctag"].name%>"
data-nodechannelcurrentId="<%= channels["advvfdipp.writeplctag"].nodechannelcurrentId %>"
id="<%= channels["advvfdipp.writeplctag"].channelId %>"
class="btn btn-large btn-theme animated setstatic material-icons">send</a>
</form>
</div>
</div>
<div class="col-md-6 box-me entry-top-level" id="sensorheight">
<div class="pad15">
<h2>Sensor Height</h2>
<form class="form-inline">
<div class="form-group">
<input class="form-control val_box"
type="number"
step="any"
value="<%=channels['advvfdipp.sensorheight'].value %>">
</div>
<a href="#"
data-confirm-message="Are you sure you want to do this?"
data-refreshpause="1"
data-command=""
data-staticsend="{'tag': 'cfg_DHSensorDistToIntake', 'val': <%=channels['advvfdipp.sensorheight'].value %>}"
data-channelId="<%= channels["advvfdipp.writeplctag"].channelId %>"
data-techname="<%=channels["advvfdipp.writeplctag"].techName %>"
data-name="<%= channels["advvfdipp.writeplctag"].name%>"
data-nodechannelcurrentId="<%= channels["advvfdipp.writeplctag"].nodechannelcurrentId %>"
id="<%= channels["advvfdipp.writeplctag"].channelId %>"
class="btn btn-large btn-theme animated setstatic material-icons">send</a>
</form>
</div>
</div>
</div>
<script>
$('.val_box').each(function(topLevel){
$(this).change(function(){
var id = "#" + $(this).closest(".entry-top-level").attr('id');
if (id !== "#undefined"){
// console.log("before parse", $(id).find('.setstatic').attr('data-staticsend').replace(/'/g, '"'));
var jsobj = JSON.parse($(id).find('.setstatic').attr('data-staticsend').replace(/'/g, '"'));
// console.log("after parse", jsobj)
// var tagStart = $(id).find('.setstatic').attr('data-staticsend').indexOf("tag") + 3;
// var tagStop = $(id).find('.setstatic').attr('data-staticsend').indexOf("] ]");
// var tag = $(id).find('.setstatic').attr('data-staticsend').substring(tagStart, tagStop).split(',')[0].replace(/'/g,"");
var val = $(id).find('.val_box').val();
var newData = "{'tag': '" + jsobj.tag +"', 'val': " + val.toString() + "}"
var tag = $(id).find('.setstatic').attr('data-staticsend', newData);
console.log($(id).find('.setstatic').attr('data-staticsend'));
}
});
});
</script>
<style>
.box-me {
position: relative;
padding: 0.5em;
padding-bottom: 1.5em;
border: 1px solid #eee;
/*margin: 1em 0;*/
}
.box-me .gauge-box {
margin-top: -0.25em;
}
.pad15 {
margin: 15px 15px;
}
.box-me h2 {
text-transform: uppercase;
font-size: 14px;
color: #666;
font-weight: 400;
letter-spacing: 1px;
z-index: 100;
}
.dynamic-chart-form {
background-color: whiteSmoke;
padding: 1em 0.5em;
margin-top: 1em;
}
.row-flex {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
flex-wrap: wrap;
}
.row-flex > [class*='col-'] {
display: flex;
flex-direction: column;
}
</style>

View File

@@ -0,0 +1,437 @@
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<div class="row row-flex">
<div class="col-xs-12 text-center">
<h1>Control</h1>
</div>
<div class='col-xs-6 text-center box-me'>
<!-- Use data-confirm-message to set the exact message that pops up in the alert window. -->
<a href="#"
data-confirm-message="Are you sure you want to remotely start the well?"
data-refreshpause="3"
data-command=""
data-staticsend="[{'com':'1','values':[ ['cmd_Start',1] ] }]"
data-channelId="<%= channels['advvfdipp.modbuswrite'].channelId %>"
data-techname="<%=channels['advvfdipp.modbuswrite'].techName %>"
data-name="<%= channels['advvfdipp.modbuswrite'].name%>"
data-nodechannelcurrentId="<%= channels['advvfdipp.modbuswrite'].nodechannelcurrentId %>"
id="<%= channels['advvfdipp.modbuswrite'].channelId %>"
class="btn btn-large btn-theme animated confirmstatic pad15">
Start</a>
<!-- Two sets were occurring because you had both the confirmstatic and setstatic classes on the button. Use one or the other, but not both. -->
</div>
<div class='col-xs-6 text-center box-me'>
<a href="#"
data-confirm-message="Are you sure you want to remotely stop the well?"
data-refreshpause="3"
data-command=""
data-staticsend="[{'com':'1','values':[ ['cmd_Stop',1] ] }]"
data-channelId="<%= channels['advvfdipp.modbuswrite'].channelId %>"
data-techname="<%=channels['advvfdipp.modbuswrite'].techName %>"
data-name="<%= channels['advvfdipp.modbuswrite'].name%>"
data-nodechannelcurrentId="<%= channels['advvfdipp.modbuswrite'].nodechannelcurrentId %>"
id="<%= channels['advvfdipp.modbuswrite'].channelId %>"
class="btn btn-large btn-theme animated confirmstatic pad15">
Stop</a>
</div>
</div>
<div class="row row-flex">
<div class="col-xs-12 text-center">
<h1>PID Settings</h1>
</div>
<div class="col-md-6 box-me entry-top-level" id="flowsetpoint">
<div class="pad15">
<h2>Flow Setpoint
<% if (channels["advvfdipp.pidcontrolmode"].value == "Flow"){ %>
<span class="label label-success">ACTIVE</span>
<% } %>
</h2>
<form class="form-inline">
<div class="form-group">
<input class="form-control val_box"
type="number"
step="any"
value="<%=channels['advvfdipp.flowsetpoint'].value %>">
</div>
<a href="#"
data-refreshpause="3"
data-command=""
data-staticsend="[{'com':'1','values':[ ['cfg_PID_FlowSP',<%=channels['advvfdipp.flowsetpoint'].value %>] ] }]"
data-channelId="<%= channels['advvfdipp.modbuswrite'].channelId %>"
data-techname="<%=channels['advvfdipp.modbuswrite'].techName %>"
data-name="<%= channels['advvfdipp.modbuswrite'].name%>"
data-nodechannelcurrentId="<%= channels['advvfdipp.modbuswrite'].nodechannelcurrentId %>"
id="<%= channels['advvfdipp.modbuswrite'].channelId %>"
class="btn btn-large btn-theme animated confirmstatic">
<i class="material-icons">send</i></a>
</form>
<a href="#"
style="width:95%"
data-confirm-message="Are you sure you want to activate Flow Control Mode?"
data-refreshpause="3"
data-command=""
data-staticsend="[{'com':'1','values':[ ['cfg_PID_Flow',1] ] }]"
data-channelId="<%= channels['advvfdipp.modbuswrite'].channelId %>"
data-techname="<%=channels['advvfdipp.modbuswrite'].techName %>"
data-name="<%= channels['advvfdipp.modbuswrite'].name%>"
data-nodechannelcurrentId="<%= channels['advvfdipp.modbuswrite'].nodechannelcurrentId %>"
id="<%= channels['advvfdipp.modbuswrite'].channelId %>"
class="btn btn-large btn-theme animated confirmstatic pad15">
Activate Flow Control</a>
</div>
</div>
<div class="col-md-6 box-me entry-top-level" id="fluidlevelsetpoint">
<div class="pad15">
<h2>Fluid Level Setpoint
<% if (channels["advvfdipp.pidcontrolmode"].value == "Fluid Level"){ %>
<span class="label label-success">ACTIVE</span>
<% } %>
</h2>
<form class="form-inline">
<div class="form-group">
<input class="form-control val_box"
type="number"
step="any"
value="<%=channels['advvfdipp.fluidlevelsetpoint'].value %>">
</div>
<a href="#"
data-refreshpause="3"
data-command=""
data-staticsend="[{'com':'1','values':[ ['cfg_PID_FluidLevelSP',<%=channels['advvfdipp.fluidlevelsetpoint'].value %>] ] }]"
data-channelId="<%= channels['advvfdipp.modbuswrite'].channelId %>"
data-techname="<%=channels['advvfdipp.modbuswrite'].techName %>"
data-name="<%= channels['advvfdipp.modbuswrite'].name%>"
data-nodechannelcurrentId="<%= channels['advvfdipp.modbuswrite'].nodechannelcurrentId %>"
id="<%= channels['advvfdipp.modbuswrite'].channelId %>"
class="btn btn-large btn-theme animated confirmstatic">
<i class="material-icons">send</i></a>
</form>
<a href="#"
style="width:95%"
data-confirm-message="Are you sure you want to activate Fluid Level Control Mode?"
data-refreshpause="3"
data-command=""
data-staticsend="[{'com':'1','values':[ ['cfg_PID_FluidLevel',1] ] }]"
data-channelId="<%= channels['advvfdipp.modbuswrite'].channelId %>"
data-techname="<%=channels['advvfdipp.modbuswrite'].techName %>"
data-name="<%= channels['advvfdipp.modbuswrite'].name%>"
data-nodechannelcurrentId="<%= channels['advvfdipp.modbuswrite'].nodechannelcurrentId %>"
id="<%= channels['advvfdipp.modbuswrite'].channelId %>"
class="btn btn-large btn-theme animated confirmstatic pad15">
Activate Fluid Level Control</a>
</div>
</div>
<div class="col-md-6 box-me entry-top-level" id="tubingpressuresetpoint">
<div class="pad15">
<h2>Tubing Pressure Setpoint
<% if (channels["advvfdipp.pidcontrolmode"].value == "Tubing Pressure"){ %>
<span class="label label-success">ACTIVE</span>
<% } %>
</h2>
<form class="form-inline">
<div class="form-group">
<input class="form-control val_box"
type="number"
step="any"
value="<%=channels['advvfdipp.tubingpressuresetpoint'].value %>">
</div>
<a href="#"
data-refreshpause="3"
data-command=""
data-staticsend="[{'com':'1','values':[ ['cfg_PID_TubingPressureSP',<%=channels['advvfdipp.tubingpressuresetpoint'].value %>] ] }]"
data-channelId="<%= channels['advvfdipp.modbuswrite'].channelId %>"
data-techname="<%=channels['advvfdipp.modbuswrite'].techName %>"
data-name="<%= channels['advvfdipp.modbuswrite'].name%>"
data-nodechannelcurrentId="<%= channels['advvfdipp.modbuswrite'].nodechannelcurrentId %>"
id="<%= channels['advvfdipp.modbuswrite'].channelId %>"
class="btn btn-large btn-theme animated confirmstatic">
<i class="material-icons">send</i></a>
</form>
<a href="#"
style="width:95%"
data-confirm-message="Are you sure you want to activate Tubing Pressure Control Mode?"
data-refreshpause="3"
data-command=""
data-staticsend="[{'com':'1','values':[ ['cfg_PID_TubingPressure',1] ] }]"
data-channelId="<%= channels['advvfdipp.modbuswrite'].channelId %>"
data-techname="<%=channels['advvfdipp.modbuswrite'].techName %>"
data-name="<%= channels['advvfdipp.modbuswrite'].name%>"
data-nodechannelcurrentId="<%= channels['advvfdipp.modbuswrite'].nodechannelcurrentId %>"
id="<%= channels['advvfdipp.modbuswrite'].channelId %>"
class="btn btn-large btn-theme animated confirmstatic pad15">
Activate Tubing Pressure Control</a>
</div>
</div>
<div class="col-md-6 box-me entry-top-level" id="manualfrequencysetpoint">
<div class="pad15">
<h2>Manual Frequency Setpoint
<% if (channels["advvfdipp.pidcontrolmode"].value == "Manual"){ %>
<span class="label label-success">ACTIVE</span>
<% } %>
</h2>
<form class="form-inline">
<div class="form-group">
<input class="form-control val_box"
type="number"
step="any"
value="<%=channels['advvfdipp.manualfrequencysetpoint'].value %>">
</div>
<a href="#"
data-refreshpause="3"
data-command=""
data-staticsend="[{'com':'1','values':[ ['cfg_PID_ManualFrequencySP',<%=channels['advvfdipp.manualfrequencysetpoint'].value %>] ] }]"
data-channelId="<%= channels['advvfdipp.modbuswrite'].channelId %>"
data-techname="<%=channels['advvfdipp.modbuswrite'].techName %>"
data-name="<%= channels['advvfdipp.modbuswrite'].name%>"
data-nodechannelcurrentId="<%= channels['advvfdipp.modbuswrite'].nodechannelcurrentId %>"
id="<%= channels['advvfdipp.modbuswrite'].channelId %>"
class="btn btn-large btn-theme animated confirmstatic">
<i class="material-icons">send</i></a>
</form>
<a href="#"
style="width:95%"
data-confirm-message="Are you sure you want to activate Manual Control Mode?"
data-refreshpause="3"
data-command=""
data-staticsend="[{'com':'1','values':[ ['cfg_PID_Manual',1] ] }]"
data-channelId="<%= channels['advvfdipp.modbuswrite'].channelId %>"
data-techname="<%=channels['advvfdipp.modbuswrite'].techName %>"
data-name="<%= channels['advvfdipp.modbuswrite'].name%>"
data-nodechannelcurrentId="<%= channels['advvfdipp.modbuswrite'].nodechannelcurrentId %>"
id="<%= channels['advvfdipp.modbuswrite'].channelId %>"
class="btn btn-large btn-theme animated confirmstatic pad15">
Activate Manual Control</a>
</div>
</div>
</div>
<div class="row row-flex">
<div class="col-md-12 text-center">
<h1>Shutdown Parameters</h1>
</div>
<div class="col-md-6 box-me entry-top-level" id="pressureshutdownlimit">
<div class="pad15">
<h2>Pressure Shutdown Limit</h2>
<form class="form-inline">
<div class="form-group">
<input class="form-control val_box"
type="number"
step="any"
value="<%=channels['advvfdipp.pressureshutdownlimit'].value %>">
</div>
<a href="#"
data-refreshpause="3"
data-command=""
data-staticsend="[{'com':'1','values':[ ['AIn_IntakePressure.PSet_LoLim',<%=channels['advvfdipp.pressureshutdownlimit'].value %>] ] }]"
data-channelId="<%= channels['advvfdipp.modbuswrite'].channelId %>"
data-techname="<%=channels['advvfdipp.modbuswrite'].techName %>"
data-name="<%= channels['advvfdipp.modbuswrite'].name%>"
data-nodechannelcurrentId="<%= channels['advvfdipp.modbuswrite'].nodechannelcurrentId %>"
id="<%= channels['advvfdipp.modbuswrite'].channelId %>"
class="btn btn-large btn-theme animated confirmstatic">
<i class="material-icons">send</i></a>
</form>
</div>
</div>
<div class="col-md-6 box-me entry-top-level" id="pressurestartuplimit">
<div class="pad15">
<h2>Pressure Startup Limit</h2>
<form class="form-inline">
<div class="form-group">
<input class="form-control val_box"
type="number"
step="any"
value="<%=channels['advvfdipp.pressurestartuplimit'].value %>">
</div>
<a href="#"
data-refreshpause="3"
data-command=""
data-staticsend="[{'com':'1','values':[ ['AIn_IntakePressure.PSet_HiLim',<%=channels['advvfdipp.pressurestartuplimit'].value %>] ] }]"
data-channelId="<%= channels['advvfdipp.modbuswrite'].channelId %>"
data-techname="<%=channels['advvfdipp.modbuswrite'].techName %>"
data-name="<%= channels['advvfdipp.modbuswrite'].name%>"
data-nodechannelcurrentId="<%= channels['advvfdipp.modbuswrite'].nodechannelcurrentId %>"
id="<%= channels['advvfdipp.modbuswrite'].channelId %>"
class="btn btn-large btn-theme animated confirmstatic">
<i class="material-icons">send</i></a>
</form>
</div>
</div>
<div class="col-md-6 box-me entry-top-level" id="temperatureshutdownlimit">
<div class="pad15">
<h2>Temperature Shutdown Limit</h2>
<form class="form-inline">
<div class="form-group">
<input class="form-control val_box"
type="number"
step="any"
value="<%=channels['advvfdipp.temperatureshutdownlimit'].value %>">
</div>
<a href="#"
data-refreshpause="3"
data-command=""
data-staticsend="[{'com':'1','values':[ ['AIn_IntakeTemperature.PSet_HiLim', <%=channels['advvfdipp.temperatureshutdownlimit'].value %>] ] }]"
data-channelId="<%= channels['advvfdipp.modbuswrite'].channelId %>"
data-techname="<%=channels['advvfdipp.modbuswrite'].techName %>"
data-name="<%= channels['advvfdipp.modbuswrite'].name%>"
data-nodechannelcurrentId="<%= channels['advvfdipp.modbuswrite'].nodechannelcurrentId %>"
id="<%= channels['advvfdipp.modbuswrite'].channelId %>"
class="btn btn-large btn-theme animated confirmstatic">
<i class="material-icons">send</i></a>
</form>
</div>
</div>
<div class="col-md-6 box-me entry-top-level" id="temperaturestartuplimit">
<div class="pad15">
<h2>Temperature Startup Limit</h2>
<form class="form-inline">
<div class="form-group">
<input class="form-control val_box"
type="number"
step="any"
value="<%=channels['advvfdipp.temperaturestartuplimit'].value %>">
</div>
<a href="#"
data-refreshpause="3"
data-command=""
data-staticsend="[{'com':'1','values':[ ['AIn_IntakeTemperature.PSet_LoLim', <%=channels['advvfdipp.temperaturestartuplimit'].value %>] ] }]"
data-channelId="<%= channels['advvfdipp.modbuswrite'].channelId %>"
data-techname="<%=channels['advvfdipp.modbuswrite'].techName %>"
data-name="<%= channels['advvfdipp.modbuswrite'].name%>"
data-nodechannelcurrentId="<%= channels['advvfdipp.modbuswrite'].nodechannelcurrentId %>"
id="<%= channels['advvfdipp.modbuswrite'].channelId %>"
class="btn btn-large btn-theme animated confirmstatic">
<i class="material-icons">send</i></a>
</form>
</div>
</div>
</div>
<div class="row row-flex">
<div class="col-md-12 text-center">
<h1>Well Parameters</h1>
</div>
<div class="col-md-6 box-me entry-top-level" id="fluidspecificgravity">
<div class="pad15">
<h2>Specific Gravity</h2>
<form class="form-inline">
<div class="form-group">
<input class="form-control val_box"
type="number"
step="any"
value="<%=channels['advvfdipp.fluidspecificgravity'].value %>">
</div>
<a href="#"
data-refreshpause="3"
data-command=""
data-staticsend="[{'com':'1','values':[ ['cfg_FluidSpecificGravity', <%=channels['advvfdipp.fluidspecificgravity'].value %>] ] }]"
data-channelId="<%= channels['advvfdipp.modbuswrite'].channelId %>"
data-techname="<%=channels['advvfdipp.modbuswrite'].techName %>"
data-name="<%= channels['advvfdipp.modbuswrite'].name%>"
data-nodechannelcurrentId="<%= channels['advvfdipp.modbuswrite'].nodechannelcurrentId %>"
id="<%= channels['advvfdipp.modbuswrite'].channelId %>"
class="btn btn-large btn-theme animated confirmstatic">
<i class="material-icons">send</i></a>
</form>
</div>
</div>
<div class="col-md-6 box-me entry-top-level" id="sensorheight">
<div class="pad15">
<h2>Sensor Height</h2>
<form class="form-inline">
<div class="form-group">
<input class="form-control val_box"
type="number"
step="any"
value="<%=channels['advvfdipp.sensorheight'].value %>">
</div>
<a href="#"
data-refreshpause="3"
data-command=""
data-staticsend="[{'com':'1','values':[ ['cfg_DHSensorDistToIntake', <%=channels['advvfdipp.sensorheight'].value %>] ] }]"
data-channelId="<%= channels['advvfdipp.modbuswrite'].channelId %>"
data-techname="<%=channels['advvfdipp.modbuswrite'].techName %>"
data-name="<%= channels['advvfdipp.modbuswrite'].name%>"
data-nodechannelcurrentId="<%= channels['advvfdipp.modbuswrite'].nodechannelcurrentId %>"
id="<%= channels['advvfdipp.modbuswrite'].channelId %>"
class="btn btn-large btn-theme animated confirmstatic">
<i class="material-icons">send</i></a>
</form>
</div>
</div>
</div>
<script>
$('.val_box').each(function(topLevel){
$(this).change(function(){
var id = "#" + $(this).closest(".entry-top-level").attr('id');
if (id !== "#undefined"){
var tagStart = $(id).find('.confirmstatic').attr('data-staticsend').indexOf("[ [") + 3;
var tagStop = $(id).find('.confirmstatic').attr('data-staticsend').indexOf("] ]");
var tag = $(id).find('.confirmstatic').attr('data-staticsend').substring(tagStart, tagStop).split(',')[0].replace(/'/g,"");
var val = $(id).find('.val_box').val();
var newData = "[{'com':'1','values':[ ['" + tag +"'," + val.toString() + "] ] }]"
var tag = $(id).find('.confirmstatic').attr('data-staticsend', newData);
console.log($(id).find('.confirmstatic').attr('data-staticsend'));
}
});
});
</script>
<style>
.box-me {
position: relative;
padding: 0.5em;
padding-bottom: 1.5em;
border: 1px solid #eee;
/*margin: 1em 0;*/
}
.box-me .gauge-box {
margin-top: -0.25em;
}
.pad15 {
margin: 15px 15px;
}
.box-me h2 {
text-transform: uppercase;
font-size: 14px;
color: #666;
font-weight: 400;
letter-spacing: 1px;
z-index: 100;
}
.dynamic-chart-form {
background-color: whiteSmoke;
padding: 1em 0.5em;
margin-top: 1em;
}
.row-flex {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
flex-wrap: wrap;
}
.row-flex > [class*='col-'] {
display: flex;
flex-direction: column;
}
</style>

42
POCloud/HTML/Device.html Normal file
View File

@@ -0,0 +1,42 @@
<div class="row row-flex box-me">
<div class="col-md-6 text-center">
<h2 class="uppercase">Public IP Address</h2>
<p><%= channels["advvfdipp.public_ip_address"].value %><p>
</div>
</div>
<style>
.uppercase {
text-transform: uppercase;
font-size: 14px;
color: #666;
font-weight: 400;
letter-spacing: 1px;
z-index: 100;
}
.box-me {
position: relative;
padding: 0.5em;
padding-bottom: 1.5em;
border: 1px solid #eee;
/*margin: 1em 0;*/
}
.row-flex {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
flex-wrap: wrap;
}
.row-flex > [class*='col-'] {
display: flex;
flex-direction: column;
}
p {
font-size: 1.25em;
}
</style>

View File

@@ -13,3 +13,9 @@
<h4>Pump Depth: <span data-updatevalue="vfd_fault"><%=channels["advvfdipp.pumpdepth"].value %></span> ft.</h4>
<% } %>
</div>
<div class="col-xs-2">
<a href="#"
data-channelId="<%= channels["advvfdipp.alarmlog"].channelId %>"
class="data-table btn-block btn btn-theme animated"
title="Alarm Log"><i style='margin-left: 0.5em; cursor: pointer' class="fa fa-th-list icon-theme"></i> Alarm Log</a>
</div>

View File

@@ -309,31 +309,6 @@
</div>
<div class="row box-me">
<div class='col-xs-12 text-center'>
<h3 class='subdued'>Alarm History</h3>
</div>
<div class="col-xs-6 col-xs-offset-3" style='padding: 1.5em 15px'>
<div class="input-daterange input-group" id="datepicker">
<input data-chartid="chart7" id="fromDate" data-daysofhistory="7" type="text" class="form-control" name="start">
<span class="input-group-addon">to</span>
<input class="form-control" data-chartid="chart7" id="toDate" type="text" name="end">
<span class="input-group-btn">
<a href="#!" id='runHistory' data-chartid="chart7" data-otherchartids="chart8" class="btn btn-theme animated">Run</a>
</span>
</div>
</div>
<hr>
<div class="col-xs-12">
<ol id='alarms' class='list-unstyled'>
</ol>
</div>
</div>
<style>
#note-modal{
position: absolute;
@@ -405,117 +380,4 @@
letter-spacing: 1px;
z-index: 100;
}
.slice.node-detail hr {
border-color: #ccc;
}
.slice.node-detail #alarms li {
margin-bottom: 1em;
padding: 0.5em;
}
.slice.node-detail #alarms li:nth-child(even){
background-color: whiteSmoke;
}
.slice.node-detail #alarms li span {
margin-left: 1em;
color: #aaa;
}
</style>
<script>
var nodeID = <%= node.nodeId %>;
var nodeType = '<%= node.nodetypeName %>';
var alarmChannels = [
{
chId:<%= channels["advvfdipp.alarmflowrate"].channelId %>,
chName: 'Flow Alarm'
},
{
chId:<%= channels["advvfdipp.alarmintakepressure"].channelId %>,
chName: 'Intake Pressure Alarm'
},
{
chId:<%= channels["advvfdipp.alarmintaketemperature"].channelId %>,
chName: 'Intake Temperature Alarm'
},
{
chId:<%= channels["advvfdipp.alarmtubingpressure"].channelId %>,
chName: 'Tubing Pressure Alarm'
},
{
chId:<%= channels["advvfdipp.alarmvfd"].channelId %>,
chName: 'VFD Alarm'
}
];
var formatDate = function(str){
var c1, c2;
c1 = new Date(str);
c2 = (c1.getTime() / 1000);
c2 = Math.floor(c2);
return c2.toString();
};
var updateTable = function(){
var $output = $('#alarms');
var allAlarms = [];
var ajaxResults = [];
_.each(alarmChannels, function(ac){
var channelID = ac.chId;
var channelName = ac.chName;
var apiData, start, end, finalURL, dateString;
finalURL = '<%= rootURL %>' + "/api2/Nodechannels";
start = $('#datepicker').find('#fromDate');
dateString = start.val().replace(/-/g, "/");
start = formatDate(dateString);
end = $('#datepicker').find('#toDate');
dateString = end.val().replace(/-/g, "/");
end = formatDate(dateString);
apiData = "&nodelist[0][nodeId]=" + nodeID.toString() + "&nodelist[0][channelId]=" + channelID.toString();
apiData += "&start=" + start + "&end=" + end;
ajaxResults.push($.ajax({
url: finalURL,
data: apiData,
type: "GET",
success: function(data) {
var alarms = data.listofstreams[0].stream;
_.each(alarms, function(alarm){
var timestamp = alarm.x;
var value = alarm.y;
if (value !== "OK"){
allAlarms.push({alarm: channelName, timestamp:timestamp, value:value});
}
});
}
}));
});
$.when.apply(this, ajaxResults).done(function(){
if (allAlarms.length > 0){
var html = '';
_.each(_.sortBy(allAlarms, "timestamp").reverse(), function(al_in_order) {
console.log(al_in_order.timestamp);
html += "<li>" + al_in_order.alarm + ": " + al_in_order.value + "<span>" + moment(al_in_order.timestamp, "X").add(5, 'hours').format("dddd, MMMM Do YYYY, h:mm:ss a"); + "</span></li>";
})
$output.html(html);
} else {
$output.html("<li>No Alarms for this time range</li>");
}
})
};
$('#runHistory').on('click', function(e){
e.preventDefault();
updateTable();
});
updateTable();
</script>

View File

@@ -1,9 +1,31 @@
"""Max Water System driver code."""
import threading
import sys
import logging
import time
from random import randint
from Channel import write_tag, read_tag
from device_base import deviceBase
from utilities import get_public_ip_address
import json
# LOGGING SETUP
from logging.handlers import RotatingFileHandler
log_formatter = logging.Formatter('%(asctime)s %(levelname)s %(funcName)s(%(lineno)d) %(message)s')
logFile = './advvfdipp.log'
my_handler = RotatingFileHandler(logFile, mode='a', maxBytes=500*1024, backupCount=2, encoding=None, delay=0)
my_handler.setFormatter(log_formatter)
my_handler.setLevel(logging.INFO)
logger = logging.getLogger('advvfdipp')
logger.setLevel(logging.INFO)
logger.addHandler(my_handler)
console_out = logging.StreamHandler(sys.stdout)
console_out.setFormatter(log_formatter)
logger.addHandler(console_out)
logger.info("advvfdipp startup")
PLC_IP_ADDRESS = "192.168.1.10"
WATCHDOG_SEND_PERIOD = 3600 # seconds
@@ -18,7 +40,7 @@ class start(threading.Thread, deviceBase):
deviceBase.__init__(self, name=name, number=number, mac=mac, Q=Q, mcu=mcu, companyId=companyId, offset=offset, mqtt=mqtt, Nodes=Nodes)
self.daemon = True
self.version = "7"
self.version = "8"
self.finished = threading.Event()
threading.Thread.start(self)
@@ -28,21 +50,38 @@ class start(threading.Thread, deviceBase):
def run(self):
"""Run the driver."""
wait_sec = 30
for i in range(0, wait_sec):
print("advvfdipp driver will start in {} seconds".format(wait_sec - i))
time.sleep(1)
logger.info("BOOM! Starting advvfdipp driver...")
self.nodes["advvfdipp_0199"] = self
public_ip_address = get_public_ip_address()
self.sendtodbDev(1, 'public_ip_address', public_ip_address, 0, 'advvfdipp')
watchdog = self.advvfdipp_watchdog()
self.sendtodbDev(1, 'watchdog', watchdog, 0)
self.sendtodbDev(1, 'watchdog', watchdog, 0, 'advvfdipp')
watchdog_send_timestamp = time.time()
watchdog_loops = 0
watchdog_check_after = 5000
while True:
self.nodes["advvfdipp_0199"] = self
watchdog_loops += 1
if (watchdog_loops >= watchdog_check_after):
test_watchdog = self.advvfdipp_watchdog()
if test_watchdog != watchdog or (time.time() - watchdog_send_timestamp) > WATCHDOG_SEND_PERIOD:
if not test_watchdog == watchdog or (time.time() - watchdog_send_timestamp) > WATCHDOG_SEND_PERIOD:
self.sendtodbDev(1, 'watchdog', test_watchdog, 0, 'advvfdipp')
watchdog_send_timestamp = time.time()
watchdog = test_watchdog
test_public_ip = get_public_ip_address()
if not test_public_ip == public_ip_address:
self.sendtodbDev(1, 'public_ip_address', test_public_ip, 0, 'advvfdipp')
public_ip_address = test_public_ip
watchdog_loops = 0
time.sleep(15)
def advvfdipp_watchdog(self):
"""Write a random integer to the PLC and then 1 seconds later check that it has been decremented by 1."""
@@ -54,3 +93,24 @@ class start(threading.Thread, deviceBase):
return (randval - 1) == watchdog_val[0]
except (KeyError, TypeError):
return False
def advvfdipp_sync(self, name, value):
"""Sync all data from the driver."""
self.forceSend = True
# self.sendtodb("log", "synced", 0)
return True
def advvfdipp_writeplctag(self, name, value):
"""Write a value to the PLC."""
try:
new_val = json.loads(str(value).replace("'", '"'))
tag_n = str(new_val['tag']) # "cmd_Start"
val_n = new_val['val']
w = write_tag(str(PLC_IP_ADDRESS), tag_n, val_n)
logger.warning("Result of advvfdipp_writeplctag(self, {}, {}) = {}".format(name, value, w))
if w is None:
w = "Error writing to PLC..."
return w
except Exception as e:
logger.warning("GOT EXCEPTION in advvfdipp_writeplctag(self, {}, {}) => {}".format(name, value, e))
return e

View File

@@ -1,12 +1,12 @@
{
"driverFileName":"advvfdipp.py",
"deviceName":"advvfdipp",
"driverId":"0100",
"releaseVersion":"7",
"files": {
"file1":"advvfdipp.py",
"file2":"modbusMap.p",
"file3":"Channel.py" }
"files": {
"file3": "Channel.py",
"file2": "utilities.py",
"file1": "advvfdipp.py",
"file4": "modbusMap.p"
},
"deviceName": "advvfdipp",
"driverId": "0100",
"releaseVersion": "8",
"driverFileName": "advvfdipp.py"
}

12
POCloud/driverConfig.json Normal file
View File

@@ -0,0 +1,12 @@
{
"name": "advvfdipp",
"driverFilename": "advvfdipp.py",
"driverId": "0100",
"additionalDriverFiles": [
"utilities.py",
"Channel.py",
"modbusMap.p"
],
"version": 8,
"s3BucketName": "advvfdipp"
}

File diff suppressed because it is too large Load Diff

54
POCloud/utilities.py Normal file
View File

@@ -0,0 +1,54 @@
"""Utility functions for the driver."""
import socket
import struct
def get_public_ip_address():
"""Find the public IP Address of the host device."""
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("8.8.8.8", 80))
ip = s.getsockname()[0]
s.close()
return ip
def int_to_float16(int_to_convert):
"""Convert integer into float16 representation."""
bin_rep = ('0' * 16 + '{0:b}'.format(int_to_convert))[-16:]
sign = 1.0
if int(bin_rep[0]) == 1:
sign = -1.0
exponent = float(int(bin_rep[1:6], 2))
if exponent == 30:
fraction = float(int("1" + bin_rep[7:17], 2))
else:
fraction = float(int(bin_rep[7:17], 2))
if exponent == float(0b00000):
return sign * 2 ** -14 * fraction / (2.0 ** 10.0)
elif exponent == float(0b11111):
if fraction == 0:
return sign * float("inf")
else:
return float("NaN")
else:
frac_part = 1.0 + fraction / (2.0 ** 10.0)
return sign * (2 ** (exponent - 15)) * frac_part
def ints_to_float(int1, int2):
"""Convert 2 registers into a floating point number."""
mypack = struct.pack('>HH', int1, int2)
f = struct.unpack('>f', mypack)
print("[{}, {}] >> {}".format(int1, int2, f[0]))
return f[0]
def degf_to_degc(temp_f):
"""Convert deg F to deg C."""
return (temp_f - 32.0) * (5.0/9.0)
def degc_to_degf(temp_c):
"""Convert deg C to deg F."""
return temp_c * 1.8 + 32.0

View File

@@ -0,0 +1,166 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<RSLogix5000Content SchemaRevision="1.0" SoftwareRevision="30.00" TargetType="Rung" TargetCount="1" ContainsContext="true" Owner="Patrick McDonagh, Henry Pump" ExportDate="Fri Dec 01 14:58:36 2017" ExportOptions="References NoRawData L5KData DecoratedData Context RoutineLabels AliasExtras IOTags NoStringData ForceProtectedEncoding AllProjDocTrans">
<Controller Use="Context" Name="MaxWaterSystem">
<DataTypes Use="Context">
</DataTypes>
<Tags Use="Context">
<Tag Name="alarm_Count" TagType="Base" DataType="DINT" Radix="Decimal" Constant="false" ExternalAccess="Read/Write">
<Description>
<![CDATA[Number of consecutive times the unit has alarmed]]>
</Description>
<Data Format="L5K">
<![CDATA[0]]>
</Data>
<Data Format="Decorated">
<DataValue DataType="DINT" Radix="Decimal" Value="0"/>
</Data>
</Tag>
<Tag Name="alarm_Lockout" TagType="Base" DataType="BOOL" Radix="Decimal" Constant="false" ExternalAccess="Read/Write">
<Description>
<![CDATA[Alarm: VFD Locked out]]>
</Description>
<Data Format="L5K">
<![CDATA[0]]>
</Data>
<Data Format="Decorated">
<DataValue DataType="BOOL" Radix="Decimal" Value="0"/>
</Data>
</Tag>
<Tag Name="cfg_AlarmLockoutLimit" TagType="Base" DataType="DINT" Radix="Decimal" Constant="false" ExternalAccess="Read/Write">
<Description>
<![CDATA[Number of faults before manual intervention is required]]>
</Description>
<Data Format="L5K">
<![CDATA[3]]>
</Data>
<Data Format="Decorated">
<DataValue DataType="DINT" Radix="Decimal" Value="3"/>
</Data>
</Tag>
<Tag Name="cfg_AlarmRecoverSeconds" TagType="Base" DataType="DINT" Radix="Decimal" Constant="false" ExternalAccess="Read/Write">
<Description>
<![CDATA[Number of seconds the unit must remain running before considering a fault cleared]]>
</Description>
<Data Format="L5K">
<![CDATA[3600]]>
</Data>
<Data Format="Decorated">
<DataValue DataType="DINT" Radix="Decimal" Value="3600"/>
</Data>
</Tag>
<Tag Name="cmd_ResetAlarmCount" TagType="Base" DataType="BOOL" Radix="Decimal" Constant="false" ExternalAccess="Read Only">
<Description>
<![CDATA[Command to reset the Alarm Count to 0]]>
</Description>
<Data Format="L5K">
<![CDATA[0]]>
</Data>
<Data Format="Decorated">
<DataValue DataType="BOOL" Radix="Decimal" Value="0"/>
</Data>
</Tag>
<Tag Name="cmd_ResetAlarms" TagType="Base" DataType="BOOL" Radix="Decimal" Constant="false" ExternalAccess="Read/Write">
<Description>
<![CDATA[Reset Alarms]]>
</Description>
<Data Format="L5K">
<![CDATA[0]]>
</Data>
<Data Format="Decorated">
<DataValue DataType="BOOL" Radix="Decimal" Value="0"/>
</Data>
</Tag>
<Tag Name="cmd_Restart" TagType="Base" DataType="BOOL" Radix="Decimal" Constant="false" ExternalAccess="Read/Write">
<Description>
<![CDATA[Restart Command]]>
</Description>
<Data Format="L5K">
<![CDATA[0]]>
</Data>
<Data Format="Decorated">
<DataValue DataType="BOOL" Radix="Decimal" Value="0"/>
</Data>
</Tag>
<Tag Name="cmd_Run" TagType="Base" DataType="BOOL" Radix="Decimal" Constant="false" ExternalAccess="Read/Write">
<Description>
<![CDATA[Command to Run the pump]]>
</Description>
<Data Format="L5K">
<![CDATA[1]]>
</Data>
<Data Format="Decorated">
<DataValue DataType="BOOL" Radix="Decimal" Value="1"/>
</Data>
</Tag>
<Tag Name="sts_NoAlarms" TagType="Base" DataType="BOOL" Radix="Decimal" Constant="false" ExternalAccess="Read/Write">
<Data Format="L5K">
<![CDATA[1]]>
</Data>
<Data Format="Decorated">
<DataValue DataType="BOOL" Radix="Decimal" Value="1"/>
</Data>
</Tag>
<Tag Name="sts_PumpOff" TagType="Base" DataType="BOOL" Radix="Decimal" Constant="false" ExternalAccess="Read/Write">
<Description>
<![CDATA[Pump-Off Condition]]>
</Description>
<Data Format="L5K">
<![CDATA[0]]>
</Data>
<Data Format="Decorated">
<DataValue DataType="BOOL" Radix="Decimal" Value="0"/>
</Data>
</Tag>
<Tag Name="sts_RestartAllowed" TagType="Base" DataType="BOOL" Radix="Decimal" Constant="false" ExternalAccess="Read/Write">
<Description>
<![CDATA[Restarting automatically is allowed]]>
</Description>
<Data Format="L5K">
<![CDATA[1]]>
</Data>
<Data Format="Decorated">
<DataValue DataType="BOOL" Radix="Decimal" Value="1"/>
</Data>
</Tag>
</Tags>
<Programs Use="Context">
<Program Use="Context" Name="MainProgram">
<Tags Use="Context">
<Tag Name="ONS_IncrementAlarmCount" TagType="Base" DataType="BOOL" Radix="Decimal" Constant="false" ExternalAccess="Read/Write">
<Data Format="L5K">
<![CDATA[0]]>
</Data>
<Data Format="Decorated">
<DataValue DataType="BOOL" Radix="Decimal" Value="0"/>
</Data>
</Tag>
<Tag Name="TON_FaultRecover" TagType="Base" DataType="TIMER" Constant="false" ExternalAccess="Read/Write">
<Data Format="L5K">
<![CDATA[[-1607653396,3600000,3600001]]]>
</Data>
<Data Format="Decorated">
<Structure DataType="TIMER">
<DataValueMember Name="PRE" DataType="DINT" Radix="Decimal" Value="3600000"/>
<DataValueMember Name="ACC" DataType="DINT" Radix="Decimal" Value="3600001"/>
<DataValueMember Name="EN" DataType="BOOL" Value="1"/>
<DataValueMember Name="TT" DataType="BOOL" Value="0"/>
<DataValueMember Name="DN" DataType="BOOL" Value="1"/>
</Structure>
</Data>
</Tag>
</Tags>
<Routines Use="Context">
<Routine Use="Context" Name="MainRoutine">
<RLLContent Use="Context">
<Rung Use="Target" Number="12" Type="N">
<Text>
<![CDATA[[XIO(sts_NoAlarms) XIO(sts_PumpOff) ONS(ONS_IncrementAlarmCount) ADD(alarm_Count,1,alarm_Count) ,GEQ(alarm_Count,cfg_AlarmLockoutLimit) OTU(sts_RestartAllowed) OTL(alarm_Lockout) ,MUL(cfg_AlarmRecoverSeconds,1000,TON_FaultRecover.PRE) XIC(cmd_Run) TON(TON_FaultRecover,?,?) XIC(TON_FaultRecover.DN) OTL(cmd_ResetAlarmCount) ,XIC(cmd_ResetAlarms) XIO(cmd_Restart) OTL(cmd_ResetAlarmCount) ,XIC(cmd_ResetAlarmCount) OTU(alarm_Lockout) MOV(0,alarm_Count) OTU(cmd_ResetAlarmCount) ];]]>
</Text>
</Rung>
</RLLContent>
</Routine>
</Routines>
</Program>
</Programs>
</Controller>
</RSLogix5000Content>

File diff suppressed because it is too large Load Diff

BIN
docs/imgs/Picture1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 459 KiB

BIN
docs/imgs/Picture2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 367 KiB

BIN
docs/imgs/Picture3.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 297 KiB

BIN
docs/imgs/Picture4.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 256 KiB

BIN
docs/imgs/Picture5.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

BIN
docs/imgs/Picture6.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

21
docs/installation.md Normal file
View File

@@ -0,0 +1,21 @@
# Max Water System Panel Installation
Please follow the following steps for the software uploads into the different components.
## Power-Up
Start by suppling power to the drive and hooking up to the switch.
![Network Switch](imgs/Picture1.png "Network Switch") ![Power Wiring](imgs/Picture2.png "Power Wiring")
## VFD Programming
1. Start by changing the IP Address to 192.168.1.12. This done on the front of the drive. Must remove cover and set the dials 0 1 2. This is the last three digits for the IP address. Look at pic: Start from the top dial down, the top dial been 0 and so forth.
![Side View](imgs/Picture3.png "Side View") ![Switch View](imgs/Picture4.png "Switch View")
2. Go to This PC > Document > Git Hub > Max water Systems > Advance-vfd-ipp-ccw and double click on file. Wait until Connect Component software loads up.
![Windows explorer showing file](imgs/Picture5.png "Windows Explorer showing path")
![Connected Components Workbench with project open](imgs/Picture6.png "Connected Components Workbench with project open")