123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520 |
- using AGV_WPF.Tools;
- using AGV_WPF_Global;
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Data;
- using System.Data.OleDb;
- using System.Drawing;
- using System.IO;
- using System.Linq;
- using System.Text;
- using System.Threading;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- using WCS.API;
- using WCS.API.Model;
- using Newtonsoft.Json.Linq;
- using WCS.API.WebApiClient;
- using Newtonsoft.Json;
- using HslCommunication.LogNet;
- namespace AGV_WPF
- {
-
- public partial class DispatchSystem7334 : Form
- {
- public static DataTable dtStation = new DataTable();
- public static DataTable dtTraffic = new DataTable();
- public static List<Models.AGVInfoModel> listReleaseInfos = new List<Models.AGVInfoModel>();
- public static List<JObject> listTrafficInfos = new List<JObject>();
- private static object portLock1 = new object();
- public string[] SpeedOpt = { "初始化...", "低速", "中速", "高速", "最高速", "减速" };
- static LogNetDateTime logNetDateTimeMES;//= new LogNetDateTime("D:/Logs/MESLog", GenerateMode.ByEveryDay);
- static LogNetDateTime logNetDateTimeSPS;// = new LogNetDateTime("D:/Logs/SPSLog", GenerateMode.ByEveryDay);
- static LogNetDateTime logNetDateTimeTraffic;// = new LogNetDateTime("D:/Logs/TrafficLog", GenerateMode.ByEveryDay);
- public DispatchSystem7334()
- {
- InitializeComponent();
- }
-
- private void DispatchSystem7334_Load(object sender, EventArgs e)
- {
- if (!Directory.Exists("D:/Logs/MESLog"))
- {
- Directory.CreateDirectory("D:/Logs/MESLog");
- }
- if (!Directory.Exists("D:/Logs/SPSLog"))
- {
- Directory.CreateDirectory("D:/Logs/SPSLog");
- }
- if (!Directory.Exists("D:/Logs/TrafficLog"))
- {
- Directory.CreateDirectory("D:/Logs/TrafficLog");
- }
- logNetDateTimeMES = new LogNetDateTime("D:/Logs/MESLog", GenerateMode.ByEveryDay);
- logNetDateTimeSPS = new LogNetDateTime("D:/Logs/SPSLog", GenerateMode.ByEveryDay);
- logNetDateTimeTraffic = new LogNetDateTime("D:/Logs/TrafficLog", GenerateMode.ByEveryDay);
- LoadConfig();
- this.FormClosing += DispatchSystem7334_FormClosing;
- StartHttpServer();
- Thread t4 = new Thread(new ThreadStart(PostAGVDataToMes));
- t4.Start();
- Thread t5 = new Thread(new ThreadStart(PostAGVDataToSPS));
- t5.Start();
- }
- private void DispatchSystem7334_FormClosing(object sender, FormClosingEventArgs e)
- {
- e.Cancel = true;
- }
- public void PostAGVDataToMes()
- {
- while(true)
- {
- try
- {
- var Infos = GlobalPara.AgvInfoDic.Values.ToList().FindAll(o=>o.StatusChangeFlag==true);
- if (Infos != null && Infos.Count > 0)
- {
- JArray jArray = new JArray();
- JObject objResult = new JObject();
- for (int i = 0; i < Infos.Count; i++)
- {
- var info = Infos[i];
- JObject obj = new JObject();
- obj.Add("agv_num", info.AGVNUM);
- string state = info.ConnectStatus ? "" : "离线";
- if (state == "" && info.ConnectStatus)
- {
- switch (info.RUNSTATUS_Cur)
- {
- case 0x40:
- state = "运行";
- break;
- case 0x41:
- state = "停止";
- break;
- case 0x42:
- state = "结束";
- break;
- case 0x43:
- state = "暂停";
- break;
- case 0x44:
- state = "充电中";
- break;
- case 0x45:
- state = "管制";
- break;
- case 0x47:
- state = "减速";
- break;
- default:
- state = "其他";
- break;
- }
- }
- string speed = "默认";
- if (info.SPEEDLEVEL > 0 && info.SPEEDLEVEL < SpeedOpt.Length)
- {
- speed = SpeedOpt[info.SPEEDLEVEL];
- }
- obj.Add("agv_numstate", state);
- obj.Add("agv_errorid", info.ALARMINFO);
- obj.Add("agv_linenum", info.ROUTENUM);
- obj.Add("agv_speed", speed);
- obj.Add("agv_marknum", info.MARKNUM);
- jArray.Add(obj);
- lock (info)
- {
- info.StatusChangeFlag = false;
- }
- }
- objResult.Add("request_uuid", Guid.NewGuid().ToString("N"));
- objResult.Add("request_time", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
- objResult.Add("request_attr", "");
- objResult.Add("data_from_sys", "");
- objResult.Add("list", jArray);
- DataResponseMES dataResponse = null;
- AddLog("向MES发送所有AGV数据:" + objResult.ToString(), "MES交互日志");
- WcsApi.PostMES(GlobalPara.MesURL, null, objResult.ToString(), out dataResponse);
- if (dataResponse != null)
- {
- AddLog("MES回复数据(AGV信息):" + JsonConvert.SerializeObject(dataResponse), "MES交互日志");
- }
- else
- {
- AddLog("MES交互失败", "MES交互日志");
- }
- }
- }
- catch (Exception e)
- {
- }
- Thread.Sleep(1000);
- }
- }
- public void PostAGVDataToSPS()
- {
- while (true)
- {
- try
- {
- var Infos = GlobalPara.AgvInfoDic.Values.ToList();
- foreach (DataRow dr in dtStation.Rows)
- {
- var info = Infos.Find(o => o.MARKNUM.ToString() == dr["工位地标"].ToString() && o.ConnectStatus &&dr["工位属性"].ToString().Trim()=="1");
- if (info != null)
- {
- var info2 = listReleaseInfos.Find(o => o.MARKNUM == info.MARKNUM && o.AGVNUM == info.AGVNUM);
- if (info2 == null)
- {
- JObject obj = new JObject();
- obj.Add("StationCode", dr["工位名称"].ToString());
- DataResponseSPS res = null;
- AddLog("向SPS发送AGV上线数据:" + JsonConvert.SerializeObject(obj), "SPS交互日志");
- WcsApi.PostSPS(GlobalPara.SPSURL, null, JsonConvert.SerializeObject(obj), out res);
- if (res != null)
- {
- AddLog("SPS回复数据(上线信息):" + JsonConvert.SerializeObject(res), "SPS交互日志");
- listReleaseInfos.Add(info);
- // DispatcherTool.ReleaseAgvOnStop(info.MARKNUM, 0);
- }
- else
- {
- AddLog("SPS交互失败", "SPS交互日志");
- }
- }
- }
- else
- {
- var temp = listReleaseInfos.Find(o => o.MARKNUM.ToString() == dr["工位地标"].ToString());
- if (temp != null)
- {
- listReleaseInfos.Remove(temp);
- }
- }
- }
- }
- catch (Exception e)
- {
- }
- Thread.Sleep(1000);
- }
- }
- public void LoadConfig()
- {
- string currPath = System.AppDomain.CurrentDomain.BaseDirectory;
- string dataPath = currPath + @"data";
- string dataFile = dataPath + @"\物料信息表.xls";
- try
- {
- string confStr1 = @"Provider=Microsoft.ACE.OLEDB.12.0;";
- string confStr2 = @"Persist Security Info=false;";
- string confStr3 = @"Data Source=" + dataFile + ";";
- string confStr4 = @"Extended Properties=" + "'Excel 12.0;HDR=YES;IMEX=1'";
- string connStr = confStr1 + confStr2 + confStr3 + confStr4;
- OleDbConnection oleDC = new OleDbConnection(connStr);
- OleDbDataAdapter oleDDA1 = new OleDbDataAdapter("Select * From [放行配置表$]", oleDC);
- oleDDA1.Fill(dtStation);
- OleDbDataAdapter oleDDA2 = new OleDbDataAdapter("Select * From [管制配置表$]", oleDC);
- oleDDA2.Fill(dtTraffic);
- for (int i = 0; i < dtTraffic.Rows.Count; i++)
- {
- MyTest.ManagedThreadPoolcs.ManagedThreadPool.QueueUserWorkItem(new WaitCallback(TrafficByDispatch), dtTraffic.Rows[i]);
- }
- }
- catch (System.Exception ex)
- {
- MessageBox.Show(ex.StackTrace);
- }
- }
- public void StartHttpServer()
- {
- string address = "http://"+ GlobalPara.HostIPSPS + ":3350";
- if (WcsServerHost.Instance.StartServer(address))
- {
- toolStripStatusLabel1.Text = $"Http服务启动成功,地址:{address}";
- }
- else
- {
- toolStripStatusLabel1.Text = $"Http服务启动失败,地址:{address}";
- }
- }
- public static void AddLog(string log,string FileName)
- {
- try
- {
- string content = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\t\t" + log;
- RichTextBox richTextBox = new RichTextBox();
- if (FileName.Contains("MES"))
- {
- richTextBox = richTextBox2;
- content = content.Replace("\n", "").Replace(" ", "").Replace("\r", "");
- if (logNetDateTimeMES != null)
- {
- logNetDateTimeMES.WriteInfo(log);
- }
- }
- else if (FileName.Contains("SPS"))
- {
- richTextBox = richTextBox1;
- if (logNetDateTimeSPS != null)
- {
- logNetDateTimeSPS.WriteInfo(log);
- }
- }
- else if (FileName.Contains("临工管制"))
- {
- richTextBox = richTextBox3;
- if (logNetDateTimeTraffic != null)
- {
- logNetDateTimeTraffic.WriteInfo(log);
- }
- }
- richTextBox.BeginInvoke((Action)(() =>
- {
- if (richTextBox.Lines.Length > 1000)
- {
- richTextBox.Clear();
- }
- int textLength = richTextBox.TextLength;
- richTextBox.AppendText(content);
- richTextBox.AppendText(Environment.NewLine);
- richTextBox.Select(textLength, 4);
- {
- richTextBox.ScrollToCaret();
- }
- }));
- }
- catch (Exception e) { }
- }
- public static DataResponseSPS ReleaseAGV(Model.ReleaseInfo2 StationInfo)
- {
- DataResponseSPS dataResponse = new DataResponseSPS();
- dataResponse.resCode = 20001;
- var drs = dtStation.Select("工位名称='" + StationInfo.StationID + "'");
- if (drs != null && drs.Length > 0)
- {
- var Infos = GlobalPara.AgvInfoDic.Values.ToList();
- var infos = Infos.FindAll(o => o.MARKNUM.ToString() == drs[0]["工位地标"].ToString() && o.ConnectStatus);
- if (infos != null && infos.Count > 0)
- {
- var info = infos.Find(o => o.RUNSTATUS_Cur == 0x41);
- if (info != null)
- {
- DispatcherTool.ReleaseAgvOnStop(info.MARKNUM, 0);
- dataResponse.resCode = 20000;
- dataResponse.resMsg = string.Format("AGV车号:{0},地标:{1},路线:{2},工位名称:{3},状态:{4},放行成功",info.AGVNUM,info.MARKNUM,info.ROUTENUM, StationInfo.StationID,info.RUNSTATUS_Cur);
- //var temp = listReleaseInfos.Find(o => o.AGVNUM == info.AGVNUM && o.MARKNUM == info.MARKNUM);
- //if (temp != null)
- //{
- // listReleaseInfos.Remove(temp);
- //}
-
- }
- else
- {
- dataResponse.resMsg = string.Format("AGV车号:{0},地标:{1},路线:{2},工位名称:{3},状态:{4},AGV未处于停止状态,无法放行", info.AGVNUM, info.MARKNUM, info.ROUTENUM, StationInfo.StationID, info.RUNSTATUS_Cur);
- }
- }
- else
- {
- dataResponse.resMsg = string.Format("无AGV在 {0} 上,无法放行", StationInfo.StationID);
- }
- }
- return dataResponse;
- }
- public void TrafficByDispatch(object DR)
- {
- DataRow dr = (DataRow)DR;
- while (true)
- {
- try
- {
- var Infos = GlobalPara.AgvInfoDic.Values.ToList().FindAll(o=>o.ConnectStatus);
- var info = Infos.Find(o => (dr[1].ToString().Split(';').Contains(o.MARKNUM.ToString())) && o.ConnectStatus&& o.RUNSTATUS_Cur == 0x41);
- if (info != null)
- {
-
- {
- string url = GlobalPara.TrafficAreaRequestURL;
- url = url.Replace("URLValue", dr["主控IP"].ToString()).Replace("RegionValue", dr["管制区号"].ToString());
- string content = null;
- AddLog(string.Format("线体:{0},管制区号:{1},AGV信息:地标{2},路线{3},车号{5},向临工请求进入管制区,URL:{4}", dr["线体名称"].ToString(), dr["管制区号"].ToString(), info.MARKNUM, info.ROUTENUM,url,info.AGVNUM), "临工管制交互日志");
- // WcsApi.GetTrafficArea(url, null, null, out content);
- content = WcsApi.GetData(url);
- if (content != null)
- {
- AddLog("收到临工系统回复:" + content, "临工管制交互日志");
- JObject obj = JsonConvert.DeserializeObject<JObject>(content);
- if (obj["msg"].ToString().Trim().ToLower() == "ok"|| obj["msg"].ToString().Trim().ToLower() == "0")
- {
- if (obj["code"].ToString().Trim() == "1")
- {
- DispatcherTool.ReleaseAgvOnStop(info.MARKNUM, 0);
- var temp = listTrafficInfos.Find(o => o["AGVNUM"].ToString() == info.AGVNUM.ToString() && o["MARKNUM"].ToString() == info.MARKNUM.ToString());
- if (temp == null)
- {
- JObject obj2 = new JObject();
- obj2["AGVNUM"] = info.AGVNUM.ToString();
- obj2["MARKNUM"] = info.MARKNUM.ToString();
- obj2["Step"] = 1;
- obj2["Time"] = DateTime.Now.ToString();
- listTrafficInfos.Add(obj2);
- }
- else
- {
- temp["Step"] = 1;
- }
- AddLog("管制区内AGV数量:" + obj["msg"].ToString().Trim() + ",放行AGV进入管制区", "临工管制交互日志");
- }
- else
- {
- AddLog("管制区内AGV数量:" + obj["msg"].ToString().Trim() + ",继续等待进入管制区", "临工管制交互日志");
- }
- }
- }
- else
- {
- AddLog("请求临工系统回复失败", "临工管制交互日志");
- }
- }
-
- }
- info = Infos.Find(o => (dr[1].ToString().Split(';').Contains(o.MARKNUM.ToString())) && o.ConnectStatus && o.RUNSTATUS_Cur == 0x40);
- if (info!=null)
- {
- string url = GlobalPara.TrafficAreaResponseURL;
- url = url.Replace("URLValue", dr["主控IP"].ToString()).Replace("RegionValue", dr["管制区号"].ToString()).Replace("OperValue", "1");
- string content = null;
- var temp = listTrafficInfos.Find(o => o["AGVNUM"].ToString() == info.AGVNUM.ToString() && o["MARKNUM"].ToString() == info.MARKNUM.ToString() && o["Step"].ToString() == "1");
- if (temp != null)
- {
- AddLog(string.Format("线体:{0},管制区号:{1},AGV信息:地标{2},路线{3},车号{5},向临工反馈AGV进入管制区,URL:{4}", dr["线体名称"].ToString(), dr["管制区号"].ToString(), info.MARKNUM, info.ROUTENUM, url, info.AGVNUM), "临工管制交互日志");
- // WcsApi.GetTrafficArea(url, null, null, out content);
- content = WcsApi.GetData(url);
- if (content != null)
- {
- JObject obj = JsonConvert.DeserializeObject<JObject>(content);
- if (obj["msg"].ToString().Trim().ToLower() == "ok")
- {
- temp["Step"] = 2;
-
- }
- AddLog("收到临工系统回复:" + content, "临工管制交互日志");
- }
- }
- }
- info = Infos.Find(o => (dr[2].ToString().Split(';').Contains(o.MARKNUM.ToString())) && o.ConnectStatus);
- if (info != null)
- {
- string url = GlobalPara.TrafficAreaResponseURL;
- url = url.Replace("URLValue", dr["主控IP"].ToString()).Replace("RegionValue", dr["管制区号"].ToString()).Replace("OperValue", "0");
- string content = null;
- var temp = listTrafficInfos.Find(o => o["AGVNUM"].ToString() == info.AGVNUM.ToString() && o["Step"].ToString() == "2");
- if (temp != null)
- {
- AddLog(string.Format("线体:{0},管制区号:{1},AGV信息:地标{2},路线{3},车号{5},向临工反馈AGV离开管制区,URL:{4}", dr["线体名称"].ToString(), dr["管制区号"].ToString(), info.MARKNUM, info.ROUTENUM,url, info.AGVNUM), "临工管制交互日志");
- // WcsApi.GetTrafficArea(url, null, null, out content);
- content = WcsApi.GetData(url);
- if (content != null)
- {
- JObject obj = JsonConvert.DeserializeObject<JObject>(content);
- if (obj["msg"].ToString().Trim().ToLower() == "ok")
- {
- listTrafficInfos.Remove(temp);
-
- }
- AddLog("收到临工系统回复:" + content, "临工管制交互日志");
- }
- }
- }
- }
- catch(Exception)
- {
- }
- Thread.Sleep(1000);
- }
- }
- public void TrafficByDispatch0(object DR)
- {
- DataRow dr = (DataRow)DR;
- while (true)
- {
- DAL.ZSql ZSql = new DAL.ZSql();
- try
- {
- bool NoAGV = false;
- var drResult = ZSql.Open_dr("select * from T_TrafficCombine where AreaID=" + dr[0].ToString());
- if(drResult!=null&&drResult.GetInt32(0)==2)
- {
- continue;
- }
- var Infos = GlobalPara.AgvInfoDic.Values.ToList();
- var info = Infos.Find(o => (dr[2].ToString().Split(';').Contains(o.MARKNUM.ToString())) && o.ConnectStatus);
- if (info != null)
- {
- 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());
- continue;
- }
- else
- {
- NoAGV = true;
- }
- if (drResult.GetInt32(0) == 0)
- {
- info = Infos.Find(o => dr[1].ToString().Split(';').Contains(o.MARKNUM.ToString())&& o.ConnectStatus);
- if (info != null)
- {
- if(info.RUNSTATUS_Cur == 0x41)
- {
- 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());
- DispatcherTool.ReleaseAgvOnStop(info.MARKNUM, 0);
- NoAGV = false;
- }
- else if (info.RUNSTATUS_Cur == 0x40)
- {
- NoAGV = false;
- }
- }
- }
- if (NoAGV)
- {
- 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());
- }
- }
- catch (Exception)
- {
- }
- finally
- {
- ZSql.Close();
- }
- Thread.Sleep(1000);
- }
- }
-
- }
- }
|