From b3f5ebc53a7a55b14701b40c601b4d1b7b5d49b3 Mon Sep 17 00:00:00 2001 From: Miguel Date: Sun, 23 Jun 2024 00:07:41 +0200 Subject: [PATCH] Mejorado UserControl --- Icons/connect.png | Bin 0 -> 8622 bytes LibS7Adv.csproj | 9 +++ PLCControl.xaml | 69 ++++++++++---------- PLCViewModel.cs | 156 ++++++++++++++++++++++++++++++---------------- 4 files changed, 145 insertions(+), 89 deletions(-) create mode 100644 Icons/connect.png diff --git a/Icons/connect.png b/Icons/connect.png new file mode 100644 index 0000000000000000000000000000000000000000..4a0bf70172926cf9d3f1896792ea21ffafca3d13 GIT binary patch literal 8622 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 M)=oR_ZVx#9fAdd3D*ylh literal 0 HcmV?d00001 diff --git a/LibS7Adv.csproj b/LibS7Adv.csproj index 6ece5ae..2bbcb22 100644 --- a/LibS7Adv.csproj +++ b/LibS7Adv.csproj @@ -7,8 +7,13 @@ enable + + + + + @@ -18,4 +23,8 @@ + + + + diff --git a/PLCControl.xaml b/PLCControl.xaml index ea1ea6d..c5dad9f 100644 --- a/PLCControl.xaml +++ b/PLCControl.xaml @@ -1,44 +1,43 @@  - + xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:LibS7Adv" + xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit" > + + + + + + + + - - - - - - - - - - - - - + diff --git a/PLCViewModel.cs b/PLCViewModel.cs index 4368289..101e5bf 100644 --- a/PLCViewModel.cs +++ b/PLCViewModel.cs @@ -3,18 +3,50 @@ using CommunityToolkit.Mvvm.Input; using Siemens.Simatic.Simulation.Runtime; using Newtonsoft.Json; using System.Text.RegularExpressions; -using System.Text.RegularExpressions; -using System.Threading.Tasks; -using Siemens.Simatic.Simulation.Runtime; +using System.ComponentModel; +using Newtonsoft.Json.Linq; namespace LibS7Adv { + [DisplayName("PLC Advanced Setup")] + public partial class PlcData : ObservableObject + { + [ObservableProperty] + [property: Description("IP of the PLC")] + [property: Category("Connection:")] + string iP = "10.1.30.11"; + + [ObservableProperty] + [property: Description("Name of the instance at the PLC Advanced")] + [property: Category("Connection:")] + string name = "PLC Name"; + + [ObservableProperty] + [property: Description("CPU Info")] + [property: Category("Status:")] + string cpuTime; + + [ObservableProperty] + [property: Description("CPU Status")] + [property: Category("Status:")] + string connectionStatus; + + [ObservableProperty] + [property: Description("API Error")] + [property: Category("Status:")] + string lastError; + } + public partial class PLCViewModel : ObservableObject { [JsonIgnore] private IInstance Instance { get; set; } + private bool IsConfigured { get; set; } + [ObservableProperty] + PlcData plcData = new PlcData(); + public PLCViewModel() { @@ -23,69 +55,60 @@ namespace LibS7Adv public void ucLoaded() { IsConnected = false; - lastError = ""; - connectionStatus = "offline"; + PlcData.LastError = ""; + PlcData.ConnectionStatus = "offline"; } - [ObservableProperty] - string iP = "10.1.30.11"; - - [ObservableProperty] - string name = "PLC Name"; - - [ObservableProperty] - string cpuTime; - - [ObservableProperty] - string connectionStatus; - - [ObservableProperty] - string lastError; - [ObservableProperty] [property: JsonIgnore] bool isConnected; [RelayCommand] [property: JsonIgnore] + public void ConnectButton() + { + if (isConnected) + Disconnect(); + else + Connect(); + } + public void Connect() { try { // Implementa la conexión utilizando PLCModel - Instance = SimulationRuntimeManager.CreateInterface(Name); + Instance = SimulationRuntimeManager.CreateInterface(PlcData.Name); Instance.OnSoftwareConfigurationChanged += Instance_OnSoftwareConfigurationChanged; //_plcModel.Instance.CommunicationInterface = ECommunicationInterface.Softbus; if (Instance != null) { UpdateTagList(); - ConnectionStatus = Instance.OperatingState.ToString(); + PlcData.ConnectionStatus = Instance.OperatingState.ToString(); IsConnected = true; } } catch (Exception ex) { - LastError = ex.Message; - ConnectionStatus = "offline"; + PlcData.LastError = ex.Message; + PlcData.ConnectionStatus = "offline"; } } + public void Disconnect() + { + IsConnected = false; + PlcData.ConnectionStatus = "offline"; + Instance = null; + } + + private void Instance_OnSoftwareConfigurationChanged(IInstance instance, SOnSoftwareConfigChangedParameter event_param) { UpdateTagList(); } - [RelayCommand] - [property: JsonIgnore] - public void Disconnect() - { - IsConnected = false; - ConnectionStatus = "offline"; - Instance = null; - } - - public void UpdateTagList() { IsConfigured = false; @@ -96,7 +119,7 @@ namespace LibS7Adv } catch (Exception ex) { - LastError = ex.Message; + PlcData.LastError = ex.Message; } } @@ -106,7 +129,7 @@ namespace LibS7Adv { if (!isConnected) { - LastError = "Not Connected"; + PlcData.LastError = "Not Connected"; return false; } if (sTag == null) @@ -128,7 +151,7 @@ namespace LibS7Adv } catch (Exception ex) { - LastError = sTag + ":" + ex.Message; + PlcData.LastError = sTag + ":" + ex.Message; return false; } } @@ -139,7 +162,7 @@ namespace LibS7Adv { if (!isConnected) { - LastError = "Not Connected"; + PlcData.LastError = "Not Connected"; return false; } if (sTag == null) @@ -162,19 +185,19 @@ namespace LibS7Adv } catch (Exception ex) { - LastError = sTag + ":" + ex.Message; + PlcData.LastError = sTag + ":" + ex.Message; return false; } } - public string? LeerNumber(string sTag) + public string? LeerNumber(string sTag, bool Signed = false) { try { if (!isConnected) { - LastError = "Not Connected"; + PlcData.LastError = "Not Connected"; return ""; } if (sTag == null) @@ -190,26 +213,51 @@ namespace LibS7Adv { // Read not Work for ImputArea if (tag.areaType == EArea.Output) - return Instance?.OutputArea.ReadByte(tag.word_offset).ToString(); + { + var val = Instance?.OutputArea.ReadByte(tag.word_offset); + if (Signed) + return val > 127 ? (val - 256).ToString() : val.ToString(); + return val.ToString(); + } if (tag.areaType == EArea.Marker) - return Instance?.MarkerArea.ReadByte(tag.word_offset).ToString(); + { + var val = Instance?.MarkerArea.ReadByte(tag.word_offset); + if (Signed) + return val > 127 ? (val-256).ToString() : val.ToString(); + return val.ToString(); + } } else if (tag.tagType == EDataType.Word) { // Read not Work for ImputArea if (tag.areaType == EArea.Output) - return Instance?.OutputArea.ReadBytes(tag.word_offset,2).ToString(); + { + int value; + byte[] bytes = Instance?.OutputArea.ReadBytes(tag.word_offset, 2); + Array.Reverse(bytes); + if (Signed) + value = BitConverter.ToInt16(bytes, 0); + else + value = BitConverter.ToUInt16(bytes, 0); + return value.ToString(); + } if (tag.areaType == EArea.Marker) { + int value; byte[] bytes = Instance?.MarkerArea.ReadBytes(tag.word_offset, 2); - return (bytes[0] + bytes[1]*256).ToString(); + Array.Reverse(bytes); + if (Signed) + value = BitConverter.ToInt16(bytes, 0); + else + value = BitConverter.ToUInt16(bytes, 0); + return value.ToString(); } } return ""; } catch (Exception ex) { - LastError = sTag + ":" + ex.Message; + PlcData.LastError = sTag + ":" + ex.Message; return ""; } } @@ -224,7 +272,7 @@ namespace LibS7Adv } catch (Exception ex) { - LastError = ex.Message; + PlcData.LastError = ex.Message; return false; } } @@ -237,7 +285,7 @@ namespace LibS7Adv } catch (Exception ex) { - LastError = ex.Message; + PlcData.LastError = ex.Message; } } public void EscribirTag(string pTag, SDataValue Value) @@ -248,7 +296,7 @@ namespace LibS7Adv } catch (Exception ex) { - LastError = pTag + ":" + ex.Message; + PlcData.LastError = pTag + ":" + ex.Message; } } public SDataValue LeerTag(string pTag) @@ -259,7 +307,7 @@ namespace LibS7Adv } catch (Exception ex) { - LastError = pTag + ":" + ex.Message; + PlcData.LastError = pTag + ":" + ex.Message; return new SDataValue(); } } @@ -271,7 +319,7 @@ namespace LibS7Adv } catch (Exception ex) { - LastError = pTag + ":" + ex.Message; + PlcData.LastError = pTag + ":" + ex.Message; } } public void EscribirTagInt16(string pTag, int pValue) @@ -282,7 +330,7 @@ namespace LibS7Adv } catch (Exception ex) { - LastError = pTag + ":" + ex.Message; + PlcData.LastError = pTag + ":" + ex.Message; } } @@ -294,7 +342,7 @@ namespace LibS7Adv } catch (Exception ex) { - LastError = pTag + ":" + ex.Message; + PlcData.LastError = pTag + ":" + ex.Message; return false; } } @@ -307,7 +355,7 @@ namespace LibS7Adv } catch (Exception ex) { - LastError = pTag + ":" + ex.Message; + PlcData.LastError = pTag + ":" + ex.Message; return 0; } }