DispatchSystem7334.cs 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520
  1. using AGV_WPF.Tools;
  2. using AGV_WPF_Global;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.ComponentModel;
  6. using System.Data;
  7. using System.Data.OleDb;
  8. using System.Drawing;
  9. using System.IO;
  10. using System.Linq;
  11. using System.Text;
  12. using System.Threading;
  13. using System.Threading.Tasks;
  14. using System.Windows.Forms;
  15. using WCS.API;
  16. using WCS.API.Model;
  17. using Newtonsoft.Json.Linq;
  18. using WCS.API.WebApiClient;
  19. using Newtonsoft.Json;
  20. using HslCommunication.LogNet;
  21. namespace AGV_WPF
  22. {
  23. public partial class DispatchSystem7334 : Form
  24. {
  25. public static DataTable dtStation = new DataTable();
  26. public static DataTable dtTraffic = new DataTable();
  27. public static List<Models.AGVInfoModel> listReleaseInfos = new List<Models.AGVInfoModel>();
  28. public static List<JObject> listTrafficInfos = new List<JObject>();
  29. private static object portLock1 = new object();
  30. public string[] SpeedOpt = { "初始化...", "低速", "中速", "高速", "最高速", "减速" };
  31. static LogNetDateTime logNetDateTimeMES;//= new LogNetDateTime("D:/Logs/MESLog", GenerateMode.ByEveryDay);
  32. static LogNetDateTime logNetDateTimeSPS;// = new LogNetDateTime("D:/Logs/SPSLog", GenerateMode.ByEveryDay);
  33. static LogNetDateTime logNetDateTimeTraffic;// = new LogNetDateTime("D:/Logs/TrafficLog", GenerateMode.ByEveryDay);
  34. public DispatchSystem7334()
  35. {
  36. InitializeComponent();
  37. }
  38. private void DispatchSystem7334_Load(object sender, EventArgs e)
  39. {
  40. if (!Directory.Exists("D:/Logs/MESLog"))
  41. {
  42. Directory.CreateDirectory("D:/Logs/MESLog");
  43. }
  44. if (!Directory.Exists("D:/Logs/SPSLog"))
  45. {
  46. Directory.CreateDirectory("D:/Logs/SPSLog");
  47. }
  48. if (!Directory.Exists("D:/Logs/TrafficLog"))
  49. {
  50. Directory.CreateDirectory("D:/Logs/TrafficLog");
  51. }
  52. logNetDateTimeMES = new LogNetDateTime("D:/Logs/MESLog", GenerateMode.ByEveryDay);
  53. logNetDateTimeSPS = new LogNetDateTime("D:/Logs/SPSLog", GenerateMode.ByEveryDay);
  54. logNetDateTimeTraffic = new LogNetDateTime("D:/Logs/TrafficLog", GenerateMode.ByEveryDay);
  55. LoadConfig();
  56. this.FormClosing += DispatchSystem7334_FormClosing;
  57. StartHttpServer();
  58. Thread t4 = new Thread(new ThreadStart(PostAGVDataToMes));
  59. t4.Start();
  60. Thread t5 = new Thread(new ThreadStart(PostAGVDataToSPS));
  61. t5.Start();
  62. }
  63. private void DispatchSystem7334_FormClosing(object sender, FormClosingEventArgs e)
  64. {
  65. e.Cancel = true;
  66. }
  67. public void PostAGVDataToMes()
  68. {
  69. while(true)
  70. {
  71. try
  72. {
  73. var Infos = GlobalPara.AgvInfoDic.Values.ToList().FindAll(o=>o.StatusChangeFlag==true);
  74. if (Infos != null && Infos.Count > 0)
  75. {
  76. JArray jArray = new JArray();
  77. JObject objResult = new JObject();
  78. for (int i = 0; i < Infos.Count; i++)
  79. {
  80. var info = Infos[i];
  81. JObject obj = new JObject();
  82. obj.Add("agv_num", info.AGVNUM);
  83. string state = info.ConnectStatus ? "" : "离线";
  84. if (state == "" && info.ConnectStatus)
  85. {
  86. switch (info.RUNSTATUS_Cur)
  87. {
  88. case 0x40:
  89. state = "运行";
  90. break;
  91. case 0x41:
  92. state = "停止";
  93. break;
  94. case 0x42:
  95. state = "结束";
  96. break;
  97. case 0x43:
  98. state = "暂停";
  99. break;
  100. case 0x44:
  101. state = "充电中";
  102. break;
  103. case 0x45:
  104. state = "管制";
  105. break;
  106. case 0x47:
  107. state = "减速";
  108. break;
  109. default:
  110. state = "其他";
  111. break;
  112. }
  113. }
  114. string speed = "默认";
  115. if (info.SPEEDLEVEL > 0 && info.SPEEDLEVEL < SpeedOpt.Length)
  116. {
  117. speed = SpeedOpt[info.SPEEDLEVEL];
  118. }
  119. obj.Add("agv_numstate", state);
  120. obj.Add("agv_errorid", info.ALARMINFO);
  121. obj.Add("agv_linenum", info.ROUTENUM);
  122. obj.Add("agv_speed", speed);
  123. obj.Add("agv_marknum", info.MARKNUM);
  124. jArray.Add(obj);
  125. lock (info)
  126. {
  127. info.StatusChangeFlag = false;
  128. }
  129. }
  130. objResult.Add("request_uuid", Guid.NewGuid().ToString("N"));
  131. objResult.Add("request_time", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
  132. objResult.Add("request_attr", "");
  133. objResult.Add("data_from_sys", "");
  134. objResult.Add("list", jArray);
  135. DataResponseMES dataResponse = null;
  136. AddLog("向MES发送所有AGV数据:" + objResult.ToString(), "MES交互日志");
  137. WcsApi.PostMES(GlobalPara.MesURL, null, objResult.ToString(), out dataResponse);
  138. if (dataResponse != null)
  139. {
  140. AddLog("MES回复数据(AGV信息):" + JsonConvert.SerializeObject(dataResponse), "MES交互日志");
  141. }
  142. else
  143. {
  144. AddLog("MES交互失败", "MES交互日志");
  145. }
  146. }
  147. }
  148. catch (Exception e)
  149. {
  150. }
  151. Thread.Sleep(1000);
  152. }
  153. }
  154. public void PostAGVDataToSPS()
  155. {
  156. while (true)
  157. {
  158. try
  159. {
  160. var Infos = GlobalPara.AgvInfoDic.Values.ToList();
  161. foreach (DataRow dr in dtStation.Rows)
  162. {
  163. var info = Infos.Find(o => o.MARKNUM.ToString() == dr["工位地标"].ToString() && o.ConnectStatus &&dr["工位属性"].ToString().Trim()=="1");
  164. if (info != null)
  165. {
  166. var info2 = listReleaseInfos.Find(o => o.MARKNUM == info.MARKNUM && o.AGVNUM == info.AGVNUM);
  167. if (info2 == null)
  168. {
  169. JObject obj = new JObject();
  170. obj.Add("StationCode", dr["工位名称"].ToString());
  171. DataResponseSPS res = null;
  172. AddLog("向SPS发送AGV上线数据:" + JsonConvert.SerializeObject(obj), "SPS交互日志");
  173. WcsApi.PostSPS(GlobalPara.SPSURL, null, JsonConvert.SerializeObject(obj), out res);
  174. if (res != null)
  175. {
  176. AddLog("SPS回复数据(上线信息):" + JsonConvert.SerializeObject(res), "SPS交互日志");
  177. listReleaseInfos.Add(info);
  178. // DispatcherTool.ReleaseAgvOnStop(info.MARKNUM, 0);
  179. }
  180. else
  181. {
  182. AddLog("SPS交互失败", "SPS交互日志");
  183. }
  184. }
  185. }
  186. else
  187. {
  188. var temp = listReleaseInfos.Find(o => o.MARKNUM.ToString() == dr["工位地标"].ToString());
  189. if (temp != null)
  190. {
  191. listReleaseInfos.Remove(temp);
  192. }
  193. }
  194. }
  195. }
  196. catch (Exception e)
  197. {
  198. }
  199. Thread.Sleep(1000);
  200. }
  201. }
  202. public void LoadConfig()
  203. {
  204. string currPath = System.AppDomain.CurrentDomain.BaseDirectory;
  205. string dataPath = currPath + @"data";
  206. string dataFile = dataPath + @"\物料信息表.xls";
  207. try
  208. {
  209. string confStr1 = @"Provider=Microsoft.ACE.OLEDB.12.0;";
  210. string confStr2 = @"Persist Security Info=false;";
  211. string confStr3 = @"Data Source=" + dataFile + ";";
  212. string confStr4 = @"Extended Properties=" + "'Excel 12.0;HDR=YES;IMEX=1'";
  213. string connStr = confStr1 + confStr2 + confStr3 + confStr4;
  214. OleDbConnection oleDC = new OleDbConnection(connStr);
  215. OleDbDataAdapter oleDDA1 = new OleDbDataAdapter("Select * From [放行配置表$]", oleDC);
  216. oleDDA1.Fill(dtStation);
  217. OleDbDataAdapter oleDDA2 = new OleDbDataAdapter("Select * From [管制配置表$]", oleDC);
  218. oleDDA2.Fill(dtTraffic);
  219. for (int i = 0; i < dtTraffic.Rows.Count; i++)
  220. {
  221. MyTest.ManagedThreadPoolcs.ManagedThreadPool.QueueUserWorkItem(new WaitCallback(TrafficByDispatch), dtTraffic.Rows[i]);
  222. }
  223. }
  224. catch (System.Exception ex)
  225. {
  226. MessageBox.Show(ex.StackTrace);
  227. }
  228. }
  229. public void StartHttpServer()
  230. {
  231. string address = "http://"+ GlobalPara.HostIPSPS + ":3350";
  232. if (WcsServerHost.Instance.StartServer(address))
  233. {
  234. toolStripStatusLabel1.Text = $"Http服务启动成功,地址:{address}";
  235. }
  236. else
  237. {
  238. toolStripStatusLabel1.Text = $"Http服务启动失败,地址:{address}";
  239. }
  240. }
  241. public static void AddLog(string log,string FileName)
  242. {
  243. try
  244. {
  245. string content = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\t\t" + log;
  246. RichTextBox richTextBox = new RichTextBox();
  247. if (FileName.Contains("MES"))
  248. {
  249. richTextBox = richTextBox2;
  250. content = content.Replace("\n", "").Replace(" ", "").Replace("\r", "");
  251. if (logNetDateTimeMES != null)
  252. {
  253. logNetDateTimeMES.WriteInfo(log);
  254. }
  255. }
  256. else if (FileName.Contains("SPS"))
  257. {
  258. richTextBox = richTextBox1;
  259. if (logNetDateTimeSPS != null)
  260. {
  261. logNetDateTimeSPS.WriteInfo(log);
  262. }
  263. }
  264. else if (FileName.Contains("临工管制"))
  265. {
  266. richTextBox = richTextBox3;
  267. if (logNetDateTimeTraffic != null)
  268. {
  269. logNetDateTimeTraffic.WriteInfo(log);
  270. }
  271. }
  272. richTextBox.BeginInvoke((Action)(() =>
  273. {
  274. if (richTextBox.Lines.Length > 1000)
  275. {
  276. richTextBox.Clear();
  277. }
  278. int textLength = richTextBox.TextLength;
  279. richTextBox.AppendText(content);
  280. richTextBox.AppendText(Environment.NewLine);
  281. richTextBox.Select(textLength, 4);
  282. {
  283. richTextBox.ScrollToCaret();
  284. }
  285. }));
  286. }
  287. catch (Exception e) { }
  288. }
  289. public static DataResponseSPS ReleaseAGV(Model.ReleaseInfo2 StationInfo)
  290. {
  291. DataResponseSPS dataResponse = new DataResponseSPS();
  292. dataResponse.resCode = 20001;
  293. var drs = dtStation.Select("工位名称='" + StationInfo.StationID + "'");
  294. if (drs != null && drs.Length > 0)
  295. {
  296. var Infos = GlobalPara.AgvInfoDic.Values.ToList();
  297. var infos = Infos.FindAll(o => o.MARKNUM.ToString() == drs[0]["工位地标"].ToString() && o.ConnectStatus);
  298. if (infos != null && infos.Count > 0)
  299. {
  300. var info = infos.Find(o => o.RUNSTATUS_Cur == 0x41);
  301. if (info != null)
  302. {
  303. DispatcherTool.ReleaseAgvOnStop(info.MARKNUM, 0);
  304. dataResponse.resCode = 20000;
  305. dataResponse.resMsg = string.Format("AGV车号:{0},地标:{1},路线:{2},工位名称:{3},状态:{4},放行成功",info.AGVNUM,info.MARKNUM,info.ROUTENUM, StationInfo.StationID,info.RUNSTATUS_Cur);
  306. //var temp = listReleaseInfos.Find(o => o.AGVNUM == info.AGVNUM && o.MARKNUM == info.MARKNUM);
  307. //if (temp != null)
  308. //{
  309. // listReleaseInfos.Remove(temp);
  310. //}
  311. }
  312. else
  313. {
  314. dataResponse.resMsg = string.Format("AGV车号:{0},地标:{1},路线:{2},工位名称:{3},状态:{4},AGV未处于停止状态,无法放行", info.AGVNUM, info.MARKNUM, info.ROUTENUM, StationInfo.StationID, info.RUNSTATUS_Cur);
  315. }
  316. }
  317. else
  318. {
  319. dataResponse.resMsg = string.Format("无AGV在 {0} 上,无法放行", StationInfo.StationID);
  320. }
  321. }
  322. return dataResponse;
  323. }
  324. public void TrafficByDispatch(object DR)
  325. {
  326. DataRow dr = (DataRow)DR;
  327. while (true)
  328. {
  329. try
  330. {
  331. var Infos = GlobalPara.AgvInfoDic.Values.ToList().FindAll(o=>o.ConnectStatus);
  332. var info = Infos.Find(o => (dr[1].ToString().Split(';').Contains(o.MARKNUM.ToString())) && o.ConnectStatus&& o.RUNSTATUS_Cur == 0x41);
  333. if (info != null)
  334. {
  335. {
  336. string url = GlobalPara.TrafficAreaRequestURL;
  337. url = url.Replace("URLValue", dr["主控IP"].ToString()).Replace("RegionValue", dr["管制区号"].ToString());
  338. string content = null;
  339. AddLog(string.Format("线体:{0},管制区号:{1},AGV信息:地标{2},路线{3},车号{5},向临工请求进入管制区,URL:{4}", dr["线体名称"].ToString(), dr["管制区号"].ToString(), info.MARKNUM, info.ROUTENUM,url,info.AGVNUM), "临工管制交互日志");
  340. // WcsApi.GetTrafficArea(url, null, null, out content);
  341. content = WcsApi.GetData(url);
  342. if (content != null)
  343. {
  344. AddLog("收到临工系统回复:" + content, "临工管制交互日志");
  345. JObject obj = JsonConvert.DeserializeObject<JObject>(content);
  346. if (obj["msg"].ToString().Trim().ToLower() == "ok"|| obj["msg"].ToString().Trim().ToLower() == "0")
  347. {
  348. if (obj["code"].ToString().Trim() == "1")
  349. {
  350. DispatcherTool.ReleaseAgvOnStop(info.MARKNUM, 0);
  351. var temp = listTrafficInfos.Find(o => o["AGVNUM"].ToString() == info.AGVNUM.ToString() && o["MARKNUM"].ToString() == info.MARKNUM.ToString());
  352. if (temp == null)
  353. {
  354. JObject obj2 = new JObject();
  355. obj2["AGVNUM"] = info.AGVNUM.ToString();
  356. obj2["MARKNUM"] = info.MARKNUM.ToString();
  357. obj2["Step"] = 1;
  358. obj2["Time"] = DateTime.Now.ToString();
  359. listTrafficInfos.Add(obj2);
  360. }
  361. else
  362. {
  363. temp["Step"] = 1;
  364. }
  365. AddLog("管制区内AGV数量:" + obj["msg"].ToString().Trim() + ",放行AGV进入管制区", "临工管制交互日志");
  366. }
  367. else
  368. {
  369. AddLog("管制区内AGV数量:" + obj["msg"].ToString().Trim() + ",继续等待进入管制区", "临工管制交互日志");
  370. }
  371. }
  372. }
  373. else
  374. {
  375. AddLog("请求临工系统回复失败", "临工管制交互日志");
  376. }
  377. }
  378. }
  379. info = Infos.Find(o => (dr[1].ToString().Split(';').Contains(o.MARKNUM.ToString())) && o.ConnectStatus && o.RUNSTATUS_Cur == 0x40);
  380. if (info!=null)
  381. {
  382. string url = GlobalPara.TrafficAreaResponseURL;
  383. url = url.Replace("URLValue", dr["主控IP"].ToString()).Replace("RegionValue", dr["管制区号"].ToString()).Replace("OperValue", "1");
  384. string content = null;
  385. var temp = listTrafficInfos.Find(o => o["AGVNUM"].ToString() == info.AGVNUM.ToString() && o["MARKNUM"].ToString() == info.MARKNUM.ToString() && o["Step"].ToString() == "1");
  386. if (temp != null)
  387. {
  388. AddLog(string.Format("线体:{0},管制区号:{1},AGV信息:地标{2},路线{3},车号{5},向临工反馈AGV进入管制区,URL:{4}", dr["线体名称"].ToString(), dr["管制区号"].ToString(), info.MARKNUM, info.ROUTENUM, url, info.AGVNUM), "临工管制交互日志");
  389. // WcsApi.GetTrafficArea(url, null, null, out content);
  390. content = WcsApi.GetData(url);
  391. if (content != null)
  392. {
  393. JObject obj = JsonConvert.DeserializeObject<JObject>(content);
  394. if (obj["msg"].ToString().Trim().ToLower() == "ok")
  395. {
  396. temp["Step"] = 2;
  397. }
  398. AddLog("收到临工系统回复:" + content, "临工管制交互日志");
  399. }
  400. }
  401. }
  402. info = Infos.Find(o => (dr[2].ToString().Split(';').Contains(o.MARKNUM.ToString())) && o.ConnectStatus);
  403. if (info != null)
  404. {
  405. string url = GlobalPara.TrafficAreaResponseURL;
  406. url = url.Replace("URLValue", dr["主控IP"].ToString()).Replace("RegionValue", dr["管制区号"].ToString()).Replace("OperValue", "0");
  407. string content = null;
  408. var temp = listTrafficInfos.Find(o => o["AGVNUM"].ToString() == info.AGVNUM.ToString() && o["Step"].ToString() == "2");
  409. if (temp != null)
  410. {
  411. AddLog(string.Format("线体:{0},管制区号:{1},AGV信息:地标{2},路线{3},车号{5},向临工反馈AGV离开管制区,URL:{4}", dr["线体名称"].ToString(), dr["管制区号"].ToString(), info.MARKNUM, info.ROUTENUM,url, info.AGVNUM), "临工管制交互日志");
  412. // WcsApi.GetTrafficArea(url, null, null, out content);
  413. content = WcsApi.GetData(url);
  414. if (content != null)
  415. {
  416. JObject obj = JsonConvert.DeserializeObject<JObject>(content);
  417. if (obj["msg"].ToString().Trim().ToLower() == "ok")
  418. {
  419. listTrafficInfos.Remove(temp);
  420. }
  421. AddLog("收到临工系统回复:" + content, "临工管制交互日志");
  422. }
  423. }
  424. }
  425. }
  426. catch(Exception)
  427. {
  428. }
  429. Thread.Sleep(1000);
  430. }
  431. }
  432. public void TrafficByDispatch0(object DR)
  433. {
  434. DataRow dr = (DataRow)DR;
  435. while (true)
  436. {
  437. DAL.ZSql ZSql = new DAL.ZSql();
  438. try
  439. {
  440. bool NoAGV = false;
  441. var drResult = ZSql.Open_dr("select * from T_TrafficCombine where AreaID=" + dr[0].ToString());
  442. if(drResult!=null&&drResult.GetInt32(0)==2)
  443. {
  444. continue;
  445. }
  446. var Infos = GlobalPara.AgvInfoDic.Values.ToList();
  447. var info = Infos.Find(o => (dr[2].ToString().Split(';').Contains(o.MARKNUM.ToString())) && o.ConnectStatus);
  448. if (info != null)
  449. {
  450. ZSql.Open("update T_TrafficCombine set TrafficFlag=1,AGVID="+info.AGVNUM+",LastUpdateTime1='" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "' where TrafficFlag=0 and AreaID=" + dr[0].ToString());
  451. continue;
  452. }
  453. else
  454. {
  455. NoAGV = true;
  456. }
  457. if (drResult.GetInt32(0) == 0)
  458. {
  459. info = Infos.Find(o => dr[1].ToString().Split(';').Contains(o.MARKNUM.ToString())&& o.ConnectStatus);
  460. if (info != null)
  461. {
  462. if(info.RUNSTATUS_Cur == 0x41)
  463. {
  464. ZSql.Open("update T_TrafficCombine set TrafficFlag=1,AGVID="+info.AGVNUM+",LastUpdateTime1='" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "' where TrafficFlag=0 and AreaID=" + dr[0].ToString());
  465. DispatcherTool.ReleaseAgvOnStop(info.MARKNUM, 0);
  466. NoAGV = false;
  467. }
  468. else if (info.RUNSTATUS_Cur == 0x40)
  469. {
  470. NoAGV = false;
  471. }
  472. }
  473. }
  474. if (NoAGV)
  475. {
  476. ZSql.Open("update T_TrafficCombine set TrafficFlag=0,AGVID=0,LastUpdateTime1='" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "' where TrafficFlag=1 and AreaID=" + dr[0].ToString());
  477. }
  478. }
  479. catch (Exception)
  480. {
  481. }
  482. finally
  483. {
  484. ZSql.Close();
  485. }
  486. Thread.Sleep(1000);
  487. }
  488. }
  489. }
  490. }