using System;
|
using WIDESEAWCS_S7Simulator.Core.Interfaces;
|
|
namespace WIDESEAWCS_S7Simulator.Core.Memory
|
{
|
/// <summary>
|
/// T区(定时器区/Timer)实现
|
/// 用于模拟西门子S7 PLC的定时器区域
|
/// 每个定时器占用2字节,存储定时器的时间值(毫秒)
|
/// </summary>
|
public class TRegion : MemoryRegion, IMemoryRegion
|
{
|
/// <summary>
|
/// 标识对象是否已被释放
|
/// </summary>
|
private bool _disposed = false;
|
|
/// <summary>
|
/// 区域类型
|
/// </summary>
|
public override string RegionType => "T";
|
|
/// <summary>
|
/// 每个定时器占用的字节数(S7定时器为2字节)
|
/// </summary>
|
private const int TimerSize = 2;
|
|
/// <summary>
|
/// 构造函数
|
/// </summary>
|
/// <param name="timerCount">定时器数量</param>
|
public TRegion(int timerCount) : base(timerCount * TimerSize)
|
{
|
}
|
|
/// <summary>
|
/// 读取定时器值
|
/// </summary>
|
/// <param name="timerNumber">定时器号(从1开始)</param>
|
/// <returns>定时器值(毫秒)</returns>
|
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]);
|
}
|
|
/// <summary>
|
/// 写入定时器值
|
/// </summary>
|
/// <param name="timerNumber">定时器号(从1开始)</param>
|
/// <param name="value">定时器值(毫秒)</param>
|
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);
|
}
|
|
/// <summary>
|
/// 释放资源
|
/// </summary>
|
/// <param name="disposing">是否正在释放托管资源</param>
|
protected override void Dispose(bool disposing)
|
{
|
if (!_disposed)
|
{
|
if (disposing)
|
{
|
// 释放托管资源
|
}
|
_disposed = true;
|
}
|
base.Dispose(disposing);
|
}
|
}
|
}
|