WriteDataRequest.cs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. using System;
  2. using PLC.Siemens.Protocol.Common;
  3. using PLC.Siemens.Protocol.ReadData;
  4. using ByteBuffer = Core.Communication.Transport.ByteBuffer;
  5. namespace PLC.Siemens.Protocol.WriteData
  6. {
  7. public class WriteDataRequest
  8. {
  9. public byte ReturnCode { get; set; }
  10. public byte TransportSize { get; set; }
  11. public ushort DataLength { get; set; }
  12. public byte[] Data { get; set; }// 17 = header + params + data header -1
  13. public ushort PacketLength { get { return (ushort)(0x04 + Data.Length); } }
  14. public void Build(DataItem item, bool isLast)
  15. {
  16. var sizeByte = (ushort)(item.SizeByte*item.Length);
  17. ReturnCode = 0x00;
  18. switch (item.DataType)
  19. {
  20. case DataType.Bit:
  21. TransportSize = (byte)TsType.TsResBit; ;
  22. break;
  23. case DataType.Int:
  24. case DataType.DInt:
  25. TransportSize = (byte)TsType.TsResInt;
  26. break;
  27. case DataType.Real:
  28. TransportSize = (byte)TsType.TsResReal;// TS_ResReal;
  29. break;
  30. case DataType.Char:
  31. case DataType.Counter:
  32. case DataType.Timer:
  33. TransportSize = (byte)TsType.TsResOctet;//TS_ResOctet;
  34. break;
  35. default:
  36. TransportSize = (byte)TsType.TsResByte;
  37. break;
  38. };
  39. if ((TransportSize != (byte)TsType.TsResOctet) &&
  40. (TransportSize != (byte)TsType.TsResReal) &&
  41. (TransportSize != (byte)TsType.TsResBit))
  42. DataLength = (ushort)(sizeByte * 8);
  43. else
  44. DataLength = (sizeByte);
  45. if (!isLast && sizeByte%2 != 0)
  46. Data = new byte[sizeByte + 1];
  47. else
  48. Data= new byte[sizeByte];
  49. Array.Copy(item.Data, item.DataOffset, Data, 0, sizeByte);
  50. }
  51. public void GetByteBuffer(ByteBuffer buffer)
  52. {
  53. buffer.Push(ReturnCode);
  54. buffer.Push(TransportSize);
  55. buffer.Push(DataLength);
  56. buffer.Push(Data);
  57. }
  58. }
  59. }