| ¶Ô±ÈÐÂÎļþ |
| | |
| | | using System; |
| | | using WIDESEAWCS_S7Simulator.Core.Interfaces; |
| | | |
| | | namespace WIDESEAWCS_S7Simulator.Core.Memory |
| | | { |
| | | /// <summary> |
| | | /// Måºï¼ä½åå¨å¨/Merkerï¼å®ç° |
| | | /// </summary> |
| | | public class MRegion : MemoryRegion, IMemoryRegion |
| | | { |
| | | /// <summary> |
| | | /// åºåç±»å |
| | | /// </summary> |
| | | public override string RegionType => "M"; |
| | | |
| | | /// <summary> |
| | | /// æé 彿° |
| | | /// </summary> |
| | | /// <param name="size">åºå大å°ï¼åèï¼</param> |
| | | public MRegion(int size) : base(size) |
| | | { |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 读åä½ |
| | | /// </summary> |
| | | /// <param name="byteOffset">åèåç§»</param> |
| | | /// <param name="bitOffset">ä½åç§»ï¼0-7ï¼</param> |
| | | /// <returns>ä½å¼</returns> |
| | | public bool ReadBit(ushort byteOffset, byte bitOffset) |
| | | { |
| | | if (bitOffset > 7) |
| | | throw new ArgumentOutOfRangeException(nameof(bitOffset), "ä½åç§»å¿
é¡»å¨0-7ä¹é´"); |
| | | |
| | | _lock.EnterReadLock(); |
| | | try |
| | | { |
| | | if (byteOffset >= Size) |
| | | throw new ArgumentOutOfRangeException(nameof(byteOffset), "åèåç§»è¶
åºèå´"); |
| | | |
| | | return (_memory[byteOffset] & (1 << bitOffset)) != 0; |
| | | } |
| | | finally |
| | | { |
| | | _lock.ExitReadLock(); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// åå
¥ä½ |
| | | /// </summary> |
| | | /// <param name="byteOffset">åèåç§»</param> |
| | | /// <param name="bitOffset">ä½åç§»ï¼0-7ï¼</param> |
| | | /// <param name="value">ä½å¼</param> |
| | | public void WriteBit(ushort byteOffset, byte bitOffset, bool value) |
| | | { |
| | | if (bitOffset > 7) |
| | | throw new ArgumentOutOfRangeException(nameof(bitOffset), "ä½åç§»å¿
é¡»å¨0-7ä¹é´"); |
| | | |
| | | _lock.EnterWriteLock(); |
| | | try |
| | | { |
| | | if (byteOffset >= Size) |
| | | throw new ArgumentOutOfRangeException(nameof(byteOffset), "åèåç§»è¶
åºèå´"); |
| | | |
| | | if (value) |
| | | _memory[byteOffset] |= (byte)(1 << bitOffset); |
| | | else |
| | | _memory[byteOffset] &= (byte)~(1 << bitOffset); |
| | | } |
| | | finally |
| | | { |
| | | _lock.ExitWriteLock(); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 读ååï¼Wordï¼2åèï¼ |
| | | /// </summary> |
| | | public ushort ReadWord(ushort byteOffset) |
| | | { |
| | | var data = Read(byteOffset, 2); |
| | | return (ushort)((data[0] << 8) | data[1]); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// åå
¥åï¼Wordï¼2åèï¼ |
| | | /// </summary> |
| | | public void WriteWord(ushort byteOffset, ushort value) |
| | | { |
| | | var data = new byte[] { (byte)(value >> 8), (byte)(value & 0xFF) }; |
| | | Write(byteOffset, data); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 读åååï¼DWordï¼4åèï¼ |
| | | /// </summary> |
| | | public uint ReadDWord(ushort byteOffset) |
| | | { |
| | | var data = Read(byteOffset, 4); |
| | | return (uint)((data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3]); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// åå
¥ååï¼DWordï¼4åèï¼ |
| | | /// </summary> |
| | | public void WriteDWord(ushort byteOffset, uint value) |
| | | { |
| | | var data = new byte[] { |
| | | (byte)(value >> 24), |
| | | (byte)((value >> 16) & 0xFF), |
| | | (byte)((value >> 8) & 0xFF), |
| | | (byte)(value & 0xFF) |
| | | }; |
| | | Write(byteOffset, data); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è¯»åæ´æ°ï¼Intï¼2åèï¼æç¬¦å·ï¼ |
| | | /// </summary> |
| | | public short ReadInt(ushort byteOffset) |
| | | { |
| | | return (short)ReadWord(byteOffset); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// åå
¥æ´æ°ï¼Intï¼2åèï¼æç¬¦å·ï¼ |
| | | /// </summary> |
| | | public void WriteInt(ushort byteOffset, short value) |
| | | { |
| | | WriteWord(byteOffset, (ushort)value); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 读ååæ´æ°ï¼DIntï¼4åèï¼æç¬¦å·ï¼ |
| | | /// </summary> |
| | | public int ReadDInt(ushort byteOffset) |
| | | { |
| | | return (int)ReadDWord(byteOffset); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// åå
¥åæ´æ°ï¼DIntï¼4åèï¼æç¬¦å·ï¼ |
| | | /// </summary> |
| | | public void WriteDInt(ushort byteOffset, int value) |
| | | { |
| | | WriteDWord(byteOffset, (uint)value); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è¯»åæµ®ç¹æ°ï¼Realï¼4åèï¼ |
| | | /// </summary> |
| | | public float ReadReal(ushort byteOffset) |
| | | { |
| | | var bytes = Read(byteOffset, 4); |
| | | return BitConverter.ToSingle(bytes, 0); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// åå
¥æµ®ç¹æ°ï¼Realï¼4åèï¼ |
| | | /// </summary> |
| | | public void WriteReal(ushort byteOffset, float value) |
| | | { |
| | | var bytes = BitConverter.GetBytes(value); |
| | | Write(byteOffset, bytes); |
| | | } |
| | | } |
| | | } |