using System; using WIDESEAWCS_S7Simulator.Core.Interfaces; namespace WIDESEAWCS_S7Simulator.Core.Memory { /// /// T区(定时器区/Timer)实现 /// 用于模拟西门子S7 PLC的定时器区域 /// 每个定时器占用2字节,存储定时器的时间值(毫秒) /// public class TRegion : MemoryRegion, IMemoryRegion { /// /// 标识对象是否已被释放 /// private bool _disposed = false; /// /// 区域类型 /// public override string RegionType => "T"; /// /// 每个定时器占用的字节数(S7定时器为2字节) /// private const int TimerSize = 2; /// /// 构造函数 /// /// 定时器数量 public TRegion(int timerCount) : base(timerCount * TimerSize) { } /// /// 读取定时器值 /// /// 定时器号(从1开始) /// 定时器值(毫秒) public ushort ReadTimer(ushort timerNumber) { if (_disposed) throw new ObjectDisposedException(nameof(TRegion)); ushort offset = (ushort)((timerNumber - 1) * TimerSize); var data = Read(offset, TimerSize); return (ushort)((data[0] << 8) | data[1]); } /// /// 写入定时器值 /// /// 定时器号(从1开始) /// 定时器值(毫秒) public void WriteTimer(ushort timerNumber, ushort value) { if (_disposed) throw new ObjectDisposedException(nameof(TRegion)); ushort offset = (ushort)((timerNumber - 1) * TimerSize); 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); } } }