Modbus working 22/11/2024
This commit is contained in:
@@ -41,17 +41,23 @@ namespace FAtoPA.Net
|
||||
// untuk values di Combobox Modbus Registers
|
||||
public ObservableCollection<int> ModbusRegisters { get; set; }
|
||||
|
||||
// Untuk manual add SIID to FSM Table
|
||||
public ObservableCollection<int> NetGroupList { get; set; }
|
||||
public ObservableCollection<int> NetNodeList { get; set; }
|
||||
public ObservableCollection<int> PNAList { get; set; }
|
||||
|
||||
public ObservableCollection<int> SINumberList { get; set; }
|
||||
public ObservableCollection<int> SISubList { get; set; }
|
||||
|
||||
// Isi FSM Table
|
||||
ObservableCollection<FSMData> FsmTableMember { get; set; }
|
||||
// Isi Modbus Table
|
||||
ObservableCollection<ModbusData> ModbusTableMember { get; set; }
|
||||
// Isi VX Table
|
||||
ObservableCollection<VXData> VXTableMember { get; set; }
|
||||
|
||||
public List<String> ConditionON;
|
||||
public List<String> ConditionOFF;
|
||||
|
||||
FSMEvent fsmEvent;
|
||||
public MainWindow()
|
||||
{
|
||||
@@ -100,6 +106,14 @@ namespace FAtoPA.Net
|
||||
siType.ItemsSource = Enum.GetValues(typeof(SIType)).Cast<SIType>().ToList();
|
||||
|
||||
this.DataContext = this;
|
||||
|
||||
//TODO : Add Condition for ON and OFF
|
||||
ConditionON = new List<string>();
|
||||
ConditionON.Add(SILogicalState.ACTIVATION.ToString());
|
||||
ConditionON.Add(SILogicalState.FIRE.ToString());
|
||||
|
||||
ConditionOFF = new List<string>();
|
||||
ConditionOFF.Add(SILogicalState.NORMAL.ToString());
|
||||
}
|
||||
|
||||
private void Window_Loaded(object sender, RoutedEventArgs e)
|
||||
@@ -142,7 +156,11 @@ namespace FAtoPA.Net
|
||||
|
||||
// Load Database
|
||||
database = new Database();
|
||||
database.GetFSMDatas().ForEach(f => FsmTableMember.Add(f));
|
||||
database.GetFSMDatas().ForEach(f =>
|
||||
{
|
||||
FsmTableMember.Add(f);
|
||||
FSMSIID.Add(f.SIID);
|
||||
});
|
||||
database.GetModbusDatas().ForEach(m => ModbusTableMember.Add(m));
|
||||
database.GetVXDatas().ForEach(v => VXTableMember.Add(v));
|
||||
|
||||
@@ -160,10 +178,12 @@ namespace FAtoPA.Net
|
||||
|
||||
|
||||
ModbusRegisters.Clear();
|
||||
|
||||
for (int i = 0; i < config.Modbus_MaxRegister; i++)
|
||||
{
|
||||
ModbusRegisters.Add(i);
|
||||
}
|
||||
Debug.WriteLine($"Creating ModbusRegisters untuk Combobox, length={ModbusRegisters.Count}");
|
||||
|
||||
// Load Modbus Slave
|
||||
modbusSlave = new ModbusSlave(new ModbusEvent(modbusstatusbar, ConnectedModbusClients, ConnectedModbusCount), config.Modbus_MaxRegister);
|
||||
@@ -176,8 +196,8 @@ namespace FAtoPA.Net
|
||||
|
||||
|
||||
fsm.AddListener(new FSMTableUpdater(FsmTableMember, DetectedSIID, DetectedSIIDCount));
|
||||
fsm.AddListener(new ModbusTriggerFromFSM(FsmTableMember, ModbusTableMember, modbusSlave));
|
||||
fsm.AddListener(new VXTriggerFromFSM(FsmTableMember, VXTableMember, vx3k));
|
||||
fsm.AddListener(new ModbusTriggerFromFSM(FsmTableMember, ModbusTableMember, modbusSlave, ConditionON, ConditionOFF));
|
||||
fsm.AddListener(new VXTriggerFromFSM(FsmTableMember, VXTableMember, vx3k, ConditionON, ConditionOFF));
|
||||
}
|
||||
|
||||
private void Timer1s_Tick(object sender, EventArgs e)
|
||||
@@ -778,13 +798,15 @@ namespace FAtoPA.Net
|
||||
{
|
||||
if (database != null)
|
||||
{
|
||||
FSMData f = new FSMData(selected.ToString());
|
||||
if (database.AddFSMData(f))
|
||||
{
|
||||
FSMTable.ItemsSource = database.GetFSMDatas();
|
||||
FSMSIID.Add(selected.ToString());
|
||||
}
|
||||
else MessageBox.Show("Failed to add to database");
|
||||
//TODO Manual Add SIID, perlukah ?
|
||||
|
||||
//FSMData f = new FSMData(selected.ToString());
|
||||
//if (database.AddFSMData(f))
|
||||
//{
|
||||
// FSMTable.ItemsSource = database.GetFSMDatas();
|
||||
// FSMSIID.Add(selected.ToString());
|
||||
//}
|
||||
//else MessageBox.Show("Failed to add to database");
|
||||
}
|
||||
else MessageBox.Show("Database is null");
|
||||
}
|
||||
@@ -795,19 +817,19 @@ namespace FAtoPA.Net
|
||||
|
||||
private void btnDelSIID_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
int selectedindex = FSMTable.SelectedIndex;
|
||||
if (selectedindex >= 0)
|
||||
{
|
||||
FSMData selected = (FSMData)FSMTable.Items[selectedindex];
|
||||
MessageBoxResult result = MessageBox.Show("Delete SIID " + selected.ToString() + " ?", "Delete SIID", MessageBoxButton.YesNo);
|
||||
if (result == MessageBoxResult.Yes)
|
||||
{
|
||||
FsmTableMember.Remove(selected);
|
||||
database.RemoveFSMDatabySIID(selected.SIID);
|
||||
|
||||
}
|
||||
}
|
||||
else MessageBox.Show("Select a row in table to delete");
|
||||
//int selectedindex = FSMTable.SelectedIndex;
|
||||
//if (selectedindex >= 0)
|
||||
//{
|
||||
// FSMData selected = (FSMData)FSMTable.Items[selectedindex];
|
||||
// MessageBoxResult result = MessageBox.Show("Delete SIID " + selected.ToString() + " ?", "Delete SIID", MessageBoxButton.YesNo);
|
||||
// if (result == MessageBoxResult.Yes)
|
||||
// {
|
||||
// FsmTableMember.Remove(selected);
|
||||
// database.RemoveFSMDatabySIID(selected.SIID);
|
||||
// FSMSIID.Remove(selected.SIID);
|
||||
// }
|
||||
//}
|
||||
//else MessageBox.Show("Select a row in table to delete");
|
||||
|
||||
|
||||
}
|
||||
@@ -819,7 +841,7 @@ namespace FAtoPA.Net
|
||||
{
|
||||
FsmTableMember.Clear();
|
||||
database.ClearFSMTable();
|
||||
|
||||
FSMSIID.Clear();
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1060,19 +1082,20 @@ namespace FAtoPA.Net
|
||||
switch (e.PropertyName)
|
||||
{
|
||||
case "SIID":
|
||||
e.Column.Width = new DataGridLength(0, DataGridLengthUnitType.Auto);
|
||||
e.Column.Width = DataGridLength.Auto;
|
||||
break;
|
||||
case "Enable":
|
||||
e.Column.Width = new DataGridLength(0, DataGridLengthUnitType.Auto);
|
||||
e.Column.Width = DataGridLength.Auto;
|
||||
break;
|
||||
case "Description":
|
||||
e.Column.Width = new DataGridLength(1, DataGridLengthUnitType.Star);
|
||||
e.Column.Width = DataGridLength.Auto;
|
||||
break;
|
||||
case "Value":
|
||||
e.Column.Width = new DataGridLength(0, DataGridLengthUnitType.Auto);
|
||||
e.Column.Width = DataGridLength.Auto;
|
||||
break;
|
||||
case "LastUpdate":
|
||||
e.Column.Width = new DataGridLength(0, DataGridLengthUnitType.Auto);
|
||||
e.Column.Width = DataGridLength.Auto;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1083,19 +1106,19 @@ namespace FAtoPA.Net
|
||||
switch (e.PropertyName)
|
||||
{
|
||||
case "SIID":
|
||||
e.Column.Width = new DataGridLength(0, DataGridLengthUnitType.Auto);
|
||||
e.Column.Width = DataGridLength.Auto;
|
||||
break;
|
||||
case "Register":
|
||||
e.Column.Width = new DataGridLength(0, DataGridLengthUnitType.Auto);
|
||||
e.Column.Width = DataGridLength.Auto;
|
||||
break;
|
||||
case "Description":
|
||||
e.Column.Width = new DataGridLength(1, DataGridLengthUnitType.Star);
|
||||
e.Column.Width = DataGridLength.Auto;
|
||||
break;
|
||||
case "Value":
|
||||
e.Column.Width = new DataGridLength(0, DataGridLengthUnitType.Auto);
|
||||
e.Column.Width = DataGridLength.Auto;
|
||||
break;
|
||||
case "LastUpdate":
|
||||
e.Column.Width = new DataGridLength(0, DataGridLengthUnitType.Auto);
|
||||
e.Column.Width = DataGridLength.Auto;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1106,22 +1129,22 @@ namespace FAtoPA.Net
|
||||
switch (e.PropertyName)
|
||||
{
|
||||
case "SIID":
|
||||
e.Column.Width = new DataGridLength(0, DataGridLengthUnitType.Auto);
|
||||
e.Column.Width = DataGridLength.Auto;
|
||||
break;
|
||||
case "ID":
|
||||
e.Column.Width = new DataGridLength(0, DataGridLengthUnitType.Auto);
|
||||
e.Column.Width = DataGridLength.Auto;
|
||||
break;
|
||||
case "CIN":
|
||||
e.Column.Width = new DataGridLength(0, DataGridLengthUnitType.Auto);
|
||||
e.Column.Width = DataGridLength.Auto;
|
||||
break;
|
||||
case "Description":
|
||||
e.Column.Width = new DataGridLength(1, DataGridLengthUnitType.Star);
|
||||
e.Column.Width = DataGridLength.Auto;
|
||||
break;
|
||||
case "Value":
|
||||
e.Column.Width = new DataGridLength(0, DataGridLengthUnitType.Auto);
|
||||
e.Column.Width = DataGridLength.Auto;
|
||||
break;
|
||||
case "LastUpdate":
|
||||
e.Column.Width = new DataGridLength(0, DataGridLengthUnitType.Auto);
|
||||
e.Column.Width = DataGridLength.Auto;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -1135,13 +1158,23 @@ namespace FAtoPA.Net
|
||||
if (selected.Tag is NodeData)
|
||||
{
|
||||
NodeData data = (NodeData)selected.Tag;
|
||||
FSMData fSMData = new FSMData(data.SIID.ToString(), true, data.Description);
|
||||
if (database.AddFSMData(fSMData))
|
||||
FSMData fSMData = new FSMData(data.SIID.ToString(), true, data.Label, data.Description);
|
||||
|
||||
|
||||
if (database.FSMDataHaveSIID(fSMData.SIID)!=null)
|
||||
{
|
||||
FsmTableMember.Add(fSMData);
|
||||
database.AddFSMData(fSMData);
|
||||
Debug.WriteLine($"database already have SIID={fSMData.SIID}");
|
||||
} else
|
||||
{
|
||||
if (database.AddFSMData(fSMData))
|
||||
{
|
||||
FsmTableMember.Add(fSMData);
|
||||
FSMSIID.Add(fSMData.SIID);
|
||||
Debug.WriteLine($"Added SIID={fSMData.SIID}, Label={fSMData.Label}, Type= {fSMData.Type} to database");
|
||||
}
|
||||
else MessageBox.Show($"Failed to add SIID={fSMData.SIID}, Label={fSMData.Label}, Type={fSMData.Type} to database");
|
||||
}
|
||||
else MessageBox.Show("Failed to add to database");
|
||||
|
||||
}
|
||||
else MessageBox.Show("Selected SIID dont have NodeData");
|
||||
} else MessageBox.Show("No SIID Selected");
|
||||
@@ -1191,19 +1224,23 @@ namespace FAtoPA.Net
|
||||
|
||||
private void refresh_connectedlist()
|
||||
{
|
||||
|
||||
connectedlist.Items.Clear();
|
||||
foreach (ModbusClientRecord client in ModbusSlave)
|
||||
Application.Current.Dispatcher.Invoke(() =>
|
||||
{
|
||||
TextBlock l = new TextBlock();
|
||||
l.Width = connectedlist.Width;
|
||||
l.Margin = new Thickness(5, 0, 5, 0);
|
||||
l.TextWrapping = TextWrapping.Wrap;
|
||||
UpdateLabel(l, client);
|
||||
|
||||
connectedlist.Items.Add(l);
|
||||
}
|
||||
if (connectedcount != null) connectedcount.Content = "Connected : " + connectedlist.Items.Count;
|
||||
connectedlist.Items.Clear();
|
||||
foreach (ModbusClientRecord client in ModbusSlave)
|
||||
{
|
||||
TextBlock l = new TextBlock();
|
||||
l.Width = connectedlist.Width;
|
||||
l.Margin = new Thickness(5, 0, 5, 0);
|
||||
l.TextWrapping = TextWrapping.Wrap;
|
||||
UpdateLabel(l, client);
|
||||
connectedlist.Items.Add(l);
|
||||
|
||||
}
|
||||
if (connectedcount != null) connectedcount.Content = "Connected : " + connectedlist.Items.Count;
|
||||
});
|
||||
|
||||
|
||||
}
|
||||
|
||||
void ModbusSlaveEvent.Log(string msg)
|
||||
@@ -1242,9 +1279,8 @@ namespace FAtoPA.Net
|
||||
|
||||
private void UpdateLabel(TextBlock l, ModbusClientRecord client)
|
||||
{
|
||||
|
||||
l.Text = client.remoteEP + " TX: " + client.TXBytes + " RX: " + client.RXBytes + "TXOK: " + client.TXResponse + " RXOK: " + client.RXValidRequest;
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1276,16 +1312,17 @@ namespace FAtoPA.Net
|
||||
|
||||
public void StatisticUpdate(uint TXOK, uint RXOK, uint TXErr, uint RXerr, uint TXBytes, uint RXBytes)
|
||||
{
|
||||
if (statusbar != null)
|
||||
{
|
||||
statusbar.Dispatcher.Invoke(() =>
|
||||
//if (statusbar != null)
|
||||
//{
|
||||
|
||||
// statusbar.Dispatcher.Invoke(() =>
|
||||
|
||||
{
|
||||
statusbar.Text = "FSM : TXOK: " + TXOK + " RXOK: " + RXOK + " TXErr: " + TXErr + " RXErr: " + RXerr + " TXBytes: " + TXBytes + " RXBytes: " + RXBytes;
|
||||
});
|
||||
// {
|
||||
// statusbar.Text = "FSM : TXOK: " + TXOK + " RXOK: " + RXOK + " TXErr: " + TXErr + " RXErr: " + RXerr + " TXBytes: " + TXBytes + " RXBytes: " + RXBytes;
|
||||
// });
|
||||
|
||||
|
||||
}
|
||||
//}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1305,12 +1342,20 @@ namespace FAtoPA.Net
|
||||
|
||||
public void DiscoveredSIID(string SIID, NodeData type)
|
||||
{
|
||||
Debug.WriteLine("Discovered SIID : " + SIID + " Type : " + type.Description);
|
||||
Application.Current.Dispatcher.Invoke(() =>
|
||||
Debug.WriteLine($"Discovered SIID={SIID} Label={type.Label} Type={type.Description}");
|
||||
if (type.Label != null && type.Label.Length > 0)
|
||||
{
|
||||
listbox.Items.Add(new Label() { Content = $"{SIID} : {type.Label} : {type.Description}", Tag = type });
|
||||
countlabel.Content = "Count : " + listbox.Items.Count;
|
||||
});
|
||||
if (type.Description != null && type.Description.Length > 0)
|
||||
{
|
||||
// yang punya Label dan Description saja yang masuk ke Listbox dan dihitung
|
||||
Application.Current.Dispatcher.Invoke(() =>
|
||||
{
|
||||
listbox.Items.Add(new Label() { Content = $"{SIID} : {type.Label} : {type.Description}", Tag = type });
|
||||
countlabel.Content = "Count : " + listbox.Items.Count;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -1318,8 +1363,10 @@ namespace FAtoPA.Net
|
||||
public void NewState(string SIID, NodeState previous, NodeState current)
|
||||
{
|
||||
Debug.WriteLine("New State : " + SIID + " Previous : " + previous?.LogicalState + " Current : " + current.LogicalState);
|
||||
|
||||
if (data != null)
|
||||
{
|
||||
// update yang ada di FsmTable saja
|
||||
foreach (var dd in data)
|
||||
{
|
||||
if (dd.SIID.Equals(SIID))
|
||||
@@ -1327,6 +1374,7 @@ namespace FAtoPA.Net
|
||||
dd.LastUpdate = DateTime.Now.ToString();
|
||||
dd.Value = current.LogicalState ?? "Unknown";
|
||||
Debug.WriteLine($"Changing row in FSM Table for SIID={SIID} Value={dd.Value}");
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -1344,11 +1392,15 @@ namespace FAtoPA.Net
|
||||
ObservableCollection<FSMData> source;
|
||||
ObservableCollection<ModbusData> data;
|
||||
ModbusSlave slave;
|
||||
public ModbusTriggerFromFSM(ObservableCollection<FSMData> source, ObservableCollection<ModbusData> data, ModbusSlave slave)
|
||||
List<String> ConditionON;
|
||||
List<String> ConditionOFF;
|
||||
public ModbusTriggerFromFSM(ObservableCollection<FSMData> source, ObservableCollection<ModbusData> data, ModbusSlave slave, List<string> conditionON, List<string> conditionOFF)
|
||||
{
|
||||
this.source = source;
|
||||
this.data = data;
|
||||
this.slave = slave;
|
||||
ConditionON = conditionON;
|
||||
ConditionOFF = conditionOFF;
|
||||
}
|
||||
public void DiscoveredSIID(string SIID, NodeData type)
|
||||
{
|
||||
@@ -1358,33 +1410,71 @@ namespace FAtoPA.Net
|
||||
|
||||
public void NewState(string SIID, NodeState previous, NodeState current)
|
||||
{
|
||||
//FSMData src = source.First(d => d.SIID == SIID);
|
||||
//ModbusData dt = data.First(d => d.SIID == SIID);
|
||||
//if (src != null && dt != null)
|
||||
//{
|
||||
// if (src.Enable)
|
||||
// {
|
||||
// if (dt.Register >= 0)
|
||||
// {
|
||||
// dt.LastUpdate = DateTime.Now.ToString();
|
||||
// dt.Value = current.LogicalState ?? "Unknown";
|
||||
// if (slave != null)
|
||||
// {
|
||||
// switch (current.LogicalState)
|
||||
// {
|
||||
// case "ON":
|
||||
// slave.SetRegister(dt.Register, 1);
|
||||
// break;
|
||||
// case "NORMAL":
|
||||
// case "OFF":
|
||||
// slave.SetRegister(dt.Register, 0);
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
||||
// }
|
||||
//}
|
||||
FSMData src = null;
|
||||
ModbusData dt = null;
|
||||
foreach(var x in source)
|
||||
{
|
||||
if (x.SIID.Equals(SIID))
|
||||
{
|
||||
src = x;
|
||||
break;
|
||||
}
|
||||
}
|
||||
foreach (var x in data)
|
||||
{
|
||||
if (x.SIID.Equals(SIID))
|
||||
{
|
||||
dt = x;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (src != null && dt != null)
|
||||
{
|
||||
if (src.Enable)
|
||||
{
|
||||
if (dt.Register >= 0)
|
||||
{
|
||||
if (slave != null)
|
||||
{
|
||||
if (ConditionON != null && ConditionOFF != null)
|
||||
{
|
||||
if (ConditionON.Contains(current.LogicalState))
|
||||
{
|
||||
Debug.WriteLine($"NewState for SIID={SIID} State={current.LogicalState} is ConditionON");
|
||||
slave.SetRegister(dt.Register, 1);
|
||||
dt.Value = "ON";
|
||||
}
|
||||
else if (ConditionOFF.Contains(current.LogicalState))
|
||||
{
|
||||
Debug.WriteLine($"NewState for SIID={SIID} State={current.LogicalState} is ConditionOFF");
|
||||
slave.SetRegister(dt.Register, 0);
|
||||
dt.Value = "OFF";
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.WriteLine($"NewState for SIID={SIID} in Modbus is ignored because Condition ON/OFF is not met");
|
||||
dt.Value = "RULE NOT AVAILABLE";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.WriteLine($"Condition ON/OFF for SIID={SIID} in Modbus is not set");
|
||||
dt.Value = "RULE NOT SET";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.WriteLine($"Not connected to Modbus Slave, NewState for SIID={SIID} in Modbus is ignored");
|
||||
dt.Value = "NO MODBUS";
|
||||
}
|
||||
dt.LastUpdate = DateTime.Now.ToString();
|
||||
|
||||
|
||||
} else Debug.WriteLine($"NewState for SIID={SIID} in Modbus is ignored because Register is not set");
|
||||
} else Debug.WriteLine($"NewState for SIID={SIID} in Modbus is ignored because FSMData is Disabled");
|
||||
} else Debug.WriteLine($"NewState for SIID={SIID} in Modbus is ignored because not registered in ModbusTable");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1394,11 +1484,15 @@ namespace FAtoPA.Net
|
||||
ObservableCollection<VXData> data;
|
||||
ObservableCollection<FSMData> source;
|
||||
VX3K vx;
|
||||
public VXTriggerFromFSM(ObservableCollection<FSMData> source, ObservableCollection<VXData> data, VX3K vx)
|
||||
List<String> ConditionON;
|
||||
List<String> ConditionOFF;
|
||||
public VXTriggerFromFSM(ObservableCollection<FSMData> source, ObservableCollection<VXData> data, VX3K vx, List<string> conditionON, List<string> conditionOFF)
|
||||
{
|
||||
this.source = source;
|
||||
this.data = data;
|
||||
this.vx = vx;
|
||||
ConditionON = conditionON;
|
||||
ConditionOFF = conditionOFF;
|
||||
}
|
||||
public void DiscoveredSIID(string SIID, NodeData type)
|
||||
{
|
||||
@@ -1408,31 +1502,66 @@ namespace FAtoPA.Net
|
||||
|
||||
public void NewState(string SIID, NodeState previous, NodeState current)
|
||||
{
|
||||
//FSMData src = source.First(d => d.SIID == SIID);
|
||||
//VXData dt = data.First(d => d.SIID == SIID);
|
||||
//if (src != null && dt != null)
|
||||
//{
|
||||
// if (src.Enable)
|
||||
// {
|
||||
// dt.LastUpdate = DateTime.Now.ToString();
|
||||
// dt.Value = current.LogicalState ?? "Unknown";
|
||||
// if (vx != null && vx.IsConnected())
|
||||
// {
|
||||
// switch (current.LogicalState)
|
||||
// {
|
||||
// case "ON":
|
||||
// vx.Virtual_Contact_Input(dt.FrameID, dt.CIN, true);
|
||||
// break;
|
||||
// case "NORMAL":
|
||||
// case "OFF":
|
||||
// vx.Virtual_Contact_Input(dt.FrameID, dt.CIN, false);
|
||||
// break;
|
||||
// }
|
||||
FSMData src = null;
|
||||
VXData dt = null;
|
||||
foreach (var x in source)
|
||||
{
|
||||
if (x.SIID.Equals(SIID))
|
||||
{
|
||||
src = x;
|
||||
break;
|
||||
}
|
||||
}
|
||||
foreach (var x in data)
|
||||
{
|
||||
if (x.SIID.Equals(SIID))
|
||||
{
|
||||
dt = x;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// }
|
||||
if (src != null && dt != null)
|
||||
{
|
||||
if (src.Enable)
|
||||
{
|
||||
if (vx != null && vx.IsConnected())
|
||||
{
|
||||
if (ConditionON != null && ConditionOFF != null)
|
||||
{
|
||||
if (ConditionON.Contains(current.LogicalState))
|
||||
{
|
||||
Debug.WriteLine($"NewState for SIID={SIID} State={current.LogicalState} is ConditionON");
|
||||
vx.Virtual_Contact_Input(dt.FrameID, dt.CIN, true);
|
||||
dt.Value = "ON";
|
||||
}
|
||||
else if (ConditionOFF.Contains(current.LogicalState))
|
||||
{
|
||||
Debug.WriteLine($"NewState for SIID={SIID} State={current.LogicalState} is ConditionOFF");
|
||||
vx.Virtual_Contact_Input(dt.FrameID, dt.CIN, false);
|
||||
dt.Value = "OFF";
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.WriteLine($"NewState for SIID={SIID} in VX3K is ignored because Condition ON/OFF is not met");
|
||||
dt.Value = "RULE NOT AVAILABLE";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.WriteLine($"Condition ON/OFF for SIID={SIID} in VX3K is not set");
|
||||
dt.Value = "RULE NOT SET";
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.WriteLine($"Not connected to VX3K, NewState for SIID={SIID} in VX3K is ignored");
|
||||
dt.Value = "NO VX";
|
||||
}
|
||||
dt.LastUpdate = DateTime.Now.ToString();
|
||||
} else Debug.WriteLine($"NewState for SIID={SIID} in VX3K is ignored because FSMData is Disabled");
|
||||
} else Debug.WriteLine($"NewState for SIID={SIID} in VX3K is ignored because not registered in VXTable");
|
||||
|
||||
// }
|
||||
//}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user