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

@@ -17,6 +17,21 @@
<Deterministic>true</Deterministic> <Deterministic>true</Deterministic>
<NuGetPackageImportStamp> <NuGetPackageImportStamp>
</NuGetPackageImportStamp> </NuGetPackageImportStamp>
<PublishUrl>publish\</PublishUrl>
<Install>true</Install>
<InstallFrom>Disk</InstallFrom>
<UpdateEnabled>false</UpdateEnabled>
<UpdateMode>Foreground</UpdateMode>
<UpdateInterval>7</UpdateInterval>
<UpdateIntervalUnits>Days</UpdateIntervalUnits>
<UpdatePeriodically>false</UpdatePeriodically>
<UpdateRequired>false</UpdateRequired>
<MapFileExtensions>true</MapFileExtensions>
<ApplicationRevision>0</ApplicationRevision>
<ApplicationVersion>1.0.0.%2a</ApplicationVersion>
<IsWebBootstrapper>false</IsWebBootstrapper>
<UseApplicationTrust>false</UseApplicationTrust>
<BootstrapperEnabled>true</BootstrapperEnabled>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget> <PlatformTarget>AnyCPU</PlatformTarget>
@@ -170,7 +185,11 @@
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType> <SubType>Designer</SubType>
</ApplicationDefinition> </ApplicationDefinition>
<Compile Include="FSMModbusData.cs" />
<Compile Include="VX3K.cs" /> <Compile Include="VX3K.cs" />
<Compile Include="InputBox.xaml.cs">
<DependentUpon>InputBox.xaml</DependentUpon>
</Compile>
<Page Include="MainWindow.xaml"> <Page Include="MainWindow.xaml">
<Generator>MSBuild:Compile</Generator> <Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType> <SubType>Designer</SubType>
@@ -188,6 +207,10 @@
<DependentUpon>MainWindow.xaml</DependentUpon> <DependentUpon>MainWindow.xaml</DependentUpon>
<SubType>Code</SubType> <SubType>Code</SubType>
</Compile> </Compile>
<Page Include="InputBox.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="MappingData.cs" /> <Compile Include="MappingData.cs" />
@@ -219,6 +242,18 @@
<ItemGroup> <ItemGroup>
<None Include="App.config" /> <None Include="App.config" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<BootstrapperPackage Include=".NETFramework,Version=v4.8">
<Visible>False</Visible>
<ProductName>Microsoft .NET Framework 4.8 %28x86 and x64%29</ProductName>
<Install>true</Install>
</BootstrapperPackage>
<BootstrapperPackage Include="Microsoft.Net.Framework.3.5.SP1">
<Visible>False</Visible>
<ProductName>.NET Framework 3.5 SP1</ProductName>
<Install>false</Install>
</BootstrapperPackage>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild"> <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup> <PropertyGroup>

17
FSM.cs
View File

@@ -12,6 +12,9 @@ using System.Threading.Tasks;
namespace FAtoPA namespace FAtoPA
{ {
/// <summary>
/// Class to handle Fire Alarm System Monitoring
/// </summary>
class FSM class FSM
{ {
public static bool Started = false; public static bool Started = false;
@@ -21,6 +24,11 @@ namespace FAtoPA
public Dictionary<int, String> ItemTypeDictionary { get; } public Dictionary<int, String> ItemTypeDictionary { get; }
public Dictionary<String, NodeData> AvailableNodes { get; } public Dictionary<String, NodeData> AvailableNodes { get; }
private EventInterface _event; private EventInterface _event;
/// <summary>
/// to count the incoming event, then update at _event;
/// </summary>
public static long eventcounter = 0;
public FSM(EventInterface callback) public FSM(EventInterface callback)
{ {
_event = callback; _event = callback;
@@ -75,6 +83,7 @@ namespace FAtoPA
/// </summary> /// </summary>
public void Start() public void Start()
{ {
eventcounter = 0;
controller = FSIController.GetInstance(); controller = FSIController.GetInstance();
// internal Listeners // internal Listeners
controller.AddListener(new ConfigListener(ItemTypeDictionary, AvailableNodes, listenerlist)); controller.AddListener(new ConfigListener(ItemTypeDictionary, AvailableNodes, listenerlist));
@@ -150,6 +159,7 @@ namespace FAtoPA
public void SetItemType(ItemType devItemType) public void SetItemType(ItemType devItemType)
{ {
//Debug.WriteLine($"Item type {devItemType.FunctionalType} ({devItemType.Description})"); //Debug.WriteLine($"Item type {devItemType.FunctionalType} ({devItemType.Description})");
if (type_dictionary != null) if (type_dictionary != null)
{ {
int type = int.Parse(devItemType.FunctionalType.ToString()); int type = int.Parse(devItemType.FunctionalType.ToString());
@@ -161,6 +171,9 @@ namespace FAtoPA
else Debug.WriteLine($"type_dictionary already have key={type}"); else Debug.WriteLine($"type_dictionary already have key={type}");
} }
FSM.eventcounter++;
} }
/// <summary> /// <summary>
@@ -191,6 +204,7 @@ namespace FAtoPA
} }
else Debug.WriteLine($"node_data already have SIID={SIID}"); else Debug.WriteLine($"node_data already have SIID={SIID}");
} }
FSM.eventcounter++;
} }
@@ -207,6 +221,7 @@ namespace FAtoPA
if (node_data.ContainsKey(SIID)) node_data.Remove(SIID); if (node_data.ContainsKey(SIID)) node_data.Remove(SIID);
} }
FSM.eventcounter++;
} }
} }
@@ -261,6 +276,7 @@ namespace FAtoPA
} else Debug.WriteLine("node_data is null"); } else Debug.WriteLine("node_data is null");
FSM.eventcounter++;
} }
@@ -271,6 +287,7 @@ namespace FAtoPA
public void SetMPNetTime(DateTime mpNetTime) public void SetMPNetTime(DateTime mpNetTime)
{ {
Debug.WriteLine($"Time is {mpNetTime}"); Debug.WriteLine($"Time is {mpNetTime}");
FSM.eventcounter++;
} }
} }

52
FSMModbusData.cs Normal file
View File

@@ -0,0 +1,52 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FAtoPA.Net
{
internal class FSMModbusData : INotifyPropertyChanged
{
private string _logicalstate;
public String LogicalState
{
get { return _logicalstate; }
set
{
if (_logicalstate != value)
{
_logicalstate = value;
OnPropertyChanged(nameof(LogicalState));
}
}
}
private short _register;
public short Register
{
get { return _register; }
set
{
if (_register != value)
{
_register = value;
OnPropertyChanged(nameof(Register));
}
}
}
public FSMModbusData(String logicalstate, short register)
{
LogicalState = logicalstate;
Register = register;
}
protected void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public event PropertyChangedEventHandler PropertyChanged;
}
}

43
InputBox.xaml Normal file
View File

@@ -0,0 +1,43 @@
<Window x:Class="FAtoPA.Net.InputBox"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:FAtoPA.Net"
mc:Ignorable="d"
Title="FSM To Modbus Register" Height="200" Width="250">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid Grid.Row="0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="AUTO"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Label Grid.Column="0" Content="Logical State" VerticalContentAlignment="Center"/>
<Border Grid.Column="1" BorderBrush="Black" BorderThickness="1" Margin="5">
<TextBlock x:Name="txtLogicalState" />
</Border>
</Grid>
<Grid Grid.Row="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="AUTO"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Label Grid.Column="0" Content="Modbus Register" VerticalContentAlignment="Center"/>
<ComboBox Grid.Column="1" x:Name="cbModbusRegister" Margin="5" />
</Grid>
<Grid Grid.Row="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Button Grid.Column="0" Content="Cancel" Margin="5" Click="Cancel_Click"/>
<Button Grid.Column="1" Content="OK" Margin="5" Click="OK_Click"/>
</Grid>
</Grid>
</Window>

77
InputBox.xaml.cs Normal file
View File

@@ -0,0 +1,77 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
namespace FAtoPA.Net
{
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class InputBox : Window
{
private String _key;
public String FsmState { get => _key; }
private short _value;
public short ModbusRegister { get => _value; }
private List<short> ModbusRegisters;
public InputBox(string key, short value)
{
_key = key;
_value = value;
ModbusRegisters = new List<short>();
for (short i = 0; i < 10; i++)
{
ModbusRegisters.Add(i);
}
InitializeComponent();
cbModbusRegister.ItemsSource = ModbusRegisters;
txtLogicalState.Text = key;
cbModbusRegister.SelectedIndex = ModbusRegisters.IndexOf(value);
DataContext = this;
}
private void Cancel_Click(object sender, RoutedEventArgs e)
{
this.DialogResult = false;
Close();
}
private void OK_Click(object sender, RoutedEventArgs e)
{
if (cbModbusRegister.SelectedIndex != -1)
{
var selected = cbModbusRegister.SelectedItem;
if (selected != null)
{
short vv = (short)selected;
if (vv!= _value)
{
_value = vv;
this.DialogResult = true;
} else { this.DialogResult = false; }
Close();
return;
}
}
MessageBox.Show("Please select a Modbus Register");
}
}
}

View File

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