using System; using WIDESEAWCS_S7Simulator.Core.Interfaces; namespace WIDESEAWCS_S7Simulator.Core.Memory { /// /// C区(计数器区/Counter)实现 /// 用于模拟西门子S7 PLC的计数器区域 /// 每个计数器占用2字节,存储计数器的当前值 /// public class CRegion : MemoryRegion, IMemoryRegion { /// /// 标识对象是否已被释放 /// private bool _disposed = false; /// /// 区域类型 /// public override string RegionType => "C"; /// /// 每个计数器占用的字节数(S7计数器为2字节) /// private const int CounterSize = 2; /// /// 构造函数 /// /// 计数器数量 public CRegion(int counterCount) : base(counterCount * CounterSize) { } /// /// 读取计数器值 /// /// 计数器号(从1开始) /// 计数器值 public ushort ReadCounter(ushort counterNumber) { if (_disposed) throw new ObjectDisposedException(nameof(CRegion)); ushort offset = (ushort)((counterNumber - 1) * CounterSize); var data = Read(offset, CounterSize); return (ushort)((data[0] << 8) | data[1]); } /// /// 写入计数器值 /// /// 计数器号(从1开始) /// 计数器值 public void WriteCounter(ushort counterNumber, ushort value) { if (_disposed) throw new ObjectDisposedException(nameof(CRegion)); ushort offset = (ushort)((counterNumber - 1) * CounterSize); var data = new byte[] { (byte)(value >> 8), (byte)(value & 0xFF) }; Write(offset, data); } /// /// 释放资源 /// /// 是否正在释放托管资源 protected override void Dispose(bool disposing) { if (!_disposed) { if (disposing) { // 释放托管资源 } _disposed = true; } base.Dispose(disposing); } } }