| Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Memory/CRegion.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Memory/IRegion.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Memory/QRegion.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Memory/TRegion.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Memory/CRegion.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,83 @@ 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); } } } Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Memory/IRegion.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,106 @@ using System; using WIDESEAWCS_S7Simulator.Core.Interfaces; namespace WIDESEAWCS_S7Simulator.Core.Memory { /// <summary> /// Iåºï¼è¾å ¥åº/Inputï¼å®ç° /// ç¨äºæ¨¡æè¥¿é¨åS7 PLCçè¾å ¥è¿ç¨æ ååº /// </summary> public class IRegion : MemoryRegion, IMemoryRegion { /// <summary> /// æ è¯å¯¹è±¡æ¯å¦å·²è¢«éæ¾ /// </summary> private bool _disposed = false; /// <summary> /// åºåç±»å /// </summary> public override string RegionType => "I"; /// <summary> /// æé 彿° /// </summary> /// <param name="size">åºå大å°ï¼åèï¼</param> public IRegion(int size) : base(size) { } /// <summary> /// 读åä½ /// </summary> /// <param name="byteOffset">åèåç§»é</param> /// <param name="bitOffset">ä½åç§»éï¼0-7ï¼</param> /// <returns>ä½ç¶æï¼true/falseï¼</returns> public bool ReadBit(ushort byteOffset, byte bitOffset) { if (_disposed) throw new ObjectDisposedException(nameof(IRegion)); if (bitOffset > 7) throw new ArgumentOutOfRangeException(nameof(bitOffset), "ä½åç§»å¿ é¡»å¨0-7ä¹é´"); _lock.EnterReadLock(); try { if (byteOffset >= Size) throw new ArgumentOutOfRangeException(nameof(byteOffset), "åèåç§»è¶ åºIåºèå´"); return (_memory[byteOffset] & (1 << bitOffset)) != 0; } finally { _lock.ExitReadLock(); } } /// <summary> /// åå ¥ä½ /// </summary> /// <param name="byteOffset">åèåç§»é</param> /// <param name="bitOffset">ä½åç§»éï¼0-7ï¼</param> /// <param name="value">ä½å¼ï¼true/falseï¼</param> public void WriteBit(ushort byteOffset, byte bitOffset, bool value) { if (_disposed) throw new ObjectDisposedException(nameof(IRegion)); if (bitOffset > 7) throw new ArgumentOutOfRangeException(nameof(bitOffset), "ä½åç§»å¿ é¡»å¨0-7ä¹é´"); _lock.EnterWriteLock(); try { if (byteOffset >= Size) throw new ArgumentOutOfRangeException(nameof(byteOffset), "åèåç§»è¶ åºIåºèå´"); if (value) _memory[byteOffset] |= (byte)(1 << bitOffset); else _memory[byteOffset] &= (byte)~(1 << bitOffset); } finally { _lock.ExitWriteLock(); } } /// <summary> /// éæ¾èµæº /// </summary> /// <param name="disposing">æ¯å¦æ£å¨éæ¾æç®¡èµæº</param> protected override void Dispose(bool disposing) { if (!_disposed) { if (disposing) { // éæ¾æç®¡èµæº } _disposed = true; } base.Dispose(disposing); } } } Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Memory/QRegion.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,106 @@ using System; using WIDESEAWCS_S7Simulator.Core.Interfaces; namespace WIDESEAWCS_S7Simulator.Core.Memory { /// <summary> /// Qåºï¼è¾åºåº/Outputï¼å®ç° /// ç¨äºæ¨¡æè¥¿é¨åS7 PLCçè¾åºè¿ç¨æ ååº /// </summary> public class QRegion : MemoryRegion, IMemoryRegion { /// <summary> /// æ è¯å¯¹è±¡æ¯å¦å·²è¢«éæ¾ /// </summary> private bool _disposed = false; /// <summary> /// åºåç±»å /// </summary> public override string RegionType => "Q"; /// <summary> /// æé 彿° /// </summary> /// <param name="size">åºå大å°ï¼åèï¼</param> public QRegion(int size) : base(size) { } /// <summary> /// 读åä½ /// </summary> /// <param name="byteOffset">åèåç§»é</param> /// <param name="bitOffset">ä½åç§»éï¼0-7ï¼</param> /// <returns>ä½ç¶æï¼true/falseï¼</returns> public bool ReadBit(ushort byteOffset, byte bitOffset) { if (_disposed) throw new ObjectDisposedException(nameof(QRegion)); if (bitOffset > 7) throw new ArgumentOutOfRangeException(nameof(bitOffset), "ä½åç§»å¿ é¡»å¨0-7ä¹é´"); _lock.EnterReadLock(); try { if (byteOffset >= Size) throw new ArgumentOutOfRangeException(nameof(byteOffset), "åèåç§»è¶ åºQåºèå´"); return (_memory[byteOffset] & (1 << bitOffset)) != 0; } finally { _lock.ExitReadLock(); } } /// <summary> /// åå ¥ä½ /// </summary> /// <param name="byteOffset">åèåç§»é</param> /// <param name="bitOffset">ä½åç§»éï¼0-7ï¼</param> /// <param name="value">ä½å¼ï¼true/falseï¼</param> public void WriteBit(ushort byteOffset, byte bitOffset, bool value) { if (_disposed) throw new ObjectDisposedException(nameof(QRegion)); if (bitOffset > 7) throw new ArgumentOutOfRangeException(nameof(bitOffset), "ä½åç§»å¿ é¡»å¨0-7ä¹é´"); _lock.EnterWriteLock(); try { if (byteOffset >= Size) throw new ArgumentOutOfRangeException(nameof(byteOffset), "åèåç§»è¶ åºQåºèå´"); if (value) _memory[byteOffset] |= (byte)(1 << bitOffset); else _memory[byteOffset] &= (byte)~(1 << bitOffset); } finally { _lock.ExitWriteLock(); } } /// <summary> /// éæ¾èµæº /// </summary> /// <param name="disposing">æ¯å¦æ£å¨éæ¾æç®¡èµæº</param> protected override void Dispose(bool disposing) { if (!_disposed) { if (disposing) { // éæ¾æç®¡èµæº } _disposed = true; } base.Dispose(disposing); } } } Code/WCS/WIDESEAWCS_S7Simulator/WIDESEAWCS_S7Simulator.Core/Memory/TRegion.cs
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,83 @@ 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); } } }