Ffu.cs 15 KB

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