ReadParamsRequest.cs 2.4 KB

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