using System; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net; using CommonLib; using System.Speech.Synthesis; using System.ServiceModel; using System.Collections.Generic; using System.Collections; namespace wcfControlMonitorClient { public partial class FrmClient : Form, WcfControlMonitor.IControlMonitorCallback { //protected override CreateParams CreateParams //{ // get // { // CreateParams cp = base.CreateParams; // cp.ExStyle |= 0x02000000;//WS_CLIPCHILDREN 两个窗体叠加时,重叠部分不重绘 // return cp; // } //} int timersum = 0;//20150103增加断网恢复 Model.MDevice devinfo; FrmDeviceStatus _deviceStatus = new FrmDeviceStatus(); FrmWorkstationStatus _worstation = new FrmWorkstationStatus(); StringBuilder sql = new StringBuilder(); DBFactory.DBOperator dbo = CStaticClass.dbo; DBFactory.DBOperator dbo1 = new DBFactory.DBOperator(); string EmStop = "stop11201, stop11202, stop11203, stop11204,11003,11004,11006,11008,11010"; //string[] EmStop = new string[40] { "stop15401", "stop15402", "stop15403", "stop11201", "stop11202", "stop11203", "stop11204", "stop11205", "stop11206", "stop11207" }; //SpeechVoiceSpeakFlags SpFlags = SpeechVoiceSpeakFlags.SVSFlagsAsync; //public SpVoice Voice = new SpVoice(); private static SpeechSynthesizer speak = new SpeechSynthesizer(); public Model.MDevice[] devlist; public int devsn = 0; private static FrmClient _formInstance; public static FrmClient FormInstance { get { if (_formInstance == null) { _formInstance = new FrmClient(); } return _formInstance; } set { _formInstance = value; } } #region 控件大小随窗体大小等比例缩放 private float x;//定义当前窗体的宽度 private float y;//定义当前窗体的高度 private void setControls_Location_Size(Control cons) { foreach (Control con in cons.Controls) { con.AccessibleName = con.Width + ";" + con.Height + ";" + con.Left + ";" + con.Top + ";" + con.Font.Size; if (con.Controls.Count > 0) { setControls_Location_Size(con); } } } private void setControls(float newx, float newy, Control cons) { //遍历窗体中的控件,重新设置控件的值 foreach (Control con in cons.Controls) { //获取控件的Tag属性值,并分割后存储字符串数组 if (con.AccessibleName != null) { string[] mytag = con.AccessibleName.ToString().Split(new char[] { ';' }); //根据窗体缩放的比例确定控件的值 con.Width = Convert.ToInt32(System.Convert.ToSingle(mytag[0]) * newx);//宽度 con.Height = Convert.ToInt32(System.Convert.ToSingle(mytag[1]) * newy);//高度 con.Left = Convert.ToInt32(System.Convert.ToSingle(mytag[2]) * newx);//左边距 con.Top = Convert.ToInt32(System.Convert.ToSingle(mytag[3]) * newy);//顶边距 //如果不需要字体的缩放可自行注释掉下面两行代码。 Single currentSize = System.Convert.ToSingle(mytag[4]) * newy;//字体大小 con.Font = new Font(con.Font.Name, currentSize, con.Font.Style, con.Font.Unit); if (con.Controls.Count > 0) { setControls(newx, newy, con); } } } } private void FrmClient_Resize(object sender, EventArgs e) { float newx = (this.Width) / x; float newy = (this.Height) / y; setControls(newx, newy, this); } //禁止通过拖动,双击标题栏改变窗体大小。 public const int WM_NCLBUTTONDBLCLK = 0xA3; const int WM_NCLBUTTONDOWN = 0x00A1; const int HTCAPTION = 2; protected override void WndProc(ref Message m) { if (m.Msg == WM_NCLBUTTONDOWN && m.WParam.ToInt32() == HTCAPTION) return; if (m.Msg == WM_NCLBUTTONDBLCLK) return; base.WndProc(ref m); } #endregion public FrmClient() { CommonClassLib.CCarryConvert.WriteDarkCasket("Login", "操作日志", "FrmClient()", "", ""); InitializeComponent(); x = this.Width; y = this.Height; setControls_Location_Size(this); try { //初始化管理和调度交互状态 Model.CGetInfo.AddIOControlStatus(); Model.CGetInfo.AddDeviceKindInfo(); Model.CGetInfo.AddDeviceInfo(); Model.CGetInfo.AddDeviceErrors(); devlist = Model.CGetInfo.DeviceInfo.Values.ToArray(); DataView dv0 = dbo.ExceSQL("SELECT distinct F_S7Connection,F_DBWGetLength FROM T_Base_Device WHERE (F_DeviceKindIndex = 28)").Tables[0].DefaultView; if (dv0.Count > 0) { for (int i = 0; i < dv0.Count; i++) { if (CStaticClass.MutiS7ConnReturns.ContainsKey(dv0[i]["F_S7Connection"].ToString()) == false) { CStaticClass.MutiS7ConnReturns.Add(dv0[i]["F_S7Connection"].ToString(), new int[Convert.ToInt32(dv0[i]["F_DBWGetLength"])]); } } } CStaticClass.SystemName = CommonClassLib.AppSettings.GetValue("SystemName"); this.notifyIcon1.Text = CStaticClass.SystemName; this.Text = CStaticClass.SystemName; OPCClient.CCommonOPCClient.Hostname = CommonClassLib.AppSettings.GetValue("HostName"); OPCClient.CCommonOPCClient.ProgID = CommonClassLib.AppSettings.GetValue("OPCProgID"); #region 客户端订阅初始化20120428 DataView dvx; DataView dv = dbo.ExceSQL("SELECT F_ReadSubscription, F_DeviceIndex, F_DBW2Address, F_DBWGetLength, F_S7Connection, F_SplitByte FROM T_Base_Device WHERE (F_ReadSubscription IS NOT NULL) AND (F_ReadSubscription =F_DeviceIndex) ORDER BY F_ReadSubscription").Tables[0].DefaultView; for (int i = 0; i < dv.Count; i++) { dvx = dbo.ExceSQL(string.Format("SELECT (MAX(F_DBW2Address) + F_DBWGetLength) AS maxdbw2 FROM T_Base_Device WHERE (F_ReadSubscription = '{0}') AND (F_DeviceKindIndex <> 33) GROUP BY F_DBWGetLength ORDER BY maxdbw2 DESC", dv[i]["F_ReadSubscription"])).Tables[0].DefaultView; if (dvx.Count > 0) { if (CStaticClass.MutiReadSubscriptionDeviceStateReturns.ContainsKey(dv[i]["F_ReadSubscription"].ToString()) == false) { CStaticClass.MutiReadSubscriptionDeviceStateReturns.Add(dv[i]["F_ReadSubscription"].ToString(), new int[Convert.ToInt32(dvx[0]["maxdbw2"]) - Convert.ToInt32(dv[i]["F_DBW2Address"])]); } } } dv = dbo.ExceSQL("SELECT F_ReadSubscription, F_DeviceIndex, F_DBW2Address, F_DBWGetLength, F_S7Connection, F_SplitByte FROM T_Base_Device WHERE (F_ReadSubscription IS NOT NULL) AND (F_DeviceKindIndex=33) ORDER BY F_ReadSubscription").Tables[0].DefaultView; for (int i = 0; i < dv.Count; i++) { if (CStaticClass.MutiReadSubscriptionDeviceSplitReturns.ContainsKey(dv[i]["F_ReadSubscription"].ToString()) == false) { CStaticClass.MutiReadSubscriptionDeviceSplitReturns.Add(dv[i]["F_ReadSubscription"].ToString(), new int[Convert.ToInt32(dv[i]["F_DBWGetLength"])]); } } CommonClassLib.CCarryConvert.WriteDarkCasket("Login", "操作日志", "FrmClient()-准备CreateSubscriptionGroup", "", ""); OPCClient.CCommonOPCClient.CreateSubscriptionGroup(); CommonClassLib.CCarryConvert.WriteDarkCasket("Login", "操作日志", "FrmClient()-CreateSubscriptionGroup", "", ""); OPCClient.CCommonOPCClient.UpdateDB += new CUpdateDBEventHandler(CCommon_UpdateDB); if (OPCClient.CCommonOPCClient.OpcError != null) { MessageBox.Show(OPCClient.CCommonOPCClient.OpcError); } } catch (Exception ex) { CommonClassLib.CCarryConvert.WriteDarkCasket("Login", "操作日志", "FrmClient()-catch", ex.StackTrace, ex.Message); throw ex; } #endregion } /// /// 客户端事件响应20120428 /// /// /// void CCommon_UpdateDB(object sender, CUpdateDBChangeEventArgs e) { if (CStaticClass.WCFOK == true && !CStaticClass.client.IsDisposed) { string errtext = string.Empty; this.BeginInvoke(new MethodInvoker(delegate() { DealWithDeviceState(out errtext, e.Deviceindex, e.SplitbyteValue, e.Devicestates); })); } } /// /// 客户端事件响应处理函数20120428 /// /// /// /// /// /// bool DealWithDeviceState(out string errtext, int deviceindex, byte[] splitbyteValue, byte[] devicestates) {//deviceindex设备组代表的订阅,首先把设备组按照F_DBW2Address由小到大排序,拆分到具体每个设备 if ((devicestates == null))//(splitbyteValue == null) && {//20120420 errtext = OPCClient.CCommonOPCClient.OpcError; SendMessage(string.Format("tsStatus@FrmClient.DealWithDeviceState时,订阅组:{0}发生异常,{1}!", deviceindex, errtext)); return false; } errtext = string.Empty; DataView dv = new DataView(); DataView dvsp = new DataView(); DataView dvbc = new DataView(); int devicebegin = 0; int DBW2Addressbegin = 0; string S7Connection = string.Empty; int SplitByteLength = 0; try { //StringBuilder sql = new StringBuilder(string.Format("SELECT F_DeviceIndex, F_DBW2Address, F_DBWGetLength, F_SplitByte,F_S7Connection FROM T_Base_Device WHERE (F_DeviceKindIndex <>33) AND (F_ReadSubscription = '{0}') AND (F_DBW2Address IS NOT NULL) ORDER BY F_DBW2Address", deviceindex)); //dv = dbo1.ExceSQL(sql.ToString()).Tables[0].DefaultView; //if (dv.Count > 0) //{ // devicebegin = Convert.ToInt32(dv[0]["F_DeviceIndex"]); // DBW2Addressbegin = Convert.ToInt32(dv[0]["F_DBW2Address"]); // //SplitBytebegin = Convert.ToInt32(dv[0]["F_SplitByte"]); // S7Connection = dv[0]["F_S7Connection"].ToString(); // sql = new StringBuilder(string.Format("SELECT F_DeviceIndex, F_DBW2Address, F_DBWGetLength, F_SplitByte,F_S7Connection FROM T_Base_Device WHERE (F_DeviceKindIndex =33) AND (F_ReadSubscription = '{0}') ORDER BY F_DBW2Address", deviceindex)); // dvsp = dbo1.ExceSQL(sql.ToString()).Tables[0].DefaultView; // if (dvsp.Count > 0) // { // SplitByteLength = Convert.ToInt32(dvsp[0]["F_DBWGetLength"]); // } //} //else //{ // sql = new StringBuilder(string.Format("SELECT F_DeviceIndex, F_DBW2Address, F_DBWGetLength, F_SplitByte,F_S7Connection FROM T_Base_Device WHERE (F_DeviceIndex = '{0}') AND (F_DBW2Address IS NOT NULL) ORDER BY F_DBW2Address", deviceindex)); // dv = dbo1.ExceSQL(sql.ToString()).Tables[0].DefaultView; // if (dv.Count > 0) // { // devicebegin = Convert.ToInt32(dv[0]["F_DeviceIndex"]); // DBW2Addressbegin = Convert.ToInt32(dv[0]["F_DBW2Address"]); // //SplitBytebegin = Convert.ToInt32(dv[0]["F_SplitByte"]); // S7Connection = dv[0]["F_S7Connection"].ToString(); // sql = new StringBuilder(string.Format("SELECT F_DeviceIndex, F_DBW2Address, F_DBWGetLength, F_SplitByte,F_S7Connection FROM T_Base_Device WHERE (F_DeviceKindIndex =33) AND (F_ReadSubscription = '{0}') ORDER BY F_DBW2Address", deviceindex)); // dv = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; // if (dv.Count > 0) // { // SplitByteLength = Convert.ToInt32(dv[0]["F_DBWGetLength"]); // } // } // else // {//20120420 // errtext = string.Format("FrmClient.DealWithDeviceState时,订阅组:{0}对应的设备索引不存在!", deviceindex); // SendMessage(string.Format("tsStatus@FrmClient.DealWithDeviceState时,订阅组:{0}对应的设备索引不存在!", deviceindex)); // return false; // } //} //int tempdb2addr = 0; StringBuilder sss = new StringBuilder(); StringBuilder barcode = new StringBuilder(); if (devicestates != null) { Array.Copy(devicestates, CStaticClass.MutiReadSubscriptionDeviceStateReturns[deviceindex.ToString()], devicestates.Length); //for (int di = 0; di < dv.Count; di++) //{ // int devidx = Convert.ToInt32(dv[di]["F_DeviceIndex"]); // devinfo = Model.CGetInfo.GetDeviceInfo(devidx); // int taskindex= 0; // int state = 0; // //以下代码重新开发CStaticClass.MutiS7ConnReturns改为按照F_ReadSubscription // if (devinfo.Dbw2Getlength>3) // { // tempdb2addr = Convert.ToInt32(dv[di]["F_DBW2Address"]) - DBW2Addressbegin; // taskindex = (devicestates[tempdb2addr + 2] << 8) + devicestates[tempdb2addr + 3]; // if (devinfo.Dbw2Getlength > 1) // { // state = devicestates[tempdb2addr + 1]; // } // } // int devkind = devinfo.DeviceKind; // if (state >= 30) // { // devinfo.ErrorCode = state; // devinfo.RunState = 2; // } // else // {//0,1,2 // if (state == 2) // { // devinfo.RunState = 5; // } // else // { // devinfo.RunState = state; // } // devinfo.ErrorCode = state; // } // if (devkind == 13 && devinfo.UnControl != "1") // {//richard.liu20230718鸿安环穿0-1是心跳单独订阅;2是可下任务状态0:不可下命令,1:可下命令 // state = devicestates[tempdb2addr + 1] == 0 ? 1 : 0;//可下任务状态 // taskindex = (devicestates[tempdb2addr + 2] << 8) + devicestates[tempdb2addr + 3]; // } // devinfo.TaskNo = taskindex; // int sn = 4;//输送机光电开关位移 // if ((devinfo.DeviceKind == 1) || (devinfo.DeviceKind == 4) || (devinfo.DeviceKind == 14)) // { // devinfo.XCoor = devicestates[tempdb2addr + 7] + (devicestates[tempdb2addr + 6] << 8) + (devicestates[tempdb2addr + 5] << 16) + (devicestates[tempdb2addr + 4] << 32);//X坐标 // if (devinfo.DeviceKind == 1) // { // sn = 13;//堆垛机光电开关位移 // devinfo.YCoor = devicestates[tempdb2addr + 11] + (devicestates[tempdb2addr + 10] << 8) + (devicestates[tempdb2addr + 9] << 16) + (devicestates[tempdb2addr + 8] << 32);//Y坐标 // devinfo.ZCoor = devicestates[tempdb2addr + 12];//Z相对坐标(1或2\3) // } else // { // sn = 8;//直穿和环穿光电开关位移 // } // } // //设备开关状态 // if (devinfo.Dbw2Getlength >= 3 && devinfo.DeviceKind!=5) // { // devinfo.SplitByte_0 = (devicestates[tempdb2addr + sn] & 1) == 1 ? 1 : 0; // devinfo.SplitByte_1 = (devicestates[tempdb2addr + sn] & 2) == 2 ? 1 : 0; // devinfo.SplitByte_2 = (devicestates[tempdb2addr + sn] & 4) == 4 ? 1 : 0; // devinfo.SplitByte_3 = (devicestates[tempdb2addr + sn] & 8) == 8 ? 1 : 0; // devinfo.SplitByte_4 = (devicestates[tempdb2addr + sn] & 16) == 16 ? 1 : 0; // devinfo.SplitByte_5 = (devicestates[tempdb2addr + sn] & 32) == 32 ? 1 : 0; // devinfo.SplitByte_6 = (devicestates[tempdb2addr + sn] & 64) == 64 ? 1 : 0; // devinfo.SplitByte_7 = (devicestates[tempdb2addr + sn] & 128) == 128 ? 1 : 0; // int a = "123".IndexOf("123"); // } // Model.CGetInfo.SetDeviceInfo(devinfo); //} int devidx = deviceindex; devinfo = Model.CGetInfo.GetDeviceInfo(devidx); int taskindex = 0; int state = 0; //以下代码重新开发CStaticClass.MutiS7ConnReturns改为按照F_ReadSubscription if (devinfo.Dbw2Getlength > 3) { taskindex = (devicestates[2] << 8) + devicestates[ 3]; if (devinfo.Dbw2Getlength > 1) { state = devicestates[ 1]; } } int devkind = devinfo.DeviceKind; if (state >= 30) { devinfo.ErrorCode = state; devinfo.RunState = 2; } else {//0,1,2 if (state == 2) { devinfo.RunState = 5; } else { devinfo.RunState = state; } devinfo.ErrorCode = state; } if (devkind == 13 && devinfo.UnControl != "1") {//richard.liu20230718鸿安环穿0-1是心跳单独订阅;2是可下任务状态0:不可下命令,1:可下命令 state = devicestates[ 1] == 0 ? 1 : 0;//可下任务状态 taskindex = (devicestates[ 2] << 8) + devicestates[ 3]; } devinfo.TaskNo = taskindex; int sn = 4;//输送机光电开关位移 if ((devinfo.DeviceKind == 1) || (devinfo.DeviceKind == 4) || (devinfo.DeviceKind == 14)) { devinfo.XCoor = devicestates[ 7] + (devicestates[ 6] << 8) + (devicestates[ 5] << 16) + (devicestates[ 4] << 32);//X坐标 if (devinfo.DeviceKind == 1) { sn = 13;//堆垛机光电开关位移 devinfo.YCoor = devicestates[11] + (devicestates[10] << 8) + (devicestates[ 9] << 16) + (devicestates[ 8] << 32);//Y坐标 devinfo.ZCoor = devicestates[ 12];//Z相对坐标(1或2\3) } else { sn = 8;//直穿和环穿光电开关位移 } } //设备开关状态 if ((devinfo.Dbw2Getlength >= 5 && devinfo.DeviceKind != 5)||(devinfo.DeviceKind == 5 && devinfo.Dbw2Getlength >= 10)) { devinfo.SplitByte_0 = (devicestates[ sn] & 1) == 1 ? 1 : 0; devinfo.SplitByte_1 = (devicestates[ sn] & 2) == 2 ? 1 : 0; devinfo.SplitByte_2 = (devicestates[ sn] & 4) == 4 ? 1 : 0; devinfo.SplitByte_3 = (devicestates[ sn] & 8) == 8 ? 1 : 0; devinfo.SplitByte_4 = (devicestates[sn] & 16) == 16 ? 1 : 0; devinfo.SplitByte_5 = (devicestates[ sn] & 32) == 32 ? 1 : 0; devinfo.SplitByte_6 = (devicestates[sn] & 64) == 64 ? 1 : 0; devinfo.SplitByte_7 = (devicestates[sn] & 128) == 128 ? 1 : 0; } Model.CGetInfo.SetDeviceInfo(devinfo); } return true; } catch (Exception ex) { SendMessage(string.Format("tsStatus@FrmClient.DealWithDeviceState时{0}", ex.StackTrace+ex.Message)); errtext = string.Format("tsStatus@FrmClient.DealWithDeviceState时{0}", ex.StackTrace + ex.Message); return false; } finally { dv.Dispose(); dvbc.Dispose(); dvsp.Dispose(); } } #region wcf回调 public void SendDeviceInfo(Model.MDevice devinfo) { try { if (CStaticClass.WCFOK == false) return; if (this.IsDisposed) return; Model.CGetInfo.SetDeviceInfo(devinfo); } catch (Exception ex) { throw ex; } } public IAsyncResult BeginSendDeviceInfo(Model.MDevice devinfo, AsyncCallback acb, object state) { return state as IAsyncResult; } public void EndSendDeviceInfo(IAsyncResult ar) { } public IAsyncResult BeginSendMessage(string message, AsyncCallback acb, object state) { return state as IAsyncResult; } public void EndSendMessage(IAsyncResult ar) { } public void SendMessage(string message) { char[] cc = new char[1] { '@' }; string[] strsplit = message.Split(cc); if (strsplit.GetLength(0) > 1) {//更新指定控件 if (strsplit[0] == "tsStatus") { tsStatus.Text = strsplit[1]; } else if (strsplit[0] == "notifyIcon1") { this.BeginInvoke(new MethodInvoker(delegate() { notifyIcon1.BalloonTipText = strsplit[1]; notifyIcon1.ShowBalloonTip(10000, "警告:", strsplit[1],ToolTipIcon.Warning); })); } } //else //{//刷新数据显示 // this.dgvManager.BeginInvoke(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; // })); // this.dgvMonitor.BeginInvoke(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; // })); //} } //20140824richard public void SendOrderMessage(Model.MonitorInfo mi) { this.BeginInvoke(new MethodInvoker(delegate() { try { if (CStaticClass.UserID.ToUpper() == "SA") { CStaticClass.Order = mi.Orderturnon; CStaticClass.ObtainManageTask = mi.Obtaintask; if (CStaticClass.Order == true) { ClickOrderTurnOn(); } else { ClickOrderTurnOff(); } if (CStaticClass.ObtainManageTask == true) { ClickObtainTask(); } else { ClickStopObtainTask(); } } } catch (Exception ex) { if (tsStatus.Text.IndexOf("接收【获取任务和命令开关】广播时:" + ex.Message) < 0) { tsStatus.ForeColor = Color.Red; this.tsStatus.Text += "接收【获取任务和命令开关】广播时:" + ex.Message; } } })); } public IAsyncResult BeginSendOrderMessage(Model.MonitorInfo mi, AsyncCallback callBack, object state) { return state as IAsyncResult; } public void EndSendOrderMessage(IAsyncResult ar) { } //20140824richard #endregion private void Client_FormClosing(object sender, FormClosingEventArgs e) { if (MessageBox.Show("您确认要关闭"+CStaticClass.SystemName+"吗?", "操作提示:", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) != DialogResult.OK) { e.Cancel = true; return; } ClientLogout(); CommonClassLib.AppSettings.dbo.Close();//richard20181022 CommonClassLib.AppSettings.dboM.Close();//richard20181022 OPCClient.CCommonOPCClient.DisConnectOPCServer();//20120428 FrmLogin.FormInstance.Close(); } void LogCallBack(IAsyncResult ar) { try { string strErr = string.Empty; if (CStaticClass.WcfControl.EndLogoutClient(out strErr, ar) == true) { //if (ar.AsyncState.ToString() == "RegisterClientCallBack") //{ // CStaticClass.WcfControl.BeginRegisterClient(CStaticClass.UserID, "客户端:" + CStaticClass.ClientID + ",用户名:" + CStaticClass.UserID, new AsyncCallback(RegisterClientCallBack), null); // return; //} } CStaticClass.WCFOK = false; } catch (Exception ex) { MessageBox.Show(ex.Message, "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Error); } } public void ClientLogout() { try { string errtext = string.Empty; CStaticClass.WcfControl.BeginLogoutClient("客户端:" + CStaticClass.ClientID + ",用户名:" + CStaticClass.UserID,new AsyncCallback(LogCallBack),"" ); } catch (Exception ex) { MessageBox.Show(ex.Message, "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void MIHandCommand_Click(object sender, EventArgs e) { FrmHandCommand.FormInstance.Show(); } private void MIHandAssociateCommand_Click(object sender, EventArgs e) { FrmHandAssociateCommand.FormInstance.Show(); } private void MIAutoCommand_Click(object sender, EventArgs e) { FrmAutoCommand.FormInstance.Show(); } private void MIAltMonitor_Click(object sender, EventArgs e) { FrmModifyMonitor.FormInstance.Show(); } private void MIAltManange_Click(object sender, EventArgs e) { FrmModifyManage.FormInstance.Show(); } private void notifyIcon1_BalloonTipShown(object sender, EventArgs e) { try { //speak.Volume = 100;//设置音量 //speak.Rate = 0;//设置语速 //speak.SetOutputToDefaultAudioDevice(); //speak.SpeakAsync(notifyIcon1.BalloonTipText);//播放内容 speak.SpeakAsync(notifyIcon1.BalloonTipText); } catch { } } private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e) { if (CStaticClass.WCFOK == true) { this.TopMost = true; this.Visible = true; this.TopMost = false; this.WindowState = FormWindowState.Maximized; } } private void tsStatus_TextChanged(object sender, EventArgs e) { } private void TSMrefresh_Click(object sender, EventArgs e) { //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; } 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 "); //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 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) // { // MessageBox.Show(ex.Message); // } //} //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 button2_Click(object sender, EventArgs e) { CStaticClass.Monstatus = " F_Status>=-1 "; TSMMonitorRefresh_Click(sender, e); } public void MonitorRefresh() {//20110222 //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() {//20110222 //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; } void BuildHandTaskCallBack(IAsyncResult ar) { string errtext = string.Empty; if (CStaticClass.WcfControl.EndBuildHandTask(out errtext, ar) == false) { //MessageBox.Show(errtext, "操作提示:", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void Client_Load(object sender, EventArgs e) { try { //for (int i = 0; i <= 1000; i++) //{ // Model.HandTask ht = new Model.HandTask(11001, 1, 0, "0", "00-00-00", "-", 0, 0); // CStaticClass.WcfControl.BeginBuildHandTask(ht, new AsyncCallback(BuildHandTaskCallBack), ht); //} #region 添加输送机、穿梭车和堆垛机的单击事件 foreach (Control ctrl in this.plHW.Controls) { if (ctrl.GetType().ToString() == "System.Windows.Forms.Button") { ctrl.Click += new EventHandler(ctrl_Click); toolTip1.SetToolTip(ctrl, ctrl.Tag.ToString()); } if ((ctrl.GetType().ToString() == "System.Windows.Forms.PictureBox") && (ctrl.Enabled == true)) { if (ctrl.Name.ToString().Contains("stop")) { ctrl.Click += new EventHandler(ctrl_ClickPicStop); ctrl.MouseEnter += new EventHandler(Btn_MouseEnter_Stop); } else { ctrl.Click += new EventHandler(ctrl_ClickPic); } toolTip1.SetToolTip(ctrl, ctrl.Tag.ToString()); } } foreach (Control ctrl in this.plCW.Controls) { if (ctrl.GetType().ToString() == "System.Windows.Forms.Button") { ctrl.Click += new EventHandler(ctrl_Click); toolTip1.SetToolTip(ctrl, ctrl.Tag.ToString()); } if ((ctrl.GetType().ToString() == "System.Windows.Forms.PictureBox") && (ctrl.Enabled == true)) { if (ctrl.Name.ToString().Contains("stop")) { ctrl.Click += new EventHandler(ctrl_ClickPicStop); ctrl.MouseEnter += new EventHandler(Btn_MouseEnter_Stop); } else { ctrl.Click += new EventHandler(ctrl_ClickPic); } toolTip1.SetToolTip(ctrl, ctrl.Tag.ToString()); } } foreach (Control ctrl in this.plZJLL.Controls) { if (ctrl.GetType().ToString() == "System.Windows.Forms.Button") { ctrl.Click += new EventHandler(ctrl_Click); toolTip1.SetToolTip(ctrl, ctrl.Tag.ToString()); } if ((ctrl.GetType().ToString() == "System.Windows.Forms.PictureBox") && (ctrl.Enabled == true)) { if (ctrl.Name.ToString().Contains("stop")) { ctrl.Click += new EventHandler(ctrl_ClickPicStop); ctrl.MouseEnter += new EventHandler(Btn_MouseEnter_Stop); } else { ctrl.Click += new EventHandler(ctrl_ClickPic); } toolTip1.SetToolTip(ctrl, ctrl.Tag.ToString()); } } foreach (Control ctrl in this.plZJCJ.Controls) { if (ctrl.GetType().ToString() == "System.Windows.Forms.Button") { ctrl.Click += new EventHandler(ctrl_Click); toolTip1.SetToolTip(ctrl, ctrl.Tag.ToString()); } if ((ctrl.GetType().ToString() == "System.Windows.Forms.PictureBox") && (ctrl.Enabled == true)) { if (ctrl.Name.ToString().Contains("stop")) { ctrl.Click += new EventHandler(ctrl_ClickPicStop); ctrl.MouseEnter += new EventHandler(Btn_MouseEnter_Stop); } else { ctrl.Click += new EventHandler(ctrl_ClickPic); } toolTip1.SetToolTip(ctrl, ctrl.Tag.ToString()); } } #endregion TSMrefresh_Click(sender, e); TSMMonitorRefresh_Click(sender, e); if (CStaticClass.UserID.ToUpper() == "SA") { this.MMmasterAdmin.Visible = true; } else { this.MMmasterAdmin.Visible = false; } } catch (Exception ex) { throw (ex); } } private void MIDeviceState_Click(object sender, EventArgs e) { FrmDeviceInfoEdit.FormInstance.Show(); } private void MIRouteInfo_Click(object sender, EventArgs e) { FrmRouteEdit.FormInstance.Show(); } private void MIWaitTime_Click(object sender, EventArgs e) { FrmWaitTime.FormInstance.Show(); } private void MIMonitorConnectInfo_Click(object sender, EventArgs e) { FrmConnectDB.FormInstance.ConnectType = "Monitor"; FrmConnectDB.FormInstance.Show(); } private void MIIOStation_Click(object sender, EventArgs e) { FrmIOStation.FormInstance.Show(); } private void timer1_Tick(object sender, EventArgs e) { try { if (CStaticClass.WcfControl != null) { if (CStaticClass.WcfControl.State == CommunicationState.Faulted) { CStaticClass.WCFOK = false; ReConnectAndRegisterClient();//20160115添加断线重连功能 } else { CStaticClass.WcfControl.BeginHeartbeat(new AsyncCallback(CallBackHeartbeat), null); } } } catch (Exception ex) { ReConnectAndRegisterClient();//20160115添加断线重连功能 } if (CStaticClass.WCFOK == false) return; try { CStaticClass.WcfControl.BeginHeartbeat(new AsyncCallback(CallBackHeartbeat), null); } catch (Exception ex) { if (tsStatus.Text.IndexOf("BeginHeartbeat时:" + ex.Message) < 0) { tsStatus.ForeColor = Color.Red; this.tsStatus.Text += "BeginHeartbeat时:"+DateTime.Now.ToString("u") + ex.Message; } ReRegisterClient(); } } void ReConnectAndRegisterClient() { try { CStaticClass.ClientID = Dns.GetHostName(); var ctx = new InstanceContext(CStaticClass.client); CStaticClass.WcfControl = new WcfControlMonitor.ControlMonitorClient(ctx); string errtext = string.Empty; CommonClassLib.CCarryConvert.WriteDarkCasket("Login", "UserID:" + CStaticClass.UserID + "的操作日志", "尝试重新连接", "", ""); CStaticClass.WcfControl.BeginRegisterClient(CStaticClass.UserID, "客户端:" + CStaticClass.ClientID + ",用户名:" + CStaticClass.UserID, new AsyncCallback(ReConnectAndRegisterClientCallBack), null); } catch (Exception ex) { throw ex; } } void ReConnectAndRegisterClientCallBack(IAsyncResult ar) { try { string ErrText = string.Empty; if (false == CStaticClass.WcfControl.EndRegisterClient(out ErrText, ar)) { //MessageBox.Show(ErrText, "登陆错误", MessageBoxButtons.OK, MessageBoxIcon.Error); CStaticClass.WCFOK = false; return; } //OPCClient.CCommonOPCClient.DisConnectOPCServer(); //OPCClient.CCommonOPCClient.UpdateDB += new CUpdateDBEventHandler(CCommon_UpdateDB); //OPCClient.CCommonOPCClient.CreateSubscriptionGroup(); CommonClassLib.CCarryConvert.WriteDarkCasket("Login", "UserID:" + CStaticClass.UserID + "的操作日志", "重连**成功登录系统", "", ""); tsStatus.Text = ""; //CStaticClass.WcfControl.BeginSendAllDeviceStates(CStaticClass.client.devlist[0].DeviceIndex, new AsyncCallback(CStaticClass.client.SendAllDeviceStatesCallback), null); CStaticClass.WCFOK = true; } catch (Exception ex) { //MessageBox.Show(ex.Message, "登陆错误", MessageBoxButtons.OK, MessageBoxIcon.Error); CStaticClass.WCFOK = false; return; } } public void SendAllDeviceStatesCallback(IAsyncResult ar) { try { Model.MDevice dev; dev = CStaticClass.WcfControl.EndSendAllDeviceStates(ar); if (dev != null) { Model.CGetInfo.SetDeviceInfo(dev); } devsn++; if (devsn < devlist.Count()) { CStaticClass.WcfControl.BeginSendAllDeviceStates(devlist[devsn].DeviceIndex, new AsyncCallback(SendAllDeviceStatesCallback), null); } else { //devsn=0; //CStaticClass.WcfControl.BeginSendAllDeviceStates(devlist[devsn].DeviceIndex, new AsyncCallback(SendAllDeviceStatesCallback), null); } } catch (Exception ex) { this.BeginInvoke(new MethodInvoker(delegate() { if (tsStatus.Text.IndexOf("SendAllDeviceStatesCallback时:" + ex.Message) < 0) { tsStatus.ForeColor = Color.Red; this.tsStatus.Text += "SendAllDeviceStatesCallback时:" + ex.Message; } })); ReRegisterClient(); } } private void MITransportTimeout_Click(object sender, EventArgs e) { FrmTransportTimeout.FormInstance.Show(); } private void MISeeDarket_Click(object sender, EventArgs e) { FrmBrowseDarkCasket.FormInstance.Show(); } private void MIDarketFileSet_Click(object sender, EventArgs e) { FrmDarkCasket.FormInstance.Show(); } private void MIAutoTaskHistory_Click(object sender, EventArgs e) { FrmBrowseAotoTaskLog.FormInstance.Show(); } private void MIUserInfoManage_Click(object sender, EventArgs e) { FrmUsers.FormInstance.Show(); } private void MIAltPassword_Click(object sender, EventArgs e) { FrmPassword.FormInstance.Show(); } private void MMExitSystem_Click(object sender, EventArgs e) { this.Close(); } private void MIUnVisible_Click(object sender, EventArgs e) { this.Visible = false; } private void MIMaxWindow_Click(object sender, EventArgs e) { this.Visible = true; this.WindowState = FormWindowState.Maximized; } private void MICloseWindow_Click(object sender, EventArgs e) { this.Close(); } private void tabPage1_Paint(object sender, PaintEventArgs e) { Graphics g = e.Graphics; g.TranslateTransform(this.tabPage2.AutoScrollPosition.X, this.tabPage2.AutoScrollPosition.Y); g.Dispose(); } 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 ctrl_ClickPicStop(object sender, EventArgs e) { PictureBox btn = (PictureBox)sender; int DeviceIndexForRunButton = Convert.ToInt32(btn.Tag); Model.MDevice deviceRun = Model.CGetInfo.GetDeviceInfo(DeviceIndexForRunButton); int iValue = 0; iValue = (deviceRun.SplitByte_6 == 1) ? 0 : 1; //if (iValue == 0) //{ // if (MessageBox.Show("您确认要向设备:" + DeviceIndexForRunButton + "发送【设备急停】吗?", "操作提示:", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) != DialogResult.OK) // { // return; // } //} //else //{ // if (MessageBox.Show("您确认要向设备:" + DeviceIndexForRunButton + "发送【急停复位】吗?", "操作提示:", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) != DialogResult.OK) // { // return; // } //} CStaticClass.WcfControl.BeginSendDeviceReset(DeviceIndexForRunButton, 10 + iValue, new AsyncCallback(SendDeviceResetCallBack), iValue); // CStaticClass.WcfControl.BeginSendDeviceReset(DeviceIndexForRunButton, iValue, new AsyncCallback(SendDeviceResetCallBack), iValue); } /// /// 急停显示 用于紧急急停按钮鼠标放上去显示设备信息 /// /// /// private void Btn_MouseEnter_Stop(object sender, EventArgs e) { string deviceindex = (sender as Control).Tag.ToString(); devinfo = Model.CGetInfo.GetDeviceInfo(Convert.ToInt32(deviceindex)); if (devinfo != null) { if (devinfo.SplitByte_6 == 1)//未停车 { deviceindex = string.Format("{0}-未联机停车", devinfo.DeviceIndex); } if (devinfo.SplitByte_6 == 0)//停车 { deviceindex = string.Format("{0}-联机停车", devinfo.DeviceIndex); } } toolTip1.SetToolTip(sender as Control, deviceindex); } void SendDeviceResetCallBack(IAsyncResult ar) { string errtext = string.Empty; if (CStaticClass.WcfControl.EndSendDeviceReset(out errtext, ar) == false) { MessageBox.Show(errtext, "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void timerFlash_Tick(object sender, EventArgs e) { string[] DS;char[] dd=new char [1]{'.'}; Model.MDevice device; TimeSpan ts = DateTime.Now.TimeOfDay; DataView dv; DataView dvJY; this.SuspendLayout(); //richard.liu20140806 try { if (CStaticClass.WCFOK == true) { //timersum++;//20150103增加断网恢复//20151120取消断网恢复 //if (timersum >= 120)//1分钟刷新订阅一次 //{//20150103增加断网恢复 // OPCClient.CCommonOPCClient.RefreshMonitoringMode(); // timersum = 0; //} sql.Remove(0, sql.Length);//richard.liu20140806 sql.Append("SELECT F_DeviceIndex FROM T_Base_Device WHERE F_LockedState = - 1 and F_DeviceIndex not in (12685,12686,12692,12693) "); dvJY = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView;//richard.liu20140806 dvJY.Sort = "F_DeviceIndex"; Button btdevice = bt11101; PictureBox pbdevice = pbh15400; TextBox tw0 = t11101; TextBox tw1 = t11101; Panel pp = plHW; if (this.tabControl1.SelectedIndex == 0) { pp = plHW; } else if (this.tabControl1.SelectedIndex == 1) { pp = plCW; } else if (this.tabControl1.SelectedIndex == 2) { pp = plZJLL; } else if (this.tabControl1.SelectedIndex == 3) { pp = plZJCJ; } #region 每层楼监视画面 #region 货物探测 foreach (TextBox ctrl in pp.Controls.OfType()) { DS = ctrl.Tag.ToString().Split(dd); int devicebyte = 0; int devbit = 0; int.TryParse(DS[0], out devicebyte); int.TryParse(DS[1], out devbit); device = Model.CGetInfo.GetDeviceInfo(devicebyte); if (device.DeviceIndex >= 15401 && device.DeviceIndex <= 15403) { continue; } if (device == null) {//20100108 if (tsStatus.Text.IndexOf(ctrl.Name + "控件对应的设备索引:" + ctrl.Tag + "在数据库没有记录!") < 0) { tsStatus.ForeColor = Color.Red; this.tsStatus.Text += ctrl.Name + "控件对应的设备索引:" + ctrl.Tag + "在数据库没有记录!"; } continue; } switch (devbit) { case 0: ctrl.Visible = device.SplitByte_0 == 1 ? true : false; break; case 1: ctrl.Visible = device.SplitByte_1 == 1 ? true : false; break; case 2: ctrl.Visible = device.SplitByte_2 == 1 ? true : false; break; case 3: ctrl.Visible = device.SplitByte_3 == 1 ? true : false; break; case 4: ctrl.Visible = device.SplitByte_4 == 1 ? true : false; break; case 5: ctrl.Visible = device.SplitByte_5 == 1 ? true : false; break; case 6: ctrl.Visible = device.SplitByte_6 == 1 ? true : false; ctrl.BackColor = Color.Goldenrod; break; case 7: ctrl.Visible = device.SplitByte_7 == 1 ? true : false; break; } } #endregion #region 逻辑有物显示 foreach (RadioButton ctrl in pp.Controls.OfType()) { //20100108DataView dvh; dv = dbo.ExceSQL("SELECT F_DeviceIndex FROM T_Base_Device WHERE (F_DeviceIndex = " + ctrl.Tag + ") AND (F_HaveGoods >0)").Tables[0].DefaultView; if (dv.Count > 0) { ctrl.Visible = true; ctrl.BackColor = Color.Blue; } else { ctrl.Visible = false; } } #endregion #region 联机紧急停车状态 foreach (PictureBox ctrl in pp.Controls.OfType()) { if(pp == plHW || pp == plCW) { if (ctrl.Tag!=null) { //如果是紧急停车按钮的时候 if (!ctrl.Tag.ToString().Contains(".")) { if(ctrl.Name.Length>9)//gjn 界面联机急停长度超过9位 为10位 { device = Model.CGetInfo.GetDeviceInfo(Convert.ToInt32("3" + ctrl.Name.ToString().Substring(ctrl.Name.Length - 5, 4))); } else { device = Model.CGetInfo.GetDeviceInfo(Convert.ToInt32("3" + ctrl.Name.ToString().Substring(ctrl.Name.Length - 4, 4))); } if (device.DeviceKind == 40) { //取堆垛机13.6状态来显示颜色 device = Model.CGetInfo.GetDeviceInfo(Convert.ToInt32(ctrl.Tag)); if (device == null) { if (tsStatus.Text.IndexOf(ctrl.Name + "控件对应的设备索引:" + ctrl.Name.ToString().Substring(ctrl.Name.Length - 5, 5) + "在数据库没有记录!") < 0) { tsStatus.ForeColor = Color.Red; this.tsStatus.Text += ctrl.Name + "控件对应的设备索引:" + ctrl.Name.ToString().Substring(ctrl.Name.Length - 5, 5) + "在数据库没有记录!"; } continue; } //DataView dwRunDevice = dbo.ExceSQL("SELECT F_DeviceIndex FROM T_Base_Device WHERE F_DeviceKindIndex = 1 or F_DeviceKindIndex = 4").Tables[0].DefaultView; //for (int i = 0; i < dwRunDevice.Count; i++) //{ // if (ctrl.Tag.ToString() == dwRunDevice[i]["F_Deviceindex"].ToString()) // { //Model.MDevice deviceRun = Model.CGetInfo.GetDeviceInfo(Convert.ToInt32(ctrl.Tag.ToString())); if (device.SplitByte_6 == 1) { //ctrl.Image = wcfControlMonitorClient.Properties.Resources.stop0; ctrl.Image = wcfControlMonitorClient.Properties.Resources.stop0; } if (device.SplitByte_6 == 0) { //ctrl.Image = wcfControlMonitorClient.Properties.Resources.stop1; ctrl.Image = wcfControlMonitorClient.Properties.Resources.stop1; } // } //} } } } } } #endregion #region Button foreach (Button ctrl in pp.Controls.OfType