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