FileRecordCollection.cs 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. using NModbus.Unme.Common;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Collections.ObjectModel;
  5. using System.IO;
  6. using System.Linq;
  7. using System.Net;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. namespace NModbus.Data
  11. {
  12. public class FileRecordCollection : IModbusMessageDataCollection
  13. {
  14. private IReadOnlyList<byte> networkBytes;
  15. private IReadOnlyList<byte> dataBytes;
  16. public FileRecordCollection(ushort fileNumber, ushort startingAddress, byte[] data)
  17. {
  18. Build(fileNumber, startingAddress, data);
  19. FileNumber = fileNumber;
  20. StartingAddress = startingAddress;
  21. }
  22. public FileRecordCollection(byte[] messageFrame)
  23. {
  24. var fileNumber = (ushort)IPAddress.NetworkToHostOrder(BitConverter.ToInt16(messageFrame, 4));
  25. var startingAdress = (ushort)IPAddress.NetworkToHostOrder(BitConverter.ToInt16(messageFrame, 6));
  26. var count = (ushort)IPAddress.NetworkToHostOrder(BitConverter.ToInt16(messageFrame, 8));
  27. var data = messageFrame.Slice(10, count * 2).ToArray();
  28. Build(fileNumber, startingAdress, data);
  29. FileNumber = fileNumber;
  30. StartingAddress = startingAdress;
  31. }
  32. private void Build(ushort fileNumber, ushort startingAddress, byte[] data)
  33. {
  34. if (data.Length % 2 != 0)
  35. {
  36. throw new FormatException("Number of bytes has to be even");
  37. }
  38. var values = new List<byte>
  39. {
  40. 6, // Reference type, demanded by standard definition
  41. };
  42. void addAsBytes(int value)
  43. {
  44. values.AddRange(BitConverter.GetBytes((ushort)IPAddress.HostToNetworkOrder((short)value)));
  45. }
  46. addAsBytes(fileNumber);
  47. addAsBytes(startingAddress);
  48. addAsBytes(data.Length / 2);
  49. values.AddRange(data);
  50. dataBytes = data;
  51. networkBytes = values;
  52. }
  53. /// <summary>
  54. /// The Extended Memory file number
  55. /// </summary>
  56. public ushort FileNumber { get; }
  57. /// <summary>
  58. /// The starting register address within the file.
  59. /// </summary>
  60. public ushort StartingAddress { get; }
  61. /// <summary>
  62. /// The bytes written to the extended memory file.
  63. /// </summary>
  64. public IReadOnlyList<byte> DataBytes => dataBytes;
  65. public byte[] NetworkBytes => networkBytes.ToArray();
  66. /// <summary>
  67. /// Gets the byte count.
  68. /// </summary>
  69. public byte ByteCount => (byte)networkBytes.Count;
  70. /// <summary>
  71. /// Returns a <see cref="T:System.String" /> that represents the current <see cref="T:System.Object" />.
  72. /// </summary>
  73. /// <returns>
  74. /// A <see cref="T:System.String" /> that represents the current <see cref="T:System.Object" />.
  75. /// </returns>
  76. public override string ToString()
  77. {
  78. return string.Concat("{", string.Join(", ", this.networkBytes.Select(v => v.ToString()).ToArray()), "}");
  79. }
  80. }
  81. }