mirror of
https://github.com/evopro-ag/Sharp7Reactive.git
synced 2026-02-04 07:42:53 +00:00
Verify data types
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
using System.Globalization;
|
#nullable enable
|
||||||
|
using System.Globalization;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using Sharp7.Rx.Enums;
|
using Sharp7.Rx.Enums;
|
||||||
using Sharp7.Rx.Interfaces;
|
using Sharp7.Rx.Interfaces;
|
||||||
@@ -7,7 +8,7 @@ namespace Sharp7.Rx;
|
|||||||
|
|
||||||
internal class S7VariableNameParser : IS7VariableNameParser
|
internal class S7VariableNameParser : IS7VariableNameParser
|
||||||
{
|
{
|
||||||
private static readonly Regex regex = new Regex(@"^(?<operand>db)(?<dbNo>\d+)\.?(?<type>[a-z]+)(?<start>\d+)(\.(?<bitOrLength>\d+))?$",
|
private static readonly Regex regex = new(@"^(?<operand>db)(?<dbNo>\d+)\.?(?<type>[a-z]+)(?<start>\d+)(\.(?<bitOrLength>\d+))?$",
|
||||||
RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.CultureInvariant);
|
RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.CultureInvariant);
|
||||||
|
|
||||||
private static readonly IReadOnlyDictionary<string, DbType> types = new Dictionary<string, DbType>(StringComparer.OrdinalIgnoreCase)
|
private static readonly IReadOnlyDictionary<string, DbType> types = new Dictionary<string, DbType>(StringComparer.OrdinalIgnoreCase)
|
||||||
|
|||||||
@@ -77,8 +77,7 @@ public class Sharp7Plc : IPlc
|
|||||||
{
|
{
|
||||||
return Observable.Create<TValue>(observer =>
|
return Observable.Create<TValue>(observer =>
|
||||||
{
|
{
|
||||||
var address = varaibleNameParser.Parse(variableName);
|
var address = ParseAndVerify(variableName, typeof(TValue));
|
||||||
if (address == null) throw new ArgumentException("Input variable name is not valid", nameof(variableName));
|
|
||||||
|
|
||||||
var disp = new CompositeDisposable();
|
var disp = new CompositeDisposable();
|
||||||
var disposeableContainer = multiVariableSubscriptions.GetOrCreateObservable(variableName);
|
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<TValue> GetValue<TValue>(string variableName)
|
public Task<TValue> GetValue<TValue>(string variableName)
|
||||||
{
|
{
|
||||||
return GetValue<TValue>(variableName, CancellationToken.None);
|
return GetValue<TValue>(variableName, CancellationToken.None);
|
||||||
@@ -117,8 +125,7 @@ public class Sharp7Plc : IPlc
|
|||||||
|
|
||||||
public async Task<TValue> GetValue<TValue>(string variableName, CancellationToken token)
|
public async Task<TValue> GetValue<TValue>(string variableName, CancellationToken token)
|
||||||
{
|
{
|
||||||
var address = varaibleNameParser.Parse(variableName);
|
var address = ParseAndVerify(variableName, typeof(TValue));
|
||||||
if (address == null) throw new ArgumentException("Input variable name is not valid", nameof(variableName));
|
|
||||||
|
|
||||||
var data = await s7Connector.ReadBytes(address.Operand, address.Start, address.Length, address.DbNr, token);
|
var data = await s7Connector.ReadBytes(address.Operand, address.Start, address.Length, address.DbNr, token);
|
||||||
return S7ValueConverter.ReadFromBuffer<TValue>(data, address);
|
return S7ValueConverter.ReadFromBuffer<TValue>(data, address);
|
||||||
@@ -150,8 +157,7 @@ public class Sharp7Plc : IPlc
|
|||||||
|
|
||||||
public async Task SetValue<TValue>(string variableName, TValue value, CancellationToken token)
|
public async Task SetValue<TValue>(string variableName, TValue value, CancellationToken token)
|
||||||
{
|
{
|
||||||
var address = varaibleNameParser.Parse(variableName);
|
var address = ParseAndVerify(variableName, typeof(TValue));
|
||||||
if (address == null) throw new ArgumentException("Input variable name is not valid", "variableName");
|
|
||||||
|
|
||||||
if (typeof(TValue) == typeof(bool))
|
if (typeof(TValue) == typeof(bool))
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user