ReadParamsRequest.cs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. using System.Collections.Generic;
  2. using Core.Communication.Transport;
  3. using Core.Util.Extension;
  4. using PLC.Siemens.Protocol.Common;
  5. namespace PLC.Siemens.Protocol.ReadData
  6. {
  7. public class ReadParamsRequest
  8. {
  9. public byte FunRead { get; set; }
  10. public byte ItemsCount { get; set; }
  11. public ReadItemRequest[] Items{ get; set; }//×î´ó³¤¶È20
  12. public byte PacketLength {get{
  13. return (byte)(0x0C * Items.Length + 2);
  14. }}
  15. public void Build(List<DataItem> dataItems)
  16. {
  17. //Header
  18. FunRead = (byte)PduFuncType.PduFuncRead;
  19. ItemsCount = (byte) dataItems.Count;
  20. //Ïî´¦Àí
  21. Items = new ReadItemRequest[ItemsCount];
  22. for (var i = 0; i < dataItems.Count; i++)
  23. {
  24. var dataItem = dataItems[i];
  25. var item = new ReadItemRequest();
  26. Items[i] = item;
  27. item.ItemHead[0] = 0x12;
  28. item.ItemHead[1] = 0x0A;
  29. item.ItemHead[2] = 0x10;
  30. item.TransportSize = (byte)dataItem.DataType;
  31. item.Length = dataItem.Length;
  32. if (dataItem.AreaType == AreaType.DB)
  33. item.DB = dataItem.Db;
  34. else
  35. item.DB = 0x0000;
  36. item.Area = (byte)dataItem.AreaType;
  37. long address;
  38. if ((dataItem.DataType == DataType.Bit) || (dataItem.DataType == DataType.Counter) || (dataItem.DataType == DataType.Timer))
  39. address = dataItem.Start;
  40. else
  41. address = (dataItem.Start * 8);
  42. item.Address[2] = (byte)(address & 0x000000FF);
  43. address = (ushort)(address >> 8);
  44. item.Address[1] = (byte)(address & 0x000000FF);
  45. address = (ushort)(address >> 8);
  46. item.Address[0] = (byte)(address & 0x000000FF);
  47. }
  48. }
  49. public void GetByteBuffer(ByteBuffer buffer)
  50. {
  51. buffer.Push(FunRead);
  52. buffer.Push(ItemsCount);
  53. Items.ForEach(t =>
  54. {
  55. buffer.Push(t.ItemHead);
  56. buffer.Push(t.TransportSize);
  57. buffer.Push(t.Length);
  58. buffer.Push(t.DB);
  59. buffer.Push(t.Area);
  60. buffer.Push(t.Address);
  61. });
  62. }
  63. }
  64. }