123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- using NModbus;
- using System.Xml.Linq;
- namespace ModbusSimulationProtocol.Data;
- public class PointSource<TPoint> : IPointSource<TPoint>
- {
- private readonly string _name;
- private readonly int _capacity;
- private readonly TPoint[] _points;
- private readonly object _lock = new();
-
- /// <summary>
- /// The implementation to the <typeparamref name="TPoint"/> register.
- /// </summary>
- /// <param name="name">The name of this register.</param>
- /// <param name="capacity">A number between 1 and 65536 inclusive.</param>
- public PointSource(string name, int capacity = 65536)
- {
- ArgumentOutOfRangeException.ThrowIfLessThanOrEqual(capacity, ushort.MinValue, nameof(capacity));
- ArgumentOutOfRangeException.ThrowIfGreaterThan(capacity, ushort.MaxValue + 1, nameof(capacity));
- _name = name;
- _capacity = capacity;
- _points = new TPoint[_capacity];
- }
- public TPoint[] ReadPoints(ushort startAddress, ushort numberOfPoints)
- {
- if (numberOfPoints == 0) return [];
- int start = startAddress;
- int count = numberOfPoints;
- ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(start, _capacity, nameof(start));
- ArgumentOutOfRangeException.ThrowIfGreaterThan(start + count, _capacity, $"{start}+{count}");
- lock (_lock)
- {
- TPoint[] snapshot = new TPoint[count];
- Array.Copy(_points, start, snapshot, 0, count);
- return snapshot;
- }
- }
- public void WritePoints(ushort startAddress, TPoint[] points)
- {
- if (points.Length == 0) return;
- int start = startAddress;
- int count = points.Length;
- ArgumentOutOfRangeException.ThrowIfGreaterThanOrEqual(start, _capacity, nameof(start));
- ArgumentOutOfRangeException.ThrowIfGreaterThan(start + count, _capacity, $"{start}+{count}");
- lock (_lock)
- {
- Array.Copy(points, 0, _points, start, count);
- }
- }
- }
|