using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using DBFactory; using System.Net.Sockets; using System.Threading; using ICommLayer; using CommLayerFactory; using Microsoft.VisualBasic; namespace ControlSystem { /// /// Creator:Richard.liu /// 调度程序主窗口 /// public partial class FrmControlMonitor : Form { private Object thisLock = new Object(); Model.MDevice device = null;//20110331 StringBuilder sql = new StringBuilder(); char[] dd = new char[1] { '.' };//20101124 string[] DS;//20101124 FrmDeviceStatus _deviceStatus = new FrmDeviceStatus(); FrmWorkstationStatus _worstation = new FrmWorkstationStatus(); #region 方法 public void FlashPanit(string obj, bool visible) { this.Controls[obj].Visible = visible; } public void FlashPanit(string obj, Image backgroundImage) { this.Controls[obj].BackgroundImage = backgroundImage; } public void FlashPanit(string obj, ImageLayout backgroundImageLayout) { this.Controls[obj].BackgroundImageLayout = backgroundImageLayout; } public void FlashPanit(string obj, int top, int left) { this.Controls[obj].Top = top; this.Controls[obj].Left = left; } public void FlashPanit(string obj, string text, bool append) { if (append == true) { this.Controls[obj].Text += text; } else { this.Controls[obj].Text = text; } } public string GetObjectText(string obj) { return this.Controls[obj].Text; } public void MonitorRefresh(object dataSource) { if (dataSource!=this.dgvMonitor.DataSource) { this.dgvMonitor.DataSource = dataSource; } //20100108 dataSource = null; } public void MonitorRefresh() {//20110222 if (CStaticClass.RealRefresh == true) { sql.Remove(0, sql.Length); sql.Append("select * from V_Monitor_Task where ").Append(CStaticClass.Monstatus).Append(" order by 设备指令索引 asc "); this.dgvMonitor.DataSource = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; } } public void ManagerRefresh(object dataSource) { if (this.dgvManager.DataSource != dataSource) { this.dgvManager.DataSource = dataSource; } //20100108 dataSource = null; } public void ManagerRefresh() {//20110222 if (CStaticClass.RealRefresh == true) { sql.Remove(0, sql.Length); sql.Append("select * from V_Manage_Task where ").Append(CStaticClass.Manstatus); this.dgvManager.DataSource = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; } } #endregion private static FrmControlMonitor _formInstance; public static FrmControlMonitor FormInstance { get { if (_formInstance == null) { _formInstance = new FrmControlMonitor(); } return _formInstance; } set { _formInstance = value; } } //IGetDeviceState gds; CGetState gs = new CGetState(); CControl cc = new CControl(); CListenPLCAsk cplc = new CListenPLCAsk(); CCommonFunction ccf = new CCommonFunction(); DBOperator dbo = CStaticClass.dbo; DBOperator dbo1 = CStaticClass.dbo1; DBOperator dboM =CStaticClass.dboM; public FrmControlMonitor() { InitializeComponent(); _formInstance = this; //201100608 CListenAGVState.DataChange+=new CDataSourceChangeEventHandler(CListenAGVState_DataChange); CListenAGVState.UpdateDB+=new CUpdateDBEventHandler(CListenAGVState_UpdateDB); DataView dv; System.IO.Ports.SerialPort sp; try { //20100609 #region 串口初始化 sql.Remove(0, sql.Length); sql.Append("SELECT F_DeviceIndex, F_CommSettings, F_SerialPort FROM T_Base_Device where F_SerialPort>0"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; for (int i = 0; i < dv.Count; i++) { sp=new System.IO.Ports.SerialPort("COM"+dv[i]["F_SerialPort"].ToString()); sp.BaudRate = 9600; sp.Parity = System.IO.Ports.Parity.None; sp.DataBits = 8; sp.StopBits = System.IO.Ports.StopBits.One; CStaticClass.serialports.Add(Convert.ToInt32( dv[i]["F_DeviceIndex"]),sp); } #endregion } catch (Exception ex) { tsStatus.Text = "串口初始化时:" + ex.Message; } finally { dv=null; sp=null; } } /// /// 20110405相应CListenAGV线程的数据反馈事件 /// /// /// void CListenAGVState_DataChange(object sender, CDataChangeEventArgs e) { try { if (e.ManDataSource == null) { dgvManager.Invoke(new MethodInvoker(delegate() { sql.Remove(0, sql.Length); sql.Append("select * from V_Manage_Task where ").Append(CStaticClass.Manstatus); this.dgvManager.DataSource = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; })); } else { dgvManager.Invoke(new MethodInvoker(delegate() { dgvManager.DataSource = e.ManDataSource; })); } if (e.MonDataSource == null) { dgvMonitor.Invoke(new MethodInvoker(delegate() { sql.Remove(0, sql.Length); sql.Append("select * from V_Monitor_Task where ").Append(CStaticClass.Monstatus).Append(" order by 设备指令索引 asc "); this.dgvMonitor.DataSource = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; })); } else { dgvMonitor.Invoke(new MethodInvoker(delegate() { dgvMonitor.DataSource = e.MonDataSource; })); } } catch (Exception ex) { if (tsStatus.Text.IndexOf("处理附加线程反馈数据更新时:" + ex.Message) < 0) { tsStatus.Text += "处理附加线程反馈数据更新时:" + ex.Message; } } } /// /// 20110608相应CListenAGV线程的数据库更新事件 /// /// /// void CListenAGVState_UpdateDB(object sender, CUpdateDBChangeEventArgs e) { try { this.Invoke(new MethodInvoker(delegate() { if (e.Taskindex > 0) { gs.ActionComplete(e.Deviceindex, e.Taskindex, e.Taskstate); } else { dbo1 = e.Dbo; dbo1.ExecuteSql(e.ExeSQL.ToString()); } })); } catch (Exception ex) { if (tsStatus.Text.IndexOf("处理附加线程更新数据库时:" + ex.Message) < 0) { tsStatus.Text += "处理附加线程更新数据库时:" + ex.Message; } } } private void FrmControlMonitor_Load(object sender, EventArgs e) { if (this.rbmanAll.Checked == true) { CStaticClass.Manstatus = " F_Status<>-1 "; } if (this.rbmanRun.Checked == true) { CStaticClass.Manstatus = " F_Status=1 "; } if (this.rbmanWait.Checked == true) { CStaticClass.Manstatus = " F_Status=0 "; } //显示设备指令 sql.Remove(0, sql.Length); sql.Append("select * from V_Monitor_Task where " ).Append( CStaticClass.Monstatus ).Append( " order by 设备指令索引 asc "); this.dgvMonitor.DataSource = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; //显示调度任务 sql.Remove(0, sql.Length); sql.Append("select * from V_Manage_Task where " ).Append( CStaticClass.Manstatus); this.dgvManager.DataSource = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; this.tabPage1.AutoScrollMinSize = new Size(1072, 312); #region 添加输送机、穿梭车和堆垛机的单击事件 foreach (Control ctrl in this.plAccessorial1.Controls) { if (ctrl.GetType().ToString() == "System.Windows.Forms.Button") { ctrl.Click += new EventHandler(ctrl_Click); } if ((ctrl.GetType().ToString() == "System.Windows.Forms.PictureBox")&&(ctrl.Enabled==true)) { ctrl.Click += new EventHandler(ctrl_ClickPic); } } foreach (Control ctrl in this.plAccessorial2.Controls) { if (ctrl.GetType().ToString() == "System.Windows.Forms.Button") { ctrl.Click += new EventHandler(ctrl_Click); } if ((ctrl.GetType().ToString() == "System.Windows.Forms.PictureBox") && (ctrl.Enabled == true)) { ctrl.Click += new EventHandler(ctrl_ClickPic); } if (ctrl.GetType().ToString() == "System.Windows.Forms.GroupBox") { foreach (Control ct in ctrl.Controls) { if (ct.GetType().ToString() == "System.Windows.Forms.TextBox") { ct.Click += new EventHandler(ctrl_ClickTxt); } } } } #endregion } private void ctrl_Click(object sender, EventArgs e) { Button btn = (Button)sender; _deviceStatus.DeviceIndex = Convert.ToInt32(btn.Tag); _deviceStatus.ShowDialog(); } private void ctrl_ClickTxt(object sender, EventArgs e) { TextBox txt = (TextBox)sender; _worstation.DeviceIndex = Convert.ToInt32(txt.Tag); _worstation.ShowDialog(); } private void ctrl_ClickPic(object sender, EventArgs e) { PictureBox btn = (PictureBox)sender; _deviceStatus.DeviceIndex = Convert.ToInt32(btn.Tag ); _deviceStatus.ShowDialog(); } private void timer1_Tick(object sender, EventArgs e) { if (CStaticClass.Order == true) { gs.GetDeviceState(); if (tsStatus.Text.Length > 300) tsStatus.Text = ""; } } private void TSMrefresh_Click(object sender, EventArgs e) { sql.Remove(0, sql.Length); sql.Append("select * from V_Manage_Task where " ).Append( CStaticClass.Manstatus); CStaticClass.RealRefresh = true; this.dgvManager.DataSource = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; } private void TSMMonitorRefresh_Click(object sender, EventArgs e) { sql.Remove(0, sql.Length); sql.Append("select * from V_Monitor_Task where " ).Append( CStaticClass.Monstatus ).Append( " order by 设备指令索引 asc "); CStaticClass.RealRefresh = true; this.dgvMonitor.DataSource = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; } private void rbmanAll_CheckedChanged(object sender, EventArgs e) { RadioButton rb = (RadioButton)sender; if (rb.Checked == true) { CStaticClass.Manstatus = " F_Status<>-1 "; } TSMrefresh_Click(sender, e); } private void rbmanRun_CheckedChanged(object sender, EventArgs e) { RadioButton rb = (RadioButton)sender; if (rb.Checked == true) { CStaticClass.Manstatus = " F_Status=1 "; } TSMrefresh_Click(sender, e); } private void rbmanWait_CheckedChanged(object sender, EventArgs e) { RadioButton rb = (RadioButton)sender; if (rb.Checked == true) { CStaticClass.Manstatus = " F_Status=0 "; } TSMrefresh_Click(sender, e); } private void rbmonAll_CheckedChanged(object sender, EventArgs e) { RadioButton rb = (RadioButton)sender; if (rb.Checked == true) { CStaticClass.Monstatus = " F_Status<>-1 "; } TSMMonitorRefresh_Click(sender, e); } private void rbmonRun_CheckedChanged(object sender, EventArgs e) { RadioButton rb = (RadioButton)sender; if (rb.Checked == true) { CStaticClass.Monstatus = " (F_Status>=1) "; } TSMMonitorRefresh_Click(sender, e); } private void rbmonWait_CheckedChanged(object sender, EventArgs e) { RadioButton rb = (RadioButton)sender; if (rb.Checked == true) { CStaticClass.Monstatus = " F_Status=0 "; } TSMMonitorRefresh_Click(sender, e); } private void button2_Click(object sender, EventArgs e) { CStaticClass.Monstatus = " F_Status<>-1 "; TSMMonitorRefresh_Click(sender, e); } private void button1_Click(object sender, EventArgs e) { try { if (this.textBox1.Text.Trim().Length == 0) return; if (this.comboBox1.Text == "托盘条码") { CStaticClass.Monstatus = " 附加信息='" + this.textBox1.Text.Trim() + "' "; } if (this.comboBox1.Text == "调度任务索引") { CStaticClass.Monstatus = " 调度任务索引='" + this.textBox1.Text.Trim() + "' "; } if (this.comboBox1.Text == "设备指令索引") { CStaticClass.Monstatus = " 设备指令索引='" + this.textBox1.Text.Trim() + "' "; } TSMMonitorRefresh_Click(sender, e); } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void dgvMonitor_DataSourceChanged(object sender, EventArgs e) { dgvMonitor.Columns["F_Status"].Visible = false; } private void dgvManager_DataSourceChanged(object sender, EventArgs e) { dgvManager.Columns["F_Status"].Visible = false; } private void timer2_Tick(object sender, EventArgs e) { //DataTable dt; string ss1; try { if ((CStaticClass.RealRefresh == true) && (CStaticClass.Order == true)) { //if ((CStaticClass.gcCount % 10) == 0) //{ // #region 故障信息显示 // ss1 = DateTime.Now.Second.ToString() + "-" + DateTime.Now.Millisecond.ToString(); // string sql = "SELECT 调度任务索引,设备索引, 设备名称, 故障名称, 发生时间 FROM V_Device_Error_log where 发生时间 like '" + DateTime.Today.ToString("yyyy-MM-dd") + "%' order by 发生时间 asc"; // //20091128 // dt = dbo1.ExceSQL(sql).Tables[0]; // if (dt.Rows.Count > 0) // { // this.listView1.Items.Clear(); // for (int i = 0; i < dt.Rows.Count; i++) // { // ListViewItem lvi = new ListViewItem(); // lvi.Text = dt.Rows[i]["调度任务索引"].ToString(); // lvi.SubItems.Add(dt.Rows[i]["设备索引"].ToString()); // lvi.SubItems.Add(dt.Rows[i]["设备名称"].ToString()); // lvi.SubItems.Add(dt.Rows[i]["故障名称"].ToString()); // lvi.SubItems.Add(dt.Rows[i]["发生时间"].ToString()); // listView1.Items.Add(lvi); // //20091128 // lvi = null; // } // } // #endregion //} //显示设备指令20110222 //sql.Remove(0, sql.Length); //sql.Append("select * from V_Monitor_Task where " ).Append( CStaticClass.Monstatus ).Append( " order by 设备指令索引 asc "); //FrmControlMonitor.FormInstance.MonitorRefresh(dbo1.ExceSQL(sql.ToString()).Tables[0].DefaultView); ////显示调度任务 //sql.Remove(0, sql.Length); //sql.Append("select * from V_Manage_Task where " ).Append( CStaticClass.Manstatus); //FrmControlMonitor.FormInstance.ManagerRefresh( // dbo1.ExceSQL(sql.ToString()).Tables[0].DefaultView); } //获取调度任务 if (CStaticClass.ObtainManageTask == true) { if (CObtainTask.GetManagerTask() == 0) { this.tsStatus.ForeColor = Color.Red; if (this.tsStatus.Text.IndexOf(CObtainTask.CObtainTaskError) < 0) { this.tsStatus.Text += CObtainTask.CObtainTaskError; } } if (CObtainTask.CObtainTaskError.Length > 0) { if (this.tsStatus.Text.IndexOf(CObtainTask.CObtainTaskError) < 0) { this.tsStatus.ForeColor = Color.Red; this.tsStatus.Text += CObtainTask.CObtainTaskError; } } CObtainTask.CObtainTaskError = ""; } } catch (Exception ex) { if (tsStatus.Text.IndexOf("获取调度任务时:" + ex.Message) < 0) { tsStatus.Text += "获取调度任务时:" + ex.Message; } } finally { //dt = null; } } private void timer3_Tick(object sender, EventArgs e) { if (CStaticClass.Order == true) { //启动拆分进程MyTaskIntoSteps(); CDisassembleTask.MyTaskIntoSteps(); if (CDisassembleTask .DisassembleTaskError!= "") { if (tsStatus.Text.IndexOf(CDisassembleTask.DisassembleTaskError) < 0) { tsStatus.ForeColor = Color.Red; tsStatus.Text += CDisassembleTask.DisassembleTaskError; } CDisassembleTask.DisassembleTaskError = ""; } cplc.DealwithPLCAsk(); if (cplc.ListenPLCAskError != "") { if (tsStatus.Text.IndexOf(cplc.ListenPLCAskError) < 0) { tsStatus.ForeColor = Color.Red; tsStatus.Text += cplc.ListenPLCAskError; } } cplc.ListenPLCAskError = ""; if (CListenAGVState.TcpServerError != "") { if (tsStatus.Text.IndexOf(CListenAGVState.TcpServerError) < 0) { tsStatus.ForeColor = Color.Red; tsStatus.Text += CListenAGVState.TcpServerError; } } CListenAGVState.TcpServerError = ""; } } private void timer4_Tick(object sender, EventArgs e) { if (CStaticClass.Order == true) { #region 读取所有PLC数据 //string ss1 = DateTime.Now.Second.ToString() + "-" + DateTime.Now.Millisecond.ToString(); CStaticClass.GetAllReturns(); //string ss11 = DateTime.Now.Second.ToString() + "-" + DateTime.Now.Millisecond.ToString(); #endregion } } private void timer5_Tick(object sender, EventArgs e) { if (CStaticClass.Order == true) { //string ss1 = DateTime.Now.Second.ToString() + "-" + DateTime.Now.Millisecond.ToString(); cc.StartOrder(); if (cc.CControlError != "") { if (tsStatus.Text.IndexOf(cc.CControlError) < 0) { tsStatus.ForeColor = Color.Red; tsStatus.Text += cc.CControlError; } } cc.CControlError = ""; } } private void timerFlash_Tick(object sender, EventArgs e) { //20100108 DataView dvh; //Model.MDevice device = null; try { if (CStaticClass.Order == true) { Panel pp = plAccessorial1; PictureBox stack1 = bt11001; PictureBox stack2 = bt11002; TextBox tw11 = t11001; TextBox tw21 = t11002; PictureBox stack3 = bt11003; PictureBox stack4 = bt11004; TextBox tw31 = t11003; TextBox tw41 = t11004; switch(tabControl1.SelectedIndex ) { case 0: pp = plAccessorial1; tw11 = t11001; tw21 = t11002; stack1 = bt11001; stack2 = bt11002; tw31 = t11003; tw41 = t11004; stack3 = bt11003; stack4 = bt11004; break; case 1: pp = plAccessorial2; break; } #region 每层楼监视画面 foreach (Control ctrl in pp.Controls) { if (((ctrl.GetType().ToString() == "System.Windows.Forms.Button") || (ctrl.GetType().ToString() == "System.Windows.Forms.PictureBox")) && (ctrl.Enabled == true)) { device = Model.CGetInfo.GetDeviceInfo(Convert.ToInt32(ctrl.Tag)); if (device == null) {//20100108 if (tsStatus.Text.IndexOf("设备索引:" + ctrl.Tag + "在数据库没有记录!") < 0) { tsStatus.ForeColor = Color.Red; this.tsStatus.Text += "设备索引:" + ctrl.Tag + "在数据库没有记录!"; } continue; } #region 设置设备状态 switch (device.RunState) { //空闲 case 0: if (device.DeviceKind == 1 || device.DeviceKind == 4) { ctrl.BackColor = Color.MediumOrchid; } else { if (device.DeviceKind != 18) { ctrl.BackColor = SystemColors.InactiveCaptionText; } } break; //运行 case 1: ctrl.BackColor = Color.Lime; break; //故障 case 2: ctrl.BackColor = Color.Red; break; //离线 case 3: ctrl.BackColor = Color.LightYellow; break; //停用 case 4: ctrl.BackColor = Color.Maroon; break; //20090920动作完成 case 5: if (device.DeviceKind == 1 || device.DeviceKind == 4) { ctrl.BackColor = Color.MediumSlateBlue;//MediumOrchid; } else { if (device.DeviceKind != 18) { ctrl.BackColor = Color.Gray; } } break; } #endregion #region 移动设备坐标更新 //堆垛机 if (device.DeviceKind == 1) { switch (device.DeviceIndex) { case 11001: stack1.Location = new Point((int)(233+18.02 * (device.XCoor - 1)), stack1.Location.Y); tw11.Location = new Point(stack1.Location.X + 6, tw11.Location.Y); break; case 11002: stack2.Location = new Point((int)(233+18.02 * (device.XCoor - 1)), stack2.Location.Y); tw21.Location = new Point(stack2.Location.X + 6, tw21.Location.Y); break; case 11003: stack3.Location = new Point((int)(233 + 18.02 * (device.XCoor - 1)), stack3.Location.Y); tw31.Location = new Point(stack3.Location.X + 6, tw31.Location.Y); break; case 11004: stack4.Location = new Point((int)(233 + 18.02 * (device.XCoor - 1)), stack4.Location.Y); tw41.Location = new Point(stack4.Location.X + 6, tw41.Location.Y); break; } } #endregion } else if ((ctrl.GetType().ToString() == "System.Windows.Forms.TextBox") || ((ctrl.GetType().ToString() == "System.Windows.Forms.PictureBox") && (ctrl.Name.Substring(0, 1) == "t"))) { #region 货物探测20101118 DS = ctrl.Tag.ToString().Split(dd); int devicebyte = 0; int devbit = 0; int.TryParse(DS[0], out devicebyte); int.TryParse(DS[1], out devbit); ctrl.Visible = CStaticClass.GetDevicePhotoelectric(devicebyte,devbit) == 1 ? true : false; #endregion } #region 逻辑有物显示 else if (ctrl.GetType().ToString() == "System.Windows.Forms.RadioButton") { //20100108DataView dvh; dvh = dbo.ExceSQL("SELECT F_DeviceIndex FROM T_Base_Device WHERE (F_DeviceIndex = " + ctrl.Tag + ") AND (F_HaveGoods = 1)").Tables[0].DefaultView; if (dvh.Count > 0) { ctrl.Visible = true; ctrl.BackColor = Color.Blue; } else { ctrl.Visible = false; } } #endregion } #endregion } } catch (Exception ex) {//20100108 if (tsStatus.Text.IndexOf("刷新界面动画时:" + ex.Message) < 0) { tsStatus.ForeColor = Color.Red; this.tsStatus.Text += "刷新界面动画时:" + ex.Message; } } finally {//20100108 dvh = null; device = null; } } private void tabPage1_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; g.TranslateTransform(this.tabPage1.AutoScrollPosition.X, this.tabPage1.AutoScrollPosition.Y); //20100108 g.Dispose(); } private void dgvMonitor_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) { foreach (DataGridViewRow DGVRow in this.dgvMonitor.Rows) { if (DGVRow != null) { if (Convert.ToInt32(DGVRow.Cells["f_status"].Value) >= 30) { DGVRow.DefaultCellStyle.BackColor = Color.Red; } } } } private void timerCamera_Tick(object sender, EventArgs e) { //20100108控制摄像头解除当前区域报警 //摄像头设备类型29;每个设备的F_LocalPort代表摄像头设备索引;F_RemotePort代表摄像头划分的区域值(1--12) //检查F_LocalPort代表摄像头设备索引的区域F_RemotePort内的所有设备都没有报警就置F_LockedState=0 if (CStaticClass.Order == false) return; DataView dv; DataView dv1; DataView dvs; try { dv = dbo.ExceSQL("select F_DeviceIndex,F_LockedState from T_Base_Device where F_DeviceKindIndex=29 and F_LockedState>0").Tables[0].DefaultView; for (int i = 0; i < dv.Count; i++) { if (dv[i]["F_LockedState"] != DBNull.Value) {//有设备索引锁住摄像头 dv1 = dbo.ExceSQL("SELECT F_RemotePort FROM T_Base_Device WHERE F_DeviceIndex=" + dv[i]["F_LockedState"] + "").Tables[0].DefaultView; if (dv1.Count > 0) { //检查F_LocalPort摄像头设备索引的F_RemotePort区域内的所有设备都没有报警就置F_LockedState=0 dvs = dbo.ExceSQL("SELECT SUM(F_ErrorCode) AS errs FROM T_Base_Device WHERE (F_LocalPort = " + dv[i]["F_DeviceIndex"] + " and F_RemotePort=" + dv1[0]["F_RemotePort"] + ") ").Tables[0].DefaultView; if (dvs[0]["errs"] != DBNull.Value) { if (Convert.ToInt32(dvs[0]["errs"]) <= 0) { #region 控制摄像头解除当前区域报警 dbo.ExceSQL("update T_Base_Device set F_LockedState=0 where F_DeviceIndex=" + dv[i]["F_DeviceIndex"] + " and F_LockedState>0"); #endregion } } } } } } catch (Exception ex) { if (tsStatus.Text.IndexOf(ex.Message) < 0) { tsStatus.Text += ex.Message; } } finally { dv = null; dvs = null; dv1 = null; } } private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { try { string df = ""; switch (this.comboBox1.Text) { case "托盘条码": df = "附加信息"; break; case "调度任务索引": df = "调度任务索引"; break; case "设备指令索引": df = "设备指令索引"; break; default: return; } //20100208 sql.Remove(0, sql.Length); sql.Append("select distinct " + df + " from V_Monitor_Task "); DataView dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { this.textBox1.DataSource = null; this.textBox1.DisplayMember = df; this.textBox1.ValueMember = df; this.textBox1.DataSource = dv; } } catch (Exception ex) { throw ex; } } private void timerListenSerialPort_Tick(object sender, EventArgs e) {//20100609监听状态是大于0的串口设备 DataView dv,dvlane; int devindex = 0, byteRead = 0; byte[] GetBytes; int TaskIdx = 0; int mti =0; int mtikind=0; try { sql.Remove(0, sql.Length); sql.Append("SELECT T_Base_Device.F_DeviceIndex,T_Monitor_Task.F_MonitorIndex FROM T_Base_Device,T_Monitor_Task where (T_Base_Device.F_DeviceIndex = T_Monitor_Task.F_DeviceIndex) and (T_Monitor_Task.F_Status > 0) AND (T_Base_Device.F_SerialPort > 0)"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; for (int i = 0; i < dv.Count; i++) { devindex = Convert.ToInt32(dv[i]["F_DeviceIndex"]); if (CStaticClass.serialports[devindex].IsOpen == false) { CStaticClass.serialports[devindex].Open(); } byteRead = CStaticClass.serialports[devindex].BytesToRead; if (byteRead >= 8) { GetBytes = new byte[byteRead]; CStaticClass.serialports[devindex].Read(GetBytes, 0, byteRead); if ((byteRead == 8) && (GetBytes[1] == 240) && (GetBytes[6] == 170))//PLC执行PC命令的应答帧,PC认为任务开始运行 { TaskIdx =Convert.ToInt32( (GetBytes[3] * Math.Pow(2, 8) + GetBytes[4])); mti = ccf.GetManageTaskIndexfromMonitor(TaskIdx); mtikind = ccf.GetManageTaskKindIndexFromMonitor(TaskIdx); #region 修改调度任务状态 sql.Remove(0, sql.Length); sql.Append("update T_Monitor_Task set F_Status=2 where F_Status=1 and F_MonitorIndex=" + TaskIdx); dbo.ExceSQL(sql.ToString()); #endregion #region 根据任务号和探物情况判断任务执行的位置回写本地管理表 sql.Remove(0, sql.Length); sql.Append("update T_Manage_Task set FCurrentLocation=" ).Append( devindex ).Append( " where F_ManageTaskKindIndex=" ).Append( mtikind ).Append( " and FID=" ).Append( mti ).Append( ""); dbo.ExceSQL(sql.ToString()); //调度任务表也记录当前位置,主要是给输送机链用 sql.Remove(0, sql.Length); sql.Append("update T_Monitor_Task set F_CurrentLocation=" ).Append( devindex ).Append( " where F_MonitorIndex=" ).Append( TaskIdx); dbo.ExceSQL(sql.ToString()); //设备逻辑有物 //20090918给堆垛机送货的输送机逻辑有物解锁F_HaveGoods=0 //20100108 sql.Remove(0, sql.Length); sql.Append("SELECT F_LaneGateDeviceIndex FROM T_Base_Lane_Gate where F_LaneGateDeviceIndex=" ).Append( devindex); dvlane = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dvlane.Count > 0) { sql.Remove(0, sql.Length); sql.Append("update T_Base_Device set F_HaveGoods=0 where F_DeviceIndex=" ).Append( devindex); dbo.ExceSQL(sql.ToString()); } #endregion } else if ((byteRead == 16)&& (GetBytes[1] != 240) && (GetBytes[6] != 170))//PLC主动上报信息帧:完成、故障;PC需要发送应答帧 { TaskIdx = Convert.ToInt32((GetBytes[2] * Math.Pow(2, 8) + GetBytes[3])); mti = ccf.GetManageTaskIndexfromMonitor(TaskIdx); mtikind = ccf.GetManageTaskKindIndexFromMonitor(TaskIdx); if (GetBytes[4] == 1)//完成 { gs.ActionComplete(devindex, TaskIdx, 0); } else if (GetBytes[4]>=30)//故障 { gs.ActionError(devindex, TaskIdx, GetBytes[4]); } byte [] _Senddata=new byte[8]; _Senddata[0] = 8; _Senddata[1] = 240; _Senddata[2] = GetBytes[1]; _Senddata[3] = Convert.ToByte(TaskIdx >> 8); _Senddata[4] = Convert.ToByte(TaskIdx & 255); _Senddata[5] = 0;//Convert.ToByte(devindex); _Senddata[6] = 170; byte SXor = _Senddata[0]; for (int k = 1; k <= 6; k++) { SXor = Convert.ToByte(Convert.ToInt16(SXor) ^ Convert.ToInt16(_Senddata[k])); } _Senddata[7] = SXor; CStaticClass.serialports[devindex].Write(_Senddata, 0, 8); } } } } catch (Exception ex) { if (tsStatus.Text.IndexOf("监听串口设备" + devindex.ToString() + "时:" + ex.Message) < 0) { tsStatus.Text += "监听串口设备" + devindex.ToString() + "时:" + ex.Message; } } finally { dv = null; GetBytes = null; } } private void tsStatus_TextChanged(object sender, EventArgs e) { if (OPCClient.CCommonOPCClient.OpcError != null)//20101011 { if (OPCClient.CCommonOPCClient.OpcError.IndexOf("同步数据时:OPC Server没连接到PLC,并且超过重复连接次数!请先关闭命令开关,检查通讯线路,确认后重新打开命令开关!") >= 0) { if (tsStatus.Text.IndexOf("同步数据时:OPC Server没连接到PLC,并且超过重复连接次数!请先关闭命令开关,检查通讯线路,确认后重新打开命令开关!") >= 0) { FrmMain.FormInstance.Voice.Speak("同步数据时:OPC Server没连接到PLC,并且超过重复连接次数!请先关闭命令开关,检查通讯线路,确认后重新打开命令开关!", DotNetSAPI.SpeechVoiceSpeakFlags.SVSFlagsAsync); //tsStatus.Text = ""; } } } if (SocketsTCPIP.CClientTCPIP.TcpError != null)//20101011 { if (SocketsTCPIP.CClientTCPIP.TcpError.IndexOf("SocketsTCPIP:连接远程主机时,发生三次连接失败错误!请检查远程主机是否正常运行!重新打开命令开关。") >= 0) { if (tsStatus.Text.IndexOf("SocketsTCPIP:连接远程主机时,发生三次连接失败错误!请检查远程主机是否正常运行!重新打开命令开关。") >= 0) { FrmMain.FormInstance.Voice.Speak("SocketsTCPIP:连接远程主机时,发生三次连接失败错误!请检查远程主机是否正常运行!重新打开命令开关。", DotNetSAPI.SpeechVoiceSpeakFlags.SVSFlagsAsync); //tsStatus.Text = ""; } } } if (CParsePLCData.CParsePLCError != null)//20101011 { if (CParsePLCData.CParsePLCError.IndexOf("发生故障:有货无调度任务,请您检查确认!") >= 0) { if (tsStatus.Text.IndexOf("发生故障:有货无调度任务,请您检查确认!") >= 0) { FrmMain.FormInstance.Voice.Speak("组箱区入库输送机发生故障:有货无调度任务,请您检查确认!", DotNetSAPI.SpeechVoiceSpeakFlags.SVSFlagsAsync); //tsStatus.Text = ""; } } } } private void FrmControlMonitor_Resize(object sender, EventArgs e) { if (this.WindowState == FormWindowState.Maximized) { this.FormBorderStyle = FormBorderStyle.None; } else { this.FormBorderStyle = FormBorderStyle.Sizable; } } private void ReApplyTask_Click(object sender, EventArgs e) {//20110331 try { LinkLabel bt = (LinkLabel)sender; int devBind = Convert.ToInt32(bt.Tag); device = Model.CGetInfo.GetDeviceInfo(devBind);//20110331 if (CStaticClass.GetDevicePhotoelectric(device.SendOutDetect) != 1) return;//20110331 DataView dv = dbo.ExceSQL(string.Format("SELECT F_DeviceIndex, F_BarCode FROM T_Base_PLC_Ask WHERE (F_BarCode<>'-') and (F_BindingDevice = {0})", devBind)).Tables[0].DefaultView; if (dv.Count > 0) { cplc.clientApp.ManageStockCreateApplyAsync(dv[0]["F_BarCode"].ToString(), dv[0]["F_DeviceIndex"].ToString()); } } catch (Exception ex) { tsStatus.Text = "重新申请任务时:" + ex.Message; } } private void HandleCompelte_Click(object sender, EventArgs e) {//20110412 try { LinkLabel bt = (LinkLabel)sender; int deviceindex = Convert.ToInt32(bt.Tag); string barcode = string.Empty; if (CStaticClass.GetDevicePhotoelectric(deviceindex.ToString() + ".0") != 1) return;//20110331叠盘机无物 sql.Remove(0, sql.Length); sql.Append("SELECT T_Base_PLC_Ask.F_DeviceIndex,T_Base_PLC_Ask.F_BindingDevice, F_Askkind,F_TaskIndex,F_BarCode,F_Remark").Append( ",F_FirstProject,F_BoxBarcode,F_TempFirstProject FROM T_Base_Device,T_Base_PLC_Ask").Append( " where T_Base_Device.F_DeviceIndex=T_Base_PLC_Ask.F_DeviceIndex and F_BarCode<>'-' and T_Base_PLC_Ask.F_DeviceIndex=").Append(deviceindex).Append( " order by T_Base_Device.F_DeviceIndex desc"); DataView dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { barcode = dv[0]["F_BarCode"].ToString(); sql.Remove(0, sql.Length); sql.Append("SELECT T_Base_PLC_Ask.F_DeviceIndex,T_Base_PLC_Ask.F_BindingDevice, F_Askkind,F_TaskIndex,F_BarCode,F_Remark").Append( ",F_FirstProject,F_BoxBarcode,F_TempFirstProject FROM T_Base_Device,T_Base_PLC_Ask").Append( " where T_Base_Device.F_DeviceIndex=T_Base_PLC_Ask.F_DeviceIndex and T_Base_PLC_Ask.F_Remark=").Append(deviceindex).Append( " order by T_Base_Device.F_DeviceIndex desc"); dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dv.Count > 0) { int i = 0; //20110505一楼叠盘机下达命令到叠盘机14001 int dcode = Convert.ToInt32(dv[i]["F_BindingDevice"]); int dpjcode = 0; if (deviceindex == 14001) { dpjcode = 14001; } else { dpjcode = Convert.ToInt32(dv[i]["F_BoxBarcode"]); } StringBuilder dtime = new StringBuilder(DateTime.Now.ToString("u")); dtime.Remove(dtime.Length - 1, 1); int hidx = ccf.GetTempManageIdx(); int hmindx = ccf.GetMonitorIndex(hidx, 2); string ah = string.Format("D-{0}.0;D{1}.0;I{0};I{1}", dv[i]["F_Remark"].ToString(), dv[i]["F_BoxBarcode"].ToString()); sql.Remove(0, sql.Length); sql.Append("insert into T_Monitor_Task(F_MonitorTaskLevel,F_RouteID,F_ManageTaskIndex,F_ManageTaskKindIndex,F_MonitorIndex,"). Append("F_DeviceIndex,F_DeviceCommandIndex,F_UseAwayFork,F_AheadDetect,F_RunningLock,F_TxtParam) "). Append("values(2,").Append(GetRouteIDsub(Convert.ToInt32(dv[i]["F_BoxBarcode"]))).Append(",").Append(hidx).Append(",2,").Append(hmindx).Append(",").Append(dpjcode). Append(",8,'-','").Append(ah).Append("','").Append(dcode.ToString()).Append("','").Append(barcode).Append("')"); dbo.ExecuteSql(sql.ToString()); sql.Remove(0, sql.Length); sql.Append("update T_Base_device set F_LockedState=").Append(hmindx).Append( " where F_DeviceIndex=").Append(dcode); dbo.ExecuteSql(sql.ToString()); sql.Remove(0, sql.Length); sql.Append("insert into T_Manage_Task(FID,FPALLETBARCODE,FCONTROLTASKTYPE,F_ManageTaskKindIndex,FSTARTWAREHOUSE,FSTARTDEVICE,FSTARTCELL,"). Append("FENDWAREHOUSE,FENDDEVICE,FENDCELL,FLANEWAY,FSTACK,FUseAwayFork,FBEGTIME,FIntoStepOK) "). Append("values(").Append(hidx).Append(",'").Append(barcode).Append("',1,2,'").Append(ccf.GetWarehouseIndex()).Append("','").Append(Convert.ToInt32(dv[i]["F_BoxBarcode"])).Append("','-','").Append(ccf.GetWarehouseIndex()).Append("','" ).Append(dv[i]["F_TempFirstProject"]).Append("','-',0,0,'-','").Append(dtime).Append("','1')"); dbo.ExecuteSql(sql.ToString()); cplc.client.ManageStockCreateCompleteAsync(dv[i]["F_BoxBarcode"].ToString(),barcode); } dbo.ExecuteSql(string.Format("UPDATE T_Base_PLC_Ask SET F_BarCode = '-' WHERE (F_DeviceIndex = {0})", deviceindex)); CommonClassLib.CCarryConvert.WriteDarkCasket("OPCClient", "人工强制叠盘完成", deviceindex.ToString(), barcode); FrmControlMonitor.FormInstance.MonitorRefresh();//20110222 FrmControlMonitor.FormInstance.ManagerRefresh();//20110222 } } catch(Exception ex) { tsStatus.Text = "强制叠盘完成时:" + ex.Message; } } int GetRouteIDsub(int device) {//20110412 DataView dv = dbo.ExceSQL("SELECT F_RouteIDSub, F_DeviceIndex, F_RouteID FROM T_Base_Route_Device where F_DeviceIndex=" + device + "").Tables[0].DefaultView; if (dv.Count > 0) { return Convert.ToInt32(dv[0]["F_RouteIDSub"]); } else { return -1; } } private void linkLabel3_Click(object sender, EventArgs e) { if (CStaticClass.GetDevicePhotoelectric(12030, 0) == 1) { if (MessageBox.Show("您确认12030没扫到条码,需要人工检查吗?", "操作提示:", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) != DialogResult.OK) { return; } string dtime = DateTime.Now.ToString("u");//20101028 dtime = dtime.Substring(0, dtime.Length - 1);//20101028 int AutoManageIdx = ccf.GetTempManageIdx(); string Sql = "insert into T_Manage_Task(FID,FPALLETBARCODE,FCONTROLTASKTYPE,F_ManageTaskKindIndex,FSTARTWAREHOUSE,FSTARTDEVICE,FSTARTCELL," + "FENDWAREHOUSE,FENDDEVICE,FENDCELL,FLANEWAY,FSTACK,FUseAwayFork,FBEGTIME) " + "values(" + AutoManageIdx + ",'0000000000','3',2,'" + ccf.GetWarehouseIndex() + "','12030','-','" + ccf.GetWarehouseIndex() + "','12032','-',0,0,'-','" + dtime + "')";//20101028 dbo.ExceSQL(Sql); FrmControlMonitor.FormInstance.ManagerRefresh();//20110222 } } } }