using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.ServiceModel; using System.Net; using CommonLib; using System.Diagnostics; namespace wcfControlMonitorClient { /// /// Creator:Richard.liu and Jack.Ma /// 设备实时状态显示 /// public partial class FrmDeviceStatus : Form { #region 变量定义 Model.MDevice _device = null; int _deviceIndex; DBFactory.DBOperator dbo = CStaticClass.dbo; /// /// 设置要显示的设备索引 /// public int DeviceIndex { set { _deviceIndex = value;} } private static FrmDeviceStatus _formInstance; public static FrmDeviceStatus FormInstance { get { if (_formInstance == null) { _formInstance = new FrmDeviceStatus(); } return _formInstance; } set { _formInstance = value; } } #endregion #region 构造函数/初始化 public FrmDeviceStatus() { InitializeComponent(); _formInstance = this; } private void FrmDeviceStatus_Load(object sender, EventArgs e) { StringBuilder sql=new StringBuilder(); sql.Append("SELECT F_LaneGateDeviceIndex from T_Base_Lane_Gate where F_LaneGateDeviceIndex=").Append(_deviceIndex); DataView dvlane = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dvlane.Count > 0) { sql = new StringBuilder(); sql.Append("SELECT F_DeviceIndex from T_Base_PLC_Ask where F_DeviceIndex=").Append(_deviceIndex); dvlane = dbo.ExceSQL(sql.ToString()).Tables[0].DefaultView; if (dvlane.Count > 0) { this.btCancelDoubleFork.Visible = true; } else { this.btCancelDoubleFork.Visible = false; } this.btLogicHaveGoods.Visible = true; this.btLogicNoneGoods.Visible = true; textBox1.Visible = true; } else if ("37001,37002,37003".Contains(_deviceIndex.ToString())) { //add for qdty 机器手拆垛位置 this.btCancelDoubleFork.Visible = true; this.btLogicHaveGoods.Visible = false; this.btLogicNoneGoods.Visible = false; textBox1.Visible = false; } else { this.btCancelDoubleFork.Visible = false; this.btLogicHaveGoods.Visible = false; this.btLogicNoneGoods.Visible = false; textBox1.Visible = false; } btnRefresh_Click(null, EventArgs.Empty); } #endregion #region 更新设备状态 private void btnRefresh_Click(object sender, EventArgs e) { try { _device = Model.CGetInfo.GetDeviceInfo(_deviceIndex); //20100108 if (_device == null) { MessageBox.Show("您选择的设备在数据库没有记录!", "操作提示:", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } //if (_deviceIndex == 12002) if (false) { gb12002.Visible = true; tbBarcode.Focus(); } else { gb12002.Visible = false; } //设备索引 this.lblDeviceIndex.Value = _device.DeviceIndex; //设备名称 this.lblDeviceName.Text = _device.DeviceName; //设备指令索引 this.lblTaskIndex.Text = _device.TaskNo.ToString(); DataView dv = dbo.ExceSQL(string.Format("SELECT F_TxtParam, F_NumParam1, F_NumParam2, F_NumParam3, F_NumParam4,F_NumParam5, F_NumParam6 FROM T_Monitor_Task WHERE (F_MonitorIndex = {0})", _device.TaskNo)).Tables[0].DefaultView; if (dv.Count > 0) { //条码号 this.lblBarcode.Text = dv[0]["F_TxtParam"].ToString(); //目标位置 this.lblArrowLocation.Text = _device.ArrowLocation; if (_device.DeviceKind == 1) { this.lblArrowLocation.Text = string.Format("{0}排{1}列{2}层", dv[0]["F_NumParam4"].ToString(), dv[0]["F_NumParam5"].ToString(), dv[0]["F_NumParam6"].ToString()); } if (_device.DeviceKind == 4) { this.lblArrowLocation.Text = dv[0]["F_NumParam1"].ToString(); } if ((_device.DeviceKind == 2) || (_device.DeviceKind == 31)) { this.lblArrowLocation.Text = dv[0]["F_NumParam4"].ToString(); } } else { //20140109 if (_device.DeviceKind == 2) { if (_device.RunState == 5 && _device.SplitByte_0 == 1) { //条码号 object bcode = dbo.GetSingle(string.Format("SELECT F_PALLETBARCODE FROM T_Base_Device WHERE (F_DeviceIndex = {0})", _device.DeviceIndex)); if (bcode != null) { this.lblBarcode.Text = bcode.ToString(); } else { this.lblBarcode.Text = ""; } } else { //条码号 this.lblBarcode.Text = ""; } } else { //条码号 this.lblBarcode.Text = ""; } //目标位置 this.lblArrowLocation.Text = ""; } if (_device.DeviceKind == 31) { this.lblTaskIndex.Text = GetMonitorTaskIndexFromBarCode(new StringBuilder(_device.Barcode)).ToString(); this.lblBarcode.Text = _device.Barcode; this.lblBarcode.Enabled = true; } else { this.lblBarcode.Enabled = true; } //设备状态 switch (_device.RunState) { case 0: lblDeviceStatus.Text = "空闲"; break; case 1: lblDeviceStatus.Text = "运行"; break; case 2: lblDeviceStatus.Text = "故障"; break; case 3: lblDeviceStatus.Text = "离线"; break; case 4: lblDeviceStatus.Text = "停用"; break; case 5://20090920 lblDeviceStatus.Text = "动作完成"; break; } if (_device.ErrorCode >= 30) { Model.MError err = Model.CGetInfo.GetErrorInfo(Convert.ToInt32(_device.DeviceKind.ToString() + _device.ErrorCode.ToString())); if (err != null) { this.lblErrorName.Text = err.ErrorName + ",代码:" + _device.ErrorCode.ToString(); } else { this.lblErrorName.Text = _device.ErrorCode.ToString(); } } else { this.lblErrorName.Text = ""; } if (_device.DeviceKind == 7) { dv = dbo.ExceSQL(string.Format("SELECT F_BarCode,F_ERRORLOG FROM T_Base_PLC_Ask WHERE (F_DeviceIndex = {0})", _device.DeviceIndex)).Tables[0].DefaultView; if (dv.Count > 0) { this.lblBarcode.Text = dv[0][0].ToString(); lblErrorName.Text = dv[0][1].ToString(); } //lblErrorName.Text = ""; //lblDeviceStatus.Text = ""; } if ((_device.DeviceKind == 1) || (_device.DeviceKind == 4) || (_device.DeviceKind == 14)) { this.lblNowX.Text = _device.XCoor.ToString(); this.lblNowY.Text = _device.YCoor.ToString(); } else { this.lblNowX.Text = ""; this.lblNowY.Text = ""; } //是否逻辑有物 dv = dbo.ExceSQL("select F_DeviceIndex from T_Base_Device where F_HaveGoods >0 and F_DeviceIndex =" + this._deviceIndex).Tables[0].DefaultView; if (dv.Count > 0) { lblGoods.Text = "逻辑有物"; } else { lblGoods.Text = "逻辑无物"; } //20120417被预约的调度任务 dv = dbo.ExceSQL(string.Format("SELECT F_MonitorIndex FROM T_Monitor_Task WHERE (F_ManageTaskKindIndex = 4 and F_MonitorIndex={0})", Convert.ToInt32(this.lblTaskIndex.Text))).Tables[0].DefaultView; if (dv.Count > 0) { lblManTask.Text = "手工任务"; } else { dv = dbo.ExceSQL(string.Format("select F_ManTaskReserve from T_Base_Device where F_ManTaskReserve>0 and F_DeviceIndex ={0}", this._deviceIndex)).Tables[0].DefaultView; if (dv.Count > 0) { int mankind = Convert.ToInt32(dv[0][0].ToString().Substring(0, 1)); int fid = Convert.ToInt32(dv[0][0].ToString().Substring(1)); lblManTask.Text = fid.ToString(); dv = dbo.ExceSQL(string.Format("SELECT F_TxtParam FROM T_Monitor_Task WHERE (F_ManageTaskKindIndex = {0} and F_ManageTaskIndex={1})", mankind, fid)).Tables[0].DefaultView; if (dv.Count > 0) { lblBarcode.Text = dv[0][0].ToString(); ; } } else { lblManTask.Text = ""; } } dv = dbo.ExceSQL(string.Format("SELECT F_DeviceIndex,F_PalletBarcodeLength,F_BarCode FROM T_Base_PLC_Ask WHERE (F_Askkind = 4 OR F_Askkind = 14) AND (F_BindingDevice = {0})", this._deviceIndex)).Tables[0].DefaultView; if (dv.Count > 0) { gbBarcode.Visible = true; CStaticClass.WcfControl.BeginGetReadedAndReportedBarcode(this._deviceIndex, new AsyncCallback(CallbackGetReadedAndReportedBarcode), null); } else { gbBarcode.Visible = false; } } catch (Exception ex) { MessageBox.Show(ex.Message); } } void CallbackGetReadedAndReportedBarcode(IAsyncResult ar) { string errortext,ReadedBarcode, ReportedBarcode; try { bool rt=CStaticClass.WcfControl.EndGetReadedAndReportedBarcode(out ReadedBarcode, out ReportedBarcode, out errortext, ar); if (rt ==true) { this.BeginInvoke(new MethodInvoker(delegate() { lblReadedBarcode.Text = ReadedBarcode; lblReportedBarcode.Text = ReportedBarcode; })); } else { this.BeginInvoke(new MethodInvoker(delegate() { lblReadedBarcode.Text =""; lblReportedBarcode.Text = ""; })); if (errortext != "") { MessageBox.Show(errortext, "操作提示:", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } } catch { } } #endregion #region 关闭窗体 private void btnClose_Click(object sender, EventArgs e) { this.Close(); } #endregion private void button2_Click(object sender, EventArgs e) { if (MessageBox.Show("您确认要把设备:" + this._deviceIndex + "设成逻辑无物吗?", "操作提示:", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) != DialogResult.OK) { return; } CStaticClass.WcfControl.BeginSetLogicHaveGoods(false, this._deviceIndex, new AsyncCallback(SetLogicHaveGoodsCallBack), null); btnRefresh_Click(sender, e); } private void button1_Click(object sender, EventArgs e) { if (MessageBox.Show("您确认要把设备:" + this._deviceIndex + "设成逻辑有物吗?", "操作提示:", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) != DialogResult.OK) { return; } CStaticClass.WcfControl.BeginSetLogicHaveGoods(true, this._deviceIndex, new AsyncCallback(SetLogicHaveGoodsCallBack), null); btnRefresh_Click(sender, e); } private void button3_Click(object sender, EventArgs e) { try { if (CStaticClass.WcfControl.State == CommunicationState.Faulted) { ReConnectAndRegisterClient();//20160115添加断线重连功能 } if (MessageBox.Show("您确认要向设备:" + this._deviceIndex + "发送【完成应答】吗?", "操作提示:", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) != DialogResult.OK) { return; } string errtext = string.Empty; CStaticClass.WcfControl.BeginSendDeviceReset(this._deviceIndex, 2, new AsyncCallback(SendDeviceResetCallBack), 2); } catch(Exception ex) { throw ex; } } void SetLogicHaveGoodsCallBack(IAsyncResult ar) { string errtext = string.Empty; if (CStaticClass.WcfControl.EndSetLogicHaveGoods(out errtext, ar) == false) { MessageBox.Show(errtext, "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Error); } } void SendDeviceResetCallBack(IAsyncResult ar) { string errtext = string.Empty; try { if (CStaticClass.WcfControl.EndSendDeviceReset(out errtext, ar) == false) { MessageBox.Show(errtext, "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Error); } else { if (ar.AsyncState != null) { //if ((((int)ar.AsyncState) == 4)&&(_device.DeviceKind==4)) //{ // CStaticClass.WcfControl.BeginSendDeviceReset(_deviceIndex, 2, new AsyncCallback(SendDeviceResetCallBack), null); //} if (((int)ar.AsyncState) == 2 || ((int)ar.AsyncState) == 4) { //CStaticClass.WcfControl.BeginSendDeviceReset(_deviceIndex, 0, new AsyncCallback(SendDeviceResetCallBack), null); } } } } catch(Exception ex) { throw ex; } } private void lblDeviceIndex_ValueChanged(object sender, EventArgs e) { _deviceIndex =int.Parse( lblDeviceIndex.Value.ToString()); } private void FrmDeviceStatus_FormClosing(object sender, FormClosingEventArgs e) { _formInstance = null; } 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; } 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; //OPCClient.CCommonOPCClient.kkk(); //OPCClient.CCommonOPCClient.CreateSubscriptionGroup(); } catch (Exception ex) { //MessageBox.Show(ex.Message, "登陆错误", MessageBoxButtons.OK, MessageBoxIcon.Error); CStaticClass.WCFOK = false; return; } //try //{ // string ErrText = string.Empty; // if (false == CStaticClass.WcfControl.EndRegisterClient(out ErrText, ar)) // { // return; // } // OPCClient.CCommonOPCClient.DisConnectOPCServer(); // OPCClient.CCommonOPCClient.CreateSubscriptionGroup(); // CommonClassLib.CCarryConvert.WriteDarkCasket("Login", "UserID:" + CStaticClass.UserID + "的操作日志", "重连**成功登录系统", "", ""); // //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; //} } 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; } } private void button4_Click(object sender, EventArgs e) { try { if (CStaticClass.WcfControl.State == CommunicationState.Faulted) { ReConnectAndRegisterClient();//20160115添加断线重连功能 } if (MessageBox.Show("您确认要向设备:" + this._deviceIndex + "发送【设备复位】吗?", "操作提示:", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) != DialogResult.OK) { return; } string errtext = string.Empty; CStaticClass.WcfControl.BeginSendDeviceReset(this._deviceIndex, 4, new AsyncCallback(SendDeviceResetCallBack), 4); } catch (Exception ex) { throw ex; } } int GetMonitorTaskIndexFromBarCode(StringBuilder BarCode) {//20110216 string bc = BarCode.ToString(); DataView dv = dbo.ExceSQL(string.Format("SELECT 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_Base_Device.F_DeviceKindIndex = 13) OR (T_Base_Device.F_DeviceKindIndex = 31)) and (F_TxtParam = '{0}') and F_Status>0 order by F_MonitorIndex asc", bc)).Tables[0].DefaultView; if (dv.Count > 0) { return Convert.ToInt32(dv[0]["F_MonitorIndex"]); } else { return -1; } } void WriteDBDataCallback(IAsyncResult ar) { string errtext; if (CStaticClass.WcfControl.EndWriteDBData(out errtext, ar) == false) { MessageBox.Show("操作提示", errtext, MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void lblBarcode_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == '\r') { if (MessageBox.Show("您确认要修改设备【" + this._deviceIndex + "】记录的【条码】吗?", "操作提示:", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) != DialogResult.OK) { return; } CStaticClass.WcfControl.BeginWriteDBData(_deviceIndex, "DB2", lblBarcode.Text, new AsyncCallback(WriteDBDataCallback), null); } } private void btCancelDoubleFork_Click(object sender, EventArgs e) { //if (MessageBox.Show("您确认要取消【" + this._deviceIndex + "】的双叉关联吗?", "操作提示:", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) != DialogResult.OK) //{ // return; //} //StringBuilder sql = new StringBuilder() ; //sql.Append("update T_Base_PLC_Ask set F_TaskIndex=0,F_Remark='' where F_DeviceIndex=").Append(_deviceIndex); //dbo.ExecuteSql(sql.ToString()); if (MessageBox.Show("您确认要向设备:" + this._deviceIndex + "发送【残盘应答】吗?", "操作提示:", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) != DialogResult.OK) { return; } string errtext = string.Empty; CStaticClass.WcfControl.BeginSendDeviceReset(this._deviceIndex, 3, new AsyncCallback(SendDeviceResetCallBack), 3); } private void btnSolutions_Click(object sender, EventArgs e) {//20151120 if (_device != null) { if (_device.ErrorCode >= 30) { FrmDeviceErrorSolutions.FormInstance.Show();//20160501 FrmDeviceErrorSolutions.FormInstance.comboBox1.SelectedValue = _device.DeviceKind; FrmDeviceErrorSolutions.FormInstance.textBox1.Text = _device.ErrorCode.ToString(); FrmDeviceErrorSolutions.FormInstance.button1_Click(sender, e); } } } private void btLayer2_Click(object sender, EventArgs e) { if (tbBarcode.Text.Trim().Length < 6) { MessageBox.Show("条码不够6位字符!", "误操作提示", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; } object ob= dbo.GetSingle(string.Format("SELECT FPALLETBARCODE FROM T_Manage_Task where FPALLETBARCODE='{0}'", tbBarcode.Text)); if (ob != null) { MessageBox.Show("任务的条码已经在队列中存在!", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } Button bt = (Button)sender; string endposition = string.Empty; if (bt.Name == "btLayer2") { endposition = "22011"; } else { endposition = "32011"; } Model.AutoTask at = new Model.AutoTask(3, tbBarcode.Text,"12002", "-", endposition, "-",false , false,1,0,0); CStaticClass.WcfControl.BeginBuildAutoTask(at, new AsyncCallback(BuildAutoTaskCallBack), at); MessageBox.Show("任务下达成功!", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information); this.tbBarcode.Text = ""; this.tbBarcode.Focus(); } void BuildAutoTaskCallBack(IAsyncResult ar) { string errtext = string.Empty; if (CStaticClass.WcfControl.EndBuildAutoTask(out errtext, ar) == false) { MessageBox.Show(errtext, "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void buttonClear_Click(object sender, EventArgs e) { if (MessageBox.Show("您确认要向设备:" + this._deviceIndex + "发送【清除条码】吗?", "操作提示:", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) != DialogResult.OK) { return; } StringBuilder sql = new StringBuilder(); sql.Append("update T_Base_PLC_Ask set F_BARCODE='' where F_DeviceIndex=").Append(this._deviceIndex); dbo.ExecuteSql(sql.ToString()); } } }