add translation table from FSM LogicalState to Modbus Register Value
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user