using System; using System.Data; using System.Text; using System.Collections.Generic; using System.Drawing; using System.Threading; using System.Windows.Forms; using DevExpress.XtraBars; using DevExpress.XtraGrid.Views.Grid; using DevExpress.XtraBars.Ribbon; using DevExpress.XtraEditors.Controls; using DevExpress.XtraEditors; using UAS_PLCDataReader.DataOperate; using UAS_PLCDataReader.Entity; using UAS_PLCDataReader.PublicMethod; using UAS_PLCDataReader.CustomerControl.PictureEditWithText; using UAS_PLCDataReader.Device.Infomation; namespace UAS_PLCDataReader { public partial class Main : RibbonForm { StringBuilder sql = new StringBuilder(); //用于设备状态查询界面SQL查看 StringBuilder DeviceStatusQuerySQL = new StringBuilder(); //用于设备主档资料查询界面SQL查看 StringBuilder DeviceListQuerySQL = new StringBuilder(); DataHelper dh = SystemInf.dh; ModeBusTCPServer mbt = new ModeBusTCPServer(); List SQL = new List(); //存放所有的设备返回的数据,用于比较 public static Dictionary ReturnData = new Dictionary(); /// /// 需要更新的设备列表 /// public static Queue QueueUpdateDevice = new Queue(); #region 初始化代码 public Main() { InitializeComponent(); CheckForIllegalCrossThreadCalls = false; dpc_enableCheckEdit.QueryCheckStateByValue += CheckedEdit_QueryCheckStateByValue; CommandSetRepositoryItemComboBox1.ParseEditValue += CommandSetRepositoryItemComboBox1_ParseEditValue; CheckEditCommandSet.QueryCheckStateByValue += CheckedEdit_QueryCheckStateByValue; PollSettingItemSearchLookUpEdit.ParseEditValue += PollSettingItemSearchLookUpEdit_ParseEditValue; GridViewPollSetting.RowCellStyle += GridViewPollSetting_RowCellStyle; #region 添加发送接收编码规则的静态值 ComboBoxData cbd = new ComboBoxData(); cbd.Text = "UTF-8"; cbd.Value = "UTF-8"; ComboBoxData cbd1 = new ComboBoxData(); cbd1.Text = "Hexadecimal"; cbd1.Value = "Hexadecimal"; ComboBoxData cbd2 = new ComboBoxData(); cbd2.Text = "ASCII"; cbd2.Value = "ASCII"; CommandSetRepositoryItemComboBox1.Items.Add(cbd); CommandSetRepositoryItemComboBox1.Items.Add(cbd1); CommandSetRepositoryItemComboBox1.Items.Add(cbd2); #endregion } private void CommandSetRepositoryItemComboBox1_ParseEditValue(object sender, ConvertEditValueEventArgs e) { string val = ""; if (e.Value != null) { val = e.Value.ToString(); } else { val = "FALSE";//默认为不选 } e.Value = val; e.Handled = true; } private void PollSettingItemSearchLookUpEdit_ParseEditValue(object sender, ConvertEditValueEventArgs e) { e.Handled = true; } private void Main_Load(object sender, EventArgs e) { //设备列表 GridDeviceList.GetDataSQL = "SELECT 0 CHECKEDCOLUMN,DE_ID,DE_CODE,DE_NAME,DE_SPEC,DE_INDATE,DE_RUNSTATUS,DE_ADDRESS,DE_INMAN,DE_LINECODE,DE_WCCODE,DE_VENDCODE,DE_VENDNAME,DE_STEPCODE,DE_STEPNAME,DE_SOURCECODE FROM DEVICE ORDER BY DE_CODE".ToUpper(); GridDeviceList.TableName = "device"; GridDeviceList.ID = "de_id"; GridDeviceList.InsertSQL = "INSERT INTO DEVICE(DE_ID,DE_CODE,DE_NAME,DE_SPEC,DE_INDATE,DE_RUNSTATUS,DE_ADDRESS,DE_INMAN,DE_LINECODE,DE_WCCODE,DE_VENDCODE,DE_VENDNAME,DE_STEPCODE,DE_STEPNAME,DE_SOURCECODE) VALUES(DEVICE_SEQ.NEXTVAL,:DE_CODE,:DE_NAME,:DE_SPEC,sysdate,:DE_RUNSTATUS,:DE_ADDRESS,:DE_INMAN,:DE_LINECODE,:DE_WCCODE,:DE_VENDCODE,:DE_VENDNAME,:DE_STEPCODE,:DE_STEPNAME,:DE_SOURCECODE)"; ButtonAddDevice.Grid = GridDeviceList; ButtonSaveDevice.Grid = GridDeviceList; ButtonDeleteDevice.Grid = GridDeviceList; //ToolPageControlDeviceList.Gridcontrol = GridDeviceList; //轮询业务 //GridPolling.GetDataSQL = "select 0 CHECKEDCOLUMN,pl_id,pl_code,pl_name,pl_type,pl_dccode,pl_remark from polling".ToUpper(); //GridPolling.ID = "pl_id"; //GridPolling.TableName = "polling"; //GridPolling.InsertSQL = "insert into polling(pl_id,pl_code,pl_name,pl_type,pl_dccode,pl_remark) values(polling_seq.nextval,:pl_code,:pl_name,:pl_type,:pl_dccode,:pl_remark)"; //ButtonDeletePolling.Grid = GridPolling; //ButtonSavePolling.Grid = GridPolling; //ButtonAddPolling.Grid = GridPolling; //轮询配置界面 GridPollingSetting.GetDataSQL = "SELECT '' POLLSETTINGSTATUSCOLUMN,0 CHECKEDCOLUMN,DPC_MAN,DPC_ID,DPC_DECODE,DPC_DENAME ,DPC_INTERVAL ,DPC_DCCODE ,DPC_FUNCTION , nvl(DPC_ENABLE,0)DPC_ENABLE,DPC_STATUS,DPC_REMARK,EM_NAME FROM DEVICEPOLLINGCONFIG left join EMPLOYEE on em_code=dpc_man WHERE DPC_MAN='" + User.UserCode + "' ORDER BY DPC_ID"; GridPollingSetting.ID = "DPC_ID"; GridPollingSetting.TableName = "DEVICEPOLLINGCONFIG"; GridPollingSetting.InsertSQL = "insert into DEVICEPOLLINGCONFIG(DPC_ID,DPC_DECODE,DPC_DENAME ,DPC_INTERVAL ,DPC_DCCODE ,DPC_FUNCTION , DPC_ENABLE,DPC_STATUS ,DPC_REMARK,DPC_MAN) values(DEVICEPOLLINGCONFIG_seq.nextval,:DPC_DECODE ,:DPC_INTERVAL ,:DPC_DCCODE ,:DPC_FUNCTION , :DPC_ENABLE,:DPC_STATUS ,:DPC_REMARK,'" + User.UserCode + "')"; ButtonSaveCommandSet.Grid = GridPollingSetting; ButtonNewCommandSet.Grid = GridPollingSetting; ButtonDeleteCommandSet.Grid = GridPollingSetting; //指令设置界面 GridCommandSetting.GetDataSQL = "select 0 CHECKEDCOLUMN,dc_id,dc_code,dc_name,dc_type,dc_value,dc_dataindex,dc_sendcoding,dc_receivecoding,db_name,dc_man,dc_date from devicecommand left join devicebrand on db_code=dc_debrand".ToUpper(); GridCommandSetting.TableName = "devicecommand"; GridCommandSetting.ID = "dc_id"; GridCommandSetting.InsertSQL = "insert into devicecommand(dc_id,dc_code,dc_name,dc_value,dc_debrand,dc_sendcoding,dc_receivecoding,dc_man,dc_date,dc_dataindex) values(devicecommand_seq.nextval,:dc_code,:dc_name,:dc_value,'" + BaseUtil.GetComboxEditValue(Brand) + "',:dc_sendcoding,:dc_receivecoding,'" + User.UserName + "',sysdate,:dc_dataindex)"; ButtonSaveCommand.Grid = GridCommandSetting; ButtonDeleteCommand.Grid = GridCommandSetting; ButtonNewCommand.Grid = GridCommandSetting; //设备联网配置界面 GridDeviceNetSetting.GetDataSQL = "SELECT 0 CHECKEDCOLUMN,DNC_ID,DNC_DECODE,DNC_GATEWAY,DNC_UPPERIP,DNC_PORT,DNC_MAC,DNC_IP,DNC_TYPE FROM DEVICENETCONFIG order by DNC_ID"; GridDeviceNetSetting.ID = "dnc_id"; GridDeviceNetSetting.TableName = "DEVICENETCONFIG"; GridDeviceNetSetting.InsertSQL = "insert into DEVICENETCONFIG(DNC_ID,DNC_DECODE,DNC_GATEWAY,DNC_UPPERIP,DNC_PORT,DNC_MAC,DNC_IP,DNC_TYPE) values(DEVICENETCONFIG_SEQ.NEXTVAL,:DNC_DECODE,:DNC_GATEWAY,:DNC_UPPERIP,:DNC_PORT,:DNC_MAC,:DNC_IP,:DNC_TYPE)"; ButtonDeleteNetConfig.Grid = GridDeviceNetSetting; ButtonAddNetConfig.Grid = GridDeviceNetSetting; ButtonSaveNetConfig.Grid = GridDeviceNetSetting; TimerUpdateDevice.Start(); Ptime = new Dictionary(); } /// /// 关闭前将所有设备离线,状态更新为离线 /// /// /// private void Main_FormClosing(object sender, FormClosingEventArgs e) { dh.ExecuteSql("update devicepollingconfig set dpc_status='Stop' where dpc_status='Running'", "update"); dh.ExecuteSql("update devicepollinglog set dpg_status='Stop' where dpg_status='Running'", "update"); } #endregion #region 设备列表界面 private void GridViewDeviceList_RowCellClick(object sender, RowCellClickEventArgs e) { string de_code = GridViewDeviceList.GetRowCellValue(e.RowHandle, "DE_CODE").ToString(); DeviceDetailInfo ddi = new DeviceDetailInfo(de_code); ddi.StartPosition = FormStartPosition.CenterScreen; ddi.ShowDialog(); } private void PageDeviceList_VisibleChanged(object sender, EventArgs e) { if (PageDeviceList.PageVisible) { DataTable dt; //填充人员资料,工作中心,线别下拉框 ComBoxDeviceListMan.Properties.DataSource = (DataTable)dh.ExecuteSql("select em_code,em_name from employee ", "select"); dt = (DataTable)dh.ExecuteSql("select wc_code,wc_name from workcenter", "select"); BaseUtil.FillComBoxEditWidthDataTable(ComboxDeviceListWC, "wc_name", "wc_code", dt, true); } } private void ButtonSaveDevice_Click(object sender, EventArgs e) { ButtonSaveDevice.DoSaveAfterHandler(); sql.Clear(); sql.Append("update device set de_inman='" + User.UserName + "' where de_id=:de_id"); if (ButtonSaveDevice.LastSaveID != null && ButtonSaveDevice.LastSaveID.Length > 0) { dh.BatchInsert(sql.ToString(), new string[] { "de_id" }, ButtonSaveDevice.LastSaveID); } GridDeviceList.RefreshData(); } private void ComboxDeviceListWC_SelectedIndexChanged(object sender, EventArgs e) { DeviceListQuerySQL.Clear(); string WC = BaseUtil.GetComboxEditValue(ComboxDeviceListWC); DeviceListQuerySQL.Append("select 0 CHECKEDCOLUMN,de_id,de_code,de_name,de_spec,de_indate,de_runstatus,de_address,de_wccode,de_inman,de_linecode"); DeviceListQuerySQL.Append("de_vendcode,de_vendname,de_stepcode,de_stepname,DE_SOURCECODE from device where de_wccode='" + WC + "' order by de_code"); sql.Clear(); if (WC == "全部") sql.Append("select li_code,li_name from line"); else sql.Append("select li_code,li_name from line where li_wccode='" + WC + "'"); DataTable dt = (DataTable)dh.ExecuteSql(sql.ToString(), "select"); BaseUtil.FillComBoxEditWidthDataTable(ComboxDeviceListLC, "li_code", "li_name", dt, true); RefreshDeviceData(); } private void ComboxDeviceListLC_SelectedIndexChanged(object sender, EventArgs e) { DeviceListQuerySQL.Clear(); string WC = BaseUtil.GetComboxEditValue(ComboxDeviceListWC); string LC = BaseUtil.GetComboxEditValue(ComboxDeviceListLC); DeviceListQuerySQL.Append("select 0 CHECKEDCOLUMN,de_id,de_code,de_name,de_spec,de_indate,de_runstatus,de_address,de_wccode, "); DeviceListQuerySQL.Append("de_vendcode,de_vendname,de_inman,de_linecode,de_stepcode,de_stepname,DE_SOURCECODE from device "); if (WC != "全部" && LC != "全部") DeviceListQuerySQL.Append(" where de_wccode='" + WC + "' and de_linecode='" + LC + "' "); if (WC == "全部" && LC != "全部") DeviceListQuerySQL.Append(" where de_linecode='" + LC + "' "); if (WC != "全部" && LC == "全部") DeviceListQuerySQL.Append(" where de_wccode='" + WC + "' "); DeviceListQuerySQL.Append("order by de_code"); RefreshDeviceData(); } private void ComBoxDeviceListMan_EditValueChanged(object sender, EventArgs e) { } private void RefreshDeviceData() { GridDeviceList.GetDataSQL = DeviceListQuerySQL.ToString(); GridDeviceList.RefreshData(); } #endregion #region 界面通用事件 /// /// 选项卡切换不同XPage /// /// /// private void ButtonItem_ItemClick(object sender, ItemClickEventArgs e) { HideXPage(e.Item.Tag.ToString()); } /// /// 根据点击按钮的Tag显示对应的XPage /// /// private void HideXPage(string PageName) { for (int i = 0; i < MainTabControl.TabPages.Count; i++) { if (MainTabControl.TabPages[i].Name == PageName) MainTabControl.TabPages[i].PageVisible = true; else MainTabControl.TabPages[i].PageVisible = false; } } /// /// 勾选Grid的CheckBox /// /// /// private void CheckedEdit_QueryCheckStateByValue(object sender, DevExpress.XtraEditors.Controls.QueryCheckStateByValueEventArgs e) { string val = ""; if (e.Value != null) { val = e.Value.ToString(); } else { val = "FALSE";//默认为不选 } switch (val.ToUpper()) { case "TRUE": case "YES": case "1": e.CheckState = CheckState.Checked; break; case "FALSE": case "NO": case "0": e.CheckState = CheckState.Unchecked; break; default: e.CheckState = CheckState.Checked; break; } e.Handled = true; } /// /// 设备数据更新列表 /// /// /// private void TimerUpdateDevice_Tick(object sender, EventArgs e) { while (QueueUpdateDevice.Count > 0) { Entity.Device item = QueueUpdateDevice.Dequeue(); SQL.Clear(); //更新轮询状态 sql.Clear(); sql.Append("update DEVICEPOLLINGCONFIG set dpc_status='Running' where dpc_decode='" + item.Decode + "' and dpc_dccode='" + item.Dccode + "'"); dh.ExecuteSql(sql.ToString(), "update"); //更新轮询日志状态 sql.Clear(); sql.Append("update DEVICEPOLLINGLOG set dpg_status='Running',dpg_senddatasize=nvl(dpg_senddatasize,0)+" + item.SendDataSize); sql.Append(",dpg_receivedatasize=nvl(dpg_receivedatasize,0)+" + item.ReceiveDataSize + ",dpg_count=nvl(dpg_count,0)+1 "); sql.Append(" where dpg_id=(select max(dpg_id) from DEVICEPOLLINGLOG where dpg_decode='" + item.Decode + "')"); dh.ExecuteSql(sql.ToString(), "update"); } } #endregion #region PageCommandSet业务代码(指令设置) /// /// 判断指令编号不能重复 /// /// /// private void ButtonSaveCommand_Click(object sender, EventArgs e) { GridCommandSetting.InsertSQL = "insert into devicecommand(dc_id,dc_code,dc_name,dc_value,dc_debrand,dc_sendcoding,dc_receivecoding,dc_man,dc_date,dc_dataindex) values(devicecommand_seq.nextval,:dc_code,:dc_name,:dc_value,'" + BaseUtil.GetComboxEditValue(Brand) + "',:dc_sendcoding,:dc_receivecoding,'" + User.UserName + "',sysdate,:dc_dataindex)"; ButtonSaveCommand.DoSaveAfterHandler(); sql.Clear(); sql.Append("update devicecommand set dc_man='" + User.UserName + "',dc_date=sysdate where dc_id=:dc_id"); if (ButtonSaveCommand.LastSaveID != null && ButtonSaveCommand.LastSaveID.Length > 0) { dh.BatchInsert(sql.ToString(), new string[] { "dc_id" }, ButtonSaveCommand.LastSaveID); } GridCommandSetting.RefreshData(); } /// /// 加载ComBox品牌数据 /// /// /// private void PageCommandSet_VisibleChanged(object sender, EventArgs e) { if (PageCommandSet.PageVisible) { DataTable dt = (DataTable)SystemInf.dh.ExecuteSql("select * from devicebrand", "select"); BaseUtil.FillComBoxEditWidthDataTable(Brand, "db_name", "db_code", dt); GridCommandSetting.Condition = " where dc_debrand='" + BaseUtil.GetComboxEditValue(Brand) + "' order by dc_id"; } } private void Brand_SelectedIndexChanged(object sender, EventArgs e) { GridCommandSetting.Condition = " where dc_debrand='" + BaseUtil.GetComboxEditValue(Brand) + "' order by dc_id"; GridCommandSetting.RefreshData(); } #endregion #region PagePollingSetting业务代码(轮询配置) PollingTask pt = new PollingTask(); /// /// 绘制轮询配置状态栏 /// List PollSettingPaintRowIndex = new List(); private void ButtonStartPolling_Click(object sender, EventArgs e) { GridView grid = GridViewPollSetting; for (int i = 0; i < GridPollingSetting.RowCount; i++) { Polling pl = new Polling(); pl.Id = int.Parse(GridViewPollSetting.GetRowCellValue(i, "DPC_ID").ToString()); pl.DeviceCode = GridViewPollSetting.GetRowCellValue(i, "DPC_DECODE").ToString(); pl.DeviceName = GridViewPollSetting.GetRowCellValue(i, "DPC_DENAME").ToString(); pl.CommandCode = GridViewPollSetting.GetRowCellValue(i, "DPC_DCCODE").ToString(); pl.Interval = int.Parse(GridViewPollSetting.GetRowCellValue(i, "DPC_INTERVAL").ToString()); pl.Enable = GridViewPollSetting.GetRowCellValue(i, "DPC_ENABLE").ToString() != "0"; pl.Dh = new DataHelper(); if (pl.Enable) { //插入轮询日志 sql.Clear(); sql.Append("insert into DEVICEPOLLINGLOG(dpg_id,dpg_decode,dpg_starttime,dpg_interval)values"); sql.Append("(DEVICEPOLLINGLOG_seq.nextval,'" + pl.DeviceCode + "',sysdate,'" + pl.Interval + "')"); dh.ExecuteSql(sql.ToString(), "insert"); sql.Clear(); sql.Append("MERGE INTO DeviceRunstatus alias1 USING (select '" + pl.DeviceCode + "' dr_decode from dual) alias2 "); sql.Append("ON (alias1.dr_decode=alias2.dr_decode) WHEN MATCHED THEN UPDATE SET dr_startdate =sysdate "); sql.Append("WHEN NOT MATCHED THEN INSERT (Dr_id,dr_decode,dr_dename,Dr_runstatus,dr_startdate) VALUES (DeviceRunstatus_seq.nextval,"); sql.Append("'" + pl.DeviceCode + "','" + pl.DeviceName + "','running',sysdate)"); dh.ExecuteSql(sql.ToString(), "update"); pt.AddTask(RunTask, pl); //添加到状态为运行的行 PollSettingPaintRowIndex.Add(i); GridPollingSetting.Focus(); } } } /// /// 绘制轮询状态 /// /// /// private void GridViewPollSetting_RowCellStyle(object sender, RowCellStyleEventArgs e) { if (e.Column.Name.ToUpper() == "POLLSETTINGSTATUSCOLUMN" && PollSettingPaintRowIndex.Contains(e.RowHandle)) { e.Appearance.BackColor = Color.Green; } } Dictionary Ptime; private void RunTask(object i) { PollingTimer timer = new PollingTimer(); Polling pl = (Polling)i; timer.Polling = i; timer.Interval = pl.Interval * 1000; timer.Elapsed += Timer_Tick; timer.Start(); try { if (!Ptime.ContainsKey(pl.Id)) Ptime.Add(pl.Id, timer); } catch (Exception) { if (!Ptime.ContainsKey(pl.Id)) Ptime.Add(pl.Id, timer); } } Dictionary client = new Dictionary(); /// /// 轮询执行的业务 /// /// /// private void Timer_Tick(object sender, EventArgs e) { PollingTimer timer = (PollingTimer)sender; Polling pl = (Polling)timer.Polling; DataHelper dh = pl.Dh; string Decode = pl.DeviceCode; string Dccode = pl.CommandCode; string DpcID = pl.Id.ToString(); DataTable dt = (DataTable)dh.ExecuteSql("select dnc_ip,dnc_port from DEVICENETCONFIG where dnc_decode='" + Decode + "'", "select"); DataTable dt1 = (DataTable)dh.ExecuteSql("select dc_sendcoding,dc_value,dc_receivecoding from devicecommand where dc_code='" + Dccode + "'", "select"); if (dt.Rows.Count > 0) { string IP = dt.Rows[0]["dnc_ip"].ToString() + ":" + dt.Rows[0]["dnc_port"].ToString(); string SendCoding = ""; string ReceiveCoding = ""; string Command = ""; int SendCommandByteSize = 0; if (dt1.Rows.Count > 0) { SendCoding = dt1.Rows[0]["dc_sendcoding"].ToString(); ReceiveCoding = dt1.Rows[0]["dc_receivecoding"].ToString(); Command = dt1.Rows[0]["dc_value"].ToString(); SendCommandByteSize = Encoding.Default.GetBytes(Command.ToCharArray()).Length; } if (client.ContainsKey(DpcID)) { client[DpcID].Send(Command); } else { ModBusTCPClient modclient = new ModBusTCPClient(dt.Rows[0]["dnc_ip"].ToString(), int.Parse(dt.Rows[0]["dnc_port"].ToString())); client.Add(DpcID, modclient); } //发送指令 //mbt.Send(IP, SendCoding, ReceiveCoding, Command); //如果不包含该项数据则在键值对中添加 if (!ReturnData.ContainsKey(Decode)) { //添加本地数据内容 Entity.Device device = new Entity.Device(); device.Decode = pl.DeviceCode; device.Dename = pl.DeviceName; device.StartTime = DateTime.Now; device.RunStatus = "Running"; device.SendDataSize += SendCommandByteSize; device.SendCount += 1; device.Dccode = pl.CommandCode; ReturnData.Add(Decode, device); } else { //每次更新轮询的数据 ReturnData[Decode].SendDataSize += SendCommandByteSize; ReturnData[Decode].SendCount += 1; //检测键值对是否发生变化,发生变化时赋予新值 } //成功返回了信息 if (client[DpcID].Returnvalue.ContainsKey(IP)) { int ReceiveCommandByteSize = Encoding.Default.GetBytes(client[DpcID].Returnvalue[IP].ToCharArray()).Length; //存放返回的所有数据 Dictionary ItemData = new Dictionary(); int[] Arr = BaseUtil.GetDecimalData(BaseUtil.ASCIIToString(client[DpcID].Returnvalue[IP]), 8); for (int i = 0; i < Arr.Length; i++) { ItemData.Add("Item" + i, Arr[i].ToString()); } if (!ReturnData.ContainsKey(Decode)) { //添加本地数据内容 Entity.Device device = new Entity.Device(); device.Decode = pl.DeviceCode; device.Dename = pl.DeviceName; device.StartTime = DateTime.Now; device.RunStatus = "Running"; device.ReceiveDataSize += ReceiveCommandByteSize; device.Dccode = pl.CommandCode; device.ItemData = ItemData; ReturnData.Add(Decode, device); } else { if (ReturnData[Decode].ItemData == null) { ReturnData[Decode].ItemData = ItemData; } //每次更新轮询的数据 ReturnData[Decode].ReceiveDataSize += ReceiveCommandByteSize; //检测键值对是否发生变化,发生变化时赋予新值 if ((BaseUtil.CheckDicDiff(ReturnData[Decode].ItemData, ItemData))) { ReturnData[Decode].ItemData = ItemData; QueueUpdateDevice.Enqueue(ReturnData[Decode]); LogicHandler.DoDeviceDataDiffLog(pl.DeviceCode, pl.DeviceName, pl.CommandCode, User.UserName); } } client[DpcID].Returnvalue.Remove(IP); } } } /// /// 停止全部轮询 /// /// /// private void ButtonPausePolling_Click(object sender, EventArgs e) { foreach (var item in Ptime) { item.Value.Stop(); } PollSettingPaintRowIndex.Clear(); GridPollingSetting.Focus(); client.Clear(); Ptime.Clear(); } private void GridViewPollSetting_CellValueChanging(object sender, DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs e) { if (e.Column.Name.ToUpper() == "DPC_ENABLE") { GridViewPollSetting.SetRowCellValue(e.RowHandle, e.Column, e.Value); if (GridViewPollSetting.GetRowCellValue(e.RowHandle, "DPC_ENABLE").ToString() == "0") { int id = int.Parse(GridViewPollSetting.GetRowCellValue(e.RowHandle, "DPC_ID").ToString()); if (Ptime.ContainsKey(id)) { Ptime[id].Stop(); Ptime.Remove(id); client.Remove(id.ToString()); PollSettingPaintRowIndex.Remove(e.RowHandle); } } else { Polling pl = new Polling(); pl.Id = int.Parse(GridViewPollSetting.GetRowCellValue(e.RowHandle, "DPC_ID").ToString()); pl.DeviceCode = GridViewPollSetting.GetRowCellValue(e.RowHandle, "DPC_DECODE").ToString(); pl.DeviceName = GridViewPollSetting.GetRowCellValue(e.RowHandle, "DPC_DENAME").ToString(); pl.Interval = int.Parse(GridViewPollSetting.GetRowCellValue(e.RowHandle, "DPC_INTERVAL").ToString()); pl.CommandCode = GridViewPollSetting.GetRowCellValue(e.RowHandle, "DPC_DCCODE").ToString(); pl.Enable = GridViewPollSetting.GetRowCellValue(e.RowHandle, "DPC_ENABLE").ToString() != "0"; pl.Dh = new DataHelper(); if (pl.Enable) pt.AddTask(RunTask, pl); PollSettingPaintRowIndex.Add(e.RowHandle); } } } private void GridViewPollSetting_CellValueChanged(object sender, DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs e) { } private void ButtonSaveCommandSet_Click(object sender, EventArgs e) { ButtonSaveCommandSet.DoSaveAfterHandler(); sql.Clear(); sql.Append("update DEVICEPOLLINGCONFIG set dpc_man='" + User.UserCode + "' where dpc_id=:dpc_id"); if (ButtonSaveCommandSet.LastSaveID != null && ButtonSaveCommandSet.LastSaveID.Length > 0) { dh.BatchInsert(sql.ToString(), new string[] { "dpc_id" }, ButtonSaveCommandSet.LastSaveID); } GridPollingSetting.RefreshData(); } /// /// 设置GridView多选放大镜 /// /// /// private void PagePollingSetting_VisibleChanged(object sender, EventArgs e) { if (PagePollingSetting.PageVisible) { //如果未开启则进行开启 if (!mbt.IsOpen) mbt.Open(); DataTable dt = (DataTable)SystemInf.dh.ExecuteSql("SELECT DC_CODE,DC_NAME,DC_REMARK FROM DEVICECOMMAND", "select"); PollSettingItemSearchLookUpEdit.DataSource = dt; PollSettingItemSearchLookUpEdit.DisplayMember = "DC_CODE"; PollSettingItemSearchLookUpEdit.ValueMember = "DC_CODE"; } } #endregion #region 设备查看界面 private void PageDeviceStatus_VisibleChanged(object sender, EventArgs e) { if (PageDeviceStatus.PageVisible) { DeviceStatusQuerySQL.Clear(); DeviceStatusQuerySQL.Append("select distinct de_code,de_name,dpc_status,dpc_id from device left join DEVICEPOLLINGCONFIG on dpc_decode=de_code order by de_code"); PaintDeviceStatusControl(DeviceStatusQuerySQL.ToString()); //填充筛选条件,车间和线体 DataTable dt = (DataTable)dh.ExecuteSql("select wc_code,wc_name from workcenter", "select"); BaseUtil.FillComBoxEditWidthDataTable(ComboxDeviceStatusWC, "wc_name", "wc_code", dt, true); } } private void CheckEditDeviceStatusEnable_CheckedChanged(object sender, EventArgs e) { DeviceStatusQuerySQL.Clear(); if (CheckEditDeviceStatusEnable.Checked) { DeviceStatusQuerySQL.Append("select distinct de_code,de_name,dpc_status,dpc_id from device left join DEVICEPOLLINGCONFIG "); DeviceStatusQuerySQL.Append("on dpc_decode=de_code where nvl(dpc_enable,0)<>0 order by de_code"); } else { DeviceStatusQuerySQL.Append("select distinct de_code,de_name,dpc_status,dpc_id from device left join DEVICEPOLLINGCONFIG "); DeviceStatusQuerySQL.Append("on dpc_decode=de_code order by de_code"); } PaintDeviceStatusControl(DeviceStatusQuerySQL.ToString()); } private void ComboxDeviceStatusWC_SelectedIndexChanged(object sender, EventArgs e) { DeviceStatusQuerySQL.Clear(); string WC = BaseUtil.GetComboxEditValue(ComboxDeviceStatusWC); if (CheckEditDeviceStatusEnable.Checked) { DeviceStatusQuerySQL.Append("select distinct de_code,de_name,dpc_status,dpc_id from device left join DEVICEPOLLINGCONFIG "); DeviceStatusQuerySQL.Append("on dpc_decode=de_code where nvl(dpc_enable,0)<>0 and de_wccode='" + WC + "' order by de_code"); } else { DeviceStatusQuerySQL.Append("select distinct de_code,de_name,dpc_status,dpc_id from device left join DEVICEPOLLINGCONFIG "); DeviceStatusQuerySQL.Append("on dpc_decode=de_code where de_wccode='" + WC + "' order by de_code"); } PaintDeviceStatusControl(DeviceStatusQuerySQL.ToString()); sql.Clear(); if (WC == "全部") sql.Append("select li_code,li_name from line"); else sql.Append("select li_code,li_name from line where li_wccode='" + WC + "'"); DataTable dt = (DataTable)dh.ExecuteSql(sql.ToString(), "select"); BaseUtil.FillComBoxEditWidthDataTable(ComboxDeviceStatusLC, "li_code", "li_name", dt, true); } private void ComboxDeviceStatusLC_SelectedIndexChanged(object sender, EventArgs e) { DeviceStatusQuerySQL.Clear(); string WC = BaseUtil.GetComboxEditValue(ComboxDeviceStatusWC); string LC = BaseUtil.GetComboxEditValue(ComboxDeviceStatusLC); if (CheckEditDeviceStatusEnable.Checked) { DeviceStatusQuerySQL.Append("select distinct de_code,de_name,dpc_status,dpc_id from device left join "); DeviceStatusQuerySQL.Append("DEVICEPOLLINGCONFIG on dpc_decode=de_code where nvl(dpc_enable,0)<>0"); if (WC != "全部") DeviceStatusQuerySQL.Append(" and de_wccode='" + WC + "' "); if (LC != "全部") DeviceStatusQuerySQL.Append(" and de_linecode='" + LC + "' "); DeviceStatusQuerySQL.Append(" order by de_code"); } else { DeviceStatusQuerySQL.Append("select distinct de_code,de_name,dpc_status,dpc_id from device left join "); DeviceStatusQuerySQL.Append("DEVICEPOLLINGCONFIG on dpc_decode=de_code "); if (WC != "全部" && LC != "全部") DeviceStatusQuerySQL.Append(" where de_wccode='" + WC + "' and de_linecode='" + LC + "' "); if (WC == "全部" && LC != "全部") DeviceStatusQuerySQL.Append(" where de_linecode='" + LC + "' "); if (WC != "全部" && LC == "全部") DeviceStatusQuerySQL.Append(" where de_wccode='" + WC + "' "); DeviceStatusQuerySQL.Append("order by de_code"); } PaintDeviceStatusControl(DeviceStatusQuerySQL.ToString()); } private void PaintDeviceStatusControl(string SQL) { DataTable dt = (DataTable)dh.ExecuteSql(SQL, "select"); //界面重新展示时如过数量不一致则重新绘制 if (PanelDeviceStatus.Controls.Count != dt.Rows.Count) { PanelDeviceStatus.Controls.Clear(); int CountPerRow = PanelDeviceStatus.Width / 110; int RightPadding = PanelDeviceStatus.Width % 110; int Count = dt.Rows.Count; int RowCount = Count % CountPerRow == 0 ? Count / CountPerRow : Count / CountPerRow + 1; int LastRowCount = 0; for (int i = 0; i < PanelDeviceStatus.Controls.Count; i++) { PanelDeviceStatus.Controls[i].Dispose(); } ContextMenu ContextMenu = new ContextMenu(); for (int j = 0; j < RowCount; j++) { //如果是最后一行则循环尾数 if (j == RowCount - 1) { LastRowCount = Count % CountPerRow; } for (int i = 0; i < (j == RowCount - 1 ? LastRowCount : CountPerRow); i++) { PictureEditWithText pic = new PictureEditWithText(); pic.DeviceName = dt.Rows[j * CountPerRow + i]["de_name"].ToString(); pic.Picedit.ToolTipController = CommonTipController; pic.Picedit.ContextMenu = ContextMenu; pic.Picedit.Click += Pic_Click; pic.Name = dt.Rows[j * CountPerRow + i]["de_code"].ToString() + i + j; pic.Anchor = AnchorStyles.Left; pic.Anchor = AnchorStyles.Top; pic.Picedit.Name = dt.Rows[j * CountPerRow + i]["de_code"].ToString(); pic.Picedit.MouseHover += Pic_MouseHover; pic.Picedit.Properties.SizeMode = PictureSizeMode.Squeeze; //如果该设备已启动 if (ReturnData.ContainsKey(dt.Rows[j * CountPerRow + i]["de_code"].ToString())) { if (ReturnData[dt.Rows[j * CountPerRow + i]["de_code"].ToString()].RunStatus == "Running") { pic.Picedit.Image = Properties.Resources.net_connected; } } else { pic.Picedit.Image = Properties.Resources.network_offline; } pic.Text = dt.Rows[j * CountPerRow + i]["de_code"].ToString(); pic.Picedit.BorderStyle = BorderStyles.HotFlat; pic.Location = new Point((10 + RightPadding) / 2 + 110 * i, 10 + j * 150); PanelDeviceStatus.Controls.Add(pic); } } BaseUtil.CleanMemory(); TimerDeviceStatus.Start(); } } private void Pic_Click(object sender, EventArgs e) { PictureEdit pic = sender as PictureEdit; DeviceStatusInfo dsi = new DeviceStatusInfo(pic.Name); dsi.StartPosition = FormStartPosition.CenterScreen; dsi.ShowDialog(); } private void Pic_MouseHover(object sender, EventArgs e) { //使用Tip显示轮询数据 PictureEdit pic = sender as PictureEdit; DataTable dt = (DataTable)dh.ExecuteSql("select * from DEVICEPOLLINGLOG where dpg_id=(select max(dpg_id) from DEVICEPOLLINGLOG where dpg_decode='" + pic.Name + "')", "select"); if (dt.Rows.Count > 0) { sql.Clear(); sql.Append("开始时间" + dt.Rows[0]["dpg_starttime"].ToString() + "\n"); sql.Append("发送数据大小" + dt.Rows[0]["dpg_senddatasize"].ToString() + "字节\n"); sql.Append("接收数据大小" + dt.Rows[0]["dpg_receivedatasize"].ToString() + "字节\n"); sql.Append("轮询次数" + dt.Rows[0]["dpg_count"].ToString() + "次\n"); CommonTipController.ShowHint(sql.ToString(), pic.Name); } else { CommonTipController.ShowHint("暂无信息", pic.Name); } } //重新展示设备图像界面 private void ShowDeviceStatus() { DataTable dt = (DataTable)dh.ExecuteSql(DeviceStatusQuerySQL.ToString(), "select"); int CountPerRow = PanelDeviceStatus.Width / 110; int RightPadding = PanelDeviceStatus.Width % 110; int Count = dt.Rows.Count; int RowCount = Count % CountPerRow == 0 ? Count / CountPerRow : Count / CountPerRow + 1; int LastRowCount = 0; //只更换现有控件的图片,不必重新绘制控件 for (int j = 0; j < RowCount; j++) { //如果是最后一行则循环尾数 if (j == RowCount - 1) { LastRowCount = Count % CountPerRow; } for (int i = 0; i < (j == RowCount - 1 ? LastRowCount : CountPerRow); i++) { if (ReturnData.ContainsKey(dt.Rows[j * CountPerRow + i]["de_code"].ToString())) { if (ReturnData[dt.Rows[j * CountPerRow + i]["de_code"].ToString()].RunStatus == "Running") { (PanelDeviceStatus.Controls[dt.Rows[j * CountPerRow + i]["de_code"].ToString() + i + j] as PictureEditWithText).Picedit.Image = Properties.Resources.net_connected; } } else { (PanelDeviceStatus.Controls[dt.Rows[j * CountPerRow + i]["de_code"].ToString() + i + j] as PictureEditWithText).Picedit.Image = Properties.Resources.network_offline; } } } BaseUtil.CleanMemory(); } //刷新界面 private void TimerDeviceStatus_Tick(object sender, EventArgs e) { if (PageDeviceStatus.PageVisible) { ShowDeviceStatus(); } } private void PanelDeviceStatus_SizeChanged(object sender, EventArgs e) { if (PageDeviceStatus.PageVisible) { ShowDeviceStatus(); TimerDeviceStatus.Start(); } } #endregion } }