add translation table from FSM LogicalState to Modbus Register Value

This commit is contained in:
2024-11-25 15:55:47 +07:00
parent 44daa44b6d
commit 5e28088303
6 changed files with 323 additions and 93 deletions

View File

@@ -58,10 +58,9 @@ namespace FAtoPA.Net
ObservableCollection<VXData> VXTableMember { get; set; }
// tabel translation FSM Status String to Modbus Register Value
public ObservableCollection<KeyValuePair<String, Int16>> ModbusTranslationTable { get; set; }
ObservableCollection<FSMModbusData> ModbusTranslationTable;
public List<String> ConditionON;
public List<String> ConditionOFF;
FSMEvent fsmEvent;
public MainWindow()
@@ -112,15 +111,6 @@ namespace FAtoPA.Net
siType.ItemsSource = Enum.GetValues(typeof(SIType)).Cast<SIType>().ToList();
//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());
Load_ModbusTranslationTable();
DataContext = this;
@@ -137,7 +127,7 @@ namespace FAtoPA.Net
String loadedJson = File.ReadAllText("ModbusTranslationTable.json");
try
{
ModbusTranslationTable = JsonSerializer.Deserialize<ObservableCollection<KeyValuePair<string, short>>>(loadedJson);
ModbusTranslationTable = JsonSerializer.Deserialize<ObservableCollection<FSMModbusData>>(loadedJson);
Debug.WriteLine("ModbusTranslationTable loaded");
}
catch (Exception ex)
@@ -159,53 +149,53 @@ namespace FAtoPA.Net
/// </summary>
private void Create_Default_ModbusTranslationTable()
{
ModbusTranslationTable = new ObservableCollection<KeyValuePair<string, short>>();
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.INVALID.ToString(), 0));
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.NORMAL.ToString(), 0));
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.TROUBLE.ToString(), 0));
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.FIRE.ToString(), 0));
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.FIRE_PRE.ToString(), 0));
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.VERIFY_FIRE.ToString(), 0));
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.HEAT.ToString(), 0));
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.SUPERVISORY.ToString(), 0));
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.SMOKE.ToString(), 0));
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.ACTIVATION.ToString(), 0));
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.ACTIVATION_FAILED.ToString(), 0));
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.TAMPER.ToString(), 0));
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.COVER_OPEN.ToString(), 0));
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.PAPER_OUT.ToString(), 0));
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.WARNING.ToString(), 0));
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.TROUBLE_LIGHT.ToString(), 0));
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.WATCHDOGRESTART.ToString(), 0));
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.ON.ToString(), 0));
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.OFF.ToString(), 0));
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.POLLUTION.ToString(), 0));
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.POLLUTION_LIGHT.ToString(), 0));
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.MONITOR.ToString(), 0));
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.WATER.ToString(), 0));
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.POWERFAIL.ToString(), 0));
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.MANUAL_ALARM.ToString(), 0));
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.PAS_WAIT_FOR_ACK.ToString(), 0));
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.PAS_INVESTIGATE.ToString(), 0));
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.AC_CHANGED.ToString(), 0));
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.AC_COUNTDOWN_STARTED.ToString(), 0));
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.AC_TAMPER.ToString(), 0));
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.FIRE_INT.ToString(), 0));
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.ERROR.ToString(), 0));
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.UNKNOWN.ToString(), 0));
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.MATCHALL.ToString(), 0));
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.NET_CONFIG_MISMATCH.ToString(), 0));
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.UNKNOWN_ITEM.ToString(), 0));
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.MISSING_ITEM.ToString(), 0));
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.INCOMPATIBLE_SOFTWARE.ToString(), 0));
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.INCOMPATIBLE_NET_PROTOCOL.ToString(), 0));
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.INFO_ALARM.ToString(), 0));
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.CHEMICAL.ToString(), 0));
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.WARNING_HEAT.ToString(), 0));
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.WARNING_SMOKE.ToString(), 0));
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.WARNING_CHEMICAL.ToString(), 0));
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.REBOOT_READY.ToString(), 0));
ModbusTranslationTable.Add(new KeyValuePair<string, short>(SILogicalState.LASTLOGICAL.ToString(), 0));
ModbusTranslationTable = new ObservableCollection<FSMModbusData>();
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.INVALID.ToString(), 0));
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.NORMAL.ToString(), 0));
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.TROUBLE.ToString(), 0));
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.FIRE.ToString(), 0));
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.FIRE_PRE.ToString(), 0));
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.VERIFY_FIRE.ToString(), 0));
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.HEAT.ToString(), 0));
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.SUPERVISORY.ToString(), 0));
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.SMOKE.ToString(), 0));
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.ACTIVATION.ToString(), 0));
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.ACTIVATION_FAILED.ToString(), 0));
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.TAMPER.ToString(), 0));
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.COVER_OPEN.ToString(), 0));
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.PAPER_OUT.ToString(), 0));
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.WARNING.ToString(), 0));
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.TROUBLE_LIGHT.ToString(), 0));
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.WATCHDOGRESTART.ToString(), 0));
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.ON.ToString(), 0));
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.OFF.ToString(), 0));
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.POLLUTION.ToString(), 0));
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.POLLUTION_LIGHT.ToString(), 0));
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.MONITOR.ToString(), 0));
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.WATER.ToString(), 0));
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.POWERFAIL.ToString(), 0));
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.MANUAL_ALARM.ToString(), 0));
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.PAS_WAIT_FOR_ACK.ToString(), 0));
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.PAS_INVESTIGATE.ToString(), 0));
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.AC_CHANGED.ToString(), 0));
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.AC_COUNTDOWN_STARTED.ToString(), 0));
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.AC_TAMPER.ToString(), 0));
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.FIRE_INT.ToString(), 0));
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.ERROR.ToString(), 0));
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.UNKNOWN.ToString(), 0));
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.MATCHALL.ToString(), 0));
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.NET_CONFIG_MISMATCH.ToString(), 0));
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.UNKNOWN_ITEM.ToString(), 0));
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.MISSING_ITEM.ToString(), 0));
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.INCOMPATIBLE_SOFTWARE.ToString(), 0));
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.INCOMPATIBLE_NET_PROTOCOL.ToString(), 0));
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.INFO_ALARM.ToString(), 0));
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.CHEMICAL.ToString(), 0));
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.WARNING_HEAT.ToString(), 0));
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.WARNING_SMOKE.ToString(), 0));
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.WARNING_CHEMICAL.ToString(), 0));
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.REBOOT_READY.ToString(), 0));
ModbusTranslationTable.Add(new FSMModbusData(SILogicalState.LASTLOGICAL.ToString(), 0));
Save_ModbusTranslationTable();
}
@@ -306,9 +296,12 @@ namespace FAtoPA.Net
vx3k = new VX3K(new VX3KEvent(this.vxstatusbar));
//vx3k.Connect(config.VX_TargetIP, config.VX_TargetPort);
List<String> ConditionON = new List<string>();
List<String> ConditionOFF = new List<string>();
fsm.AddListener(new FSMTableUpdater(FsmTableMember, DetectedSIID, DetectedSIIDCount));
fsm.AddListener(new ModbusTriggerFromFSM(FsmTableMember, ModbusTableMember, modbusSlave, ConditionON, ConditionOFF));
fsm.AddListener(new ModbusTriggerFromFSM(FsmTableMember, ModbusTableMember, modbusSlave, ModbusTranslationTable));
fsm.AddListener(new VXTriggerFromFSM(FsmTableMember, VXTableMember, vx3k, ConditionON, ConditionOFF));
}
@@ -1183,10 +1176,10 @@ namespace FAtoPA.Net
Debug.WriteLine("FSMtoModbusTranslationTable_AutoGeneratingColumn : " + e.PropertyName);
switch (e.PropertyName)
{
case "Key":
case "LogicalState":
e.Column.Width = DataGridLength.Auto;
break;
case "Value":
case "Register":
e.Column.Width = DataGridLength.Auto;
break;
@@ -1202,9 +1195,26 @@ namespace FAtoPA.Net
try
{
KeyValuePair<String, Int16> vv = (KeyValuePair<String, Int16>)selected;
Debug.WriteLine($"Selected Key={vv.Key}, Value={vv.Value}");
//TODO create InputBox to select Value for Key
FSMModbusData vv = (FSMModbusData)selected;
Debug.WriteLine($"Selected Key={vv.LogicalState}, Value={vv.Register}");
InputBox ib = new InputBox(vv.LogicalState, vv.Register);
bool? haschange = ib.ShowDialog();
if (haschange.Value)
{
Debug.WriteLine($"Changed Key={ib.FsmState}, Value={ib.ModbusRegister}");
for (int ii = 0; ii < ModbusTranslationTable.Count; ii++)
{
if (ModbusTranslationTable[ii].LogicalState == vv.LogicalState)
{
ModbusTranslationTable[ii].Register = ib.ModbusRegister;
break;
}
}
FSMtoModbusTranslationTable.InvalidateProperty(DataGrid.ItemsSourceProperty);
}
} catch(Exception exception)
{
Debug.WriteLine("FSMtoModbusTranslationTable_MouseDoubleClick Error : " + exception.Message);
@@ -1469,15 +1479,13 @@ namespace FAtoPA.Net
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)
ObservableCollection<FSMModbusData> translation;
public ModbusTriggerFromFSM(ObservableCollection<FSMData> source, ObservableCollection<ModbusData> data, ModbusSlave slave, ObservableCollection<FSMModbusData> translation)
{
this.source = source;
this.data = data;
this.slave = slave;
ConditionON = conditionON;
ConditionOFF = conditionOFF;
this.translation = translation;
}
/// <summary>
@@ -1522,29 +1530,27 @@ namespace FAtoPA.Net
{
if (slave != null)
{
if (ConditionON != null && ConditionOFF != null)
if (translation != null)
{
if (ConditionON.Contains(current.LogicalState))
foreach (var x in translation)
{
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";
if (x.LogicalState.Equals(current.LogicalState))
{
ushort reg = (ushort)x.Register;
Debug.WriteLine($"NewState for SIID={SIID} State={current.LogicalState} is Register={reg}");
slave.SetRegister(dt.Register, reg);
dt.Value = "" + reg;
dt.LastUpdate = DateTime.Now.ToString();
return;
}
}
Debug.WriteLine($"Translation for SIID={SIID} LogicalState={current.LogicalState} is not found");
dt.Value = "RULE NOT SET";
}
else
{
Debug.WriteLine($"Condition ON/OFF for SIID={SIID} in Modbus is not set");
Debug.WriteLine($"Translation for SIID={SIID} in Modbus is not set");
dt.Value = "RULE NOT SET";
}
}
@@ -1570,8 +1576,8 @@ namespace FAtoPA.Net
ObservableCollection<VXData> data;
ObservableCollection<FSMData> source;
VX3K vx;
List<String> ConditionON;
List<String> ConditionOFF;
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;