EPTS_KilnLoad.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Threading;
  6. using System.Timers;
  7. using Curtain.DataAccess;
  8. using Curtain.Extension.ExObjectConvert;
  9. using Curtain.Extension.ExSystemData;
  10. using Curtain.Framework.Json;
  11. using Curtain.Log;
  12. using Curtain.Net.Sockets.PLC;
  13. using Curtain.Net.Sockets.PLC.Model.Siemens;
  14. using Newtonsoft.Json.Linq;
  15. using PLC_S.Proxy;
  16. /// <summary>
  17. /// 获取设备参数的定时服务
  18. /// </summary>
  19. namespace PLC_S.EPTS
  20. {
  21. /// <summary>
  22. /// 登窑 6211 6212
  23. /// </summary>
  24. public class EPTS_KilnLoad : IWindowsServer, IShowFormLog
  25. {
  26. public const string M_NAME = "EPTS_KL";
  27. private Logger logger = null;
  28. private Logger logger_t = null;
  29. private Logger logger_e = null;
  30. private Logger logger_e_out = null;
  31. private bool _Started = false;
  32. //private System.Timers.Timer _timing = null;
  33. private BackgroundWorker backgroundWorker = null;
  34. private MES_S _mes_s = null;
  35. public bool Started
  36. {
  37. get
  38. {
  39. //return _timing?.Enabled ?? false;
  40. return _Started;
  41. }
  42. }
  43. public IFormLogShow FormLogShow
  44. {
  45. get;
  46. set;
  47. }
  48. public int Interval
  49. {
  50. get;
  51. set;
  52. }
  53. public string EPTS_CODE
  54. {
  55. get;
  56. set;
  57. }
  58. public EPTS_KilnLoad()
  59. {
  60. }
  61. public void Start(int value)
  62. {
  63. try
  64. {
  65. string S_NAME = "EPTS_" + EPTS_CODE;
  66. logger = Logger.CreateLogger(S_NAME + "-S");
  67. logger_t = Logger.CreateLogger(S_NAME + "-T");
  68. logger_e = Logger.CreateLogger(S_NAME + "-E");
  69. logger_e_out = Logger.CreateLogger(S_NAME + "-EO");
  70. logger.FileNameWithoutDate = true;
  71. logger.FileExistDays = 30;
  72. logger.LevelOneFile = true;
  73. logger.FilePrefix = null;
  74. logger.FileSuffix = logger.Name;
  75. logger_t.FileExistDays = 30;
  76. logger_t.LevelOneFile = true;
  77. logger_t.SubFolderFormat = logger_t.Name;
  78. logger_e.FileExistDays = 0;
  79. logger_e_out.FileExistDays = 0;
  80. logger_e_out.FilePrefix = null;
  81. logger_e_out.FileSuffix = S_NAME;
  82. logger_e_out.Directory = "..\\_PLC_Logs";
  83. logger.OutputTrace($"{M_NAME}_Starting:[{EPTS_CODE}]");
  84. FormLogShow?.ShowLog($"{M_NAME}_Starting:[{EPTS_CODE}]");
  85. if (Interval < 1000)
  86. {
  87. Interval = 1000;
  88. }
  89. //if (Interval > 60000)
  90. //{
  91. // Interval = 60000;
  92. //}
  93. backgroundWorker = new BackgroundWorker();
  94. backgroundWorker.WorkerSupportsCancellation = true;
  95. backgroundWorker.DoWork += BackgroundWorker_DoWork;
  96. backgroundWorker.RunWorkerCompleted += BackgroundWorker_RunWorkerCompleted;
  97. _Started = true;
  98. backgroundWorker.RunWorkerAsync();
  99. logger.OutputTrace($"{M_NAME}_Started:[{Interval}]");
  100. FormLogShow?.ShowLog($"{M_NAME}_Started:[{Interval}]");
  101. }
  102. catch(Exception ex)
  103. {
  104. logger.OutputError(ex);
  105. }
  106. }
  107. private void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  108. {
  109. logger.OutputTrace(JsonHelper.ToJson(e));
  110. }
  111. private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
  112. {
  113. try
  114. {
  115. _mes_s = MES_S.Get();
  116. INI_KL plc_ini = INI_KL.Get(EPTS_CODE);
  117. if (plc_ini.PLC_VALUEFLAG != "1")
  118. {
  119. return;
  120. }
  121. while (_Started && !e.Cancel)
  122. {
  123. this.Do(plc_ini);
  124. Thread.Sleep(Interval);
  125. }
  126. }
  127. catch (Exception ex)
  128. {
  129. logger_e_out.OutputError(ex);
  130. logger_e.OutputError(ex);
  131. }
  132. }
  133. private void Do(INI_KL plc_ini)
  134. {
  135. try
  136. {
  137. logger_t.BeginTracking();
  138. using (SocketClient<SiemensS7_1200Model> plc = new SocketClient<SiemensS7_1200Model>())
  139. {
  140. string outputMessage = $"[{EPTS_CODE}]PLC_Connect={JsonHelper.FromObject(plc_ini)}";
  141. logger_t.OutputTrace(outputMessage);
  142. FormLogShow?.ShowLog(outputMessage);
  143. try
  144. {
  145. plc.Connect(plc_ini.PLC_IP, plc_ini.PLC_PORT);
  146. }
  147. catch (Exception ex1)
  148. {
  149. logger_t.OutputWarn(ex1.Message);
  150. logger_e.OutputWarn(ex1.Message);
  151. logger_e_out.OutputWarn(ex1.Message);
  152. return;
  153. }
  154. // 1. 读取PLC 标识
  155. outputMessage = $"[{EPTS_CODE}]GET_F_Code=[ ]{plc_ini.Add_F_Code + plc_ini.Add_F_CodeNum}";
  156. logger_t.OutputTrace(outputMessage);
  157. FormLogShow?.ShowLog(outputMessage);
  158. PLCResult<short> flag_result = plc.Read<short>(plc_ini.Add_F_Code, plc_ini.Add_F_CodeNum);
  159. outputMessage = $"[{EPTS_CODE}]END_F_Code=[{flag_result.Data}]{plc_ini.Add_F_Code + plc_ini.Add_F_CodeNum}";
  160. logger_t.OutputTrace(outputMessage);
  161. FormLogShow?.ShowLog(outputMessage);
  162. if (flag_result.Data != 1)
  163. {
  164. return;
  165. }
  166. // 2. 读取PLC 窑车号
  167. outputMessage = $"[{EPTS_CODE}]GET_KC_Code=[ ]{plc_ini.Add_KC_Code + plc_ini.Add_KC_CodeNum}";
  168. logger_t.OutputTrace(outputMessage);
  169. FormLogShow?.ShowLog(outputMessage);
  170. // 窑车号 固定长度
  171. PLCResult<short> kc_result = plc.Read<short>(plc_ini.Add_KC_Code, plc_ini.Add_KC_CodeNum);
  172. outputMessage = $"[{EPTS_CODE}]END_KC_Code=[{kc_result.Data}]{plc_ini.Add_KC_Code + plc_ini.Add_KC_CodeNum}";
  173. logger_t.OutputTrace(outputMessage);
  174. FormLogShow?.ShowLog(outputMessage);
  175. if (kc_result.Data <= 0)
  176. {
  177. return;
  178. }
  179. string kilnCarCode = "TK3" + kc_result.Data.ToString("000");
  180. // 3. 读取PLC 条码
  181. JArray jArray = new JArray();
  182. List<string> barcodes = new List<string>();
  183. for (int i = 0; i < 24; i++)
  184. {
  185. JObject jToken = new JObject();
  186. string code = plc_ini.Add_BarCodes[i];
  187. string codeNum = plc_ini.Add_BarCodeNums[i];
  188. outputMessage = $"[{EPTS_CODE}]GET_BarCode=[ ]{code + codeNum}";
  189. logger_t.OutputTrace(outputMessage);
  190. FormLogShow?.ShowLog(outputMessage);
  191. PLCResult<string> bar_result = plc.Read<string>(code, codeNum, 11);
  192. outputMessage = $"[{EPTS_CODE}]END_BarCode=[{bar_result.Data}]{code + codeNum}";
  193. logger_t.OutputTrace(outputMessage);
  194. FormLogShow?.ShowLog(outputMessage);
  195. if (string.IsNullOrWhiteSpace(bar_result.Data) ||
  196. bar_result.Data.StartsWith("\u0000") ||
  197. bar_result.Data.StartsWith("0"))
  198. {
  199. continue;
  200. }
  201. if (barcodes.Contains(bar_result.Data))
  202. {
  203. continue;
  204. }
  205. barcodes.Add(bar_result.Data);
  206. jToken.Add("barCode", bar_result.Data);
  207. // select * from TP_MST_DataDictionary t where DictionaryType = 'TPC003' id=87
  208. jToken.Add("kilnCarPosition", i+87);
  209. jArray.Add(jToken);
  210. }
  211. string jsonBarcodes = jArray.ToString();
  212. // 登窑工号
  213. string usercode = "";
  214. using (IDataAccess dataAccess = PLC_S_DataAccess.GetDataAccess())
  215. {
  216. string sqlString = @"
  217. SELECT t.usercode
  218. FROM tp_mst_workstation t
  219. WHERE t.workstationtypeid = 3202
  220. AND t.workstationid = @workstationid@
  221. ";
  222. CDAParameter[] ps = new CDAParameter[]
  223. {
  224. new CDAParameter("workstationid", plc_ini.WS_ID),
  225. };
  226. DataTable dataTable = dataAccess.ExecuteDatatable(sqlString, ps);
  227. if (dataTable.HasData())
  228. {
  229. usercode = dataTable.Rows[0]["usercode"].ToString();
  230. }
  231. outputMessage = $"[{EPTS_CODE}]DB_UserCode=[{usercode}]";
  232. logger_t.OutputTrace(outputMessage);
  233. FormLogShow?.ShowLog(outputMessage);
  234. }
  235. string result = SmartDeviceProxy.Instance.Invoke<string>(
  236. p => p.AddWorkPieceKiln(_mes_s.AccountCode,
  237. usercode, plc_ini.P_ID, kilnCarCode, jsonBarcodes, null));
  238. outputMessage = $"[{EPTS_CODE}]MES_Result=[{result}]";
  239. logger_t.OutputTrace(outputMessage);
  240. FormLogShow?.ShowLog(outputMessage);
  241. // 返回状态(成功、失败)
  242. if (result != "OK")
  243. {
  244. if (result == "EE")
  245. {
  246. outputMessage = $"[{EPTS_CODE}]result=[{result}]MES服务端异常(详情参见MES端日志)";
  247. }
  248. else if (result == "EU-01")
  249. {
  250. outputMessage = $"[{EPTS_CODE}]result=[{result}]无效的帐套或工号(详情参见MES端日志)";
  251. }
  252. else if (result == "EU-02")
  253. {
  254. outputMessage = $"[{EPTS_CODE}]result=[{result}]无效的窑车号(详情参见MES端日志)";
  255. }
  256. else
  257. {
  258. outputMessage = $"[{EPTS_CODE}]result=[{result}]其他错误(详情参见MES端日志)";
  259. }
  260. logger_e_out.OutputError(null, outputMessage);
  261. logger_t.OutputError(null, outputMessage);
  262. logger_e.OutputError(null, outputMessage);
  263. FormLogShow?.ShowLog(outputMessage);
  264. // 7. 写入PLC ERROR标识 = 1
  265. outputMessage = $"[{EPTS_CODE}]SET_E_Code=[ ]{plc_ini.Add_Error + plc_ini.Add_ErrorNum}";
  266. logger_t.OutputTrace(outputMessage);
  267. FormLogShow?.ShowLog(outputMessage);
  268. PLCResult e1_result = plc.Write<short>(plc_ini.Add_Error, plc_ini.Add_ErrorNum, 1);
  269. outputMessage = $"[{EPTS_CODE}]END_E_Code=[1]{plc_ini.Add_Error + plc_ini.Add_ErrorNum}";
  270. logger_t.OutputTrace(outputMessage);
  271. FormLogShow?.ShowLog(outputMessage);
  272. return;
  273. }
  274. // 7. 写入PLC 标识 = 2
  275. outputMessage = $"[{EPTS_CODE}]SET_F_Code=[ ]{plc_ini.Add_F_Code + plc_ini.Add_F_CodeNum}";
  276. logger_t.OutputTrace(outputMessage);
  277. FormLogShow?.ShowLog(outputMessage);
  278. PLCResult f_result = plc.Write<short>(plc_ini.Add_F_Code, plc_ini.Add_F_CodeNum, 2);
  279. outputMessage = $"[{EPTS_CODE}]END_F_Code=[2]{plc_ini.Add_F_Code + plc_ini.Add_F_CodeNum}";
  280. logger_t.OutputTrace(outputMessage);
  281. FormLogShow?.ShowLog(outputMessage);
  282. // 7. 写入PLC ERROR标识 = 0
  283. outputMessage = $"[{EPTS_CODE}]SET_E_Code=[ ]{plc_ini.Add_Error + plc_ini.Add_ErrorNum}";
  284. logger_t.OutputTrace(outputMessage);
  285. FormLogShow?.ShowLog(outputMessage);
  286. PLCResult e_result = plc.Write<short>(plc_ini.Add_Error, plc_ini.Add_ErrorNum, 0);
  287. outputMessage = $"[{EPTS_CODE}]END_E_Code=[0]{plc_ini.Add_Error + plc_ini.Add_ErrorNum}";
  288. logger_t.OutputTrace(outputMessage);
  289. FormLogShow?.ShowLog(outputMessage);
  290. }
  291. }
  292. catch (Exception ex)
  293. {
  294. logger_e_out.OutputError(ex);
  295. logger_e.OutputError(ex);
  296. logger_t.OutputError(ex);
  297. FormLogShow?.ShowLog($"[{EPTS_CODE}]ERROR={ex.Message}");
  298. }
  299. finally
  300. {
  301. logger_t.EndTracking();
  302. }
  303. }
  304. public void Stop()
  305. {
  306. try
  307. {
  308. logger.OutputTrace($"{M_NAME}_Stoping:[{EPTS_CODE}]");
  309. FormLogShow?.ShowLog($"{M_NAME}_Stoping:[{EPTS_CODE}]");
  310. _Started = false;
  311. backgroundWorker?.CancelAsync();
  312. backgroundWorker?.Dispose();
  313. backgroundWorker = null;
  314. logger.OutputTrace($"{M_NAME}_Stoped:[{EPTS_CODE}]");
  315. FormLogShow?.ShowLog($"{M_NAME}_Stoped:[{EPTS_CODE}]");
  316. }
  317. catch (Exception ex)
  318. {
  319. logger.OutputError(ex);
  320. }
  321. finally
  322. {
  323. _Started = false;
  324. }
  325. }
  326. public void Dispose()
  327. {
  328. try
  329. {
  330. _Started = false;
  331. backgroundWorker?.CancelAsync();
  332. backgroundWorker?.Dispose();
  333. backgroundWorker = null;
  334. }
  335. catch (Exception ex)
  336. {
  337. logger.OutputError(ex);
  338. }
  339. finally
  340. {
  341. _Started = false;
  342. }
  343. }
  344. }
  345. }