Ffu.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425
  1. using MECF.Framework.Simulator.Core.Driver;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Diagnostics;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. using System.Timers;
  9. namespace MECF.Framework.Simulator.Core.FFUs
  10. {
  11. class Ffu : SerialPortDeviceSimulator
  12. {
  13. public bool Failed { get; set; }
  14. public bool IsPumpOn { get; set; }
  15. public bool IsOverTemp { get; set; }
  16. public bool IsAtSpeed { get; set; }
  17. Stopwatch _timer = new Stopwatch();
  18. private System.Timers.Timer _tick;
  19. Random _rd = new Random();
  20. public event Action<string> receiveMsg;
  21. private object _locker = new object();
  22. public string ResultValue { get; set; }
  23. public Ffu(string port)
  24. : base(port, -1, "\r", ' ', false)
  25. {
  26. ResultValue = "";
  27. _tick = new System.Timers.Timer();
  28. _tick.Interval = 200;
  29. _tick.Elapsed += _tick_Elapsed;
  30. _tick.Start();
  31. IsAtSpeed = true;
  32. }
  33. private void _tick_Elapsed(object sender, ElapsedEventArgs e)
  34. {
  35. lock (_locker)
  36. {
  37. if (_timer.IsRunning && _timer.Elapsed > TimeSpan.FromSeconds(10))
  38. {
  39. _timer.Stop();
  40. IsAtSpeed = true;
  41. }
  42. }
  43. }
  44. private byte GetSpeedValue()
  45. {
  46. Random random = new Random();
  47. return (byte)random.Next(0, 255);
  48. }
  49. protected override void ProcessUnsplitMessage(byte[] message)
  50. {
  51. if (CheckModRTU_CRC(message) != 0xff)
  52. { return; }
  53. base.ProcessUnsplitMessage(message);
  54. byte prefix = message[0];
  55. byte command = (byte)(message[1] / 16 * 16);
  56. byte deviceAddress = (byte)(message[1] % 16);
  57. byte groupAddress = message[2];
  58. switch (message.Length)
  59. {
  60. case 4:
  61. switch (prefix)
  62. {
  63. case 0x15:
  64. if (command == 0x20)
  65. {
  66. byte speed = GetSpeedValue();
  67. byte[] speedmsg = new byte[] { 0x31, (byte)(deviceAddress + 0x20), groupAddress, speed, 0x00 };
  68. speedmsg[4] = ModRTU_CRC(speedmsg);
  69. ProcessWriteMessage(speedmsg);
  70. receiveMsg($"Query Speed!{speed * 1440 / 250}");
  71. }
  72. if (command == 0x60)
  73. {
  74. if (receiveMsg != null)
  75. {
  76. receiveMsg("Receive restart!");
  77. }
  78. }
  79. break;
  80. default:
  81. break;
  82. }
  83. break;
  84. case 5:
  85. switch (prefix)
  86. {
  87. case 0x35:
  88. QueryMsg(message, prefix, command, deviceAddress, groupAddress);
  89. break;
  90. case 0x55:
  91. SetMsg(message, prefix, command, deviceAddress, groupAddress);
  92. break;
  93. default:
  94. break;
  95. }
  96. break;
  97. case 6:
  98. switch (prefix)
  99. {
  100. case 0x55:
  101. SetMsg(message, prefix, command, deviceAddress, groupAddress);
  102. break;
  103. default:
  104. break;
  105. }
  106. break;
  107. default:
  108. break;
  109. }
  110. }
  111. /// <summary>
  112. /// 查询参数,含风速设置
  113. /// </summary>
  114. /// <param name="message"></param>
  115. /// <param name="prefix"></param>
  116. /// <param name="command"></param>
  117. /// <param name="deviceAddress"></param>
  118. /// <param name="groupAddress"></param>
  119. private void QueryMsg(byte[] message, byte prefix, byte command, byte deviceAddress, byte groupAddress)
  120. {
  121. switch (command)
  122. {
  123. case 0x00:
  124. byte[] errormsg = new byte[] { 0x51, (byte)(deviceAddress + 0x00), groupAddress, 0x00, 0x00, 0x00 };
  125. errormsg[5] = ModRTU_CRC(errormsg);
  126. ProcessWriteMessage(errormsg);
  127. receiveMsg("Query Error!");//查询故障状态
  128. break;
  129. case 0xE0:
  130. if (message[3] == 0)
  131. {
  132. byte[] queryGroupymsg = new byte[] { 0x51, (byte)(deviceAddress + 0xE0), groupAddress, 0x05, 0x00, 0x00 };
  133. queryGroupymsg[5] = ModRTU_CRC(queryGroupymsg);
  134. ProcessWriteMessage(queryGroupymsg);
  135. receiveMsg("Query Group ddress!");//查询组地址
  136. }
  137. else if (message[3] == 1)
  138. {
  139. byte[] queryGroupymsg = new byte[] { 0x51, (byte)(deviceAddress + 0xE0), groupAddress, 0x05, 0x01, 0x00 };
  140. queryGroupymsg[5] = ModRTU_CRC(queryGroupymsg);
  141. ProcessWriteMessage(queryGroupymsg);
  142. receiveMsg("Query Device Address!");//查询机地址
  143. }
  144. else if (message[3] == 0x08)
  145. {
  146. byte[] queryMaxSpeed1msg = new byte[] { 0x51, (byte)(deviceAddress + 0xE0), groupAddress, 0x05, 0x08, 0x00 };
  147. queryMaxSpeed1msg[5] = ModRTU_CRC(queryMaxSpeed1msg);
  148. ProcessWriteMessage(queryMaxSpeed1msg);
  149. receiveMsg("Query MaxSpeed1!");//查询最高转速 1
  150. }
  151. else if (message[3] == 0x09)
  152. {
  153. byte[] queryMaxSpeed2msg = new byte[] { 0x51, (byte)(deviceAddress + 0xE0), groupAddress, 0x05, 0x09, 0x00 };
  154. queryMaxSpeed2msg[5] = ModRTU_CRC(queryMaxSpeed2msg);
  155. ProcessWriteMessage(queryMaxSpeed2msg);
  156. receiveMsg("Query MaxSpeed2!");//查询最高转速 2
  157. }
  158. else if (message[3] == 0x0A)
  159. {
  160. byte[] queryMaxSpeed3msg = new byte[] { 0x51, (byte)(deviceAddress + 0xE0), groupAddress, 0x05, 0x0a, 0x00 };
  161. queryMaxSpeed3msg[5] = ModRTU_CRC(queryMaxSpeed3msg);
  162. ProcessWriteMessage(queryMaxSpeed3msg);
  163. receiveMsg("Query MaxSpeed3!");//查询最高转速 3
  164. }
  165. else if (message[3] == 0x11)
  166. {
  167. byte[] querySpeedFactormsg = new byte[] { 0x51, (byte)(deviceAddress + 0xE0), groupAddress, 0x05, 0x11, 0x00 };
  168. querySpeedFactormsg[5] = ModRTU_CRC(querySpeedFactormsg);
  169. ProcessWriteMessage(querySpeedFactormsg);
  170. receiveMsg("Query Speed Factor!");//查询转速因子
  171. }
  172. break;
  173. case 0x40:
  174. byte[] setSpeedmsg = new byte[] { 0x11, (byte)(deviceAddress + 0x40), groupAddress, 0x00 };
  175. setSpeedmsg[3] = ModRTU_CRC(setSpeedmsg);
  176. ProcessWriteMessage(setSpeedmsg);
  177. receiveMsg($"Set Speed {message[3]}!");//设置风速
  178. break;
  179. default:
  180. break;
  181. }
  182. }
  183. private void SetMsg(byte[] message, byte prefix, byte command, byte deviceAddress, byte groupAddress)
  184. {
  185. switch (message[3])
  186. {
  187. case 0x00://设置组地址
  188. byte[] returnGroupAddressMsg = new byte[] { 0x11, (byte)(deviceAddress + 0xC0), groupAddress, 00};
  189. returnGroupAddressMsg[3] = ModRTU_CRC(returnGroupAddressMsg);
  190. ProcessWriteMessage(returnGroupAddressMsg);
  191. receiveMsg($"Set Group Address{message[4]}!");
  192. break;
  193. case 0x01://设置机地址
  194. byte[] returnDeviceAddressMsg = new byte[] { 0x11, (byte)(deviceAddress + 0xC0), groupAddress, 00 };
  195. returnDeviceAddressMsg[3] = ModRTU_CRC(returnDeviceAddressMsg);
  196. ProcessWriteMessage(returnDeviceAddressMsg);
  197. receiveMsg($"Set Device Address{message[4]}!");
  198. break;
  199. case 0x11://设置转速因子
  200. byte[] returnSpeedFactorMsg = new byte[] { 0x11, (byte)(deviceAddress + 0xC0), groupAddress, 00 };
  201. returnSpeedFactorMsg[3] = ModRTU_CRC(returnSpeedFactorMsg);
  202. ProcessWriteMessage(returnSpeedFactorMsg);
  203. receiveMsg($"Set Device Address{message[4]}!");
  204. break;
  205. default:
  206. break;
  207. }
  208. }
  209. private static byte ModRTU_CRC(byte[] buffer)
  210. {
  211. //ushort crc = 0xFFFF;
  212. // var buf = System.Text.Encoding.UTF8.GetBytes(String.Join(Environment.NewLine, buffer));
  213. var buf = buffer;
  214. var len = buffer.Length;
  215. byte temp = buffer[0];
  216. for (int i = 1; i < buffer.Length; i++)
  217. {
  218. temp = (byte)(temp ^ buffer[i]);
  219. }
  220. return (byte)~temp;
  221. }
  222. private static byte CheckModRTU_CRC(byte[] buffer)
  223. {
  224. //ushort crc = 0xFFFF;
  225. // var buf = System.Text.Encoding.UTF8.GetBytes(String.Join(Environment.NewLine, buffer));
  226. var buf = buffer;
  227. var len = buffer.Length;
  228. byte temp = buffer[0];
  229. for (int i = 1; i < buffer.Length; i++)
  230. {
  231. temp = (byte)(temp ^ buffer[i]);
  232. }
  233. return (byte)temp;
  234. }
  235. protected override void ProcessUnsplitMessage(string msg)
  236. {
  237. //if (!Failed)
  238. {
  239. if (msg == "0010030302=?101\r")
  240. {
  241. //OnWriteMessage("0011030306000000014" + "\r" );
  242. string text = "0011030306" + (Failed ? _rd.Next(0, 999).ToString("D6") : "000000");
  243. int sum = 0;
  244. foreach (var item in text)
  245. {
  246. sum += (int)item;
  247. }
  248. sum = sum % 256;
  249. OnWriteMessage(text + sum.ToString("D3") + "\r");
  250. return;
  251. }
  252. if (msg == "0010039802=?115\r")
  253. {
  254. string text = "0011039806" + _rd.Next(0, 999999).ToString("D6");
  255. int sum = 0;
  256. foreach (var item in text)
  257. {
  258. sum += (int)item;
  259. }
  260. sum = sum % 256;
  261. OnWriteMessage(text + sum.ToString("D3") + "\r");
  262. return;
  263. }
  264. if (msg == "0010034602=?108\r")
  265. {
  266. string text = "0011034606" + _rd.Next(0, 999999).ToString("D6");
  267. int sum = 0;
  268. foreach (var item in text)
  269. {
  270. sum += (int)item;
  271. }
  272. sum = sum % 256;
  273. OnWriteMessage(text + sum.ToString("D3") + "\r");
  274. return;
  275. }
  276. if (msg == "0011001006111111015\r")
  277. {
  278. lock (_locker)
  279. {
  280. if (!IsPumpOn)
  281. {
  282. IsPumpOn = true;
  283. IsAtSpeed = false;
  284. _timer.Restart();
  285. }
  286. }
  287. OnWriteMessage("0011001006111111015" + "\r");
  288. return;
  289. }
  290. if (msg == "0011001006000000009\r")
  291. {
  292. lock (_locker)
  293. {
  294. if (IsPumpOn)
  295. {
  296. IsPumpOn = false;
  297. IsAtSpeed = false;
  298. _timer.Restart();
  299. }
  300. }
  301. OnWriteMessage("0011001006000000009" + "\r");
  302. return;
  303. }
  304. if (msg == "0010001002=?096\r")
  305. {
  306. string text = "0011001006" + (IsPumpOn ? "111111" : "000000");
  307. int sum = 0;
  308. foreach (var item in text)
  309. {
  310. sum += (int)item;
  311. }
  312. sum = sum % 256;
  313. OnWriteMessage(text + sum.ToString("D3") + "\r");
  314. return;
  315. }
  316. if (msg == "0010030502=?103\r")
  317. {
  318. string text = "0011030506" + (IsOverTemp ? "111111" : "000000");
  319. int sum = 0;
  320. foreach (var item in text)
  321. {
  322. sum += (int)item;
  323. }
  324. sum = sum % 256;
  325. OnWriteMessage(text + sum.ToString("D3") + "\r");
  326. return;
  327. }
  328. if (msg == "0010030602=?104\r")
  329. {
  330. string text = "0011030606" + (IsAtSpeed ? "111111" : "000000");
  331. int sum = 0;
  332. foreach (var item in text)
  333. {
  334. sum += (int)item;
  335. }
  336. sum = sum % 256;
  337. OnWriteMessage(text + sum.ToString("D3") + "\r");
  338. return;
  339. }
  340. if (msg == "0010030702=?105\r")
  341. {
  342. string text = "0011030706" + (IsAtSpeed ? "000000" : "111111");
  343. int sum = 0;
  344. foreach (var item in text)
  345. {
  346. sum += (int)item;
  347. }
  348. sum = sum % 256;
  349. OnWriteMessage(text + sum.ToString("D3") + "\r");
  350. return;
  351. }
  352. }
  353. }
  354. }
  355. }