using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; using System.Drawing; using System.Net.NetworkInformation; using System.Data; using System.Threading; using Agv_Info; using BllSql; using AGVSystem.A17168; //using Agv_Control; namespace AGVSystem { public class Func { /// /// 表示每个AGV的btn /// //public static AgvLib.HxAgv[] AgvBtn; public static AgvCar.Agv[] agvcar; public static Cls.AgvInfo[] AgvInfo; public static ClsDBConn_sql db_conn = new ClsDBConn_sql(); public static BllBase bBllBase = new BllBase(); /// ///AGV位置变更时,记录位置信息的Temp /// public static int[] Agv_Location_Temp; /// /// 创建地标容器 /// /// 地标编号 /// 1.左端(后退) 2.右端(前进) 3.顶部(向上) 4.底部(向下) /// 容器放置坐标x /// 容器放置坐标y /// public static void CreatePanelLocation(string id, int direction, int x, int y, int area, string Assembly_ID) { Panel pl = new Panel(); if (area == 1) { pl.Parent = mainfrm.Map1; } else if (area == 2) { pl.Parent = mainfrm.Map2; } else { pl.Parent = mainfrm.Map3; } pl.BackColor = Color.Transparent; Label lab = new Label(); //Button lab = new Button(); lab.Visible = Cls.Param.Location_ID_Dispaly; lab.Text = id; if (Assembly_ID != "0" || Assembly_ID != "") { lab.Tag = Assembly_ID + "-" + id; lab.DoubleClick += new System.EventHandler(Cls.Path_Reset.label12_DoubleClick); lab.MouseClick += new MouseEventHandler(label_MouseClick); } else if (Cls.Param.Display_CrossID == false) { lab.ForeColor = Color.Black; } lab.AutoSize = false; lab.Height = Cls.Param.Icon_Size; lab.Width = Cls.Param.Icon_Size; pl.Width = Cls.Param.Icon_Size; pl.Height = Cls.Param.Icon_Size; lab.Parent = pl; lab.BackColor = Color.Transparent; lab.Font = new Font("宋体", 9, FontStyle.Regular); lab.TextAlign = ContentAlignment.MiddleCenter; if (direction == 1) { pl.Location = new Point(x, y - Cls.Param.Icon_Size / 2); pl.Tag = id + "-" + "1"; lab.Dock = DockStyle.Left; } else if (direction == 2) { pl.Location = new Point(x, y - Cls.Param.Icon_Size / 2); pl.Tag = id + "-" + "2"; lab.Dock = DockStyle.Left; } else if (direction == 3) { pl.Location = new Point(x - Cls.Param.Icon_Size / 2, y); pl.Tag = id + "-" + "3"; lab.Dock = DockStyle.Top; } else if (direction == 4) { pl.Location = new Point(x - Cls.Param.Icon_Size / 2, y); pl.Tag = id + "-" + "4"; lab.Dock = DockStyle.Top; } } public static int loc_flag = 0; private static void label_MouseClick(object sender, MouseEventArgs e) { if (e.Button == System.Windows.Forms.MouseButtons.Right) { loc_flag = Convert.ToInt16(((Label)sender).Text); } } private static object obj_dgvupdate = new object(); public static void DgvUpdate(DataGridView dgv, int row, string columnname, bool value) { lock (obj_dgvupdate) { dgvUpdate(dgv, row, columnname, value); } } private static void dgvUpdate(DataGridView dgv, int row, string columnname, bool value) { dgv.Rows[row].Cells[columnname].Value = value; if (columnname == "Status") { if (value) { dgv.Rows[row].DefaultCellStyle.ForeColor = Color.Red; } else { dgv.Rows[row].Cells["联网状态"].Value = value; dgv.Rows[row].DefaultCellStyle.ForeColor = Color.Gray; } } else if (columnname == "联网状态") { if (value) { dgv.Rows[row].DefaultCellStyle.ForeColor = Color.Black; } else { dgv.Rows[row].DefaultCellStyle.ForeColor = Color.Red; } } } private static object obj_AgvIpToId = new object(); public static int AgvIpToId(string IP) { lock (obj_AgvIpToId) { string ip = IP; int ID = 0; ; DataView rowfilter = new DataView(mainfrm.ds_Agvlist.Tables[0]); rowfilter.RowFilter = "IPAddress='" + ip + "'"; rowfilter.RowStateFilter = DataViewRowState.OriginalRows; DataTable dt = rowfilter.ToTable(); try { ID = Convert.ToInt16(dt.Rows[0]["ID"].ToString()); } catch { } return ID; } } private static int run_time; private static int run_model; private static int next_loc = 0; /// /// 显示AGV位置状态 /// /// AGV编号 /// 运动状态:运行/停止 /// 报警等级 /// 当前位置 /// 所属地图编号 /// 运动方向:直行/左转/右转 public static void Agv_Car_Status(int agv_id, bool run_status, int warn_level, int current_location, int map_id, int run_fx) { try { Func.agvcar[agv_id - 1].Car_Warn_Level = warn_level; if (current_location != Agv_Location_Temp[agv_id - 1]) { Func.agvcar[agv_id - 1].Run_Status = false; Agv_Location_Temp[agv_id - 1] = current_location; } else { Func.agvcar[agv_id - 1].Run_Status = run_status; } if (current_location == 0) return; run_time = 0; run_model = 0; next_loc = 0; Panel pl_new_parent = new Panel();//xin panel Panel pl_old_parent = new Panel();//jiu panel Panel parent_pnl = new Panel(); if (map_id == 1) { parent_pnl = mainfrm.Map1; } else if (map_id == 2) { parent_pnl = mainfrm.Map2; } else { parent_pnl = mainfrm.Map3; } foreach (System.Windows.Forms.Control ctl in parent_pnl.Controls) { if (ctl.GetType().Name == "Panel") { if (Convert.ToInt16(ctl.Tag.ToString().Split('-')[0]) == current_location) { pl_new_parent = (Panel)ctl; //AGV移动到新的管控停止位 if (pl_new_parent != (Panel)Func.agvcar[agv_id - 1].Parent && !Func.agvcar[agv_id - 1].Run_Status) { Func.agvcar[agv_id - 1].Refresh(); pl_old_parent = (Panel)Func.agvcar[agv_id - 1].Parent; Func.agvcar[agv_id - 1].Parent = pl_new_parent; Func.agvcar[agv_id - 1].BringToFront(); if (pl_new_parent.Tag.ToString().Split('-')[1] == "1") { Func.agvcar[agv_id - 1].Dock = DockStyle.Left; } else if (pl_new_parent.Tag.ToString().Split('-')[1] == "2") { Func.agvcar[agv_id - 1].Dock = DockStyle.Right; } else if (pl_new_parent.Tag.ToString().Split('-')[1] == "3") { Func.agvcar[agv_id - 1].Dock = DockStyle.Top; } else if (pl_new_parent.Tag.ToString().Split('-')[1] == "4") { Func.agvcar[agv_id - 1].Dock = DockStyle.Bottom; } } //AGV从停止位出发 else if (pl_new_parent == (Panel)Func.agvcar[agv_id - 1].Parent && Func.agvcar[agv_id - 1].Run_Status) { if (Func.agvcar[agv_id - 1].Parent != parent_pnl) { pl_old_parent = (Panel)Func.agvcar[agv_id - 1].Parent; Func.agvcar[agv_id - 1].Dock = DockStyle.None; Func.agvcar[agv_id - 1].Parent = parent_pnl; string ss = parent_pnl.Name; Func.agvcar[agv_id - 1].Location = pl_old_parent.Location; Func.agvcar[agv_id - 1].BringToFront(); nextStation(Convert.ToInt16((Func.agvcar[agv_id - 1].Tag.ToString().Split('-'))[1]), current_location, run_fx, out run_time, out run_model, out next_loc); Func.agvcar[agv_id - 1].TimeLong = run_time; Func.agvcar[agv_id - 1].Run_Model = run_model; if (next_loc != 0) { foreach (System.Windows.Forms.Control c in parent_pnl.Controls) { if (c.GetType().Name == "Panel") { if (Convert.ToInt16(c.Tag.ToString().Split('-')[0]) == next_loc) { Func.agvcar[agv_id - 1].NextLocation = c.Location; return; } } } } } } } } } //以下设置新容器大小 int i = 0; foreach (System.Windows.Forms.Control ctl in pl_new_parent.Controls) { i = i + Cls.Param.Icon_Size; } if (pl_new_parent.Tag != null && (pl_new_parent.Tag.ToString().Split('-')[1] == "3" || pl_new_parent.Tag.ToString().Split('-')[1] == "4")) { pl_new_parent.Height = i; } else { pl_new_parent.Width = i; } }catch(Exception ex) { } } /// /// 获取下一个站点 /// /// 线体编号 /// 位置编号 /// 区分 /// 返回下一个站点坐标 /// 返回到下一个站点的时间 /// 返回AGV图标运动模式 private static void nextStation(int Assembly_ID, int Landmark_ID, int flag, out int run_time1, out int run_model1, out int next_loc1) { run_time1 = 0; run_model1 = 0; next_loc1 = 0; DataView rowfilter = new DataView(mainfrm.ds_linelandmark.Tables[0]); rowfilter.RowFilter = "Assembly_Line=" + Assembly_ID + " and LOC_ID= " + Landmark_ID; rowfilter.RowStateFilter = DataViewRowState.OriginalRows; DataTable dt = rowfilter.ToTable(); try { if (dt.Rows.Count == 1) { if (flag == 1) { next_loc1 = Convert.ToInt16(dt.Rows[0]["Next_Station1"]); run_time1 = Convert.ToInt16(dt.Rows[0]["LongTime1"]); run_model1 = Convert.ToInt16(dt.Rows[0]["Drict1"]); } else if (flag == 2) { next_loc1 = Convert.ToInt16(dt.Rows[0]["Next_Station1"]); run_time1 = Convert.ToInt16(dt.Rows[0]["LongTime2"]); run_model1 = Convert.ToInt16(dt.Rows[0]["Drict2"]); } else if (flag == 3) { next_loc1 = Convert.ToInt16(dt.Rows[0]["Next_Station1"]); run_time1 = Convert.ToInt16(dt.Rows[0]["LongTime2"]); run_model1 = Convert.ToInt16(dt.Rows[0]["Drict2"]); } } } catch { } } /// /// AGV实时故障显示 /// /// /// /// /// /// /// public static void Agv_Alarm_Insert(int del_agv_no, string Assembly_Name, string Assembly_Id, int AGV_Internal_No, string AlarmInfo, int agv_no) { lock (obj_agv_alarm_insert) { agv_alarm_insert(del_agv_no, Assembly_Name, Assembly_Id, AGV_Internal_No, AlarmInfo, agv_no); } } private static object obj_agv_alarm_insert = new object(); private static void agv_alarm_insert(int del_agv_no, string Assembly_Name, string Assembly_Id, int AGV_Internal_No, string AlarmInfo, int agv_no) { if (del_agv_no == 0) { bool update_flag = false; if (mainfrm.ds_AgvWarn.Tables[0].Rows.Count > 0) { for (int i = 0; i < mainfrm.ds_AgvWarn.Tables[0].Rows.Count; i++) { if (Convert.ToInt16(mainfrm.ds_AgvWarn.Tables[0].Rows[i][3].ToString()) == agv_no && mainfrm.ds_AgvWarn.Tables[0].Rows[i][5].ToString().Trim() == AlarmInfo.Trim()) { //ds_aGVWarn.Tables[0].Rows[i][0] = DateTime.Now.ToString(); //ds_aGVWarn.Tables[0].Rows[i][1] = Assembly_Id; //ds_aGVWarn.Tables[0].Rows[i][2] = Assembly_Name; //ds_aGVWarn.Tables[0].Rows[i][3] = agv_no; //ds_aGVWarn.Tables[0].Rows[i][4] = AGV_Internal_No; //ds_aGVWarn.Tables[0].Rows[i][5] = AlarmInfo; //update_flag = true; return; } } } if (!update_flag) { DataRow dr = mainfrm.ds_AgvWarn.Tables[0].NewRow(); dr[0] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");// 时间 dr[1] = Assembly_Id; // 线体编号 dr[2] = Assembly_Name; // 线体名称 dr[3] = agv_no; // 设备编号 dr[4] = AGV_Internal_No; // 内部编号 dr[5] = AlarmInfo; // 报警信息 mainfrm.ds_AgvWarn.Tables[0].Rows.Add(dr); } } else { for (int i = 0; i < mainfrm.ds_AgvWarn.Tables[0].Rows.Count; i++) { if (AlarmInfo == "正常") { if (Convert.ToInt16(mainfrm.ds_AgvWarn.Tables[0].Rows[i][3]) == del_agv_no) { if (!mainfrm.ds_AgvWarn.Tables[0].Rows[i][5].ToString().Contains("障碍物")) { Warn_Log warn_Log = new Warn_Log(mainfrm.ds_AgvWarn.Tables[0].Rows[i][0].ToString(), mainfrm.ds_AgvWarn.Tables[0].Rows[i][3].ToString(), mainfrm.ds_AgvWarn.Tables[0].Rows[i][5].ToString(), DateTime.Now.ToString()); UPDateDBList.upDbList.Add(warn_Log); } mainfrm.ds_AgvWarn.Tables[0].Rows.RemoveAt(i); i--; } } else { if (Convert.ToInt16(mainfrm.ds_AgvWarn.Tables[0].Rows[i][3]) == del_agv_no && mainfrm.ds_AgvWarn.Tables[0].Rows[i][5].ToString() == AlarmInfo) { if (!mainfrm.ds_AgvWarn.Tables[0].Rows[i][5].ToString().Contains("障碍物")) { //db_conn.Command("INSERT INTO [Warn_Log] ([Dt] ,[Agv_id] ,[Type] ,[Reset]) VALUES ('" + // mainfrm.ds_AgvWarn.Tables[0].Rows[i][0] + "'," + mainfrm.ds_AgvWarn.Tables[0].Rows[i][3] + ",'" + mainfrm.ds_AgvWarn.Tables[0].Rows[i][5] + "','" + DateTime.Now.ToString() + "')"); Warn_Log warn_Log = new Warn_Log(mainfrm.ds_AgvWarn.Tables[0].Rows[i][0].ToString(), mainfrm.ds_AgvWarn.Tables[0].Rows[i][3].ToString(), mainfrm.ds_AgvWarn.Tables[0].Rows[i][5].ToString(), DateTime.Now.ToString()); UPDateDBList.upDbList.Add(warn_Log); } mainfrm.ds_AgvWarn.Tables[0].Rows.RemoveAt(i); i--; } } } } } /// /// /// /// /// /// /// /// /// public static void CrossInfo_Insert(string Assembly_Name, string Assembly_Id, int AGV_Internal_No, int LandMark, string Info, int agv_no, int plc_value, int internal_id, int line_id, string line_name) { lock (obj_crossinfo_insert1) { crossInfo_Insert(Assembly_Name, Assembly_Id, AGV_Internal_No, LandMark, Info, agv_no, plc_value, internal_id, line_id, line_name); } } private static object obj_crossinfo_insert1 = new object(); public static void crossInfo_Insert(string Assembly_Name, string Assembly_Id, int AGV_Internal_No, int LandMark, string Info, int agv_no, int plc_value, int internal_id, int line_id, string line_name) { string strsql = ""; strsql = "INSERT INTO [Go_Log] ([Dt] ,[Agv_id] ,[Type] ,[Location],[plc_value] ,[Internal_ID],[Line_ID] ,[Line_Name]) VALUES " + "('" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + "'," + agv_no + ",'" + Info + "'," + LandMark + "," + plc_value + "," + internal_id + "," + line_id + ",'" + line_name + "')"; db_conn.Command(strsql); } ///// ///// ///// ///// ///// ///// ///// ///// ///// public static void CrossInfo_Insert(string Assembly_Name, string Assembly_Id, int AGV_Internal_No, int LandMark, string Info, int agv_no, int plc_value) { UPDateDBList.upDbList.Add(new CrossInfo_Insert(DateTime.Now, Assembly_Name, Assembly_Id, AGV_Internal_No, LandMark, Info, agv_no, plc_value)); } private static object obj_crossinfo_insert = new object(); private static object obj_GetLandMarkId = new object(); /// /// 根据地标值读取地标编号 /// /// /// public static int GetLandMarkId(int assemblyline_id, int value) { lock (obj_GetLandMarkId) { int markid = 0; DataView rowfilter = new DataView(mainfrm.ds_linelandmark.Tables[0]); rowfilter.RowFilter = "Flag_Value=" + value + " and Assembly_Line= " + assemblyline_id; rowfilter.RowStateFilter = DataViewRowState.OriginalRows; DataTable dt = rowfilter.ToTable(); try { if (dt.Rows.Count > 0) markid = Convert.ToInt16(dt.Rows[0]["Loc_ID"].ToString()); } catch { } return markid; } } private static object obj_change = new object(); public static void Change_Rec(int agv_id, int current_loc, int histroy_loc, DateTime dt, int internal_id, int line_id, string line_name) { lock (obj_change) { if (mainfrm.ds_Change.Tables[0].Rows.Count == 0) return; if (histroy_loc == 0) return; bool current_loc_res = false; bool histroy_loc_res = false; if (mainfrm.ds_Change.Tables[0].Rows.Count > 0) { foreach (DataRow dr in mainfrm.ds_Change.Tables[0].Rows) { if (Convert.ToInt16(dr[0].ToString()) == current_loc) { current_loc_res = true; return; } if (Convert.ToInt16(dr[0].ToString()) == histroy_loc) { histroy_loc_res = true; } } if (current_loc_res == false && histroy_loc_res == true) { db_conn.Command("INSERT INTO [Change_Log]([Agv_ID] ,[Start_time],[Finish_time] ,[Location_ID],internal_id, line_id, line_name) VALUES(" + agv_id + ",'" + dt + "','" + DateTime.Now.ToString() + "'," + histroy_loc + "," + internal_id + "," + line_id + ",'" + line_name + "')"); } } } } private static object obj_change1 = new object(); public static void Change_Rec(int agv_id, int current_loc, int histroy_loc, DateTime dt) { lock (obj_change1) { if (mainfrm.ds_Change.Tables[0].Rows.Count == 0) return; if (histroy_loc == 0) return; bool current_loc_res = false; bool histroy_loc_res = false; if (mainfrm.ds_Change.Tables[0].Rows.Count > 0) { foreach (DataRow dr in mainfrm.ds_Change.Tables[0].Rows) { if (Convert.ToInt16(dr[0].ToString()) == current_loc) { current_loc_res = true; return; } if (Convert.ToInt16(dr[0].ToString()) == histroy_loc) { histroy_loc_res = true; } } if (current_loc_res == false && histroy_loc_res == true) { db_conn.Command("INSERT INTO [Change_Log]([Agv_ID] ,[Start_time],[Finish_time] ,[Location_ID]) VALUES(" + agv_id + ",'" + dt + "','" + DateTime.Now.ToString() + "'," + histroy_loc + ")"); } } } } } }