Manual control modbus ui for webrelay

This commit is contained in:
Yeongdo Park 2020-08-10 15:09:34 -07:00
parent bdfc973137
commit 38a0213d49
3 changed files with 174 additions and 220 deletions

View file

@ -28,6 +28,11 @@ print('pubsub API version', pub.VERSION_API)
pubsub.utils.notification.useNotifyByWriteFile(sys.stdout) pubsub.utils.notification.useNotifyByWriteFile(sys.stdout)
class WebRelay:
def __init__(self, n_relay=10):
self.n_relay = n_relay
self.relay_status = [False for i in range(self.n_relay)]
class Controller: class Controller:
def __init__(self, view): def __init__(self, view):
self.sc = None self.sc = None
@ -39,7 +44,6 @@ class Controller:
self.mbclient = None self.mbclient = None
pub.subscribe(self.getFaultInfo, 'fault_selected')
pub.subscribe(self.startTimer, 'monitoring_started') pub.subscribe(self.startTimer, 'monitoring_started')
pub.subscribe(self.stopTimer, 'monitoring_stopped') pub.subscribe(self.stopTimer, 'monitoring_stopped')
pub.subscribe(self.applyNetworkConfigs, 'apply_network_configs') pub.subscribe(self.applyNetworkConfigs, 'apply_network_configs')
@ -49,6 +53,38 @@ class Controller:
pub.subscribe(self.startSystemOp, "start_system_op_manual") pub.subscribe(self.startSystemOp, "start_system_op_manual")
pub.subscribe(self.stopSystemOp, "stop_system_op_manual") pub.subscribe(self.stopSystemOp, "stop_system_op_manual")
pub.subscribe(self.turnRelayOn, "turn_relay_on")
pub.subscribe(self.turnRelayOff, "turn_relay_off")
'''
def WriteSingleCoil(self, startingAddress, value)
Write single Coil to Server device (Function code 5)
startingAddress: Coil to be written
value: Coil Value to be written
def WriteMultipleCoils(self, startingAddress, values)
Write multiple coils to Server device (Function code 15)
startingAddress : First coil to be written
values: Coil Values [0..quantity-1] to be written
'''
def turnRelayOn(self, relay_id):
'''
:param relay_id: id of relay to turn on
:return: None
'''
self.mbclient.write_single_coil(relay_id-1, True)
def turnRelayOff(self, relay_id):
'''
:param relay_id: id of relay to turn off
:return: None
'''
self.mbclient.write_single_coil(relay_id-11, False)
def startSystemOp(self, mode, val): def startSystemOp(self, mode, val):
self.sc.setPortModes(mode) self.sc.setPortModes(mode)
self.sc.setPortSetpoints(val) self.sc.setPortSetpoints(val)
@ -89,22 +125,6 @@ class Controller:
a = "Auto" if self.mode else "Manual" a = "Auto" if self.mode else "Manual"
self.view.text_op_mode.SetValue(a) self.view.text_op_mode.SetValue(a)
def getFaultInfo(self, pos):
y, x = pos
fid = x + y * 8
if 0 <= fid <= 63:
try:
info_text = faultInfo[fid]
except IndexError:
info_text = "Fault Number: {} (Reserved)".format(fid)
self.view.text_fault_doc.SetValue(info_text)
status_text = "Not Connected"
if self.sc:
fDict = self.sc.readFaultDetail(fid)
status_text = pprint.pformat(fDict)
self.view.text_fault_status.SetValue(status_text)
def OnTimer(self, event): def OnTimer(self, event):
# Read registers # Read registers
relay_status = self.mbclient.read_coils(0,10) relay_status = self.mbclient.read_coils(0,10)
@ -226,9 +246,11 @@ class MyFrame(FaultFrame):
pub.sendMessage("check_system_op_mode") pub.sendMessage("check_system_op_mode")
def OnRelayOn(self, event): def OnRelayOn(self, event):
pub.sendMessage("turn_relay_on", relay_id = event.GetId())
event.Skip() event.Skip()
def OnRelayOff(self, event): def OnRelayOff(self, event):
pub.sendMessage("turn_relay_off", relay_id = event.GetId())
event.Skip() event.Skip()
def OnRelayPulse(self, event): def OnRelayPulse(self, event):

View file

@ -1,6 +1,6 @@
# -*- coding: UTF-8 -*- # -*- coding: UTF-8 -*-
# #
# generated by wxGlade 0.9.6 on Fri Jul 24 15:09:44 2020 # generated by wxGlade 0.9.6 on Wed Jul 29 12:53:09 2020
# #
import wx import wx
@ -18,7 +18,7 @@ class FaultFrame(wx.Frame):
# begin wxGlade: FaultFrame.__init__ # begin wxGlade: FaultFrame.__init__
kwds["style"] = kwds.get("style", 0) | wx.DEFAULT_FRAME_STYLE kwds["style"] = kwds.get("style", 0) | wx.DEFAULT_FRAME_STYLE
wx.Frame.__init__(self, *args, **kwds) wx.Frame.__init__(self, *args, **kwds)
self.SetSize((411, 480)) self.SetSize((442, 480))
self.input_ip = wx.TextCtrl(self, wx.ID_ANY, _("192.168.1.2")) self.input_ip = wx.TextCtrl(self, wx.ID_ANY, _("192.168.1.2"))
self.input_port = wx.TextCtrl(self, wx.ID_ANY, _("502")) self.input_port = wx.TextCtrl(self, wx.ID_ANY, _("502"))
self.input_uid = wx.TextCtrl(self, wx.ID_ANY, _("240")) self.input_uid = wx.TextCtrl(self, wx.ID_ANY, _("240"))
@ -27,46 +27,46 @@ class FaultFrame(wx.Frame):
self.apply_button = wx.Button(self, wx.ID_ANY, _("Apply")) self.apply_button = wx.Button(self, wx.ID_ANY, _("Apply"))
self.rreset_button = wx.Button(self, wx.ID_ANY, _("Remote PCS Reset")) self.rreset_button = wx.Button(self, wx.ID_ANY, _("Remote PCS Reset"))
self.button_1 = wx.ToggleButton(self, wx.ID_ANY, _("Start")) self.button_1 = wx.ToggleButton(self, wx.ID_ANY, _("Start"))
self.text_ctrl_1 = wx.TextCtrl(self, wx.ID_ANY, _("OFF"), style=wx.BORDER_NONE | wx.TE_CENTRE | wx.TE_READONLY) self.text_ctrl_1 = wx.TextCtrl(self, 1, _("OFF"), style=wx.TE_CENTRE | wx.TE_READONLY)
self.button_2 = wx.Button(self, wx.ID_ANY, _("ON")) self.button_2 = wx.Button(self, 1, _("ON"))
self.button_3 = wx.Button(self, wx.ID_ANY, _("OFF")) self.button_3 = wx.Button(self, 11, _("OFF"))
self.button_4 = wx.Button(self, wx.ID_ANY, _("PULSE")) self.button_4 = wx.Button(self, 21, _("PULSE"))
self.text_ctrl_2 = wx.TextCtrl(self, wx.ID_ANY, _("OFF"), style=wx.BORDER_NONE | wx.TE_CENTRE | wx.TE_READONLY) self.text_ctrl_2 = wx.TextCtrl(self, 2, _("OFF"), style=wx.TE_CENTRE | wx.TE_READONLY)
self.button_5 = wx.Button(self, wx.ID_ANY, _("ON")) self.button_5 = wx.Button(self, 2, _("ON"))
self.button_6 = wx.Button(self, wx.ID_ANY, _("OFF")) self.button_6 = wx.Button(self, 12, _("OFF"))
self.button_7 = wx.Button(self, wx.ID_ANY, _("PULSE")) self.button_7 = wx.Button(self, 22, _("PULSE"))
self.text_ctrl_3 = wx.TextCtrl(self, wx.ID_ANY, _("OFF"), style=wx.BORDER_NONE | wx.TE_CENTRE | wx.TE_READONLY) self.text_ctrl_3 = wx.TextCtrl(self, 3, _("OFF"), style=wx.TE_CENTRE | wx.TE_READONLY)
self.button_8 = wx.Button(self, wx.ID_ANY, _("ON")) self.button_8 = wx.Button(self, 3, _("ON"))
self.button_9 = wx.Button(self, wx.ID_ANY, _("OFF")) self.button_9 = wx.Button(self, 13, _("OFF"))
self.button_10 = wx.Button(self, wx.ID_ANY, _("PULSE")) self.button_10 = wx.Button(self, 23, _("PULSE"))
self.text_ctrl_4 = wx.TextCtrl(self, wx.ID_ANY, _("OFF"), style=wx.BORDER_NONE | wx.TE_CENTRE | wx.TE_READONLY) self.text_ctrl_4 = wx.TextCtrl(self, 4, _("OFF"), style=wx.TE_CENTRE | wx.TE_READONLY)
self.button_11 = wx.Button(self, wx.ID_ANY, _("ON")) self.button_11 = wx.Button(self, 4, _("ON"))
self.button_12 = wx.Button(self, wx.ID_ANY, _("OFF")) self.button_12 = wx.Button(self, 14, _("OFF"))
self.button_13 = wx.Button(self, wx.ID_ANY, _("PULSE")) self.button_13 = wx.Button(self, 24, _("PULSE"))
self.text_ctrl_5 = wx.TextCtrl(self, wx.ID_ANY, _("OFF"), style=wx.BORDER_NONE | wx.TE_CENTRE | wx.TE_READONLY) self.text_ctrl_5 = wx.TextCtrl(self, 5, _("OFF"), style=wx.TE_CENTRE | wx.TE_READONLY)
self.button_14 = wx.Button(self, wx.ID_ANY, _("ON")) self.button_14 = wx.Button(self, 5, _("ON"))
self.button_15 = wx.Button(self, wx.ID_ANY, _("OFF")) self.button_15 = wx.Button(self, 15, _("OFF"))
self.button_16 = wx.Button(self, wx.ID_ANY, _("PULSE")) self.button_16 = wx.Button(self, 25, _("PULSE"))
self.text_ctrl_6 = wx.TextCtrl(self, wx.ID_ANY, _("OFF"), style=wx.BORDER_NONE | wx.TE_CENTRE | wx.TE_READONLY) self.text_ctrl_6 = wx.TextCtrl(self, 6, _("OFF"), style=wx.TE_CENTRE | wx.TE_READONLY)
self.button_17 = wx.Button(self, wx.ID_ANY, _("ON")) self.button_17 = wx.Button(self, 6, _("ON"))
self.button_18 = wx.Button(self, wx.ID_ANY, _("OFF")) self.button_18 = wx.Button(self, 16, _("OFF"))
self.button_19 = wx.Button(self, wx.ID_ANY, _("PULSE")) self.button_19 = wx.Button(self, 26, _("PULSE"))
self.text_ctrl_7 = wx.TextCtrl(self, wx.ID_ANY, _("OFF"), style=wx.BORDER_NONE | wx.TE_CENTRE | wx.TE_READONLY) self.text_ctrl_7 = wx.TextCtrl(self, 7, _("OFF"), style=wx.TE_CENTRE | wx.TE_READONLY)
self.button_20 = wx.Button(self, wx.ID_ANY, _("ON")) self.button_20 = wx.Button(self, 7, _("ON"))
self.button_21 = wx.Button(self, wx.ID_ANY, _("OFF")) self.button_21 = wx.Button(self, 17, _("OFF"))
self.button_22 = wx.Button(self, wx.ID_ANY, _("PULSE")) self.button_22 = wx.Button(self, 27, _("PULSE"))
self.text_ctrl_8 = wx.TextCtrl(self, wx.ID_ANY, _("OFF"), style=wx.BORDER_NONE | wx.TE_CENTRE | wx.TE_READONLY) self.text_ctrl_8 = wx.TextCtrl(self, 8, _("OFF"), style=wx.TE_CENTRE | wx.TE_READONLY)
self.button_23 = wx.Button(self, wx.ID_ANY, _("ON")) self.button_23 = wx.Button(self, 8, _("ON"))
self.button_24 = wx.Button(self, wx.ID_ANY, _("OFF")) self.button_24 = wx.Button(self, 18, _("OFF"))
self.button_25 = wx.Button(self, wx.ID_ANY, _("PULSE")) self.button_25 = wx.Button(self, 28, _("PULSE"))
self.text_ctrl_9 = wx.TextCtrl(self, wx.ID_ANY, _("OFF"), style=wx.BORDER_NONE | wx.TE_CENTRE | wx.TE_READONLY) self.text_ctrl_9 = wx.TextCtrl(self, 9, _("OFF"), style=wx.TE_CENTRE | wx.TE_READONLY)
self.button_26 = wx.Button(self, wx.ID_ANY, _("ON")) self.button_26 = wx.Button(self, 9, _("ON"))
self.button_27 = wx.Button(self, wx.ID_ANY, _("OFF")) self.button_27 = wx.Button(self, 19, _("OFF"))
self.button_28 = wx.Button(self, wx.ID_ANY, _("PULSE")) self.button_28 = wx.Button(self, 29, _("PULSE"))
self.text_ctrl_10 = wx.TextCtrl(self, wx.ID_ANY, _("OFF"), style=wx.BORDER_NONE | wx.TE_CENTRE | wx.TE_READONLY) self.text_ctrl_10 = wx.TextCtrl(self, 10, _("OFF"), style=wx.TE_CENTRE | wx.TE_READONLY)
self.button_29 = wx.Button(self, wx.ID_ANY, _("ON")) self.button_29 = wx.Button(self, 10, _("ON"))
self.button_30 = wx.Button(self, wx.ID_ANY, _("OFF")) self.button_30 = wx.Button(self, 20, _("OFF"))
self.button_31 = wx.Button(self, wx.ID_ANY, _("PULSE")) self.button_31 = wx.Button(self, 30, _("PULSE"))
self.__set_properties() self.__set_properties()
self.__do_layout() self.__do_layout()
@ -157,7 +157,6 @@ class FaultFrame(wx.Frame):
sizer_4.Add(self.rreset_button, 0, 0, 0) sizer_4.Add(self.rreset_button, 0, 0, 0)
sizer_4.Add(self.button_1, 0, 0, 0) sizer_4.Add(self.button_1, 0, 0, 0)
sizer_7.Add(sizer_4, 0, wx.EXPAND, 0) sizer_7.Add(sizer_4, 0, wx.EXPAND, 0)
sizer_7.Add((20, 20), 0, wx.EXPAND, 0)
label_5 = wx.StaticText(self, wx.ID_ANY, _("Relay 1")) label_5 = wx.StaticText(self, wx.ID_ANY, _("Relay 1"))
sizer_2.Add(label_5, 0, 0, 0) sizer_2.Add(label_5, 0, 0, 0)
sizer_2.Add((20, 20), 0, 0, 0) sizer_2.Add((20, 20), 0, 0, 0)

View file

@ -1,9 +1,9 @@
<?xml version="1.0"?> <?xml version="1.0"?>
<!-- generated by wxGlade 0.9.6 on Wed Jul 22 19:28:03 2020 --> <!-- generated by wxGlade 0.9.6 on Wed Jul 29 12:53:06 2020 -->
<application encoding="UTF-8" for_version="3.0" header_extension=".h" indent_amount="4" indent_symbol="space" is_template="0" language="python" mark_blocks="0" option="0" overwrite="1" path="FaultView.py" source_extension=".cpp" top_window="frame" use_gettext="1" use_new_namespace="1"> <application encoding="UTF-8" for_version="3.0" header_extension=".h" indent_amount="4" indent_symbol="space" is_template="0" language="python" mark_blocks="0" option="0" overwrite="1" path="FaultView.py" source_extension=".cpp" top_window="frame" use_gettext="1" use_new_namespace="1">
<object class="FaultFrame" name="frame" base="EditFrame"> <object class="FaultFrame" name="frame" base="EditFrame">
<size>320, 480</size> <size>442, 480</size>
<title>PCS Controller</title> <title>PCS Controller</title>
<style>wxDEFAULT_FRAME_STYLE</style> <style>wxDEFAULT_FRAME_STYLE</style>
<object class="wxBoxSizer" name="sizer_1" base="EditBoxSizer"> <object class="wxBoxSizer" name="sizer_1" base="EditBoxSizer">
@ -19,7 +19,7 @@
<border>0</border> <border>0</border>
<flag>wxEXPAND</flag> <flag>wxEXPAND</flag>
<object class="wxGridSizer" name="sizer_4" base="EditGridSizer"> <object class="wxGridSizer" name="sizer_4" base="EditGridSizer">
<rows>7</rows> <rows>6</rows>
<cols>2</cols> <cols>2</cols>
<vgap>0</vgap> <vgap>0</vgap>
<hgap>0</hgap> <hgap>0</hgap>
@ -121,23 +121,6 @@
<label>Start</label> <label>Start</label>
</object> </object>
</object> </object>
<object class="sizeritem">
<option>0</option>
<border>0</border>
<object class="wxButton" name="op_mode_button" base="EditButton">
<events>
<handler event="EVT_BUTTON">OnCheckSysOpMode</handler>
</events>
<label>System OP Mode</label>
</object>
</object>
<object class="sizeritem">
<option>0</option>
<border>0</border>
<object class="wxTextCtrl" name="text_op_mode" base="EditTextCtrl">
<style>wxTE_READONLY</style>
</object>
</object>
</object> </object>
</object> </object>
<object class="sizeritem"> <object class="sizeritem">
@ -156,7 +139,7 @@
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxStaticText" name="label_5" base="EditStaticText"> <object class="wxStaticText" name="label_5" base="EditStaticText">
<label>Relay 1</label> <label>Relay 1</label>
</object> </object>
</object> </object>
<object class="sizeritem"> <object class="sizeritem">
@ -170,10 +153,11 @@
<object class="sizeritem"> <object class="sizeritem">
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxCheckBox" name="checkbox_1" base="EditCheckBox"> <object class="wxTextCtrl" name="text_ctrl_1" base="EditTextCtrl">
<extraproperties> <id>1</id>
<property name="relay_id">1</property> <background>#ff0000</background>
</extraproperties> <style>wxTE_READONLY|wxTE_CENTRE</style>
<value>OFF</value>
</object> </object>
</object> </object>
<object class="sizeritem"> <object class="sizeritem">
@ -188,12 +172,10 @@
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxButton" name="button_2" base="EditButton"> <object class="wxButton" name="button_2" base="EditButton">
<extraproperties>
<property name="relay_id">1</property>
</extraproperties>
<events> <events>
<handler event="EVT_BUTTON">OnRelayOn</handler> <handler event="EVT_BUTTON">OnRelayOn</handler>
</events> </events>
<id>1</id>
<label>ON</label> <label>ON</label>
</object> </object>
</object> </object>
@ -201,12 +183,10 @@
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxButton" name="button_3" base="EditButton"> <object class="wxButton" name="button_3" base="EditButton">
<extraproperties>
<property name="relay_id">1</property>
</extraproperties>
<events> <events>
<handler event="EVT_BUTTON">OnRelayOff</handler> <handler event="EVT_BUTTON">OnRelayOff</handler>
</events> </events>
<id>11</id>
<label>OFF</label> <label>OFF</label>
</object> </object>
</object> </object>
@ -214,12 +194,10 @@
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxButton" name="button_4" base="EditButton"> <object class="wxButton" name="button_4" base="EditButton">
<extraproperties>
<property name="relay_id">1</property>
</extraproperties>
<events> <events>
<handler event="EVT_BUTTON">OnRelayPulse</handler> <handler event="EVT_BUTTON">OnRelayPulse</handler>
</events> </events>
<id>21</id>
<label>PULSE</label> <label>PULSE</label>
</object> </object>
</object> </object>
@ -235,7 +213,7 @@
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxStaticText" name="label_6" base="EditStaticText"> <object class="wxStaticText" name="label_6" base="EditStaticText">
<label>Relay 1</label> <label>Relay 2</label>
</object> </object>
</object> </object>
<object class="sizeritem"> <object class="sizeritem">
@ -249,10 +227,11 @@
<object class="sizeritem"> <object class="sizeritem">
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxCheckBox" name="checkbox_2" base="EditCheckBox"> <object class="wxTextCtrl" name="text_ctrl_2" base="EditTextCtrl">
<extraproperties> <id>2</id>
<property name="relay_id">1</property> <background>#ff0000</background>
</extraproperties> <style>wxTE_READONLY|wxTE_CENTRE</style>
<value>OFF</value>
</object> </object>
</object> </object>
<object class="sizeritem"> <object class="sizeritem">
@ -267,12 +246,10 @@
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxButton" name="button_5" base="EditButton"> <object class="wxButton" name="button_5" base="EditButton">
<extraproperties>
<property name="relay_id">2</property>
</extraproperties>
<events> <events>
<handler event="EVT_BUTTON">OnRelayOn</handler> <handler event="EVT_BUTTON">OnRelayOn</handler>
</events> </events>
<id>2</id>
<label>ON</label> <label>ON</label>
</object> </object>
</object> </object>
@ -280,12 +257,10 @@
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxButton" name="button_6" base="EditButton"> <object class="wxButton" name="button_6" base="EditButton">
<extraproperties>
<property name="relay_id">2</property>
</extraproperties>
<events> <events>
<handler event="EVT_BUTTON">OnRelayOff</handler> <handler event="EVT_BUTTON">OnRelayOff</handler>
</events> </events>
<id>12</id>
<label>OFF</label> <label>OFF</label>
</object> </object>
</object> </object>
@ -293,12 +268,10 @@
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxButton" name="button_7" base="EditButton"> <object class="wxButton" name="button_7" base="EditButton">
<extraproperties>
<property name="relay_id">2</property>
</extraproperties>
<events> <events>
<handler event="EVT_BUTTON">OnRelayPulse</handler> <handler event="EVT_BUTTON">OnRelayPulse</handler>
</events> </events>
<id>22</id>
<label>PULSE</label> <label>PULSE</label>
</object> </object>
</object> </object>
@ -314,7 +287,7 @@
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxStaticText" name="label_7" base="EditStaticText"> <object class="wxStaticText" name="label_7" base="EditStaticText">
<label>Relay 1</label> <label>Relay 3</label>
</object> </object>
</object> </object>
<object class="sizeritem"> <object class="sizeritem">
@ -328,10 +301,11 @@
<object class="sizeritem"> <object class="sizeritem">
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxCheckBox" name="checkbox_3" base="EditCheckBox"> <object class="wxTextCtrl" name="text_ctrl_3" base="EditTextCtrl">
<extraproperties> <id>3</id>
<property name="relay_id">1</property> <background>#ff0000</background>
</extraproperties> <style>wxTE_READONLY|wxTE_CENTRE</style>
<value>OFF</value>
</object> </object>
</object> </object>
<object class="sizeritem"> <object class="sizeritem">
@ -346,12 +320,10 @@
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxButton" name="button_8" base="EditButton"> <object class="wxButton" name="button_8" base="EditButton">
<extraproperties>
<property name="relay_id">3</property>
</extraproperties>
<events> <events>
<handler event="EVT_BUTTON">OnRelayOn</handler> <handler event="EVT_BUTTON">OnRelayOn</handler>
</events> </events>
<id>3</id>
<label>ON</label> <label>ON</label>
</object> </object>
</object> </object>
@ -359,12 +331,10 @@
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxButton" name="button_9" base="EditButton"> <object class="wxButton" name="button_9" base="EditButton">
<extraproperties>
<property name="relay_id">3</property>
</extraproperties>
<events> <events>
<handler event="EVT_BUTTON">OnRelayOff</handler> <handler event="EVT_BUTTON">OnRelayOff</handler>
</events> </events>
<id>13</id>
<label>OFF</label> <label>OFF</label>
</object> </object>
</object> </object>
@ -372,12 +342,10 @@
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxButton" name="button_10" base="EditButton"> <object class="wxButton" name="button_10" base="EditButton">
<extraproperties>
<property name="relay_id">3</property>
</extraproperties>
<events> <events>
<handler event="EVT_BUTTON">OnRelayPulse</handler> <handler event="EVT_BUTTON">OnRelayPulse</handler>
</events> </events>
<id>23</id>
<label>PULSE</label> <label>PULSE</label>
</object> </object>
</object> </object>
@ -393,7 +361,7 @@
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxStaticText" name="label_8" base="EditStaticText"> <object class="wxStaticText" name="label_8" base="EditStaticText">
<label>Relay 1</label> <label>Relay 4</label>
</object> </object>
</object> </object>
<object class="sizeritem"> <object class="sizeritem">
@ -407,10 +375,11 @@
<object class="sizeritem"> <object class="sizeritem">
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxCheckBox" name="checkbox_4" base="EditCheckBox"> <object class="wxTextCtrl" name="text_ctrl_4" base="EditTextCtrl">
<extraproperties> <id>4</id>
<property name="relay_id">1</property> <background>#ff0000</background>
</extraproperties> <style>wxTE_READONLY|wxTE_CENTRE</style>
<value>OFF</value>
</object> </object>
</object> </object>
<object class="sizeritem"> <object class="sizeritem">
@ -425,12 +394,10 @@
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxButton" name="button_11" base="EditButton"> <object class="wxButton" name="button_11" base="EditButton">
<extraproperties>
<property name="relay_id">4</property>
</extraproperties>
<events> <events>
<handler event="EVT_BUTTON">OnRelayOn</handler> <handler event="EVT_BUTTON">OnRelayOn</handler>
</events> </events>
<id>4</id>
<label>ON</label> <label>ON</label>
</object> </object>
</object> </object>
@ -438,12 +405,10 @@
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxButton" name="button_12" base="EditButton"> <object class="wxButton" name="button_12" base="EditButton">
<extraproperties>
<property name="relay_id">4</property>
</extraproperties>
<events> <events>
<handler event="EVT_BUTTON">OnRelayOff</handler> <handler event="EVT_BUTTON">OnRelayOff</handler>
</events> </events>
<id>14</id>
<label>OFF</label> <label>OFF</label>
</object> </object>
</object> </object>
@ -451,12 +416,10 @@
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxButton" name="button_13" base="EditButton"> <object class="wxButton" name="button_13" base="EditButton">
<extraproperties>
<property name="relay_id">4</property>
</extraproperties>
<events> <events>
<handler event="EVT_BUTTON">OnRelayPulse</handler> <handler event="EVT_BUTTON">OnRelayPulse</handler>
</events> </events>
<id>24</id>
<label>PULSE</label> <label>PULSE</label>
</object> </object>
</object> </object>
@ -472,7 +435,7 @@
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxStaticText" name="label_9" base="EditStaticText"> <object class="wxStaticText" name="label_9" base="EditStaticText">
<label>Relay 1</label> <label>Relay 5</label>
</object> </object>
</object> </object>
<object class="sizeritem"> <object class="sizeritem">
@ -486,10 +449,11 @@
<object class="sizeritem"> <object class="sizeritem">
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxCheckBox" name="checkbox_5" base="EditCheckBox"> <object class="wxTextCtrl" name="text_ctrl_5" base="EditTextCtrl">
<extraproperties> <id>5</id>
<property name="relay_id">1</property> <background>#ff0000</background>
</extraproperties> <style>wxTE_READONLY|wxTE_CENTRE</style>
<value>OFF</value>
</object> </object>
</object> </object>
<object class="sizeritem"> <object class="sizeritem">
@ -504,12 +468,10 @@
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxButton" name="button_14" base="EditButton"> <object class="wxButton" name="button_14" base="EditButton">
<extraproperties>
<property name="relay_id">5</property>
</extraproperties>
<events> <events>
<handler event="EVT_BUTTON">OnRelayOn</handler> <handler event="EVT_BUTTON">OnRelayOn</handler>
</events> </events>
<id>5</id>
<label>ON</label> <label>ON</label>
</object> </object>
</object> </object>
@ -517,12 +479,10 @@
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxButton" name="button_15" base="EditButton"> <object class="wxButton" name="button_15" base="EditButton">
<extraproperties>
<property name="relay_id">5</property>
</extraproperties>
<events> <events>
<handler event="EVT_BUTTON">OnRelayOff</handler> <handler event="EVT_BUTTON">OnRelayOff</handler>
</events> </events>
<id>15</id>
<label>OFF</label> <label>OFF</label>
</object> </object>
</object> </object>
@ -530,12 +490,10 @@
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxButton" name="button_16" base="EditButton"> <object class="wxButton" name="button_16" base="EditButton">
<extraproperties>
<property name="relay_id">5</property>
</extraproperties>
<events> <events>
<handler event="EVT_BUTTON">OnRelayPulse</handler> <handler event="EVT_BUTTON">OnRelayPulse</handler>
</events> </events>
<id>25</id>
<label>PULSE</label> <label>PULSE</label>
</object> </object>
</object> </object>
@ -551,7 +509,7 @@
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxStaticText" name="label_10" base="EditStaticText"> <object class="wxStaticText" name="label_10" base="EditStaticText">
<label>Relay 1</label> <label>Relay 6</label>
</object> </object>
</object> </object>
<object class="sizeritem"> <object class="sizeritem">
@ -565,10 +523,11 @@
<object class="sizeritem"> <object class="sizeritem">
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxCheckBox" name="checkbox_6" base="EditCheckBox"> <object class="wxTextCtrl" name="text_ctrl_6" base="EditTextCtrl">
<extraproperties> <id>6</id>
<property name="relay_id">1</property> <background>#ff0000</background>
</extraproperties> <style>wxTE_READONLY|wxTE_CENTRE</style>
<value>OFF</value>
</object> </object>
</object> </object>
<object class="sizeritem"> <object class="sizeritem">
@ -583,12 +542,10 @@
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxButton" name="button_17" base="EditButton"> <object class="wxButton" name="button_17" base="EditButton">
<extraproperties>
<property name="relay_id">6</property>
</extraproperties>
<events> <events>
<handler event="EVT_BUTTON">OnRelayOn</handler> <handler event="EVT_BUTTON">OnRelayOn</handler>
</events> </events>
<id>6</id>
<label>ON</label> <label>ON</label>
</object> </object>
</object> </object>
@ -596,12 +553,10 @@
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxButton" name="button_18" base="EditButton"> <object class="wxButton" name="button_18" base="EditButton">
<extraproperties>
<property name="relay_id">6</property>
</extraproperties>
<events> <events>
<handler event="EVT_BUTTON">OnRelayOff</handler> <handler event="EVT_BUTTON">OnRelayOff</handler>
</events> </events>
<id>16</id>
<label>OFF</label> <label>OFF</label>
</object> </object>
</object> </object>
@ -609,12 +564,10 @@
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxButton" name="button_19" base="EditButton"> <object class="wxButton" name="button_19" base="EditButton">
<extraproperties>
<property name="relay_id">6</property>
</extraproperties>
<events> <events>
<handler event="EVT_BUTTON">OnRelayPulse</handler> <handler event="EVT_BUTTON">OnRelayPulse</handler>
</events> </events>
<id>26</id>
<label>PULSE</label> <label>PULSE</label>
</object> </object>
</object> </object>
@ -630,7 +583,7 @@
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxStaticText" name="label_11" base="EditStaticText"> <object class="wxStaticText" name="label_11" base="EditStaticText">
<label>Relay 1</label> <label>Relay 7</label>
</object> </object>
</object> </object>
<object class="sizeritem"> <object class="sizeritem">
@ -644,10 +597,11 @@
<object class="sizeritem"> <object class="sizeritem">
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxCheckBox" name="checkbox_7" base="EditCheckBox"> <object class="wxTextCtrl" name="text_ctrl_7" base="EditTextCtrl">
<extraproperties> <id>7</id>
<property name="relay_id">1</property> <background>#ff0000</background>
</extraproperties> <style>wxTE_READONLY|wxTE_CENTRE</style>
<value>OFF</value>
</object> </object>
</object> </object>
<object class="sizeritem"> <object class="sizeritem">
@ -662,12 +616,10 @@
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxButton" name="button_20" base="EditButton"> <object class="wxButton" name="button_20" base="EditButton">
<extraproperties>
<property name="relay_id">7</property>
</extraproperties>
<events> <events>
<handler event="EVT_BUTTON">OnRelayOn</handler> <handler event="EVT_BUTTON">OnRelayOn</handler>
</events> </events>
<id>7</id>
<label>ON</label> <label>ON</label>
</object> </object>
</object> </object>
@ -675,12 +627,10 @@
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxButton" name="button_21" base="EditButton"> <object class="wxButton" name="button_21" base="EditButton">
<extraproperties>
<property name="relay_id">7</property>
</extraproperties>
<events> <events>
<handler event="EVT_BUTTON">OnRelayOff</handler> <handler event="EVT_BUTTON">OnRelayOff</handler>
</events> </events>
<id>17</id>
<label>OFF</label> <label>OFF</label>
</object> </object>
</object> </object>
@ -688,12 +638,10 @@
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxButton" name="button_22" base="EditButton"> <object class="wxButton" name="button_22" base="EditButton">
<extraproperties>
<property name="relay_id">7</property>
</extraproperties>
<events> <events>
<handler event="EVT_BUTTON">OnRelayPulse</handler> <handler event="EVT_BUTTON">OnRelayPulse</handler>
</events> </events>
<id>27</id>
<label>PULSE</label> <label>PULSE</label>
</object> </object>
</object> </object>
@ -709,7 +657,7 @@
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxStaticText" name="label_12" base="EditStaticText"> <object class="wxStaticText" name="label_12" base="EditStaticText">
<label>Relay 1</label> <label>Relay 8</label>
</object> </object>
</object> </object>
<object class="sizeritem"> <object class="sizeritem">
@ -723,10 +671,11 @@
<object class="sizeritem"> <object class="sizeritem">
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxCheckBox" name="checkbox_8" base="EditCheckBox"> <object class="wxTextCtrl" name="text_ctrl_8" base="EditTextCtrl">
<extraproperties> <id>8</id>
<property name="relay_id">1</property> <background>#ff0000</background>
</extraproperties> <style>wxTE_READONLY|wxTE_CENTRE</style>
<value>OFF</value>
</object> </object>
</object> </object>
<object class="sizeritem"> <object class="sizeritem">
@ -741,12 +690,10 @@
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxButton" name="button_23" base="EditButton"> <object class="wxButton" name="button_23" base="EditButton">
<extraproperties>
<property name="relay_id">8</property>
</extraproperties>
<events> <events>
<handler event="EVT_BUTTON">OnRelayOn</handler> <handler event="EVT_BUTTON">OnRelayOn</handler>
</events> </events>
<id>8</id>
<label>ON</label> <label>ON</label>
</object> </object>
</object> </object>
@ -754,12 +701,10 @@
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxButton" name="button_24" base="EditButton"> <object class="wxButton" name="button_24" base="EditButton">
<extraproperties>
<property name="relay_id">8</property>
</extraproperties>
<events> <events>
<handler event="EVT_BUTTON">OnRelayOff</handler> <handler event="EVT_BUTTON">OnRelayOff</handler>
</events> </events>
<id>18</id>
<label>OFF</label> <label>OFF</label>
</object> </object>
</object> </object>
@ -767,12 +712,10 @@
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxButton" name="button_25" base="EditButton"> <object class="wxButton" name="button_25" base="EditButton">
<extraproperties>
<property name="relay_id">8</property>
</extraproperties>
<events> <events>
<handler event="EVT_BUTTON">OnRelayPulse</handler> <handler event="EVT_BUTTON">OnRelayPulse</handler>
</events> </events>
<id>28</id>
<label>PULSE</label> <label>PULSE</label>
</object> </object>
</object> </object>
@ -788,7 +731,7 @@
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxStaticText" name="label_13" base="EditStaticText"> <object class="wxStaticText" name="label_13" base="EditStaticText">
<label>Relay 1</label> <label>Relay 9</label>
</object> </object>
</object> </object>
<object class="sizeritem"> <object class="sizeritem">
@ -802,10 +745,11 @@
<object class="sizeritem"> <object class="sizeritem">
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxCheckBox" name="checkbox_9" base="EditCheckBox"> <object class="wxTextCtrl" name="text_ctrl_9" base="EditTextCtrl">
<extraproperties> <id>9</id>
<property name="relay_id">1</property> <background>#ff0000</background>
</extraproperties> <style>wxTE_READONLY|wxTE_CENTRE</style>
<value>OFF</value>
</object> </object>
</object> </object>
<object class="sizeritem"> <object class="sizeritem">
@ -820,12 +764,10 @@
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxButton" name="button_26" base="EditButton"> <object class="wxButton" name="button_26" base="EditButton">
<extraproperties>
<property name="relay_id">9</property>
</extraproperties>
<events> <events>
<handler event="EVT_BUTTON">OnRelayOn</handler> <handler event="EVT_BUTTON">OnRelayOn</handler>
</events> </events>
<id>9</id>
<label>ON</label> <label>ON</label>
</object> </object>
</object> </object>
@ -833,12 +775,10 @@
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxButton" name="button_27" base="EditButton"> <object class="wxButton" name="button_27" base="EditButton">
<extraproperties>
<property name="relay_id">9</property>
</extraproperties>
<events> <events>
<handler event="EVT_BUTTON">OnRelayOff</handler> <handler event="EVT_BUTTON">OnRelayOff</handler>
</events> </events>
<id>19</id>
<label>OFF</label> <label>OFF</label>
</object> </object>
</object> </object>
@ -846,12 +786,10 @@
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxButton" name="button_28" base="EditButton"> <object class="wxButton" name="button_28" base="EditButton">
<extraproperties>
<property name="relay_id">9</property>
</extraproperties>
<events> <events>
<handler event="EVT_BUTTON">OnRelayPulse</handler> <handler event="EVT_BUTTON">OnRelayPulse</handler>
</events> </events>
<id>29</id>
<label>PULSE</label> <label>PULSE</label>
</object> </object>
</object> </object>
@ -867,7 +805,7 @@
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxStaticText" name="label_14" base="EditStaticText"> <object class="wxStaticText" name="label_14" base="EditStaticText">
<label>Relay 1</label> <label>Relay 10</label>
</object> </object>
</object> </object>
<object class="sizeritem"> <object class="sizeritem">
@ -881,10 +819,11 @@
<object class="sizeritem"> <object class="sizeritem">
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxCheckBox" name="checkbox_10" base="EditCheckBox"> <object class="wxTextCtrl" name="text_ctrl_10" base="EditTextCtrl">
<extraproperties> <id>10</id>
<property name="relay_id">10</property> <background>#ff0000</background>
</extraproperties> <style>wxTE_READONLY|wxTE_CENTRE</style>
<value>OFF</value>
</object> </object>
</object> </object>
<object class="sizeritem"> <object class="sizeritem">
@ -899,12 +838,10 @@
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxButton" name="button_29" base="EditButton"> <object class="wxButton" name="button_29" base="EditButton">
<extraproperties>
<property name="relay_id">10</property>
</extraproperties>
<events> <events>
<handler event="EVT_BUTTON">OnRelayOn</handler> <handler event="EVT_BUTTON">OnRelayOn</handler>
</events> </events>
<id>10</id>
<label>ON</label> <label>ON</label>
</object> </object>
</object> </object>
@ -912,12 +849,10 @@
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxButton" name="button_30" base="EditButton"> <object class="wxButton" name="button_30" base="EditButton">
<extraproperties>
<property name="relay_id">10</property>
</extraproperties>
<events> <events>
<handler event="EVT_BUTTON">OnRelayOff</handler> <handler event="EVT_BUTTON">OnRelayOff</handler>
</events> </events>
<id>20</id>
<label>OFF</label> <label>OFF</label>
</object> </object>
</object> </object>
@ -925,12 +860,10 @@
<option>0</option> <option>0</option>
<border>0</border> <border>0</border>
<object class="wxButton" name="button_31" base="EditButton"> <object class="wxButton" name="button_31" base="EditButton">
<extraproperties>
<property name="relay_id">10</property>
</extraproperties>
<events> <events>
<handler event="EVT_BUTTON">OnRelayPulse</handler> <handler event="EVT_BUTTON">OnRelayPulse</handler>
</events> </events>
<id>30</id>
<label>PULSE</label> <label>PULSE</label>
</object> </object>
</object> </object>