From 5d8582316770fc6555f019a03183bb9a00f87175 Mon Sep 17 00:00:00 2001 From: Peter Butzhammer Date: Thu, 8 Feb 2024 18:06:55 +0100 Subject: [PATCH] Verify data types --- Sharp7.Rx/S7VariableNameParser.cs | 7 ++++--- Sharp7.Rx/Sharp7Plc.cs | 18 ++++++++++++------ 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/Sharp7.Rx/S7VariableNameParser.cs b/Sharp7.Rx/S7VariableNameParser.cs index 38cecc3..b53fcc9 100644 --- a/Sharp7.Rx/S7VariableNameParser.cs +++ b/Sharp7.Rx/S7VariableNameParser.cs @@ -1,4 +1,5 @@ -using System.Globalization; +#nullable enable +using System.Globalization; using System.Text.RegularExpressions; using Sharp7.Rx.Enums; using Sharp7.Rx.Interfaces; @@ -7,8 +8,8 @@ namespace Sharp7.Rx; internal class S7VariableNameParser : IS7VariableNameParser { - private static readonly Regex regex = new Regex(@"^(?db)(?\d+)\.?(?[a-z]+)(?\d+)(\.(?\d+))?$", - RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.CultureInvariant); + private static readonly Regex regex = new(@"^(?db)(?\d+)\.?(?[a-z]+)(?\d+)(\.(?\d+))?$", + RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.CultureInvariant); private static readonly IReadOnlyDictionary types = new Dictionary(StringComparer.OrdinalIgnoreCase) { diff --git a/Sharp7.Rx/Sharp7Plc.cs b/Sharp7.Rx/Sharp7Plc.cs index 46936ef..ec6504a 100644 --- a/Sharp7.Rx/Sharp7Plc.cs +++ b/Sharp7.Rx/Sharp7Plc.cs @@ -77,8 +77,7 @@ public class Sharp7Plc : IPlc { return Observable.Create(observer => { - var address = varaibleNameParser.Parse(variableName); - if (address == null) throw new ArgumentException("Input variable name is not valid", nameof(variableName)); + var address = ParseAndVerify(variableName, typeof(TValue)); var disp = new CompositeDisposable(); var disposeableContainer = multiVariableSubscriptions.GetOrCreateObservable(variableName); @@ -103,6 +102,15 @@ public class Sharp7Plc : IPlc }); } + private S7VariableAddress ParseAndVerify(string variableName, Type type) + { + var address = varaibleNameParser.Parse(variableName); + if (!address.MatchesType(type)) + throw new DataTypeMissmatchException($"Address \"{variableName}\" does not match type {type}.", type, address); + + return address; + } + public Task GetValue(string variableName) { return GetValue(variableName, CancellationToken.None); @@ -117,8 +125,7 @@ public class Sharp7Plc : IPlc public async Task GetValue(string variableName, CancellationToken token) { - var address = varaibleNameParser.Parse(variableName); - if (address == null) throw new ArgumentException("Input variable name is not valid", nameof(variableName)); + var address = ParseAndVerify(variableName, typeof(TValue)); var data = await s7Connector.ReadBytes(address.Operand, address.Start, address.Length, address.DbNr, token); return S7ValueConverter.ReadFromBuffer(data, address); @@ -150,8 +157,7 @@ public class Sharp7Plc : IPlc public async Task SetValue(string variableName, TValue value, CancellationToken token) { - var address = varaibleNameParser.Parse(variableName); - if (address == null) throw new ArgumentException("Input variable name is not valid", "variableName"); + var address = ParseAndVerify(variableName, typeof(TValue)); if (typeof(TValue) == typeof(bool)) {