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