PackInteractionCrms.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. using DbCommon.BusinessCore.BaseCore;
  2. using ProjectManagementSystem.Common.Config;
  3. using ProjectManagementSystem.Common.Extenions;
  4. using ProjectManagementSystem.Common.Function;
  5. using ProjectManagementSystem.Common.Logger;
  6. using ProjectManagementSystem.Common.Models;
  7. using ProjectManagementSystem.Common.Models.Crms;
  8. using ProjectManagementSystem.Common.Service;
  9. using System;
  10. using System.Collections.Concurrent;
  11. using System.Collections.Generic;
  12. using System.Linq;
  13. using System.Threading;
  14. using System.Threading.Tasks;
  15. namespace ProjectManagementSystem.Common.Core
  16. {
  17. public sealed class PackInteractionCrms8952A : PackInteractionCrmsBase
  18. {
  19. public override string GetNextLocation(PackStationV2 data, out string templateName, out string msg)
  20. {
  21. var config = data.Config;
  22. templateName = null;
  23. var result = ReadPlcValue(config, "PLC一键驶离", out msg);
  24. DeviceControl.Instance.Communication.InfoVcuReleaseDictionary.TryGetValue(data.AgvAtStationAgvId, out var infoVcuRelease);
  25. if (infoVcuRelease == null)
  26. {
  27. msg = $"{msg} 获取AGV{data.AgvAtStationAgvId}放行失败";
  28. }
  29. else
  30. {
  31. if (infoVcuRelease.DataValid)
  32. {
  33. msg = $"{msg} 获取AGV{data.AgvAtStationAgvId}放行成功";
  34. }
  35. else
  36. {
  37. msg = $"{msg} 获取AGV{data.AgvAtStationAgvId}放行超时";
  38. }
  39. }
  40. var vcuRelease = infoVcuRelease != null && infoVcuRelease.DataValid;
  41. if (result > 0 || vcuRelease)
  42. {
  43. if (config.RelationStationID2 <= 0)
  44. {
  45. msg = $"{msg} 一键驶离未配置关联点2";
  46. return null;
  47. }
  48. templateName = "一键驶离";
  49. return data.Id;
  50. }
  51. //没有一键驶离信号
  52. var nextLocation = base.GetNextLocation(data, out templateName, out msg);
  53. if (string.IsNullOrWhiteSpace(nextLocation))
  54. {
  55. return null;
  56. }
  57. ReadValue(config, "PLC物料", string.Empty, out var plcMaterial, out var msg2);
  58. if (string.IsNullOrWhiteSpace(plcMaterial))
  59. {
  60. msg = $"{msg} {msg2}";
  61. return null;
  62. }
  63. var resBind = Crms.PmsTaskService.BindAgvMaterial(new AgvMaterialDto() { AgvId = data.AgvAtStationAgvId, MaterialId = "默认货物", MaterialBarcode = plcMaterial });
  64. if (resBind.code != 20000)
  65. {
  66. msg = $"{msg} {msg2} 放行绑定物料失败 {resBind?.message}";
  67. return null;
  68. }
  69. msg = $"{msg} {msg2} 放行绑定物料 AGV{data.AgvAtStationAgvId} {plcMaterial}";
  70. return nextLocation;
  71. }
  72. public override bool StopAgvEntering(PackStationV2 data, out string msg)
  73. {
  74. var result = ReadPlcValue(data.Config, "PLC急停", out msg);
  75. if (result == failedCode || result == 0)
  76. {
  77. return true;
  78. }
  79. return false;
  80. }
  81. public override bool StopAgvLeaving(PackStationV2 data, out string msg)
  82. {
  83. var result = ReadPlcValue(data.Config, "PLC急停", out msg);
  84. if (result == failedCode || result == 0)
  85. {
  86. return true;
  87. }
  88. return false;
  89. }
  90. public override void Entering(PackStationV2 data, PackCarrier agv, List<TaskData> taskList)
  91. {
  92. if (agv.leaver == 1) return;
  93. //一键驶离的AGV经过的自动工位不停
  94. var config = data.Config;
  95. var result = taskList.Exists(d => d.Carrier == agv.carrier && d.TaskBook == "一键驶离");
  96. var allowStatus = result ? 1 : 0;
  97. if (agv.leaver != allowStatus)
  98. {
  99. var result2 = Crms.PmsApi.AllowAgv(data.Id, agv.carrier, 0, allowStatus, 0);
  100. var msg = $"一键驶离任务{result} {GetAgvDataString(agv.AgvData)} 工位点{GetAllowStatusString(allowStatus)}{result2.ToChineseString()}";
  101. CLog.Instance.TaskLog.WriteInfo($"{config.LocationCode} {msg}");
  102. }
  103. }
  104. public override void WaitStation(PackStationV2 data, PackCarrier agv, List<TaskData> taskList)
  105. {
  106. if (agv.leaver == 1) return;
  107. var config = data.Config;
  108. var result = taskList.Exists(d => d.Carrier == agv.carrier && d.TaskBook == "一键驶离");
  109. var allowStatus = result ? 1 : 0;
  110. var msg = $"一键驶离任务{result} {GetAgvDataString(agv.AgvData)}";
  111. if (agv.leaver != allowStatus)
  112. {
  113. var result2 = Crms.PmsApi.AllowAgv(data.Id, agv.carrier, 0, allowStatus, 0);
  114. msg = $"{msg} 工位点{GetAllowStatusString(allowStatus)}{result2.ToChineseString()}";
  115. }
  116. base.WaitStation(data, agv, taskList);
  117. }
  118. }
  119. public sealed class PackInteractionCrms8952S : PackInteractionCrmsBase
  120. {
  121. private PmsTaskInfoManager pmsTaskInfoManger = new PmsTaskInfoManager();
  122. public override void Heartbeat(PackStationV2 data, bool agvHeartbeat)
  123. {
  124. }
  125. public override void CustomProcess(PackStationV2 data, bool firstStart, bool[] forceWrite)
  126. {
  127. //进入工位区域的所有AGV
  128. var agvAtStationDataList = data.AgvList?
  129. .Where(d => d.agvPositionStatus == EPackAgvPositionStatus.Entering
  130. || d.agvPositionStatus == EPackAgvPositionStatus.StationVertex
  131. || d.agvPositionStatus == EPackAgvPositionStatus.Leaving
  132. || d.agvPositionStatus == EPackAgvPositionStatus.ReleaseVertex)?
  133. .ToList();
  134. if (agvAtStationDataList?.Count > 0)
  135. {
  136. var config = data.Config;
  137. var pmsTaskList = pmsTaskInfoManger.GetList(d => d.LocationCode == data.Id);
  138. foreach (var agv in agvAtStationDataList)
  139. {
  140. var plcRealese = pmsTaskList.Exists(d => d.Carrier == agv.carrier);
  141. if (!plcRealese)
  142. {
  143. var result = ReadPlcValue(config, "PLC放行", out var msg);
  144. if (result > 0)
  145. {
  146. ReadValue(config, "PLC物料", string.Empty, out var plcMaterial, out var msg2);
  147. if (!string.IsNullOrWhiteSpace(plcMaterial))
  148. {
  149. //缓行过程中记录PLC放行
  150. var resBind = Crms.PmsTaskService.BindAgvMaterial(new AgvMaterialDto() { AgvId = agv.carrier, MaterialId = "默认货物", MaterialBarcode = plcMaterial });
  151. var result2 = resBind?.code == 20000;
  152. CLog.Instance.TaskLog.WriteInfo($"{config.LocationCode} 放行绑码{result2.ToChineseString()} AGV{agv.carrier} {plcMaterial}");
  153. if (result2)
  154. {
  155. var dto = new PmsTaskInfoDto();
  156. dto.LocationCode = data.Id;
  157. dto.Carrier = agv.carrier;
  158. dto.MaterialId = plcMaterial;
  159. Crms.PmsTaskService.TaskAppointment(dto);
  160. }
  161. }
  162. }
  163. }
  164. }
  165. //已经放行的AGV不算到位
  166. var releaseAgvIds = pmsTaskList.Select(d => d.Carrier).ToArray();
  167. data.AgvAtStationData = agvAtStationDataList.FirstOrDefault(d => !releaseAgvIds.Contains(d.carrier));
  168. }
  169. else
  170. {
  171. data.AgvAtStationData = null;
  172. }
  173. base.CustomProcess(data, firstStart, forceWrite);
  174. }
  175. public override string GetNextLocation(PackStationV2 data, out string templateName, out string msg)
  176. {
  177. var config = data.Config;
  178. templateName = null;
  179. msg = null;
  180. string nextLocation = config.LocationCode.GetLocationMember("下个工位");
  181. if (string.IsNullOrWhiteSpace(nextLocation))
  182. {
  183. msg = $"{msg} 没配置下个工位";
  184. return null;
  185. }
  186. templateName = config.LocationCode.GetLocationMember("后任务模板");
  187. return nextLocation.ToValueArray<string>()[0];
  188. }
  189. public override bool StopAgvEntering(PackStationV2 data, out string msg)
  190. {
  191. var result = ReadPlcValue(data.Config, "PLC急停", out msg);
  192. if (result == failedCode || result == 0)
  193. {
  194. return true;
  195. }
  196. return false;
  197. }
  198. public override bool StopAgvLeaving(PackStationV2 data, out string msg)
  199. {
  200. var result = ReadPlcValue(data.Config, "PLC急停", out msg);
  201. if (result == failedCode || result == 0)
  202. {
  203. return true;
  204. }
  205. return false;
  206. }
  207. public override void WaitTask(PackStationV2 data, PackCarrier agv, List<TaskData> taskList)
  208. {
  209. }
  210. public override void WaitEnter(PackStationV2 data, PackCarrier agv, List<TaskData> taskList)
  211. {
  212. WaitRequest(data, agv, taskList);
  213. }
  214. public override void WaitRequest(PackStationV2 data, PackCarrier agv, List<TaskData> taskList)
  215. {
  216. if (agv.enter == 1) return;
  217. var config = data.Config;
  218. var result = ReadPlcValue(config, "PLC允许进入", out var msg);
  219. var allowStatus = result > 0 ? 1 : 0;
  220. msg = $"{msg} {GetAgvDataString(agv.AgvData)}";
  221. if (agv.enter != allowStatus)
  222. {
  223. var result2 = Crms.PmsApi.AllowAgv(data.Id, agv.carrier, allowStatus, allowStatus, 0);
  224. msg = $"{msg} 请求点+工位点{GetAllowStatusString(allowStatus)}{result2.ToChineseString()}";
  225. }
  226. if (data.MessageWaitRequest != msg)
  227. {
  228. CLog.Instance.TaskLog.WriteInfo($"{config.LocationCode} {msg}");
  229. }
  230. data.MessageWaitRequest = msg;
  231. }
  232. public override void WaitStation(PackStationV2 data, PackCarrier agv, List<TaskData> taskList)
  233. {
  234. if (agv.leaver == 1) return;
  235. var config = data.Config;
  236. var result2 = Crms.PmsApi.AllowAgv(data.Id, agv.carrier, 0, 1, 0);
  237. CLog.Instance.TaskLog.WriteInfo($"{config.LocationCode} 缓行工位点直接通行 {GetAgvDataString(agv.AgvData)} 工位点通行{result2.ToChineseString()}");
  238. data.MessageWaitStation = null;
  239. }
  240. public override void Leaving(PackStationV2 data, PackCarrier agv, List<TaskData> taskList)
  241. {
  242. if (agv.schedule > 0.99)
  243. {
  244. WaitLeave(data, agv, taskList);
  245. }
  246. }
  247. public override void WaitLeave(PackStationV2 data, PackCarrier agv, List<TaskData> taskList)
  248. {
  249. if (agv.release == 1) return;
  250. var config = data.Config;
  251. var pmsTaskList = pmsTaskInfoManger.GetList(d => d.LocationCode == data.Id && d.Carrier == agv.carrier);
  252. var plcRealese = pmsTaskList.Count > 0;
  253. var result = ReadPlcValue(config, "PLC拉绳", out var msg);
  254. var allowStatus = result == 0 && plcRealese ? 1 : 0;
  255. msg = $"{msg} PLC放行记录{plcRealese} {GetAgvDataString(agv.AgvData)}";
  256. var result2 = false;
  257. if (agv.release != allowStatus)
  258. {
  259. result2 = Crms.PmsApi.AllowAgv(data.Id, agv.carrier, 0, 0, allowStatus);
  260. msg = $"{msg} 释放点{GetAllowStatusString(allowStatus)}{result2.ToChineseString()}";
  261. }
  262. if (data.MessageWaitLeave != msg)
  263. {
  264. CLog.Instance.TaskLog.WriteInfo($"{config.LocationCode} {msg}");
  265. }
  266. data.MessageWaitLeave = msg;
  267. if (allowStatus == 1 && result2)
  268. {
  269. foreach (var item in pmsTaskList)
  270. {
  271. var deleteResult = pmsTaskInfoManger.Delete(item.TaskID);
  272. CLog.Instance.TaskLog.WriteInfo($"{config.LocationCode} 删除预约任务{deleteResult.ToChineseString()} {item.TaskID}");
  273. }
  274. }
  275. }
  276. }
  277. }