WriteParamsRequest.cs 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. using PlcSiemens.Core.Extension;
  2. using PlcSiemens.O;
  3. using PlcSiemens.Protocol.Common;
  4. using PlcSiemens.Protocol.ReadData;
  5. namespace PlcSiemens.Protocol.WriteData
  6. {
  7. public class WriteParamsRequest
  8. {
  9. public byte FunRead { get; set; }
  10. public byte ItemsCount { get; set; }
  11. public WriteItemRequest[] Items { get; set; }//最大长度20
  12. public byte PacketLength
  13. {
  14. get
  15. {
  16. return (byte)(0x0C * Items.Length + 2);
  17. }
  18. }
  19. public WriteParamsRequest()
  20. {
  21. }
  22. public void Build(List<DataItem> dataItems)
  23. {
  24. FunRead = (byte)PduFuncType.PduFuncWrite;
  25. ItemsCount = (byte)dataItems.Count;
  26. //项处理
  27. Items = new WriteItemRequest[ItemsCount];
  28. for (var i = 0; i < dataItems.Count; i++)
  29. {
  30. var dataItem = dataItems[i];
  31. var item = new WriteItemRequest();
  32. Items[i] = item;
  33. item.ItemHead[0] = 0x12;
  34. item.ItemHead[1] = 0x0A;
  35. item.ItemHead[2] = 0x10;
  36. item.TransportSize = (byte)dataItem.DataType;
  37. item.Length = dataItem.Length;
  38. if (dataItem.AreaType == AreaType.DB)
  39. item.DB = dataItem.Db;
  40. else
  41. item.DB = 0x0000;
  42. item.Area = (byte)dataItem.AreaType;
  43. //ushort address;
  44. long address;//修改
  45. if ((dataItem.DataType == DataType.Bit) || (dataItem.DataType == DataType.Counter) || (dataItem.DataType == DataType.Timer))
  46. address = dataItem.Start;
  47. else
  48. //address = (ushort)(dataItem.Start * 8);
  49. address = (dataItem.Start * 8);//修改
  50. item.Address[2] = (byte)(address & 0x000000FF);
  51. address = (ushort)(address >> 8);
  52. item.Address[1] = (byte)(address & 0x000000FF);
  53. address = (ushort)(address >> 8);
  54. item.Address[0] = (byte)(address & 0x000000FF);
  55. }
  56. }
  57. public void GetByteBuffer(ByteBuffer buffer)
  58. {
  59. buffer.Push(FunRead);
  60. buffer.Push(ItemsCount);
  61. Items.ForEach(t =>
  62. {
  63. buffer.Push(t.ItemHead);
  64. buffer.Push(t.TransportSize);
  65. buffer.Push(t.Length);
  66. buffer.Push(t.DB);
  67. buffer.Push(t.Area);
  68. buffer.Push(t.Address);
  69. });
  70. }
  71. }
  72. }