TeamFeeder.cs 67 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690
  1. using Newtonsoft.Json.Linq;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.ComponentModel.Design;
  5. using System.Linq;
  6. using System.Reflection;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Input;
  10. using Team.FFFeederService.Enums;
  11. using Team.FFFeederService.Interfaces;
  12. using Team.FFFeederService.Models;
  13. using TouchSocket.Core;
  14. using TouchSocket.Sockets;
  15. namespace Team.FFFeederService
  16. {
  17. /// <summary>
  18. /// Feeder 参数读写控制
  19. /// </summary>
  20. public class TeamFeeder : IVoiceCoilMotorFeeder
  21. {
  22. #region 字段
  23. /// <summary>
  24. /// 背光打开命令
  25. /// </summary>
  26. private const string LightOpenCommand = "{K1}";
  27. /// <summary>
  28. /// 背光关闭命令
  29. /// </summary>
  30. private const string LightCloseCommand = "{K0}";
  31. /// <summary>
  32. /// 查询背光状态命令
  33. /// </summary>
  34. private const string QueryLightStateCommand = "{K?}";
  35. /// <summary>
  36. /// 平台振动参数起始地址
  37. /// </summary>
  38. private const int ShakeParamStartAddress = 300;
  39. /// <summary>
  40. /// 料斗振动参数起始地址
  41. /// </summary>
  42. private const int HopperParamStartAddress = 742;
  43. /// <summary>
  44. /// 序列参数起始地址
  45. /// </summary>
  46. private const int SequenceParamStartAddress = 950;
  47. private IWaitingClient<ITcpClient, IReceiverResult> WaitClient;
  48. private bool isFirstConnect = true;
  49. private Task bgConnectTask;
  50. #endregion
  51. #region 属性
  52. public FeederBrand FeederBrand { get => FeederBrand.TEAM; }
  53. public FeederModel FeederModel { get; private set; } = FeederModel.Unknown;
  54. public Guid Id { get; set; }
  55. /// <summary>
  56. /// Feeder连接状态
  57. /// </summary>
  58. public bool IsConnected => TcpClient.Online;
  59. /// <summary>
  60. /// Feeder是否首次连接成功
  61. /// </summary>
  62. public bool IsInit { get; private set; }
  63. /// <summary>
  64. /// Feeder IP地址
  65. /// </summary>
  66. public string FeederIp => TcpClient.IP;
  67. /// <summary>
  68. /// Feeder 端口
  69. /// </summary>
  70. public int FeederPort => TcpClient.Port;
  71. /// <summary>
  72. /// 接收数据的超时时间
  73. /// </summary>
  74. public int MillisecondsTimeout = 5000; //接收数据超时时间
  75. /// <summary>
  76. /// TCP客户端通讯
  77. /// </summary>
  78. public TcpClient TcpClient { get; }
  79. #endregion
  80. // private const string SelectOneShakeCommand = "{UV1}\r\n";
  81. #region 事件
  82. /// <summary>
  83. /// Feeder连接上时
  84. /// </summary>
  85. public event Action<Guid, ITcpClient, ConnectedEventArgs> FeederConnectedEvent;
  86. /// <summary>
  87. /// Feeder断开连接上时
  88. /// </summary>
  89. public event Action<Guid, ITcpClient, ClosedEventArgs> FeederDisconnectedEvent;
  90. #endregion
  91. public TeamFeeder(TcpClient tcpClient)
  92. {
  93. TcpClient = tcpClient;
  94. //调用CreateWaitingClient获取到IWaitingClient的对象。
  95. WaitClient = tcpClient.CreateWaitingClient(new WaitingOptions()
  96. {
  97. FilterFunc = response => //设置用于筛选的fun委托,当返回为true时,才会响应返回
  98. {
  99. return true;
  100. //if (response.Data.Length == 1)
  101. //{
  102. // return true;
  103. //}
  104. //return false;
  105. }
  106. });
  107. TcpClient.Connected = ConnectedVoid;
  108. TcpClient.Closed = DisconnectedVoid;
  109. }
  110. #region 方法
  111. #region Feeder 连接
  112. /// <summary>
  113. /// 连接Feeder
  114. /// </summary>
  115. public void Connect()
  116. {
  117. try
  118. {
  119. TcpClient.Connect();
  120. IsInit = true;
  121. isFirstConnect = false;
  122. }
  123. catch (Exception)
  124. {
  125. IsInit = false;
  126. if (bgConnectTask == null)
  127. {
  128. bgConnectTask = Task.Run(async () =>
  129. {
  130. while (true)
  131. {
  132. try
  133. {
  134. TcpClient.Connect();
  135. isFirstConnect = false;
  136. return;
  137. }
  138. catch (Exception)
  139. {
  140. await Task.Delay(1000);
  141. }
  142. }
  143. });
  144. }
  145. throw;
  146. }
  147. }
  148. /// <summary>
  149. /// 连接Feeder
  150. /// </summary>
  151. /// <returns></returns>
  152. public async Task ConnectAsync()
  153. {
  154. try
  155. {
  156. await TcpClient.ConnectAsync();
  157. IsInit = true;
  158. isFirstConnect = false;
  159. }
  160. catch (Exception)
  161. {
  162. IsInit = false;
  163. if (bgConnectTask == null)
  164. {
  165. bgConnectTask = Task.Run(async () =>
  166. {
  167. while (true)
  168. {
  169. try
  170. {
  171. TcpClient.Connect();
  172. isFirstConnect = false;
  173. return;
  174. }
  175. catch (Exception)
  176. {
  177. await Task.Delay(1000);
  178. }
  179. }
  180. });
  181. }
  182. throw;
  183. }
  184. }
  185. #endregion
  186. public void Reset()
  187. {
  188. }
  189. public Task ResetAsync()
  190. {
  191. return Task.CompletedTask;
  192. }
  193. #region 振动集
  194. /// <summary>
  195. /// 选择使用振动集
  196. /// </summary>
  197. /// <param name="id"></param>
  198. /// <exception cref="FeederResponseException"></exception>
  199. public void SelectShakeParam(int id)
  200. {
  201. var sendCommand = "{UV" + id + "}";
  202. var returnData = WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(sendCommand));
  203. string result = Encoding.ASCII.GetString(returnData);
  204. if (result.TrimEnd() != sendCommand.TrimEnd())
  205. {
  206. throw new Exception("FFFeeder响应不正确");
  207. }
  208. }
  209. /// <summary>
  210. /// 选择使用振动集
  211. /// </summary>
  212. /// <param name="id"></param>
  213. /// <returns></returns>
  214. /// <exception cref="FeederResponseException"></exception>
  215. public async Task SelectShakeParamAsync(int id)
  216. {
  217. var sendCommand = "{UV" + id + "}";
  218. var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(sendCommand));
  219. string result = Encoding.ASCII.GetString(returnData);
  220. if (result.TrimEnd() != sendCommand.TrimEnd())
  221. {
  222. throw new Exception("FFFeeder响应不正确");
  223. }
  224. }
  225. /// <summary>
  226. /// 将振动集参数存储至非易失内存中
  227. /// </summary>
  228. /// <returns></returns>
  229. /// <exception cref="Exception"></exception>
  230. public async Task SaveShakeSetAsync()
  231. {
  232. string sendCommand = "{DV}";
  233. var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(sendCommand));
  234. string result = Encoding.ASCII.GetString(returnData);
  235. if (result.TrimEnd() != sendCommand.TrimEnd())
  236. {
  237. throw new Exception("FFFeeder响应不正确");
  238. }
  239. }
  240. /// <summary>
  241. /// 查询当前选择的振动集
  242. /// </summary>
  243. /// <returns></returns>
  244. public int GetSelectedShakeParam()
  245. {
  246. const string sendCommand = "{UV?}";
  247. var returnData = WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(sendCommand));
  248. string result = Encoding.ASCII.GetString(returnData);
  249. return int.Parse(result.TrimEnd().Split(':')[1].Replace("}", ""));
  250. }
  251. /// <summary>
  252. /// 查询当前选择的振动集
  253. /// </summary>
  254. /// <returns></returns>
  255. public async Task<int> GetSelectedShakeParamAsync()
  256. {
  257. const string sendCommand = "{UV?}";
  258. var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(sendCommand));
  259. string result = Encoding.ASCII.GetString(returnData);
  260. return int.Parse(result.TrimEnd().Split(':')[1].Replace("}", ""));
  261. }
  262. #endregion
  263. #region 平台振动参数
  264. //300~741
  265. //300 A 平台振动 A 振幅 1
  266. //301 A 平台振动 A 频率 1
  267. //302 A 平台振动 A 相位 1
  268. //303 A 平台振动 A 波形 1
  269. //304 A 平台振动 A 振幅 2
  270. //305 A 平台振动 A 频率 2
  271. //306 A 平台振动 A 相位 2
  272. //307 A 平台振动 A 波形 2
  273. //308 A 平台振动 A 振幅 3
  274. //309 A 平台振动 A 频率 3
  275. //310 A 平台振动 A 相位 3
  276. //311 A 平台振动 A 波形 3
  277. //312 A 平台振动 A 振幅 4
  278. //313 A 平台振动 A 频率 4
  279. //314 A 平台振动 A 相位 4
  280. //315 A 平台振动 A 波形 4
  281. //316 A 平台振动 A 持续时间
  282. //300+17*n
  283. /// <summary>
  284. /// 选择要使用的振动集(1~26)
  285. /// </summary>
  286. /// <param name="v"></param>
  287. /// <returns></returns>
  288. public bool LoadShakeSet(int v)
  289. {
  290. var command = "{UV" + v + "}";
  291. var returnData = WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(command));
  292. string result = Encoding.ASCII.GetString(returnData);
  293. return result == command;
  294. }
  295. /// <summary>
  296. /// 选择要使用的振动集(1~26)
  297. /// </summary>
  298. /// <param name="v"></param>
  299. /// <returns></returns>
  300. public async Task<bool> LoadShakeSetAsync(int v)
  301. {
  302. var command = "{UV" + v + "}";
  303. var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command));
  304. string result = Encoding.ASCII.GetString(returnData);
  305. return result == command;
  306. }
  307. /// <summary>
  308. /// 执行平台振动
  309. /// </summary>
  310. /// <param name="index"></param>
  311. /// <param name="timespan"></param>
  312. public async Task<int> StartAction(int index, int? timespan = null)
  313. {
  314. if (index < 0 || index > 25)
  315. {
  316. index = 0;
  317. }
  318. char chn = (char)('A' + index);
  319. string actionCommand = $"C{chn}";
  320. return await RunFromCommand(actionCommand, timespan);
  321. }
  322. /// <summary>
  323. /// 停止平台振动
  324. /// </summary>
  325. public void Stop()
  326. {
  327. WaitClient.SendThenReturn(Encoding.ASCII.GetBytes("{HC}"), MillisecondsTimeout);
  328. }
  329. /// <summary>
  330. /// 停止平台振动
  331. /// </summary>
  332. /// <returns></returns>
  333. public Task StopAsync()
  334. {
  335. return WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes("{HC}"), MillisecondsTimeout);
  336. }
  337. /// <summary>
  338. /// 向前
  339. /// </summary>
  340. /// <param name="timespan"></param>
  341. /// <returns></returns>
  342. public async Task<int> RunToLeftAsync(int? timespan = null)
  343. {
  344. var command = "{CA" + timespan + "}";
  345. var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command));
  346. string result = Encoding.ASCII.GetString(returnData);
  347. var timeSpan = result.TrimEnd().Replace("{", "").Replace("}", "").Replace("CA", "");
  348. if (string.IsNullOrEmpty(timeSpan))
  349. {
  350. return 0;
  351. }
  352. return int.Parse(timeSpan);
  353. }
  354. /// <summary>
  355. /// 左前
  356. /// </summary>
  357. /// <param name="timespan"></param>
  358. /// <returns></returns>
  359. public async Task<int> RunToBottomLeftAsync(int? timespan = null)
  360. {
  361. var command = "{CB" + timespan + "}";
  362. var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command));
  363. string result = Encoding.ASCII.GetString(returnData);
  364. var timeSpan = result.TrimEnd().Replace("{", "").Replace("}", "").Replace("CB", "");
  365. if (string.IsNullOrEmpty(timeSpan))
  366. {
  367. return 0;
  368. }
  369. return int.Parse(timeSpan);
  370. }
  371. /// <summary>
  372. /// 右前
  373. /// </summary>
  374. /// <param name="timespan"></param>
  375. /// <returns></returns>
  376. public async Task<int> RunToTopLeftAsync(int? timespan = null)
  377. {
  378. var command = "{CC" + timespan + "}";
  379. var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command));
  380. string result = Encoding.ASCII.GetString(returnData);
  381. var timeSpan = result.TrimEnd().Replace("{", "").Replace("}", "").Replace("CC", "");
  382. if (string.IsNullOrEmpty(timeSpan))
  383. {
  384. return 0;
  385. }
  386. return int.Parse(timeSpan);
  387. }
  388. /// <summary>
  389. /// 向左
  390. /// </summary>
  391. /// <param name="timespan"></param>
  392. /// <returns></returns>
  393. public async Task<int> RunToBottomAsync(int? timespan = null)
  394. {
  395. var command = "{CD" + timespan + "}";
  396. var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command));
  397. string result = Encoding.ASCII.GetString(returnData);
  398. var timeSpan = result.TrimEnd().Replace("{", "").Replace("}", "").Replace("CD", "");
  399. if (string.IsNullOrEmpty(timeSpan))
  400. {
  401. return 0;
  402. }
  403. return int.Parse(timeSpan);
  404. }
  405. /// <summary>
  406. /// 向右
  407. /// </summary>
  408. /// <param name="timespan"></param>
  409. /// <returns></returns>
  410. public async Task<int> RunToTopAsync(int? timespan = null)
  411. {
  412. var command = "{CE" + timespan + "}";
  413. var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command));
  414. string result = Encoding.ASCII.GetString(returnData);
  415. var timeSpan = result.TrimEnd().Replace("{", "").Replace("}", "").Replace("CE", "");
  416. if (string.IsNullOrEmpty(timeSpan))
  417. {
  418. return 0;
  419. }
  420. return int.Parse(timeSpan);
  421. }
  422. /// <summary>
  423. /// 向后
  424. /// </summary>
  425. /// <param name="timespan"></param>
  426. /// <returns></returns>
  427. public async Task<int> RunToRightAsync(int? timespan = null)
  428. {
  429. var command = "{CF" + timespan + "}";
  430. var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command));
  431. string result = Encoding.ASCII.GetString(returnData);
  432. var timeSpan = result.TrimEnd().Replace("{", "").Replace("}", "").Replace("CF", "");
  433. if (string.IsNullOrEmpty(timeSpan))
  434. {
  435. return 0;
  436. }
  437. return int.Parse(timeSpan);
  438. }
  439. /// <summary>
  440. /// 左后
  441. /// </summary>
  442. /// <param name="timespan"></param>
  443. /// <returns></returns>
  444. public async Task<int> RunToBottomRightAsync(int? timespan = null)
  445. {
  446. var command = "{CG" + timespan + "}";
  447. var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command));
  448. string result = Encoding.ASCII.GetString(returnData);
  449. var timeSpan = result.TrimEnd().Replace("{", "").Replace("}", "").Replace("CG", "");
  450. if (string.IsNullOrEmpty(timeSpan))
  451. {
  452. return 0;
  453. }
  454. return int.Parse(timeSpan);
  455. }
  456. /// <summary>
  457. /// 右后
  458. /// </summary>
  459. /// <param name="timespan"></param>
  460. /// <returns></returns>
  461. public async Task<int> RunToTopRightAsync(int? timespan = null)
  462. {
  463. var command = "{CH" + timespan + "}";
  464. var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command));
  465. string result = Encoding.ASCII.GetString(returnData);
  466. var timeSpan = result.TrimEnd().Replace("{", "").Replace("}", "").Replace("CH", "");
  467. if (string.IsNullOrEmpty(timeSpan))
  468. {
  469. return 0;
  470. }
  471. return int.Parse(timeSpan);
  472. }
  473. /// <summary>
  474. /// 散开
  475. /// </summary>
  476. /// <param name="timespan"></param>
  477. /// <returns></returns>
  478. public async Task<int> RunToFlipAsync(int? timespan = null)
  479. {
  480. var command = "{CI" + timespan + "}";
  481. var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command));
  482. string result = Encoding.ASCII.GetString(returnData);
  483. var timeSpan = result.TrimEnd().Replace("{", "").Replace("}", "").Replace("CI", "");
  484. return string.IsNullOrEmpty(timeSpan) ? 0 : int.Parse(timeSpan);
  485. }
  486. /// <summary>
  487. /// 横向聚中
  488. /// </summary>
  489. /// <param name="timespan">持续时间</param>
  490. /// <returns></returns>
  491. public async Task<int> RunToInnerVerticalAsync(int? timespan = null)
  492. {
  493. var command = "{CJ" + timespan + "}";
  494. var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command));
  495. string result = Encoding.ASCII.GetString(returnData);
  496. var timeSpan = result.TrimEnd().Replace("{", "").Replace("}", "").Replace("CJ", "");
  497. if (string.IsNullOrEmpty(timeSpan))
  498. {
  499. return 0;
  500. }
  501. return int.Parse(timeSpan);
  502. }
  503. /// <summary>
  504. /// 纵向聚中
  505. /// </summary>
  506. /// <param name="timespan"></param>
  507. /// <returns></returns>
  508. public async Task<int> RunToInnerHorizonAsync(int? timespan = null)
  509. {
  510. var command = "{CK" + timespan + "}";
  511. var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command));
  512. string result = Encoding.ASCII.GetString(returnData);
  513. var timeSpan = result.TrimEnd().Replace("{", "").Replace("}", "").Replace("CK", "");
  514. if (string.IsNullOrEmpty(timeSpan))
  515. {
  516. return 0;
  517. }
  518. return int.Parse(timeSpan);
  519. }
  520. /// <summary>
  521. /// 读一个振动动作值
  522. /// </summary>
  523. /// <param name="v"></param>
  524. /// <returns></returns>
  525. public SingleActionParam GetShakeGroupValue(int index)
  526. {
  527. if (index < 0 || index > 25)
  528. {
  529. index = 0;
  530. }
  531. return GetShakeGroupValueAsync(index).GetAwaiter().GetResult();
  532. }
  533. /// <summary>
  534. /// 读一个振动动作值
  535. /// </summary>
  536. /// <param name="index"></param>
  537. /// <returns></returns>
  538. public async Task<SingleActionParam> GetShakeGroupValueAsync(int index)
  539. {
  540. var results = new string[17];
  541. for (var j = 0; j < 17; j++)
  542. {
  543. var id = index * 17 + ShakeParamStartAddress + j;
  544. var command = "{RP" + id + "}";
  545. var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command));
  546. string result = Encoding.ASCII.GetString(returnData);
  547. results[j] = result.TrimEnd().Replace("{RP", "").Replace("}", "").Split(":")[1];
  548. }
  549. int i = 0;
  550. SingleActionParam actionParam=new SingleActionParam();
  551. actionParam.Motor1 = new VoiceMotorParam() { Amplitude = ushort.Parse(results[i]), Frequency= ushort.Parse(results[i+1]), Phase = ushort.Parse(results[i + 2]), WaveShape= (WaveShape)ushort.Parse(results[i + 3]) };
  552. i = 4;
  553. actionParam.Motor2 = new VoiceMotorParam() { Amplitude = ushort.Parse(results[i]), Frequency = ushort.Parse(results[i + 1]), Phase = ushort.Parse(results[i + 2]), WaveShape = (WaveShape)ushort.Parse(results[i + 3]) };
  554. i = 8;
  555. actionParam.Motor3 = new VoiceMotorParam() { Amplitude = ushort.Parse(results[i]), Frequency = ushort.Parse(results[i + 1]), Phase = ushort.Parse(results[i + 2]), WaveShape = (WaveShape)ushort.Parse(results[i + 3]) };
  556. i = 12;
  557. actionParam.Motor4 = new VoiceMotorParam() { Amplitude = ushort.Parse(results[i]), Frequency = ushort.Parse(results[i + 1]), Phase = ushort.Parse(results[i + 2]), WaveShape = (WaveShape)ushort.Parse(results[i + 3]) };
  558. actionParam.DurationValue = int.Parse(results[16]);
  559. return actionParam;
  560. }
  561. /// <summary>
  562. /// 获取单个动作持续时间
  563. /// </summary>
  564. /// <param name="id"></param>
  565. /// <returns></returns>
  566. public int GetDuration(int id)
  567. {
  568. var idInServer = id * 17 + 316;
  569. var command = "{RP" + idInServer + "}";
  570. var returnData = WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(command));
  571. string result = Encoding.ASCII.GetString(returnData);
  572. var value = result.TrimEnd().Replace("{RP", "").Replace("}", "").Split(':')[1];
  573. return int.Parse(value);
  574. }
  575. /// <summary>
  576. /// 获取单个动作持续时间
  577. /// </summary>
  578. /// <param name="id"></param>
  579. /// <returns></returns>
  580. public async Task<int> GetDurationAsync(int id)
  581. {
  582. var idInServer = id * 17 + 316;
  583. var command = "{RP" + idInServer + "}";
  584. var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command));
  585. string result = Encoding.ASCII.GetString(returnData);
  586. var value = result.TrimEnd().Replace("{RP", "").Replace("}", "").Split(':')[1];
  587. return int.Parse(value);
  588. }
  589. /// <summary>
  590. /// 写入振动单个参数
  591. /// </summary>
  592. /// <param name="selectedShakeMotion"></param>
  593. /// <param name="id"></param>
  594. /// <param name="value"></param>
  595. /// <returns></returns>
  596. public async Task SetShakeParametersAsync(int selectedShakeMotion, int id, string value)
  597. {
  598. var commandId = 300 + selectedShakeMotion * 17 + id;
  599. var command = "{WP" + $"{commandId}={value}" + "}";
  600. var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command));
  601. //string result = Encoding.ASCII.GetString(returnData);
  602. }
  603. /// <summary>
  604. /// 写入振动单个参数
  605. /// </summary>
  606. /// <param name="selectedShakeMotion"></param>
  607. /// <param name="id"></param>
  608. /// <param name="value"></param>
  609. public void SetShakeParameters(int selectedShakeMotion, int id, string value)
  610. {
  611. var commandId = 300 + selectedShakeMotion * 17 + id;
  612. var command = "{WP" + $"{commandId}={value}" + "}";
  613. var returnData = WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(command));
  614. }
  615. /// <summary>
  616. /// 写入平台振动完成参数
  617. /// </summary>
  618. /// <param name="selectedShakeMotion"></param>
  619. /// <param name="value"></param>
  620. /// <returns></returns>
  621. public async Task SetShakeParametersAsync(int selectedShakeMotion, string value)
  622. {
  623. if (selectedShakeMotion < 0 || selectedShakeMotion > 15)
  624. selectedShakeMotion = 0;
  625. char chn = (char)('A' + selectedShakeMotion);
  626. var command = "{SC" + $"{chn}=" + $"({value})" + "}";
  627. var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command));
  628. }
  629. /// <summary>
  630. /// 写入平台振动完成参数
  631. /// </summary>
  632. /// <param name="selectedShakeMotion"></param>
  633. /// <param name="value"></param>
  634. public void SetShakeParameters(int selectedShakeMotion, string value)
  635. {
  636. if (selectedShakeMotion < 0 || selectedShakeMotion > 15)
  637. selectedShakeMotion = 0;
  638. char chn = (char)('A' + selectedShakeMotion);
  639. var command = "{SC" + $"{chn}=" + $"({value})" + "}";
  640. var returnData = WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(command));
  641. }
  642. /// <summary>
  643. /// 写入完整的平台振动参数
  644. /// </summary>
  645. /// <param name="selectedShakeMotion"></param>
  646. /// <param name="value"></param>
  647. public void SetShakeParameters(int selectedShakeMotion, SingleActionParam value)
  648. {
  649. StringBuilder sb = new StringBuilder();
  650. sb.Append($"{value.Motor1.Amplitude};{value.Motor1.Frequency};{value.Motor1.Phase};{(int)value.Motor1.WaveShape};");
  651. sb.Append($"{value.Motor2.Amplitude};{value.Motor2.Frequency};{value.Motor2.Phase};{(int)value.Motor2.WaveShape};");
  652. sb.Append($"{value.Motor3.Amplitude};{value.Motor3.Frequency};{value.Motor3.Phase};{(int)value.Motor3.WaveShape};");
  653. sb.Append($"{value.Motor4.Amplitude};{value.Motor4.Frequency};{value.Motor4.Phase};{(int)value.Motor4.WaveShape};");
  654. sb.Append($"{value.DurationValue}");
  655. SetShakeParameters(selectedShakeMotion, sb.ToString());
  656. }
  657. /// <summary>
  658. /// 写入完整的平台振动参数
  659. /// </summary>
  660. /// <param name="selectedShakeMotion"></param>
  661. /// <param name="value"></param>
  662. /// <returns></returns>
  663. public async Task SetShakeParametersAsync(int selectedShakeMotion, SingleActionParam value)
  664. {
  665. StringBuilder sb = new StringBuilder();
  666. sb.Append($"{value.Motor1.Amplitude};{value.Motor1.Frequency};{value.Motor1.Phase};{(int)value.Motor1.WaveShape};");
  667. sb.Append($"{value.Motor2.Amplitude};{value.Motor2.Frequency};{value.Motor2.Phase};{(int)value.Motor2.WaveShape};");
  668. sb.Append($"{value.Motor3.Amplitude};{value.Motor3.Frequency};{value.Motor3.Phase};{(int)value.Motor3.WaveShape};");
  669. sb.Append($"{value.Motor4.Amplitude};{value.Motor4.Frequency};{value.Motor4.Phase};{(int)value.Motor4.WaveShape};");
  670. sb.Append($"{value.DurationValue}");
  671. await SetShakeParametersAsync(selectedShakeMotion, sb.ToString());
  672. }
  673. /// <summary>
  674. /// 获取完整的平台振动参数
  675. /// </summary>
  676. /// <param name="selectedShakeMotion"></param>
  677. /// <returns></returns>
  678. public SingleActionParam GetShakeParameters(int selectedShakeMotion)
  679. {
  680. if (selectedShakeMotion < 0 || selectedShakeMotion > 15)
  681. selectedShakeMotion = 0;
  682. char chn = (char)('A' + selectedShakeMotion);
  683. var command = "{LC" + $"{chn}" + "}";
  684. var returnData = WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(command));
  685. string result = Encoding.ASCII.GetString(returnData);
  686. var timeSpan = result.TrimEnd().Replace("{", "").Replace("}", "").Replace($"LC{chn}", "").Replace("(", "").Replace(")", "").Replace(":", "").Split(";");
  687. int i = 0;
  688. SingleActionParam actionParam = new SingleActionParam();
  689. actionParam.Motor1 = new VoiceMotorParam() { Amplitude = ushort.Parse(timeSpan[i]), Frequency = ushort.Parse(timeSpan[i + 1]), Phase = ushort.Parse(timeSpan[i + 2]), WaveShape = (WaveShape)ushort.Parse(timeSpan[i + 3]) };
  690. i = 4;
  691. actionParam.Motor2 = new VoiceMotorParam() { Amplitude = ushort.Parse(timeSpan[i]), Frequency = ushort.Parse(timeSpan[i + 1]), Phase = ushort.Parse(timeSpan[i + 2]), WaveShape = (WaveShape)ushort.Parse(timeSpan[i + 3]) };
  692. i = 8;
  693. actionParam.Motor2 = new VoiceMotorParam() { Amplitude = ushort.Parse(timeSpan[i]), Frequency = ushort.Parse(timeSpan[i + 1]), Phase = ushort.Parse(timeSpan[i + 2]), WaveShape = (WaveShape)ushort.Parse(timeSpan[i + 3]) };
  694. i = 12;
  695. actionParam.Motor2 = new VoiceMotorParam() { Amplitude = ushort.Parse(timeSpan[i]), Frequency = ushort.Parse(timeSpan[i + 1]), Phase = ushort.Parse(timeSpan[i + 2]), WaveShape = (WaveShape)ushort.Parse(timeSpan[i + 3]) };
  696. actionParam.DurationValue = int.Parse(timeSpan[16]);
  697. return actionParam;
  698. }
  699. /// <summary>
  700. /// 获取完整的平台振动参数
  701. /// </summary>
  702. /// <param name="selectedShakeMotion"></param>
  703. /// <returns></returns>
  704. public async Task<SingleActionParam> GetShakeParametersAsync(int selectedShakeMotion)
  705. {
  706. if (selectedShakeMotion < 0 || selectedShakeMotion > 15)
  707. selectedShakeMotion = 0;
  708. char chn = (char)('A' + selectedShakeMotion);
  709. var command = "{LC" + $"{chn}" + "}";
  710. var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command));
  711. string result = Encoding.ASCII.GetString(returnData);
  712. var timeSpan = result.TrimEnd().Replace("{", "").Replace("}", "").Replace($"LC{chn}", "").Replace("(", "").Replace(")", "").Replace(":", "").Split(";");
  713. int i = 0;
  714. SingleActionParam actionParam = new SingleActionParam();
  715. actionParam.Motor1 = new VoiceMotorParam() { Amplitude = ushort.Parse(timeSpan[i]), Frequency = ushort.Parse(timeSpan[i + 1]), Phase = ushort.Parse(timeSpan[i + 2]), WaveShape = (WaveShape)ushort.Parse(timeSpan[i + 3]) };
  716. i = 4;
  717. actionParam.Motor2 = new VoiceMotorParam() { Amplitude = ushort.Parse(timeSpan[i]), Frequency = ushort.Parse(timeSpan[i + 1]), Phase = ushort.Parse(timeSpan[i + 2]), WaveShape = (WaveShape)ushort.Parse(timeSpan[i + 3]) };
  718. i = 8;
  719. actionParam.Motor2 = new VoiceMotorParam() { Amplitude = ushort.Parse(timeSpan[i]), Frequency = ushort.Parse(timeSpan[i + 1]), Phase = ushort.Parse(timeSpan[i + 2]), WaveShape = (WaveShape)ushort.Parse(timeSpan[i + 3]) };
  720. i = 12;
  721. actionParam.Motor2 = new VoiceMotorParam() { Amplitude = ushort.Parse(timeSpan[i]), Frequency = ushort.Parse(timeSpan[i + 1]), Phase = ushort.Parse(timeSpan[i + 2]), WaveShape = (WaveShape)ushort.Parse(timeSpan[i + 3]) };
  722. actionParam.DurationValue = int.Parse(timeSpan[16]);
  723. return actionParam;
  724. }
  725. /// <summary>
  726. /// 获取平台震动超时时间
  727. /// </summary>
  728. /// <returns></returns>
  729. public async Task<ushort> GetPlatShakeTimeoutAsync()
  730. {
  731. const string sendCommand = "{RP65?}";
  732. var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(sendCommand));
  733. string result = Encoding.ASCII.GetString(returnData);
  734. return ushort.Parse(result.TrimEnd().Split(':')[1].Replace("}", ""));
  735. }
  736. /// <summary>
  737. /// 设置平台震动超时时间
  738. /// </summary>
  739. /// <param name="upperFeederShakeTimeout"></param>
  740. /// <returns></returns>
  741. public async Task SetPlatShakeTimeoutAsync(ushort upperFeederShakeTimeout)
  742. {
  743. const int commandId = 65;
  744. var command = "{WP" + $"{commandId}={upperFeederShakeTimeout}" + "}";
  745. var result = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command));
  746. //const string saveCommand = "{DG}";
  747. //var result1 = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(saveCommand));
  748. }
  749. #endregion
  750. #region 料斗振动输出参数
  751. //742~949
  752. //742+8*n n 料斗动作 n 数字量输出 1
  753. //743+8*n n 料斗动作 n 模拟量输出 1
  754. //744+8*n n 料斗动作 n 数字量输出 2
  755. //745+8*n n 料斗动作 n 模拟量输出 2
  756. //746+8*n n 备用
  757. //747+8*n n 备用
  758. //748+8*n n 备用
  759. //749+8*n n 料斗振动 n 持续时间
  760. /// <summary>
  761. /// 执行料斗供料
  762. /// </summary>
  763. /// <returns></returns>
  764. public async Task<int> ShakeUpAsync()
  765. {
  766. const string sendCommand = "{EF:(A;55;110)}";
  767. var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(sendCommand));
  768. string result = Encoding.ASCII.GetString(returnData);
  769. return ushort.Parse(result.TrimEnd().Split(';')[1].Replace("}", "").Replace(")", ""));
  770. }
  771. /// <summary>
  772. /// 执行供料
  773. /// </summary>
  774. /// <returns></returns>
  775. public int ShakeUp()
  776. {
  777. const string sendCommand = "{EF:(A;55;110)}";
  778. var result = Encoding.ASCII.GetString(WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(sendCommand)));
  779. return ushort.Parse(result.TrimEnd().Split(';')[1].Replace("}", "").Replace(")", ""));
  780. }
  781. /// <summary>
  782. /// 停止料斗振动
  783. /// </summary>
  784. /// <returns></returns>
  785. public Task StopOutputAsync()
  786. {
  787. const string command = "{HB}";
  788. return WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command));
  789. }
  790. /// <summary>
  791. /// 停止料斗振动
  792. /// </summary>
  793. public void StopOutput()
  794. {
  795. const string command = "{HB}";
  796. WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(command));
  797. }
  798. /// <summary>
  799. /// 获取料斗参数
  800. /// </summary>
  801. /// <param name="selectedSequence"></param>
  802. /// <returns></returns>
  803. public async Task<HopperFeederParam> GetUpperParamAsync(int selectedSequence)
  804. {
  805. var param = new HopperFeederParam();
  806. var startIndex = 742 + selectedSequence * 8;
  807. var collections = new string[8];
  808. for (var i = 0; i < 8; i++)
  809. {
  810. var id = startIndex + i;
  811. var result = await GetSingleParamValueAsync(id);
  812. collections[i] = result.Replace("{", "").Replace("}", "").Split(':')[1];
  813. }
  814. param.HopperDigitalOutput1 = int.Parse(collections[0]) == 1;
  815. param.HopperAnalogOutput1 = int.Parse(collections[1]);
  816. param.HopperDigitalOutput2 = int.Parse(collections[2]) == 1;
  817. param.HopperAnalogOutput2 = int.Parse(collections[3]);
  818. param.HopperVibrationAmpl = int.Parse(collections[4]);
  819. param.HopperVibrationFreq = int.Parse(collections[5]);
  820. param.HopperVibrationWaveform = int.Parse(collections[6]);
  821. param.HopperDuration = int.Parse(collections[7]);
  822. return param;
  823. //return ushort.Parse(result.Split(':')[1].Replace("}", ""));
  824. }
  825. /// <summary>
  826. /// 写入输出参数
  827. /// </summary>
  828. /// <param name="groupId"></param>
  829. /// <param name="param"></param>
  830. /// <returns></returns>
  831. public async Task WriteOutputParamAsync(int groupId, HopperFeederParam param)
  832. {
  833. const int startId = 742;
  834. var id1 = startId + groupId * 8;
  835. var id2 = startId + groupId * 8 + 1;
  836. var id3 = startId + groupId * 8 + 2;
  837. var id4 = startId + groupId * 8 + 3;
  838. var id5 = startId + groupId * 8 + 7;
  839. var command1 = "{WP" + $"{id1}={Convert.ToInt32(param.HopperDigitalOutput1)}" + "}";
  840. var command2 = "{WP" + $"{id2}={Convert.ToInt32(param.HopperAnalogOutput1)}" + "}";
  841. var command3 = "{WP" + $"{id3}={Convert.ToInt32(param.HopperDigitalOutput2)}" + "}";
  842. var command4 = "{WP" + $"{id4}={Convert.ToInt32(param.HopperAnalogOutput2)}" + "}";
  843. var command5 = "{WP" + $"{id5}={Convert.ToInt32(param.HopperDuration)}" + "}";
  844. var result1 = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command1));
  845. var result2 = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command2));
  846. var result3 = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command3));
  847. var result4 = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command4));
  848. var result5 = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command5));
  849. await SaveShakeSetAsync();
  850. }
  851. /// <summary>
  852. /// 获取料斗震动超时时间
  853. /// </summary>
  854. /// <returns></returns>
  855. public async Task<ushort> GetUpperFeederShakeTimeoutAsync()
  856. {
  857. const string sendCommand = "{RP66?}";
  858. var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(sendCommand));
  859. string result = Encoding.ASCII.GetString(returnData);
  860. return ushort.Parse(result.TrimEnd().Split(':')[1].Replace("}", ""));
  861. }
  862. /// <summary>
  863. /// 设置料斗震动超时时间
  864. /// </summary>
  865. /// <param name="upperFeederShakeTimeout"></param>
  866. /// <returns></returns>
  867. public async Task SetUpperFeederShakeTimeoutAsync(ushort upperFeederShakeTimeout)
  868. {
  869. const int commandId = 66;
  870. var command = "{WP" + $"{commandId}={upperFeederShakeTimeout}" + "}";
  871. var result = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command));
  872. //const string saveCommand = "{DG}";
  873. //var result1 = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(saveCommand));
  874. }
  875. /// <summary>
  876. /// 执行料斗动作
  877. /// </summary>
  878. /// <param name="id"></param>
  879. /// <param name="timespan"></param>
  880. /// <returns></returns>
  881. /// <exception cref="Exception"></exception>
  882. public async Task<int> OutputAsync(int id, int? timespan = null)
  883. {
  884. if (id < 1 || id > 26)
  885. {
  886. throw new Exception("输入参数不正确");
  887. }
  888. var enumerable = Enumerable.Range('A', 26).ToArray();
  889. //var split = new[] { "A", "B" };
  890. var outPut = "B" + (char)enumerable[id - 1];
  891. var command = "{" + outPut + timespan + "}";
  892. var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command));
  893. string result = Encoding.ASCII.GetString(returnData);
  894. var timeSpan = result.TrimEnd().Replace("{", "").Replace("}", "").Replace(outPut, "");
  895. return string.IsNullOrWhiteSpace(timeSpan) ? 0 : int.Parse(timeSpan);
  896. }
  897. /// <summary>
  898. /// 执行料斗动作
  899. /// </summary>
  900. /// <param name="id"></param>
  901. /// <param name="timespan"></param>
  902. /// <returns></returns>
  903. public int Output(int id, int? timespan = null)
  904. {
  905. var enumerable = Enumerable.Range('A', 26).ToArray();
  906. //var split = new[] { "A", "B" };
  907. var outPut = "B" + (char)enumerable[id - 1];
  908. var command = "{" + outPut + timespan + "}";
  909. var returnData = WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(command));
  910. string result = Encoding.ASCII.GetString(returnData);
  911. var timeSpan = result.TrimEnd().Replace("{", "").Replace("}", "").Replace(outPut, "");
  912. return int.Parse(timeSpan);
  913. }
  914. /// <summary>
  915. /// 获取取料斗动作状态
  916. /// </summary>
  917. /// <returns></returns>
  918. public bool GetOutputStatus()
  919. {
  920. const string sendCommand = "{RP97?}";
  921. var result = Encoding.ASCII.GetString(WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(sendCommand)));
  922. return result.Split(':')[1].Replace("}", "") == "0" ? false : true;
  923. }
  924. /// <summary>
  925. ///获取取料斗动作状态
  926. /// </summary>
  927. /// <returns></returns>
  928. public async Task<bool> GetOutputStatusAsync()
  929. {
  930. const string sendCommand = "{RP97?}";
  931. var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(sendCommand));
  932. string result = Encoding.ASCII.GetString(returnData);
  933. return result.Split(':')[1].Replace("}", "") == "0" ? false : true;
  934. }
  935. #endregion
  936. #region 序列动作参数
  937. //950~1703
  938. //950+29*n n 动作 1 类型
  939. //951+29*n n 动作 1 震动
  940. //952+29*n n 动作 1 持续模式
  941. //953+29*n n 动作 1 持续时间值
  942. //954+29*n n 动作 2 类型
  943. //955+29*n n 动作 2 震动
  944. //956+29*n n 动作 2 持续模式
  945. //957+29*n n 动作 2 持续时间值
  946. //958+29*n n 动作 3 类型
  947. //959+29*n n 动作 3 震动
  948. //960+29*n n 动作 3 持续模式
  949. //961+29*n n 动作 3 持续时间值
  950. //962+29*n n 动作 4 类型
  951. //963+29*n n 动作 4 震动
  952. //964+29*n n 动作 4 持续模式
  953. //965+29*n n 动作 4 持续时间值
  954. //966+29*n n 动作 5 类型
  955. //967+29*n n 动作 5 震动
  956. //968+29*n n 动作 5 持续模式
  957. //969+29*n n 动作 5 持续时间值
  958. //970+29*n n 动作 6 类型
  959. //971+29*n n 动作 6 震动
  960. //972+29*n n 动作 6 持续模式
  961. //973+29*n n 动作 6 持续时间值
  962. //974+29*n n 动作 7 类型
  963. //975+29*n n 动作 7 震动
  964. //976+29*n n 动作 7 持续模式
  965. //977+29*n n 动作 7 持续时间值
  966. //978+29*n n 震动平台零件极限值
  967. /// <summary>
  968. /// 停止序列
  969. /// </summary>
  970. /// <returns></returns>
  971. public async Task StopOneSequenceAsync()
  972. {
  973. var sendCommand = "{HS}";
  974. var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(sendCommand));
  975. //string result = Encoding.ASCII.GetString(returnData);
  976. }
  977. /// <summary>
  978. /// 执行一个序列
  979. /// </summary>
  980. /// <param name="id"></param>
  981. /// <returns></returns>
  982. public async Task<int> StartOneSequenceAsync(int id)
  983. {
  984. var sendCommand = "{ES:(0;0;0;0;" + id + ")}";
  985. var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(sendCommand));
  986. string result = Encoding.ASCII.GetString(returnData);
  987. var replaced = result.TrimEnd().Replace("{", "").Replace("}", "").Replace("(", "").Replace(")", "");
  988. var splits = replaced.Split(';');
  989. return int.Parse(splits[5]);
  990. //#if NETCOREAPP
  991. // var time = int.Parse(splits[^1]);
  992. // return time;
  993. //#elif NET472||NETSTANDARD
  994. // var time = int.Parse(splits[splits.Length - 1]);
  995. // return time;
  996. //#endif
  997. }
  998. /// <summary>
  999. /// 获取单个序列集
  1000. /// </summary>
  1001. /// <param name="id"></param>
  1002. /// <returns></returns>
  1003. public async Task<SingleSequenceActionGroup> GetSequenceGroupAsync(int id)
  1004. {
  1005. const int startId = SequenceParamStartAddress;
  1006. var singleSequenceActionGroup = new SingleSequenceActionGroup();
  1007. singleSequenceActionGroup.SingleSequenceActions = new System.Collections.ObjectModel.ObservableCollection<SingleSequenceAction>();
  1008. for (var i = 0; i < 7; i++)
  1009. {
  1010. var singleSequenceAction = new SingleSequenceAction();
  1011. var value1 = await GetSingleParamValueAsync(startId + id * 29 + i * 4);
  1012. var value2 = await GetSingleParamValueAsync(startId + id * 29 + i * 4 + 1);
  1013. var value3 = await GetSingleParamValueAsync(startId + id * 29 + i * 4 + 2);
  1014. var value4 = await GetSingleParamValueAsync(startId + id * 29 + i * 4 + 3);
  1015. value1 = value1.Replace("{", "");
  1016. value1 = value1.Replace("}", "").Split(':')[1];
  1017. value2 = value2.Replace("{", "");
  1018. value2 = value2.Replace("}", "").Split(':')[1];
  1019. value3 = value3.Replace("{", "");
  1020. value3 = value3.Replace("}", "").Split(':')[1];
  1021. value4 = value4.Replace("{", "");
  1022. value4 = value4.Replace("}", "").Split(':')[1];
  1023. singleSequenceAction.Type = (ActionType)int.Parse(value1);
  1024. singleSequenceAction.ShakeId = int.Parse(value2) > 0 ? int.Parse(value2) : 0;
  1025. singleSequenceAction.DurationMode = (DurationMode)int.Parse(value3);
  1026. singleSequenceAction.DurationValue = int.Parse(value4);
  1027. singleSequenceActionGroup.SingleSequenceActions.Add(singleSequenceAction);
  1028. }
  1029. var value5 = await GetSingleParamValueAsync(startId + id * 29 + 28);
  1030. value5 = value5.Replace("{", "");
  1031. value5 = value5.Replace("}", "").Split(':')[1];
  1032. singleSequenceActionGroup.PartCntMax = int.Parse(value5);
  1033. return singleSequenceActionGroup;
  1034. }
  1035. /// <summary>
  1036. /// 写入序列参数
  1037. /// </summary>
  1038. /// <param name="groupId"></param>
  1039. /// <param name="singleSequenceAction"></param>
  1040. public void SetSequence(int groupId, int actionId, SingleSequenceAction singleSequenceAction)
  1041. {
  1042. const int startId = SequenceParamStartAddress;
  1043. var id1 = startId + groupId * 29 + actionId * 4;
  1044. var id2 = startId + groupId * 29 + actionId * 4 + 1;
  1045. var id3 = startId + groupId * 29 + actionId * 4 + 2;
  1046. var id4 = startId + groupId * 29 + actionId * 4 + 3;
  1047. var command1 = "{WP" + $"{id1}={(int)singleSequenceAction.Type}" + "}";
  1048. var command2 = "{WP" + $"{id1}={singleSequenceAction.ShakeId}" + "}";
  1049. var command3 = "{WP" + $"{id1}={(int)singleSequenceAction.DurationMode}" + "}";
  1050. var command4 = "{WP" + $"{id1}={(int)singleSequenceAction.DurationValue}" + "}";
  1051. var result = WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(command1));
  1052. result = WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(command2));
  1053. result = WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(command3));
  1054. result = WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(command4));
  1055. }
  1056. /// <summary>
  1057. /// 写入序列参数
  1058. /// </summary>
  1059. /// <param name="groupId"></param>
  1060. /// <param name="actionId"></param>
  1061. /// <param name="singleSequenceAction"></param>
  1062. /// <returns></returns>
  1063. public async Task SetSequenceAsync(int groupId, int actionId, SingleSequenceAction singleSequenceAction)
  1064. {
  1065. const int startId = 950;
  1066. var id1 = startId + groupId * 29 + actionId * 4;
  1067. var id2 = startId + groupId * 29 + actionId * 4 + 1;
  1068. var id3 = startId + groupId * 29 + actionId * 4 + 2;
  1069. var id4 = startId + groupId * 29 + actionId * 4 + 3;
  1070. var command1 = "{WP" + $"{id1}={(int)singleSequenceAction.Type}" + "}";
  1071. var command2 = "{WP" + $"{id2}={singleSequenceAction.ShakeId}" + "}";
  1072. var command3 = "{WP" + $"{id3}={(int)singleSequenceAction.DurationMode}" + "}";
  1073. var command4 = "{WP" + $"{id4}={singleSequenceAction.DurationValue}" + "}";
  1074. var result = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command1));
  1075. result = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command2));
  1076. result = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command3));
  1077. result = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command4));
  1078. }
  1079. /// <summary>
  1080. /// 将序列参数存储至非易失内存中
  1081. /// </summary>
  1082. /// <returns></returns>
  1083. /// <exception cref="Exception"></exception>
  1084. public async Task SaveSequenceAsync()
  1085. {
  1086. const string sendCommand = "{DS}";
  1087. var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(sendCommand));
  1088. string result = Encoding.ASCII.GetString(returnData);
  1089. if (result.TrimEnd() != sendCommand.TrimEnd())
  1090. {
  1091. throw new Exception("FFFeeder响应不正确");
  1092. }
  1093. }
  1094. /// <summary>
  1095. /// 查询当前选择的序列
  1096. /// </summary>
  1097. /// <returns></returns>
  1098. public int GetSelectedSequence()
  1099. {
  1100. const string sendCommand = "{US?}";
  1101. var returnData = WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(sendCommand));
  1102. string result = Encoding.ASCII.GetString(returnData);
  1103. return int.Parse(result.TrimEnd().Split(':')[1].Replace("}", ""));
  1104. }
  1105. /// <summary>
  1106. /// 查询当前选择的序列
  1107. /// </summary>
  1108. /// <returns></returns>
  1109. public async Task<int> GetSelectedSequenceAsync()
  1110. {
  1111. const string sendCommand = "{US?}";
  1112. var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(sendCommand));
  1113. string result = Encoding.ASCII.GetString(returnData);
  1114. return int.Parse(result.TrimEnd().Split(':')[1].Replace("}", ""));
  1115. }
  1116. #endregion
  1117. #region 背光灯操作
  1118. /// <summary>
  1119. /// 背光灯打开
  1120. /// </summary>
  1121. public void OpenLight()
  1122. {
  1123. WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(LightOpenCommand), MillisecondsTimeout);
  1124. }
  1125. /// <summary>
  1126. /// 背光灯打开
  1127. /// </summary>
  1128. /// <returns></returns>
  1129. public Task OpenLightAsync()
  1130. {
  1131. return WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(LightOpenCommand), MillisecondsTimeout);
  1132. }
  1133. /// <summary>
  1134. /// 背光关闭
  1135. /// </summary>
  1136. public void CloseLight()
  1137. {
  1138. WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(LightCloseCommand), MillisecondsTimeout);
  1139. }
  1140. /// <summary>
  1141. /// 背光关闭
  1142. /// </summary>
  1143. /// <returns></returns>
  1144. public Task CloseLightAsync()
  1145. {
  1146. return WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(LightCloseCommand), MillisecondsTimeout);
  1147. }
  1148. /// <summary>
  1149. /// 设置背光打开超时时间
  1150. /// </summary>
  1151. /// <param name="timeout"></param>
  1152. public void SetLightTimeOut(ushort timeout)
  1153. {
  1154. var commandId = 44;
  1155. var command = "{WP" + $"{commandId}={timeout}" + "}";
  1156. var result = Encoding.ASCII.GetString(WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(command)));
  1157. //var saveCommand = "{DG}";
  1158. //var result1 = Encoding.ASCII.GetString(WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(saveCommand)));
  1159. }
  1160. /// <summary>
  1161. /// 设置背光打开超时时间
  1162. /// </summary>
  1163. /// <param name="timeout"></param>
  1164. /// <returns></returns>
  1165. public async Task SetLightTimeOutAsync(ushort timeout)
  1166. {
  1167. var commandId = 44;
  1168. var command = "{WP" + $"{commandId}={timeout}" + "}";
  1169. var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command));
  1170. string result = Encoding.ASCII.GetString(returnData);
  1171. //var saveCommand = "{DG}";
  1172. //returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(saveCommand));
  1173. }
  1174. /// <summary>
  1175. /// 获取背光打开超时时间
  1176. /// </summary>
  1177. /// <returns></returns>
  1178. public ushort GetLightTimeout()
  1179. {
  1180. const string sendCommand = "{RP44?}";
  1181. var result = Encoding.ASCII.GetString(WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(sendCommand)));
  1182. return ushort.Parse(result.Split(':')[1].Replace("}", ""));
  1183. }
  1184. /// <summary>
  1185. /// 获取背光打开超时时间
  1186. /// </summary>
  1187. /// <returns></returns>
  1188. public async Task<ushort> GetLightTimeoutAsync()
  1189. {
  1190. const string sendCommand = "{RP44?}";
  1191. var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(sendCommand));
  1192. string result = Encoding.ASCII.GetString(returnData);
  1193. return ushort.Parse(result.TrimEnd().Split(':')[1].Replace("}", ""));
  1194. }
  1195. /// <summary>
  1196. /// 设置背光亮度
  1197. /// </summary>
  1198. /// <param name="lightValue"></param>
  1199. /// <returns></returns>
  1200. public async Task SetLightValueAsync(ushort lightValue)
  1201. {
  1202. const int commandId = 34;
  1203. var command = "{WP" + $"{commandId}={lightValue}" + "}";
  1204. var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command));
  1205. string result = Encoding.ASCII.GetString(returnData);
  1206. //const string saveCommand = "{DG}";
  1207. //returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(saveCommand));
  1208. //result = Encoding.ASCII.GetString(returnData);
  1209. }
  1210. /// <summary>
  1211. /// 设置背光亮度
  1212. /// </summary>
  1213. /// <param name="lightValue"></param>
  1214. /// <returns></returns>
  1215. public async Task SetLightValueToBufferAsync(ushort lightValue)
  1216. {
  1217. const int commandId = 34;
  1218. var command = "{WP" + $"{commandId}={lightValue}" + "}";
  1219. var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command));
  1220. //string result = Encoding.ASCII.GetString(returnData);
  1221. }
  1222. /// <summary>
  1223. /// 设置背光闪烁时间
  1224. /// </summary>
  1225. /// <param name="backLightFlash"></param>
  1226. /// <returns></returns>
  1227. public async Task SetBackLightFlashTimeAsync(ushort backLightFlash)
  1228. {
  1229. const int commandId = 33;
  1230. var command = "{WP" + $"{commandId}={backLightFlash}" + "}";
  1231. var result = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command));
  1232. //const string saveCommand = "{DG}";
  1233. //var result1 = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(saveCommand));
  1234. }
  1235. /// <summary>
  1236. /// 获取背光状态
  1237. /// </summary>
  1238. /// <returns></returns>
  1239. /// <exception cref="Exception"></exception>
  1240. public bool QueryLightState()
  1241. {
  1242. var returnData = WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(QueryLightStateCommand));
  1243. string result = Encoding.ASCII.GetString(returnData);
  1244. result = result.Trim().Replace("{", "").Replace("}", "");
  1245. var splitsStrings = result.Split(':');
  1246. if (splitsStrings.Length <= 1)
  1247. {
  1248. throw new Exception("RECEIVED DATA NOT CORRECT");
  1249. }
  1250. return splitsStrings[1] == "1";
  1251. }
  1252. /// <summary>
  1253. /// 获取背光状态
  1254. /// </summary>
  1255. /// <returns></returns>
  1256. /// <exception cref="Exception"></exception>
  1257. public async Task<bool> QueryLightStateAsync()
  1258. {
  1259. var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(QueryLightStateCommand));
  1260. string result = Encoding.ASCII.GetString(returnData);
  1261. result = result.Trim().Replace("{", "").Replace("}", "");
  1262. var splitsStrings = result.Split(':');
  1263. if (splitsStrings.Length <= 1)
  1264. {
  1265. throw new Exception("RECEIVED DATA NOT CORRECT");
  1266. }
  1267. return splitsStrings[1] == "1";
  1268. }
  1269. /// <summary>
  1270. /// 获取背光亮度
  1271. /// </summary>
  1272. /// <returns></returns>
  1273. public async Task<ushort> GetLightBrightnessAsync()
  1274. {
  1275. const string sendCommand = "{RP34?}";
  1276. var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(sendCommand));
  1277. string result = Encoding.ASCII.GetString(returnData);
  1278. return ushort.Parse(result.TrimEnd().Split(':')[1].Replace("}", ""));
  1279. }
  1280. /// <summary>
  1281. /// 获取背光闪烁时间
  1282. /// </summary>
  1283. /// <returns></returns>
  1284. public async Task<ushort> GetBackLightFlashTimeAsync()
  1285. {
  1286. const string sendCommand = "{RP33?}";
  1287. var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(sendCommand));
  1288. string result = Encoding.ASCII.GetString(returnData);
  1289. return ushort.Parse(result.TrimEnd().Split(':')[1].Replace("}", ""));
  1290. }
  1291. #endregion
  1292. /// <summary>
  1293. /// 执行命令
  1294. /// </summary>
  1295. /// <param name="command"></param>
  1296. /// <param name="timespan"></param>
  1297. /// <returns></returns>
  1298. public async Task<int> RunFromCommand(string command, int? timespan = null)
  1299. {
  1300. var exeCommand = "{" + command + timespan + "}";
  1301. var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(exeCommand));
  1302. string result = Encoding.ASCII.GetString(returnData);
  1303. var timeSpan = result.TrimEnd().Replace("{", "").Replace("}", "").Replace(command, "");
  1304. return string.IsNullOrEmpty(timeSpan) ? 0 : int.Parse(timeSpan);
  1305. }
  1306. /// <summary>
  1307. /// 读单个参数值
  1308. /// </summary>
  1309. /// <param name="id"></param>
  1310. /// <returns></returns>
  1311. public string GetSingleParamValue(int id)
  1312. {
  1313. var command = "{RP" + id + "}";
  1314. var returnData = WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(command));
  1315. string result = Encoding.ASCII.GetString(returnData);
  1316. return result;
  1317. }
  1318. /// <summary>
  1319. /// 读单个参数值
  1320. /// </summary>
  1321. /// <param name="id"></param>
  1322. /// <returns></returns>
  1323. public async Task<string> GetSingleParamValueAsync(int id)
  1324. {
  1325. var command = "{RP" + id + "}";
  1326. var returnData =await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command));
  1327. string result = Encoding.ASCII.GetString(returnData);
  1328. return result.TrimEnd();
  1329. }
  1330. /// <summary>
  1331. /// 设置IP地址
  1332. /// </summary>
  1333. /// <param name="ip"></param>
  1334. /// <param name="subNetMask"></param>
  1335. /// <param name="port"></param>
  1336. /// <returns></returns>
  1337. public async Task SetIpAddressAsync(string ip, string subNetMask, int port)
  1338. {
  1339. var ipSplits = ip.Split('.');
  1340. var subNetMaskSplits = subNetMask.Split('.');
  1341. var list = ipSplits.ToList();
  1342. list.AddRange(subNetMaskSplits);
  1343. list.Add(port.ToString());
  1344. var commandId = 13;
  1345. foreach (var command in list.Select(item => "{WP" + $"{commandId}={item}" + "}"))
  1346. {
  1347. var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command));
  1348. string result = Encoding.ASCII.GetString(returnData);
  1349. commandId++;
  1350. }
  1351. string saveCommand = "{DF}";
  1352. var returnData1 = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(saveCommand));
  1353. string result1 = Encoding.ASCII.GetString(returnData1);
  1354. saveCommand = "{DG}";
  1355. returnData1 = WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(saveCommand));
  1356. result1 = Encoding.ASCII.GetString(returnData1);
  1357. }
  1358. /// <summary>
  1359. /// 设置IP地址
  1360. /// </summary>
  1361. /// <param name="ip"></param>
  1362. /// <param name="subNetMask"></param>
  1363. /// <param name="port"></param>
  1364. public void SetIpAddress(string ip, string subNetMask, int port)
  1365. {
  1366. var ipSplits = ip.Split('.');
  1367. var subNetMaskSplits = subNetMask.Split('.');
  1368. var list = ipSplits.ToList();
  1369. list.AddRange(subNetMaskSplits);
  1370. list.Add(port.ToString());
  1371. var commandId = 13;
  1372. foreach (var result in list.Select(item => "{WP" + $"{commandId}={item}" + "}")
  1373. .Select(command => Encoding.ASCII.GetString(WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(command)))))
  1374. {
  1375. commandId++;
  1376. }
  1377. const string saveCommand = "{DG}";
  1378. var result1 = WaitClient.SendThenReturn(Encoding.ASCII.GetBytes(saveCommand));
  1379. }
  1380. /// <summary>
  1381. /// 获取输入触发参数
  1382. /// </summary>
  1383. /// <param name="i"></param>
  1384. /// <returns></returns>
  1385. /// <exception cref="IndexOutOfRangeException"></exception>
  1386. public async Task<int> GetInputTrigger(int i)
  1387. {
  1388. if (i > 2 || i < 0)
  1389. {
  1390. throw new IndexOutOfRangeException("输入的参数id{i}超出了索引");
  1391. }
  1392. var param = await GetSingleParamValueAsync(40 + i - 1);
  1393. var value1 = param.Replace("{", "");
  1394. value1 = value1.Replace("}", "").Split(':')[1];
  1395. return int.Parse(value1);
  1396. }
  1397. /// <summary>
  1398. /// 设置输入触发参数
  1399. /// </summary>
  1400. /// <param name="id"></param>
  1401. /// <param name="value"></param>
  1402. /// <returns></returns>
  1403. /// <exception cref="IndexOutOfRangeException"></exception>
  1404. public async Task SetInputTrigger(int id, int value)
  1405. {
  1406. if (id > 2 || id < 0)
  1407. {
  1408. throw new IndexOutOfRangeException("输入的参数id{i}超出了索引");
  1409. }
  1410. var commandId = 39 + id;
  1411. var command = "{WP" + $"{commandId}={value}" + "}";
  1412. var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(command));
  1413. //const string saveCommand = "{DG}";
  1414. //returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(saveCommand));
  1415. }
  1416. /// <summary>
  1417. /// 将所有参数存储至非易失内存中
  1418. /// </summary>
  1419. /// <returns></returns>
  1420. /// <exception cref="Exception"></exception>
  1421. public async Task SaveAllSetAsync()
  1422. {
  1423. string sendCommand = "{DF}";
  1424. var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(sendCommand));
  1425. string result = Encoding.ASCII.GetString(returnData);
  1426. if (result.TrimEnd() != sendCommand.TrimEnd())
  1427. {
  1428. throw new Exception("FFFeeder响应不正确");
  1429. }
  1430. }
  1431. /// <summary>
  1432. /// 将全局参数存储至非易失内存中
  1433. /// </summary>
  1434. /// <returns></returns>
  1435. /// <exception cref="Exception"></exception>
  1436. public async Task SaveGlobalSetAsync()
  1437. {
  1438. string sendCommand = "{DG}";
  1439. var returnData = await WaitClient.SendThenReturnAsync(Encoding.ASCII.GetBytes(sendCommand));
  1440. string result = Encoding.ASCII.GetString(returnData);
  1441. if (result.TrimEnd() != sendCommand.TrimEnd())
  1442. {
  1443. throw new Exception("FFFeeder响应不正确");
  1444. }
  1445. }
  1446. #endregion
  1447. /// <summary>
  1448. /// 断开连接,释放资源
  1449. /// </summary>
  1450. public void Dispose()
  1451. {
  1452. TcpClient.Close();
  1453. TcpClient.Dispose();
  1454. }
  1455. /// <summary>
  1456. /// 成功连接到服务器
  1457. /// </summary>
  1458. /// <param name="client"></param>
  1459. /// <param name="e"></param>
  1460. /// <returns></returns>
  1461. private Task ConnectedVoid(ITcpClient client, ConnectedEventArgs e)
  1462. {
  1463. FeederConnectedEvent?.Invoke(this.Id, client,e);
  1464. FeederModel = GetFeederModel();
  1465. //Console.WriteLine($"{client.RemoteIPHost.EndPoint.ToString()}已连接!");
  1466. return EasyTask.CompletedTask;
  1467. }
  1468. /// <summary>
  1469. /// 从服务器断开连接,当连接不成功时不会触发。
  1470. /// </summary>
  1471. /// <param name="client"></param>
  1472. /// <param name="e"></param>
  1473. /// <returns></returns>
  1474. private Task DisconnectedVoid(ITcpClient client, ClosedEventArgs e)
  1475. {
  1476. FeederDisconnectedEvent?.Invoke(this.Id, client,e);
  1477. //Console.WriteLine($"{client.IP}断开连接!");
  1478. return EasyTask.CompletedTask;
  1479. }
  1480. /// <summary>
  1481. /// 获取Feeder型号
  1482. /// </summary>
  1483. /// <returns></returns>
  1484. public FeederModel GetFeederModel()
  1485. {
  1486. try
  1487. {
  1488. string res = GetSingleParamValue(30);
  1489. if (int.TryParse(res,out int model))
  1490. {
  1491. switch (model)
  1492. {
  1493. case 120:
  1494. return FeederModel.FF120;
  1495. case 240:
  1496. return FeederModel.FF240;
  1497. case 380:
  1498. return FeederModel.FF380;
  1499. case 530:
  1500. return FeederModel.FF530;
  1501. default:
  1502. return FeederModel.Unknown;
  1503. }
  1504. }
  1505. else
  1506. {
  1507. return FeederModel.Unknown;
  1508. }
  1509. }
  1510. catch (Exception)
  1511. {
  1512. return FeederModel.Unknown;
  1513. }
  1514. }
  1515. /// <summary>
  1516. /// 获取Feeder型号
  1517. /// </summary>
  1518. /// <returns></returns>
  1519. public async Task<FeederModel> GetFeederModelAsync()
  1520. {
  1521. try
  1522. {
  1523. string res =await GetSingleParamValueAsync(30);
  1524. if (int.TryParse(res, out int model))
  1525. {
  1526. switch (model)
  1527. {
  1528. case 120:
  1529. return FeederModel.FF120;
  1530. case 240:
  1531. return FeederModel.FF240;
  1532. case 380:
  1533. return FeederModel.FF380;
  1534. case 530:
  1535. return FeederModel.FF530;
  1536. default:
  1537. return FeederModel.Unknown;
  1538. }
  1539. }
  1540. else
  1541. {
  1542. return FeederModel.Unknown;
  1543. }
  1544. }
  1545. catch (Exception)
  1546. {
  1547. return FeederModel.Unknown;
  1548. }
  1549. }
  1550. }
  1551. }