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);
}
}
}