OmronEJ1Handler.cs 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading;
  5. using Aitex.Core.Common.DeviceData;
  6. using MECF.Framework.Common.Communications;
  7. namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Temperatures.Omrons
  8. {
  9. public abstract class OmronEJ1Handler : HandlerBase
  10. {
  11. public OmronEJ1 Device { get; }
  12. protected OmronEJ1Handler(OmronEJ1 device, byte[] commandvalue)
  13. : base(BuildMessage(commandvalue))
  14. {
  15. Device = device;
  16. }
  17. private static byte[] BuildMessage(byte[] commandvalue)
  18. {
  19. byte[] crc = ModRTU_CRC(commandvalue);
  20. List<byte> result = commandvalue.ToList();
  21. foreach (byte b in crc)
  22. {
  23. result.Add(b);
  24. }
  25. return result.ToArray();
  26. }
  27. public override bool HandleMessage(MessageBase msg, out bool handled)
  28. {
  29. var result = msg as OmronEJ1Message;
  30. ResponseMessage = msg;
  31. handled = true;
  32. return true;
  33. }
  34. private static byte[] ModRTU_CRC(byte[] buffer)
  35. {
  36. ushort crc = 0xFFFF;
  37. // var buf = System.Text.Encoding.UTF8.GetBytes(String.Join(Environment.NewLine, buffer));
  38. var buf = buffer;
  39. var len = buffer.Length;
  40. for (var pos = 0; pos < len; pos++)
  41. {
  42. crc ^= buf[pos]; // XOR byte into least sig. byte of crc
  43. for (var i = 8; i != 0; i--)
  44. // Loop over each bit
  45. if ((crc & 0x0001) != 0)
  46. {
  47. // If the LSB is set
  48. crc >>= 1; // Shift right and XOR 0xA001
  49. crc ^= 0xA001;
  50. }
  51. else // Else LSB is not set
  52. {
  53. crc >>= 1; // Just shift right
  54. }
  55. }
  56. // Note, this number has low and high bytes swapped, so use it accordingly (or swap bytes)
  57. return BitConverter.GetBytes(crc);
  58. }
  59. }
  60. public class OmronEJ1QueryHandler : OmronEJ1Handler
  61. {
  62. public OmronEJ1QueryHandler(OmronEJ1 device, string name, byte groupAddress, byte offerHigh, byte offerLow, byte dataHigh, byte dataLow)
  63. : base(device, new byte[] { groupAddress, 3, offerHigh, offerLow, dataHigh, dataLow })
  64. {
  65. Name = name;//"Query Temp";
  66. }
  67. public override bool HandleMessage(MessageBase msg, out bool handled)
  68. {
  69. var result = msg as OmronEJ1Message;
  70. handled = false;
  71. if (!result.IsResponse) return true;
  72. short rvalue = 0;
  73. rvalue = (short)(rvalue ^ result.Data[0]);
  74. rvalue = (short)(rvalue << 8);
  75. rvalue = (short)(rvalue ^ result.Data[1]);
  76. //if(Name.Contains("Actual"))
  77. //Device.ActualTemp = rvalue;
  78. //else
  79. //Device.SettingTemp = rvalue;
  80. if (Name.Contains("Actual"))
  81. {
  82. var chel = Convert.ToInt16(Name.Split(' ')[1].Substring(7, 1));
  83. var count = Convert.ToInt16(Name.Split(' ')[2].Substring(6, 1));
  84. var index = (chel - 1) * 4 + count - 1;
  85. Device.ActualTemp[index] = Convert.ToSingle(rvalue) / 10;
  86. }
  87. else
  88. {
  89. var chel = Convert.ToInt16(Name.Split(' ')[1].Substring(7, 1));
  90. var count = Convert.ToInt16(Name.Split(' ')[2].Substring(7, 1));
  91. var index = (chel - 1) * 4 + count - 1;
  92. Device.SettingTemp[index] = Convert.ToSingle(rvalue) / 10;
  93. }
  94. Device._connecteTimes = 0;
  95. ResponseMessage = msg;
  96. handled = true;
  97. Thread.Sleep(1000);
  98. return true;
  99. }
  100. }
  101. public class OmronEJ1WriteHandler : OmronEJ1Handler
  102. {
  103. public OmronEJ1WriteHandler(OmronEJ1 device, string name, byte groupAddress, byte offerHigh, byte offerLow, byte unitH, byte unitL, byte length, byte dataHigh, byte dataLow)
  104. : base(device, new byte[] { groupAddress, 0x10, offerHigh, offerLow, unitH, unitL, length, dataHigh, dataLow })
  105. {
  106. Name = name;
  107. }
  108. public override bool HandleMessage(MessageBase msg, out bool handled)
  109. {
  110. var result = msg as OmronEJ1Message;
  111. handled = false;
  112. if (!result.IsResponse) return true;
  113. if (result.FunctionCode == 0x90)
  114. {
  115. Device.RespondAbnormal(result.FunctionCode, result.Data[2]);
  116. }
  117. ResponseMessage = msg;
  118. handled = true;
  119. return true;
  120. }
  121. }
  122. public class OmronEJ1ReadVariableHandler : OmronEJ1Handler
  123. {
  124. private int _slaveAddress;
  125. private int _startAddress;
  126. private int _length;
  127. public OmronEJ1ReadVariableHandler(OmronEJ1 device, int slaveAddress, int startAddress, int length)
  128. : base(device, BuildMessage(slaveAddress, startAddress, length) )
  129. {
  130. Name = "Read Variable";
  131. _slaveAddress = slaveAddress;
  132. _startAddress = startAddress;
  133. _length = length;
  134. }
  135. private static byte[] BuildMessage(int slaveAddress, int startAddress, int length)
  136. {
  137. List<byte> result = new List<byte>();
  138. result.Add((byte)slaveAddress);
  139. result.Add(0x03);
  140. byte addressH = Convert.ToByte((startAddress >> 8) & 0xff);
  141. byte addressL = Convert.ToByte(startAddress & 0xff);
  142. result.Add(addressH);
  143. result.Add(addressL);
  144. byte lengthH = Convert.ToByte((length >> 8) & 0xff);
  145. byte lengthL = Convert.ToByte(length & 0xff);
  146. result.Add(lengthH);
  147. result.Add(lengthL);
  148. return result.ToArray();
  149. }
  150. public override bool HandleMessage(MessageBase msg, out bool handled)
  151. {
  152. var result = msg as OmronEJ1Message;
  153. handled = false;
  154. if (!result.IsResponse)
  155. return true;
  156. short[] value = new short[result.Data.Length/2];
  157. for (int i = 0; (i+1) < result.Data.Length; i+=2)
  158. {
  159. short rvalue = 0;
  160. rvalue = (short)(rvalue ^ result.Data[i]);
  161. rvalue = (short)(rvalue << 8);
  162. rvalue = (short)(rvalue ^ result.Data[i+1]);
  163. value[i / 2] = rvalue;
  164. }
  165. Device.NoteVariableReadout(_slaveAddress, _startAddress, value);
  166. ResponseMessage = msg;
  167. handled = true;
  168. return true;
  169. }
  170. }
  171. public class OmronEJ1WriteVariableHandler : OmronEJ1Handler
  172. {
  173. public OmronEJ1WriteVariableHandler(OmronEJ1 device, int slave, int address, int data)
  174. : base(device, BuildMessage(slave, address, data))
  175. {
  176. Name = "Write Variable";
  177. }
  178. private static byte[] BuildMessage(int slaveAddress, int startAddress, int data)
  179. {
  180. List<byte> result = new List<byte>();
  181. result.Add((byte)slaveAddress);
  182. result.Add(0x06);
  183. byte addressH = Convert.ToByte((startAddress >> 8) & 0xff);
  184. byte addressL = Convert.ToByte(startAddress & 0xff);
  185. result.Add(addressH);
  186. result.Add(addressL);
  187. byte lengthH = Convert.ToByte((data >> 8) & 0xff);
  188. byte lengthL = Convert.ToByte(data & 0xff);
  189. result.Add(lengthH);
  190. result.Add(lengthL);
  191. return result.ToArray();
  192. }
  193. public override bool HandleMessage(MessageBase msg, out bool handled)
  194. {
  195. var result = msg as OmronEJ1Message;
  196. handled = false;
  197. if (!result.IsResponse)
  198. return true;
  199. if (result.FunctionCode == 0x86)
  200. {
  201. Device.RespondAbnormal(result.FunctionCode, result.Data[2]);
  202. }
  203. ResponseMessage = msg;
  204. handled = true;
  205. return true;
  206. }
  207. }
  208. }