EurothermP116Handler.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading;
  5. using MECF.Framework.Common.Communications;
  6. namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Temperatures.Eurotherms
  7. {
  8. public abstract class EurothermP116Handler : HandlerBase
  9. {
  10. public Temperatures.Eurotherms.EurothermP116 Device { get; }
  11. protected EurothermP116Handler(Temperatures.Eurotherms.EurothermP116 device, byte[] commandvalue)
  12. : base(BuildMessage(commandvalue))
  13. {
  14. Device = device;
  15. }
  16. private static byte[] BuildMessage(byte[] commandvalue)
  17. {
  18. byte[] crc = ModRTU_CRC(commandvalue);
  19. List<byte> result = commandvalue.ToList();
  20. foreach (byte b in crc)
  21. {
  22. result.Add(b);
  23. }
  24. return result.ToArray();
  25. }
  26. public override bool HandleMessage(MessageBase msg, out bool handled)
  27. {
  28. var result = msg as P116PIDTCMessage;
  29. ResponseMessage = msg;
  30. handled = true;
  31. return true;
  32. }
  33. private static byte[] ModRTU_CRC(byte[] buffer)
  34. {
  35. ushort crc = 0xFFFF;
  36. // var buf = System.Text.Encoding.UTF8.GetBytes(String.Join(Environment.NewLine, buffer));
  37. var buf = buffer;
  38. var len = buffer.Length;
  39. for (var pos = 0; pos < len; pos++)
  40. {
  41. crc ^= buf[pos]; // XOR byte into least sig. byte of crc
  42. for (var i = 8; i != 0; i--)
  43. // Loop over each bit
  44. if ((crc & 0x0001) != 0)
  45. {
  46. // If the LSB is set
  47. crc >>= 1; // Shift right and XOR 0xA001
  48. crc ^= 0xA001;
  49. }
  50. else // Else LSB is not set
  51. {
  52. crc >>= 1; // Just shift right
  53. }
  54. }
  55. // Note, this number has low and high bytes swapped, so use it accordingly (or swap bytes)
  56. return BitConverter.GetBytes(crc);
  57. }
  58. }
  59. public class P116PIDTCQueryHandler : EurothermP116Handler
  60. {
  61. public P116PIDTCQueryHandler(Temperatures.Eurotherms.EurothermP116 device,string name, byte groupAddress,byte offerHigh,byte offerLow,byte dataHigh,byte dataLow)
  62. : base(device, new byte[] { groupAddress, 3, offerHigh, offerLow, dataHigh, dataLow })
  63. {
  64. Name = name;//"Query Temp";
  65. }
  66. public override bool HandleMessage(MessageBase msg, out bool handled)
  67. {
  68. var result = msg as P116PIDTCMessage;
  69. handled = false;
  70. if (!result.IsResponse) return true;
  71. short rvalue = 0;
  72. rvalue = (short)(rvalue ^ result.Data[0]);
  73. rvalue = (short)(rvalue << 8);
  74. rvalue = (short)(rvalue ^ result.Data[1]);
  75. //if(Name.Contains("Actual"))
  76. //Device.ActualTemp = rvalue;
  77. //else
  78. //Device.SettingTemp = rvalue;
  79. if (Name.Contains("QueryPVInValue"))
  80. {
  81. Device.fPVInValue =Convert.ToSingle(rvalue)/10;
  82. }
  83. else if(Name.Contains("QueryTargetSP"))
  84. {
  85. Device.fTargetSP = Convert.ToSingle(rvalue)/10;
  86. }
  87. else if (Name.Contains("QueryAM"))
  88. {
  89. Device.iAM = Convert.ToInt32(rvalue);
  90. }
  91. else
  92. {
  93. }
  94. Device._connecteTimes = 0;
  95. ResponseMessage = msg;
  96. handled = true;
  97. Thread.Sleep(500);
  98. return true;
  99. }
  100. }
  101. public class P116PIDTCWriteSingleHandler : EurothermP116Handler
  102. {
  103. public P116PIDTCWriteSingleHandler(Temperatures.Eurotherms.EurothermP116 device, string name, byte groupAddress, byte offerHigh, byte offerLow, byte dataHigh, byte dataLow)
  104. : base(device, new byte[] { groupAddress, 0x06, offerHigh, offerLow, dataHigh, dataLow })
  105. {
  106. Name = name;
  107. }
  108. public override bool HandleMessage(MessageBase msg, out bool handled)
  109. {
  110. var result = msg as P116PIDTCMessage;
  111. handled = false;
  112. if (!result.IsResponse) return true;
  113. if (result.FunctionCode == 0x86)
  114. {
  115. Device.RespondAbnormal(result.FunctionCode, result.Data[2]);
  116. }
  117. ResponseMessage = msg;
  118. handled = true;
  119. Device.IsConfig = false;
  120. Thread.Sleep(1000);
  121. return true;
  122. }
  123. }
  124. public class P116PIDTCWriteHandler : EurothermP116Handler
  125. {
  126. public P116PIDTCWriteHandler(Temperatures.Eurotherms.EurothermP116 device, string name,byte groupAddress, byte offerHigh, byte offerLow,byte unitH,byte unitL,byte length, byte dataHigh, byte dataLow)
  127. : base(device, new byte[] { groupAddress, 0x10, offerHigh, offerLow, unitH, unitL, length, dataHigh, dataLow })
  128. {
  129. Name = name;
  130. }
  131. public override bool HandleMessage(MessageBase msg, out bool handled)
  132. {
  133. var result = msg as P116PIDTCMessage;
  134. handled = false;
  135. if (!result.IsResponse) return true;
  136. if (result.FunctionCode == 0x90)
  137. {
  138. Device.RespondAbnormal(result.FunctionCode, result.Data[2]);
  139. }
  140. ResponseMessage = msg;
  141. handled = true;
  142. Device.IsConfig = false;
  143. Thread.Sleep(1000);
  144. return true;
  145. }
  146. }
  147. }