Main.cs 49 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010
  1. using System;
  2. using System.Data;
  3. using System.Text;
  4. using System.Collections.Generic;
  5. using System.Drawing;
  6. using System.Windows.Forms;
  7. using DevExpress.XtraBars;
  8. using DevExpress.XtraGrid.Views.Grid;
  9. using DevExpress.XtraBars.Ribbon;
  10. using DevExpress.XtraEditors.Controls;
  11. using DevExpress.XtraEditors;
  12. using UAS_PLCDataReader.DataOperate;
  13. using UAS_PLCDataReader.Entity;
  14. using UAS_PLCDataReader.PublicMethod;
  15. using UAS_PLCDataReader.CustomerControl.PictureEditWithText;
  16. using UAS_PLCDataReader.Device.Infomation;
  17. namespace UAS_PLCDataReader
  18. {
  19. public partial class Main : RibbonForm
  20. {
  21. StringBuilder sql = new StringBuilder();
  22. //用于设备状态查询界面SQL查看
  23. StringBuilder DeviceStatusQuerySQL = new StringBuilder();
  24. //用于设备主档资料查询界面SQL查看
  25. StringBuilder DeviceListQuerySQL = new StringBuilder();
  26. DataHelper dh = SystemInf.dh;
  27. List<string> SQL = new List<string>();
  28. DataHelper updatedh = new DataHelper();
  29. //存放所有的设备返回的数据,用于比较
  30. public static Dictionary<string, Entity.Device> ReturnData = new Dictionary<string, Entity.Device>();
  31. /// <summary>
  32. /// 需要更新的设备列表
  33. /// </summary>
  34. public static Queue<string> QueueUpdateDevice = new Queue<string>();
  35. /// <summary>
  36. /// 本地设定的上传时间
  37. /// </summary>
  38. int TimeSpan = 1;
  39. #region 初始化代码
  40. public Main()
  41. {
  42. InitializeComponent();
  43. CheckForIllegalCrossThreadCalls = false;
  44. dpc_enableCheckEdit.QueryCheckStateByValue += CheckedEdit_QueryCheckStateByValue;
  45. CommandSetRepositoryItemComboBox1.ParseEditValue += CommandSetRepositoryItemComboBox1_ParseEditValue;
  46. DataItemRepositoryItemComboBox1.ParseEditValue += CommandSetRepositoryItemComboBox1_ParseEditValue;
  47. DataItemRepositoryItemComboBox1.SelectedValueChanged += DataItemRepositoryItemComboBox1_SelectedValueChanged;
  48. CheckEditCommandSet.QueryCheckStateByValue += CheckedEdit_QueryCheckStateByValue;
  49. PollSettingItemSearchLookUpEdit.ParseEditValue += PollSettingItemSearchLookUpEdit_ParseEditValue;
  50. PollSettingDeviceSearchLookUpEdit.ParseEditValue += PollSettingItemSearchLookUpEdit_ParseEditValue;
  51. GridViewPollSetting.RowCellStyle += GridViewPollSetting_RowCellStyle;
  52. #region 添加发送接收编码规则的静态值
  53. ComboBoxData cbd = new ComboBoxData();
  54. cbd.Text = "UTF-8";
  55. cbd.Value = "UTF-8";
  56. ComboBoxData cbd1 = new ComboBoxData();
  57. cbd1.Text = "Hexadecimal";
  58. cbd1.Value = "Hexadecimal";
  59. ComboBoxData cbd2 = new ComboBoxData();
  60. cbd2.Text = "ASCII";
  61. cbd2.Value = "ASCII";
  62. CommandSetRepositoryItemComboBox1.Items.Add(cbd);
  63. CommandSetRepositoryItemComboBox1.Items.Add(cbd1);
  64. CommandSetRepositoryItemComboBox1.Items.Add(cbd2);
  65. ComboBoxData cbd3 = new ComboBoxData();
  66. cbd3.Text = "投入";
  67. cbd3.Value = "INQTY";
  68. ComboBoxData cbd4 = new ComboBoxData();
  69. cbd4.Text = "产出";
  70. cbd4.Value = "OUTQTY";
  71. ComboBoxData cbd5 = new ComboBoxData();
  72. cbd5.Text = "温度";
  73. cbd5.Value = "TEMPERATURE";
  74. ComboBoxData cbd6 = new ComboBoxData();
  75. cbd6.Text = "参数1";
  76. cbd6.Value = "PARAM1";
  77. ComboBoxData cbd7 = new ComboBoxData();
  78. cbd7.Text = "参数2";
  79. cbd7.Value = "PARAM2";
  80. ComboBoxData cbd8 = new ComboBoxData();
  81. cbd8.Text = "参数3";
  82. cbd8.Value = "PARAM3";
  83. ComboBoxData cbd9 = new ComboBoxData();
  84. cbd9.Text = "参数4";
  85. cbd9.Value = "PARAM4";
  86. ComboBoxData cbd10 = new ComboBoxData();
  87. cbd10.Text = "参数5";
  88. cbd10.Value = "PARAM5";
  89. ComboBoxData cbd11 = new ComboBoxData();
  90. cbd11.Text = "参数6";
  91. cbd11.Value = "PARAM6";
  92. ComboBoxData cbd12 = new ComboBoxData();
  93. cbd12.Text = "参数7";
  94. cbd12.Value = "PARAM7";
  95. ComboBoxData cbd13 = new ComboBoxData();
  96. cbd13.Text = "参数8";
  97. cbd13.Value = "PARAM8";
  98. ComboBoxData cbd14 = new ComboBoxData();
  99. cbd14.Text = "参数9";
  100. cbd14.Value = "PARAM9";
  101. ComboBoxData cbd15 = new ComboBoxData();
  102. cbd15.Text = "参数10";
  103. cbd15.Value = "PARAM10";
  104. DataItemRepositoryItemComboBox1.Items.Add(cbd3);
  105. DataItemRepositoryItemComboBox1.Items.Add(cbd4);
  106. DataItemRepositoryItemComboBox1.Items.Add(cbd5);
  107. DataItemRepositoryItemComboBox1.Items.Add(cbd6);
  108. DataItemRepositoryItemComboBox1.Items.Add(cbd7);
  109. DataItemRepositoryItemComboBox1.Items.Add(cbd8);
  110. DataItemRepositoryItemComboBox1.Items.Add(cbd9);
  111. DataItemRepositoryItemComboBox1.Items.Add(cbd10);
  112. DataItemRepositoryItemComboBox1.Items.Add(cbd11);
  113. DataItemRepositoryItemComboBox1.Items.Add(cbd12);
  114. DataItemRepositoryItemComboBox1.Items.Add(cbd13);
  115. DataItemRepositoryItemComboBox1.Items.Add(cbd14);
  116. DataItemRepositoryItemComboBox1.Items.Add(cbd15);
  117. #endregion
  118. }
  119. private void DataItemRepositoryItemComboBox1_SelectedValueChanged(object sender, EventArgs e)
  120. {
  121. ComboBoxData item = new ComboBoxData();
  122. try
  123. {
  124. item = (ComboBoxData)(sender as ComboBoxEdit).SelectedItem;
  125. string text = item.Text.ToString();
  126. string value = item.Value;
  127. GridView myView = (GridCommandSetting.MainView as GridView);
  128. int dataIndex = myView.GetDataSourceRowIndex(myView.FocusedRowHandle);
  129. DataTable dt = (DataTable)GridCommandSetting.DataSource;
  130. dt.Rows[dataIndex]["dc_type"] = value;
  131. }
  132. catch (Exception ex)
  133. {
  134. XtraMessageBox.Show(ex.Message, "提示");
  135. }
  136. }
  137. private void CommandSetRepositoryItemComboBox1_ParseEditValue(object sender, ConvertEditValueEventArgs e)
  138. {
  139. string val = "";
  140. if (e.Value != null)
  141. {
  142. val = e.Value.ToString();
  143. }
  144. else
  145. {
  146. val = "FALSE";//默认为不选
  147. }
  148. e.Value = val;
  149. e.Handled = true;
  150. }
  151. private void PollSettingItemSearchLookUpEdit_ParseEditValue(object sender, ConvertEditValueEventArgs e)
  152. {
  153. e.Handled = true;
  154. }
  155. private void Main_Load(object sender, EventArgs e)
  156. {
  157. //设备列表
  158. GridDeviceList.GetDataSQL = "SELECT 0 CHECKEDCOLUMN,DE_ID,DE_CODE,DE_NAME,DE_CURRENTCENTERCODE,DE_CURRENTCENTERNAME,DE_SPEC,DE_INDATE,DE_RUNSTATUS,DE_ADDRESS,DE_INMAN,DE_LINECODE,DE_WCCODE,DE_VENDCODE,DE_VENDNAME,DE_STEPCODE,DE_STEPNAME,DE_SOURCECODE,DE_ITEM1,DE_ITEM2,DE_ITEM3,DE_ITEM4,DE_ITEM5,DE_ITEM6,DE_ITEM7,DE_ITEM8,DE_ITEM9,DE_ITEM10 FROM DEVICE ORDER BY DE_CODE".ToUpper();
  159. GridDeviceList.TableName = "device";
  160. GridDeviceList.ID = "de_id";
  161. GridDeviceList.InsertSQL = "INSERT INTO DEVICE(DE_ID,DE_CODE,DE_NAME,DE_SPEC,DE_CURRENTCENTERCODE,DE_CURRENTCENTERNAME,DE_INDATE,DE_RUNSTATUS,DE_ADDRESS,DE_INMAN,DE_LINECODE,DE_WCCODE,DE_VENDCODE,DE_VENDNAME,DE_STEPCODE,DE_STEPNAME,DE_SOURCECODE,DE_ITEM1,DE_ITEM2,DE_ITEM3,DE_ITEM4,DE_ITEM5,DE_ITEM6,DE_ITEM7,DE_ITEM8,DE_ITEM9,DE_ITEM10) VALUES(DEVICE_SEQ.NEXTVAL,:DE_CODE,:DE_NAME,:DE_CURRENTCENTERCODE,:DE_CURRENTCENTERNAME,:DE_SPEC,sysdate,:DE_RUNSTATUS,:DE_ADDRESS,:DE_INMAN,:DE_LINECODE,:DE_WCCODE,:DE_VENDCODE,:DE_VENDNAME,:DE_STEPCODE,:DE_STEPNAME,:DE_SOURCECODE,:DE_ITEM1,:DE_ITEM2,:DE_ITEM3,:DE_ITEM4,:DE_ITEM5,:DE_ITEM6,:DE_ITEM7,:DE_ITEM8,:DE_ITEM9,:DE_ITEM10)";
  162. ButtonAddDevice.Grid = GridDeviceList;
  163. ButtonSaveDevice.Grid = GridDeviceList;
  164. ButtonDeleteDevice.Grid = GridDeviceList;
  165. //轮询配置界面
  166. GridPollingSetting.GetDataSQL = "SELECT '' POLLSETTINGSTATUSCOLUMN,0 CHECKEDCOLUMN,DPC_MAN,DPC_ID,DPC_DECODE,de_name 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 left join device on de_code=dpc_decode WHERE DPC_MAN='" + User.UserCode + "' ORDER BY dpc_decode";
  167. GridPollingSetting.ID = "DPC_ID";
  168. GridPollingSetting.TableName = "DEVICEPOLLINGCONFIG";
  169. 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_DENAME,:DPC_INTERVAL ,:DPC_DCCODE ,:DPC_FUNCTION , :DPC_ENABLE,:DPC_STATUS ,:DPC_REMARK,'" + User.UserCode + "')";
  170. ButtonSaveCommandSet.Grid = GridPollingSetting;
  171. ButtonNewCommandSet.Grid = GridPollingSetting;
  172. ButtonDeleteCommandSet.Grid = GridPollingSetting;
  173. //指令设置界面
  174. GridCommandSetting.GetDataSQL = "select 0 CHECKEDCOLUMN,dc_id,dc_code,dc_name,dc_type,case when dc_type='INQTY' then '投入' when dc_type='OUTQTY' then '产出' when dc_type='TEMPERATURE' then '温度' when dc_type='PARAM1' then '参数1' when dc_type='PARAM2' then '参数2' when dc_type='PARAM3' then '参数3' when dc_type='PARAM4' then '参数4' when dc_type='PARAM5' then '参数5' when dc_type='PARAM6' then '参数6' when dc_type='PARAM7' then '参数7' when dc_type='PARAM8' then '参数8' when dc_type='PARAM9' then '参数9' when dc_type='PARAM10' then '参数10' when dc_type='PARAM3' then '参数3' end dc_typename,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();
  175. GridCommandSetting.TableName = "devicecommand";
  176. GridCommandSetting.ID = "dc_id";
  177. 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,dc_type) values(devicecommand_seq.nextval,:dc_code,:dc_name,:dc_value,'" + BaseUtil.GetComboxEditValue(Brand) + "',:dc_sendcoding,:dc_receivecoding,'" + User.UserName + "',sysdate,:dc_dataindex,:dc_type)";
  178. ButtonSaveCommand.Grid = GridCommandSetting;
  179. ButtonDeleteCommand.Grid = GridCommandSetting;
  180. ButtonNewCommand.Grid = GridCommandSetting;
  181. //设备联网配置界面
  182. 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_decode";
  183. GridDeviceNetSetting.ID = "dnc_id";
  184. GridDeviceNetSetting.TableName = "DEVICENETCONFIG";
  185. 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)";
  186. ButtonDeleteNetConfig.Grid = GridDeviceNetSetting;
  187. ButtonAddNetConfig.Grid = GridDeviceNetSetting;
  188. ButtonSaveNetConfig.Grid = GridDeviceNetSetting;
  189. GridDeviceData.GetDataSQL = "select dr_decode,dr_dename,case when dr_runstatus='disconnected' then '无法连接' when dr_runstatus='stopped' then '未运行' when dr_runstatus='running' then '运行中' when dr_runstatus='noanswer' then '无应答' end dr_runstatus,dr_qty,dr_okqty from devicerunstatus";
  190. GridDeviceRunLog.GetDataSQL = "SELECT * FROM DEVICERUNRECORD";
  191. GridDeviceRunLog.ID = "drr_id";
  192. GridDeviceRunLog.TableName = "DEVICERUNRECORD";
  193. if (int.TryParse(BaseUtil.GetCacheData("UpdateTime").ToString(), out TimeSpan))
  194. {
  195. TimerUpdateDevice.Interval = TimeSpan * 60 * 1000;
  196. }
  197. else
  198. {
  199. TimerUpdateDevice.Interval = 60 * 1000;
  200. }
  201. TimerUpdateDevice.Start();
  202. TimerUpdateSQL.Start();
  203. Ptime = new Dictionary<int, PollingTimer>();
  204. //ButtonPollingSetting.PerformClick();
  205. //ButtonStartPolling.PerformClick();
  206. }
  207. #endregion
  208. #region 设备列表界面
  209. private void GridViewDeviceList_RowCellClick(object sender, RowCellClickEventArgs e)
  210. {
  211. string de_code = GridViewDeviceList.GetRowCellValue(e.RowHandle, "DE_CODE").ToString();
  212. DeviceDetailInfo ddi = new DeviceDetailInfo(de_code);
  213. ddi.StartPosition = FormStartPosition.CenterScreen;
  214. ddi.ShowDialog();
  215. }
  216. private void PageDeviceList_VisibleChanged(object sender, EventArgs e)
  217. {
  218. if (PageDeviceList.PageVisible)
  219. {
  220. DataTable dt;
  221. //填充人员资料,工作中心,线别下拉框
  222. ComBoxDeviceListMan.Properties.DataSource = (DataTable)dh.ExecuteSql("select em_code,em_name from employee ", "select");
  223. dt = (DataTable)dh.ExecuteSql("select wc_code,wc_name from workcenter", "select");
  224. BaseUtil.FillComBoxEditWidthDataTable(ComboxDeviceListWC, "wc_name", "wc_code", dt, true);
  225. DataTable dt1 = (DataTable)dh.ExecuteSql("SELECT DP_NAME,DP_CODE FROM DEPARTMENT", "select");
  226. DeviceItemSearchLookUpEdit.DataSource = dt1;
  227. DeviceItemSearchLookUpEdit.DisplayMember = "DP_NAME";
  228. DeviceItemSearchLookUpEdit.ValueMember = "DP_CODE";
  229. }
  230. }
  231. private void ButtonSaveDevice_Click(object sender, EventArgs e)
  232. {
  233. ButtonSaveDevice.DoSaveAfterHandler(true);
  234. sql.Clear();
  235. sql.Append("update device set de_inman='" + User.UserName + "' where de_id=:de_id");
  236. if (ButtonSaveDevice.LastSaveID != null && ButtonSaveDevice.LastSaveID.Length > 0)
  237. {
  238. dh.BatchInsert(sql.ToString(), new string[] { "de_id" }, ButtonSaveDevice.LastSaveID);
  239. }
  240. GridDeviceList.RefreshData();
  241. }
  242. private void GridViewDeviceList_CellValueChanged(object sender, DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs e)
  243. {
  244. if (e.Column.FieldName == "DE_CURRENTCENTERNAME")
  245. {
  246. DataTable dt = (DataTable)DeviceItemSearchLookUpEdit.DataSource;
  247. if (dt != null)
  248. {
  249. DataRow[] dr = dt.Select("dp_code='" + e.Value + "'");
  250. if (dr.Length > 0)
  251. {
  252. GridViewDeviceList.SetRowCellValue(e.RowHandle, "DE_CURRENTCENTERCODE", dr[0]["dp_code"]);
  253. }
  254. }
  255. }
  256. }
  257. private void ComboxDeviceListWC_SelectedIndexChanged(object sender, EventArgs e)
  258. {
  259. DeviceListQuerySQL.Clear();
  260. string WC = BaseUtil.GetComboxEditValue(ComboxDeviceListWC);
  261. DeviceListQuerySQL.Append("select 0 CHECKEDCOLUMN,DE_CURRENTCENTERCODE,DE_CURRENTCENTERNAME,de_id,de_code,de_name,de_spec,de_indate,de_runstatus,de_address,de_wccode,de_inman,de_linecode");
  262. DeviceListQuerySQL.Append("de_vendcode,de_vendname,de_stepcode,de_stepname,DE_SOURCECODE from device where de_wccode='" + WC + "' order by de_code");
  263. sql.Clear();
  264. if (WC == "全部")
  265. sql.Append("select li_code,li_name from line");
  266. else
  267. sql.Append("select li_code,li_name from line where li_wccode='" + WC + "'");
  268. DataTable dt = (DataTable)dh.ExecuteSql(sql.ToString(), "select");
  269. BaseUtil.FillComBoxEditWidthDataTable(ComboxDeviceListLC, "li_code", "li_name", dt, true);
  270. RefreshDeviceData();
  271. }
  272. private void ComboxDeviceListLC_SelectedIndexChanged(object sender, EventArgs e)
  273. {
  274. DeviceListQuerySQL.Clear();
  275. string WC = BaseUtil.GetComboxEditValue(ComboxDeviceListWC);
  276. string LC = BaseUtil.GetComboxEditValue(ComboxDeviceListLC);
  277. DeviceListQuerySQL.Append("select 0 CHECKEDCOLUMN,DE_CURRENTCENTERCODE,DE_CURRENTCENTERNAME,de_id,de_code,de_name,de_spec,de_indate,de_runstatus,de_address,de_wccode, ");
  278. DeviceListQuerySQL.Append("de_vendcode,de_vendname,de_inman,de_linecode,de_stepcode,de_stepname,DE_SOURCECODE,de_item1,de_item2,de_item3,de_item4,de_item5,de_item6,de_item7,de_item8,de_item9,de_item10 from device where 1=1");
  279. if (WC != "全部")
  280. DeviceListQuerySQL.Append(" and de_wccode='" + WC + "' ");
  281. if (LC != "全部")
  282. DeviceListQuerySQL.Append(" and de_linecode='" + LC + "' ");
  283. DeviceListQuerySQL.Append(" order by de_code");
  284. RefreshDeviceData();
  285. }
  286. private void RefreshDeviceData()
  287. {
  288. GridDeviceList.GetDataSQL = DeviceListQuerySQL.ToString();
  289. GridDeviceList.RefreshData();
  290. }
  291. #endregion
  292. #region 界面通用事件
  293. /// <summary>
  294. /// 选项卡切换不同XPage
  295. /// </summary>
  296. /// <param name="sender"></param>
  297. /// <param name="e"></param>
  298. private void ButtonItem_ItemClick(object sender, ItemClickEventArgs e)
  299. {
  300. HideXPage(e.Item.Tag.ToString());
  301. }
  302. /// <summary>
  303. /// 根据点击按钮的Tag显示对应的XPage
  304. /// </summary>
  305. /// <param name="PageName"></param>
  306. private void HideXPage(string PageName)
  307. {
  308. for (int i = 0; i < MainTabControl.TabPages.Count; i++)
  309. {
  310. if (MainTabControl.TabPages[i].Name == PageName)
  311. MainTabControl.TabPages[i].PageVisible = true;
  312. else
  313. MainTabControl.TabPages[i].PageVisible = false;
  314. }
  315. }
  316. /// <summary>
  317. /// 勾选Grid的CheckBox
  318. /// </summary>
  319. /// <param name="sender"></param>
  320. /// <param name="e"></param>
  321. private void CheckedEdit_QueryCheckStateByValue(object sender, DevExpress.XtraEditors.Controls.QueryCheckStateByValueEventArgs e)
  322. {
  323. string val = "";
  324. if (e.Value != null)
  325. {
  326. val = e.Value.ToString();
  327. }
  328. else
  329. {
  330. val = "FALSE";//默认为不选
  331. }
  332. switch (val.ToUpper())
  333. {
  334. case "TRUE":
  335. case "YES":
  336. case "1":
  337. e.CheckState = CheckState.Checked;
  338. break;
  339. case "FALSE":
  340. case "NO":
  341. case "0":
  342. e.CheckState = CheckState.Unchecked;
  343. break;
  344. default:
  345. e.CheckState = CheckState.Checked;
  346. break;
  347. }
  348. e.Handled = true;
  349. }
  350. /// <summary>
  351. /// 设备数据更新列表
  352. /// </summary>
  353. /// <param name="sender"></param>
  354. /// <param name="e"></param>
  355. private void TimerUpdateDevice_Tick(object sender, EventArgs e)
  356. {
  357. if (ReturnData != null)
  358. foreach (var device in ReturnData)
  359. {
  360. Entity.Device item = device.Value;
  361. LogicHandler.DoDevicePollingLog(item.Decode, item.SendDataSize.ToString(), item.ReceiveDataSize.ToString());
  362. LogicHandler.UpdateDeviceData(item.Decode, item.ItemData);
  363. }
  364. }
  365. #endregion
  366. #region PageCommandSet业务代码(指令设置)
  367. /// <summary>
  368. /// 判断指令编号不能重复
  369. /// </summary>
  370. /// <param name="sender"></param>
  371. /// <param name="e"></param>
  372. private void ButtonSaveCommand_Click(object sender, EventArgs e)
  373. {
  374. 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,dc_type) values(devicecommand_seq.nextval,:dc_code,:dc_name,:dc_value,'" + BaseUtil.GetComboxEditValue(Brand) + "',:dc_sendcoding,:dc_receivecoding,'" + User.UserName + "',sysdate,:dc_dataindex,:dc_type)";
  375. ButtonSaveCommand.DoSaveAfterHandler(true);
  376. sql.Clear();
  377. sql.Append("update devicecommand set dc_man='" + User.UserName + "',dc_date=sysdate where dc_id=:dc_id");
  378. if (ButtonSaveCommand.LastSaveID != null && ButtonSaveCommand.LastSaveID.Length > 0)
  379. {
  380. dh.BatchInsert(sql.ToString(), new string[] { "dc_id" }, ButtonSaveCommand.LastSaveID);
  381. }
  382. GridCommandSetting.RefreshData();
  383. }
  384. /// <summary>
  385. /// 加载ComBox品牌数据
  386. /// </summary>
  387. /// <param name="sender"></param>
  388. /// <param name="e"></param>
  389. private void PageCommandSet_VisibleChanged(object sender, EventArgs e)
  390. {
  391. if (PageCommandSet.PageVisible)
  392. {
  393. DataTable dt = (DataTable)SystemInf.dh.ExecuteSql("select * from devicebrand", "select");
  394. BaseUtil.FillComBoxEditWidthDataTable(Brand, "db_name", "db_code", dt);
  395. GridCommandSetting.Condition = " where dc_debrand='" + BaseUtil.GetComboxEditValue(Brand) + "' order by dc_code,dc_dataindex";
  396. }
  397. }
  398. private void Brand_SelectedIndexChanged(object sender, EventArgs e)
  399. {
  400. GridCommandSetting.Condition = " where dc_debrand='" + BaseUtil.GetComboxEditValue(Brand) + "' order by dc_code,dc_dataindex";
  401. GridCommandSetting.RefreshData();
  402. }
  403. #endregion
  404. #region PagePollingSetting业务代码(轮询配置)
  405. PollingTask pt = new PollingTask();
  406. /// <summary>
  407. /// 绘制轮询配置状态栏
  408. /// </summary>
  409. List<int> PollSettingPaintRowIndex = new List<int>();
  410. private void ButtonStartPolling_Click(object sender, EventArgs e)
  411. {
  412. GridView grid = GridViewPollSetting;
  413. for (int i = 0; i < GridPollingSetting.RowCount; i++)
  414. {
  415. Polling pl = new Polling();
  416. pl.Id = int.Parse(GridViewPollSetting.GetRowCellValue(i, "DPC_ID").ToString());
  417. pl.DeviceCode = GridViewPollSetting.GetRowCellValue(i, "DPC_DECODE").ToString();
  418. pl.DeviceName = GridViewPollSetting.GetRowCellValue(i, "DPC_DENAME").ToString();
  419. pl.CommandCode = GridViewPollSetting.GetRowCellValue(i, "DPC_DCCODE").ToString();
  420. pl.Interval = int.Parse(GridViewPollSetting.GetRowCellValue(i, "DPC_INTERVAL").ToString());
  421. pl.Enable = GridViewPollSetting.GetRowCellValue(i, "DPC_ENABLE").ToString() != "0";
  422. pl.Dh = new DataHelper();
  423. if (pl.Enable)
  424. {
  425. //插入轮询日志
  426. sql.Clear();
  427. sql.Append("insert into DEVICEPOLLINGLOG(dpg_id,dpg_decode,dpg_starttime,dpg_interval)values");
  428. sql.Append("(DEVICEPOLLINGLOG_seq.nextval,'" + pl.DeviceCode + "',sysdate,'" + pl.Interval + "')");
  429. QueueUpdateDevice.Enqueue(sql.ToString());
  430. LogicHandler.UpdateDeviceStatus(pl.DeviceCode, pl.DeviceName, DeviceStatus.Noanswer);
  431. pt.AddTask(RunTask, pl);
  432. //添加到状态为运行的行
  433. PollSettingPaintRowIndex.Add(i);
  434. GridPollingSetting.Focus();
  435. }
  436. else LogicHandler.UpdateDeviceStatus(pl.DeviceCode, pl.DeviceName, DeviceStatus.Stopped);
  437. }
  438. ButtonSaveCommandSet.DoSaveAfterHandler(false);
  439. }
  440. private void TimerUpdateSQL_Tick(object sender, EventArgs e)
  441. {
  442. while (QueueUpdateDevice.Count > 0)
  443. {
  444. updatedh.ExecuteSql(QueueUpdateDevice.Dequeue(), "update");
  445. }
  446. }
  447. /// <summary>
  448. /// 绘制轮询状态
  449. /// </summary>
  450. /// <param name="sender"></param>
  451. /// <param name="e"></param>
  452. private void GridViewPollSetting_RowCellStyle(object sender, RowCellStyleEventArgs e)
  453. {
  454. if (e.Column.Name.ToUpper() == "POLLSETTINGSTATUSCOLUMN" && PollSettingPaintRowIndex.Contains(e.RowHandle))
  455. {
  456. e.Appearance.BackColor = Color.Green;
  457. }
  458. }
  459. Dictionary<int, PollingTimer> Ptime;
  460. private void RunTask(object i)
  461. {
  462. PollingTimer timer = new PollingTimer();
  463. Polling pl = (Polling)i;
  464. timer.Polling = i;
  465. timer.Interval = pl.Interval * 1000;
  466. timer.Elapsed += Timer_Tick;
  467. timer.Start();
  468. try
  469. {
  470. if (!Ptime.ContainsKey(pl.Id))
  471. Ptime.Add(pl.Id, timer);
  472. }
  473. catch (Exception)
  474. {
  475. if (!Ptime.ContainsKey(pl.Id))
  476. Ptime.Add(pl.Id, timer);
  477. }
  478. }
  479. Dictionary<string, ModBusTCPClient> client = new Dictionary<string, ModBusTCPClient>();
  480. /// <summary>
  481. /// 轮询执行的业务
  482. /// </summary>
  483. /// <param name="sender"></param>
  484. /// <param name="e"></param>
  485. private void Timer_Tick(object sender, EventArgs e)
  486. {
  487. PollingTimer timer = (PollingTimer)sender;
  488. Polling pl = (Polling)timer.Polling;
  489. DataHelper dh = pl.Dh;
  490. string Decode = pl.DeviceCode;
  491. string Dccode = pl.CommandCode;
  492. string DpcID = pl.Id.ToString();
  493. DataTable DNC = (DataTable)dh.ExecuteSql("select dnc_ip,dnc_port from DEVICENETCONFIG where dnc_decode='" + Decode + "'", "select");
  494. DataTable DC = (DataTable)dh.ExecuteSql("select dc_sendcoding,dc_value,dc_receivecoding,dc_type from devicecommand where dc_code='" + Dccode + "' order by dc_dataindex", "select");
  495. if (DNC.Rows.Count > 0)
  496. {
  497. string IP = DNC.Rows[0]["dnc_ip"].ToString() + ":" + DNC.Rows[0]["dnc_port"].ToString();
  498. string SendCoding = "";
  499. string ReceiveCoding = "";
  500. string Command = "";
  501. int SendCommandByteSize = 0;
  502. if (DC.Rows.Count > 0)
  503. {
  504. SendCoding = DC.Rows[0]["dc_sendcoding"].ToString();
  505. ReceiveCoding = DC.Rows[0]["dc_receivecoding"].ToString();
  506. Command = DC.Rows[0]["dc_value"].ToString();
  507. SendCommandByteSize = Encoding.Default.GetBytes(Command.ToCharArray()).Length;
  508. }
  509. if (client.ContainsKey(DpcID))
  510. {
  511. client[DpcID].Send(Command);
  512. }
  513. else
  514. {
  515. try
  516. {
  517. ModBusTCPClient modclient = new ModBusTCPClient(DNC.Rows[0]["dnc_ip"].ToString(), DNC.Rows[0]["dnc_port"].ToString(), pl.DeviceCode, pl.DeviceName);
  518. modclient.Dh = dh;
  519. client.Add(DpcID, modclient);
  520. }
  521. catch (Exception)
  522. {
  523. LogicHandler.UpdateDeviceStatus(pl.DeviceCode, pl.DeviceName, DeviceStatus.Disconnect);
  524. }
  525. }
  526. //如果不包含该项数据则在键值对中添加
  527. if (!ReturnData.ContainsKey(Decode))
  528. {
  529. //添加本地数据内容
  530. Entity.Device device = new Entity.Device();
  531. device.Decode = pl.DeviceCode;
  532. device.Dename = pl.DeviceName;
  533. device.StartTime = DateTime.Now;
  534. device.RunStatus = "running";
  535. device.SendDataSize += SendCommandByteSize;
  536. device.SendCount += 1;
  537. device.Dccode = pl.CommandCode;
  538. ReturnData.Add(Decode, device);
  539. }
  540. else
  541. {
  542. //每次更新轮询的数据
  543. ReturnData[Decode].SendDataSize += SendCommandByteSize;
  544. ReturnData[Decode].SendCount += 1;
  545. //检测键值对是否发生变化,发生变化时赋予新值
  546. }
  547. //成功返回了信息
  548. if (client[DpcID].Returnvalue.ContainsKey(IP))
  549. {
  550. int ReceiveCommandByteSize = Encoding.Default.GetBytes(client[DpcID].Returnvalue[IP].ToCharArray()).Length;
  551. //存放返回的所有数据
  552. Dictionary<string, string> ItemData = new Dictionary<string, string>();
  553. int[] Arr = BaseUtil.GetDecimalData(BaseUtil.ASCIIToString(client[DpcID].Returnvalue[IP]), 8);
  554. //返回的参数个数和定义的参数个数相等或者小于的时候
  555. if (Arr.Length == DC.Rows.Count || DC.Rows.Count > Arr.Length)
  556. {
  557. for (int i = 0; i < Arr.Length; i++)
  558. {
  559. ItemData.Add(DC.Rows[i]["dc_type"].ToString(), Arr[i].ToString());
  560. }
  561. }
  562. else
  563. {
  564. for (int i = 0; i < DC.Rows.Count; i++)
  565. {
  566. ItemData.Add(DC.Rows[i]["dc_type"].ToString(), Arr[i].ToString());
  567. }
  568. }
  569. if (!ReturnData.ContainsKey(Decode))
  570. {
  571. //添加本地数据内容
  572. Entity.Device device = new Entity.Device();
  573. device.Decode = pl.DeviceCode;
  574. device.Dename = pl.DeviceName;
  575. device.StartTime = DateTime.Now;
  576. device.RunStatus = "running";
  577. device.ReceiveDataSize += ReceiveCommandByteSize;
  578. device.Dccode = pl.CommandCode;
  579. device.ItemData = ItemData;
  580. ReturnData.Add(Decode, device);
  581. }
  582. else
  583. {
  584. //在未获取过数据的时候并且获取到的数据不为空的时候进行设备数据的更新
  585. if (ReturnData[Decode].ItemData == null || (ReturnData[Decode].ItemData.Count == 0 && ItemData.Count != 0))
  586. {
  587. ReturnData[Decode].ItemData = ItemData;
  588. LogicHandler.UpdateDeviceData(Decode, ItemData);
  589. LogicHandler.DoDeviceDataDiffLog(pl.DeviceCode, pl.DeviceName, Command, pl.CommandCode, User.UserName);
  590. }
  591. //每次更新轮询的数据
  592. ReturnData[Decode].ReceiveDataSize += ReceiveCommandByteSize;
  593. //检测键值对是否发生变化,发生变化时赋予新值并上传信息
  594. if (BaseUtil.CheckDicDiff(ReturnData[Decode].ItemData, ItemData))
  595. {
  596. LogicHandler.UpdateDeviceData(Decode, ItemData);
  597. LogicHandler.DoDeviceDataDiffLog(pl.DeviceCode, pl.DeviceName, Command, pl.CommandCode, User.UserName);
  598. }
  599. ReturnData[Decode].ItemData = ItemData;
  600. }
  601. client[DpcID].Returnvalue.Remove(IP);
  602. }
  603. }
  604. else LogicHandler.UpdateDeviceStatus(pl.DeviceCode, pl.DeviceName, DeviceStatus.Disconnect);
  605. }
  606. /// <summary>
  607. /// 停止全部轮询
  608. /// </summary>
  609. /// <param name="sender"></param>
  610. /// <param name="e"></param>
  611. private void ButtonPausePolling_Click(object sender, EventArgs e)
  612. {
  613. foreach (var item in Ptime)
  614. {
  615. item.Value.Stop();
  616. }
  617. PollSettingPaintRowIndex.Clear();
  618. GridPollingSetting.Focus();
  619. client.Clear();
  620. Ptime.Clear();
  621. ButtonSaveCommandSet.DoSaveAfterHandler(false);
  622. }
  623. private void ButtonSaveCommandSet_Click(object sender, EventArgs e)
  624. {
  625. ButtonSaveCommandSet.DoSaveAfterHandler(true);
  626. sql.Clear();
  627. sql.Append("update DEVICEPOLLINGCONFIG set dpc_man='" + User.UserCode + "' where dpc_id=:dpc_id");
  628. if (ButtonSaveCommandSet.LastSaveID != null && ButtonSaveCommandSet.LastSaveID.Length > 0)
  629. {
  630. dh.BatchInsert(sql.ToString(), new string[] { "dpc_id" }, ButtonSaveCommandSet.LastSaveID);
  631. }
  632. GridPollingSetting.RefreshData();
  633. }
  634. /// <summary>
  635. /// 设置GridView多选放大镜
  636. /// </summary>
  637. /// <param name="sender"></param>
  638. /// <param name="e"></param>
  639. private void PagePollingSetting_VisibleChanged(object sender, EventArgs e)
  640. {
  641. if (PagePollingSetting.PageVisible)
  642. {
  643. DataTable dt = (DataTable)SystemInf.dh.ExecuteSql("SELECT DC_CODE,DC_NAME,DC_REMARK FROM DEVICECOMMAND", "select");
  644. PollSettingItemSearchLookUpEdit.DataSource = dt;
  645. PollSettingItemSearchLookUpEdit.DisplayMember = "DC_CODE";
  646. PollSettingItemSearchLookUpEdit.ValueMember = "DC_CODE";
  647. DataTable dt1 = (DataTable)SystemInf.dh.ExecuteSql("SELECT DE_CODE,DE_NAME FROM device", "select");
  648. PollSettingDeviceSearchLookUpEdit.DataSource = dt1;
  649. PollSettingDeviceSearchLookUpEdit.DisplayMember = "DE_CODE";
  650. PollSettingDeviceSearchLookUpEdit.ValueMember = "DE_CODE";
  651. }
  652. }
  653. private void GridViewPollSetting_CellValueChanged(object sender, DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs e)
  654. {
  655. if (e.Column.FieldName == "DPC_DECODE")
  656. {
  657. DataTable dt = (DataTable)PollSettingDeviceSearchLookUpEdit.DataSource;
  658. DataRow[] dr = dt.Select("de_code='" + e.Value + "'");
  659. if (dr.Length > 0)
  660. {
  661. GridViewPollSetting.SetRowCellValue(e.RowHandle, "DPC_DENAME", dr[0]["de_name"]);
  662. }
  663. }
  664. }
  665. #endregion
  666. #region 设备查看界面
  667. private void PageDeviceStatus_VisibleChanged(object sender, EventArgs e)
  668. {
  669. if (PageDeviceStatus.PageVisible)
  670. {
  671. DeviceStatusQuerySQL.Clear();
  672. CheckEditDeviceStatusEnable_CheckedChanged(sender, e);
  673. //填充筛选条件,车间和线体
  674. DataTable dt = (DataTable)dh.ExecuteSql("select wc_code,wc_name from workcenter", "select");
  675. BaseUtil.FillComBoxEditWidthDataTable(ComboxDeviceStatusWC, "wc_name", "wc_code", dt, true);
  676. dt = (DataTable)dh.ExecuteSql("select dp_code,dp_name from department", "select");
  677. BaseUtil.FillComBoxEditWidthDataTable(ComboxDeviceDepartment, "dp_name", "dp_code", dt, true);
  678. dt = (DataTable)dh.ExecuteSql("select distinct de_address from device", "select");
  679. BaseUtil.FillComBoxEditWidthDataTable(ComboxDeviceFloor, "de_address", "de_address", dt, true);
  680. }
  681. }
  682. private void CheckEditDeviceStatusEnable_CheckedChanged(object sender, EventArgs e)
  683. {
  684. DeviceStatusQuerySQL.Clear();
  685. if (CheckEditDeviceStatusEnable.Checked)
  686. {
  687. DeviceStatusQuerySQL.Append("select distinct de_code,de_name,dr_runstatus from device left join devicerunstatus ");
  688. DeviceStatusQuerySQL.Append("on dr_decode=de_code left join DEVICEPOLLINGCONFIG on de_code=dpc_decode where nvl(dpc_enable,0)<>0 order by de_code");
  689. }
  690. else
  691. {
  692. DeviceStatusQuerySQL.Append("select distinct de_code,de_name,dr_runstatus from device left join devicerunstatus ");
  693. DeviceStatusQuerySQL.Append("on dr_decode=de_code order by de_code");
  694. }
  695. PaintDeviceStatusControl(DeviceStatusQuerySQL.ToString());
  696. }
  697. private void ComboxDeviceStatusWC_SelectedIndexChanged(object sender, EventArgs e)
  698. {
  699. DeviceStatusQuerySQL.Clear();
  700. string WC = BaseUtil.GetComboxEditValue(ComboxDeviceStatusWC);
  701. if (CheckEditDeviceStatusEnable.Checked)
  702. {
  703. DeviceStatusQuerySQL.Append("select distinct de_code,de_name,dr_runstatus from device left join devicerunstatus ");
  704. DeviceStatusQuerySQL.Append("on dr_decode=de_code left join DEVICEPOLLINGCONFIG on de_code=dpc_decode where nvl(dpc_enable,0)<>0 and de_wccode='" + WC + "' order by de_code");
  705. }
  706. else
  707. {
  708. DeviceStatusQuerySQL.Append("select distinct de_code,de_name,dr_runstatus from device left join devicerunstatus ");
  709. DeviceStatusQuerySQL.Append("on dr_decode=de_code where de_wccode='" + WC + "' order by de_code");
  710. }
  711. PaintDeviceStatusControl(DeviceStatusQuerySQL.ToString());
  712. sql.Clear();
  713. if (WC == "全部")
  714. sql.Append("select li_code,li_name from line");
  715. else
  716. sql.Append("select li_code,li_name from line where li_wccode='" + WC + "'");
  717. DataTable dt = (DataTable)dh.ExecuteSql(sql.ToString(), "select");
  718. BaseUtil.FillComBoxEditWidthDataTable(ComboxDeviceStatusLC, "li_code", "li_name", dt, true);
  719. }
  720. private void ComboxDeviceStatusLC_SelectedIndexChanged(object sender, EventArgs e)
  721. {
  722. DeviceStatusQuerySQL.Clear();
  723. string WC = BaseUtil.GetComboxEditValue(ComboxDeviceStatusWC);
  724. string LC = BaseUtil.GetComboxEditValue(ComboxDeviceStatusLC);
  725. string DE = BaseUtil.GetComboxEditValue(ComboxDeviceDepartment);
  726. string FL = BaseUtil.GetComboxEditValue(ComboxDeviceFloor);
  727. if (CheckEditDeviceStatusEnable.Checked)
  728. {
  729. DeviceStatusQuerySQL.Append("select distinct de_code,de_name,dr_runstatus from device left join ");
  730. DeviceStatusQuerySQL.Append("devicerunstatus on dr_decode=de_code where 1=1");
  731. if (WC != "全部")
  732. DeviceStatusQuerySQL.Append(" and de_wccode='" + WC + "' ");
  733. if (LC != "全部")
  734. DeviceStatusQuerySQL.Append(" and de_linecode='" + LC + "' ");
  735. if (DE != "全部")
  736. DeviceStatusQuerySQL.Append(" and DE_CURRENTCENTERCODE='" + DE + "' ");
  737. if (FL != "全部")
  738. DeviceStatusQuerySQL.Append(" and DE_ADDRESS='" + FL + "' ");
  739. DeviceStatusQuerySQL.Append(" order by de_code");
  740. }
  741. else
  742. {
  743. DeviceStatusQuerySQL.Append("select distinct de_code,de_name,dr_runstatus from device left join ");
  744. DeviceStatusQuerySQL.Append("devicerunstatus on dr_decode=de_code where 1=1");
  745. if (WC != "全部")
  746. DeviceStatusQuerySQL.Append(" and de_wccode='" + WC + "' ");
  747. if (LC != "全部")
  748. DeviceStatusQuerySQL.Append(" and de_linecode='" + LC + "' ");
  749. if (DE != "全部")
  750. DeviceStatusQuerySQL.Append(" and DE_CURRENTCENTERCODE='" + DE + "' ");
  751. if (FL != "全部")
  752. DeviceStatusQuerySQL.Append(" and DE_ADDRESS='" + FL + "' ");
  753. DeviceStatusQuerySQL.Append(" order by de_code");
  754. }
  755. PaintDeviceStatusControl(DeviceStatusQuerySQL.ToString());
  756. }
  757. private void PaintDeviceStatusControl(string SQL)
  758. {
  759. DataTable dt = (DataTable)dh.ExecuteSql(SQL, "select");
  760. //界面重新展示时如过数量不一致则重新绘制
  761. if (PanelDeviceStatus.Controls.Count != dt.Rows.Count)
  762. {
  763. PanelDeviceStatus.Controls.Clear();
  764. int CountPerRow = PanelDeviceStatus.Width / 110;
  765. int RightPadding = PanelDeviceStatus.Width % 110;
  766. int Count = dt.Rows.Count;
  767. int RowCount = Count % CountPerRow == 0 ? Count / CountPerRow : Count / CountPerRow + 1;
  768. int LastRowCount = 0;
  769. for (int i = 0; i < PanelDeviceStatus.Controls.Count; i++)
  770. {
  771. PanelDeviceStatus.Controls[i].Dispose();
  772. }
  773. ContextMenu ContextMenu = new ContextMenu();
  774. for (int j = 0; j < RowCount; j++)
  775. {
  776. //如果是最后一行则循环尾数
  777. if (j == RowCount - 1)
  778. {
  779. if (Count == CountPerRow)
  780. LastRowCount = Count;
  781. else
  782. LastRowCount = Count % CountPerRow;
  783. }
  784. for (int i = 0; i < (j == RowCount - 1 ? LastRowCount : CountPerRow); i++)
  785. {
  786. PictureEditWithText pic = new PictureEditWithText();
  787. pic.DeviceName = dt.Rows[j * CountPerRow + i]["de_name"].ToString();
  788. pic.Picedit.ToolTipController = CommonTipController;
  789. pic.Picedit.ContextMenu = ContextMenu;
  790. pic.Picedit.Click += Pic_Click;
  791. pic.Name = dt.Rows[j * CountPerRow + i]["de_code"].ToString() + i + j;
  792. pic.Anchor = AnchorStyles.Left;
  793. pic.Anchor = AnchorStyles.Top;
  794. pic.Picedit.Name = dt.Rows[j * CountPerRow + i]["de_code"].ToString();
  795. pic.Picedit.MouseHover += Pic_MouseHover;
  796. pic.Picedit.Properties.SizeMode = PictureSizeMode.Squeeze;
  797. //如果该设备已启动
  798. switch (dt.Rows[j * CountPerRow + i]["dr_runstatus"].ToString())
  799. {
  800. case "running":
  801. pic.Picedit.Image = Properties.Resources.running;
  802. break;
  803. case "disconnect":
  804. pic.Picedit.Image = Properties.Resources.disconnect;
  805. break;
  806. case "stopped":
  807. pic.Picedit.Image = Properties.Resources.stopped;
  808. break;
  809. case "noanswer":
  810. pic.Picedit.Image = Properties.Resources.noanswer;
  811. break;
  812. default:
  813. pic.Picedit.Image = Properties.Resources.stopped;
  814. break;
  815. }
  816. pic.Text = dt.Rows[j * CountPerRow + i]["de_code"].ToString();
  817. pic.Picedit.BorderStyle = BorderStyles.HotFlat;
  818. pic.Location = new Point((10 + RightPadding) / 2 + 110 * i, 10 + j * 150);
  819. PanelDeviceStatus.Controls.Add(pic);
  820. }
  821. }
  822. BaseUtil.CleanMemory();
  823. TimerDeviceStatus.Start();
  824. }
  825. }
  826. private void Pic_Click(object sender, EventArgs e)
  827. {
  828. PictureEdit pic = sender as PictureEdit;
  829. DeviceStatusInfo dsi = new DeviceStatusInfo(pic.Name);
  830. dsi.StartPosition = FormStartPosition.CenterScreen;
  831. dsi.ShowDialog();
  832. }
  833. private void Pic_MouseHover(object sender, EventArgs e)
  834. {
  835. //使用Tip显示轮询数据
  836. PictureEdit pic = sender as PictureEdit;
  837. DataTable dt = (DataTable)dh.ExecuteSql("select * from DEVICEPOLLINGLOG where dpg_id=(select max(dpg_id) from DEVICEPOLLINGLOG where dpg_decode='" + pic.Name + "')", "select");
  838. if (dt.Rows.Count > 0)
  839. {
  840. sql.Clear();
  841. sql.Append("开始时间" + dt.Rows[0]["dpg_starttime"].ToString() + "\n");
  842. sql.Append("发送数据大小" + dt.Rows[0]["dpg_senddatasize"].ToString() + "字节\n");
  843. sql.Append("接收数据大小" + dt.Rows[0]["dpg_receivedatasize"].ToString() + "字节\n");
  844. sql.Append("轮询次数" + dt.Rows[0]["dpg_count"].ToString() + "次\n");
  845. CommonTipController.ShowHint(sql.ToString(), pic.Name);
  846. }
  847. else
  848. {
  849. CommonTipController.ShowHint("暂无信息", pic.Name);
  850. }
  851. }
  852. //重新展示设备图像界面
  853. private void ShowDeviceStatus()
  854. {
  855. DataTable dt = (DataTable)dh.ExecuteSql(DeviceStatusQuerySQL.ToString(), "select");
  856. int CountPerRow = PanelDeviceStatus.Width / 110;
  857. int RightPadding = PanelDeviceStatus.Width % 110;
  858. int Count = dt.Rows.Count;
  859. int RowCount = Count % CountPerRow == 0 ? Count / CountPerRow : Count / CountPerRow + 1;
  860. int LastRowCount = 0;
  861. //只更换现有控件的图片,不必重新绘制控件
  862. for (int j = 0; j < RowCount; j++)
  863. {
  864. //如果是最后一行则循环尾数
  865. if (j == RowCount - 1)
  866. {
  867. LastRowCount = Count % CountPerRow;
  868. }
  869. for (int i = 0; i < (j == RowCount - 1 ? LastRowCount : CountPerRow); i++)
  870. {
  871. switch (dt.Rows[j * CountPerRow + i]["dr_runstatus"].ToString())
  872. {
  873. case "running":
  874. (PanelDeviceStatus.Controls[dt.Rows[j * CountPerRow + i]["de_code"].ToString() + i + j] as PictureEditWithText).Picedit.Image = Properties.Resources.running;
  875. break;
  876. case "disconnect":
  877. (PanelDeviceStatus.Controls[dt.Rows[j * CountPerRow + i]["de_code"].ToString() + i + j] as PictureEditWithText).Picedit.Image = Properties.Resources.disconnect;
  878. break;
  879. case "stopped":
  880. (PanelDeviceStatus.Controls[dt.Rows[j * CountPerRow + i]["de_code"].ToString() + i + j] as PictureEditWithText).Picedit.Image = Properties.Resources.stopped;
  881. break;
  882. case "noanswer":
  883. (PanelDeviceStatus.Controls[dt.Rows[j * CountPerRow + i]["de_code"].ToString() + i + j] as PictureEditWithText).Picedit.Image = Properties.Resources.noanswer;
  884. break;
  885. default:
  886. (PanelDeviceStatus.Controls[dt.Rows[j * CountPerRow + i]["de_code"].ToString() + i + j] as PictureEditWithText).Picedit.Image = Properties.Resources.stopped;
  887. break;
  888. }
  889. }
  890. }
  891. BaseUtil.CleanMemory();
  892. }
  893. //刷新界面
  894. private void TimerDeviceStatus_Tick(object sender, EventArgs e)
  895. {
  896. if (PageDeviceStatus.PageVisible)
  897. {
  898. ShowDeviceStatus();
  899. }
  900. }
  901. private void PanelDeviceStatus_SizeChanged(object sender, EventArgs e)
  902. {
  903. if (PageDeviceStatus.PageVisible)
  904. {
  905. ShowDeviceStatus();
  906. TimerDeviceStatus.Start();
  907. }
  908. }
  909. #endregion
  910. #region 设备运行日志查看
  911. private void ButtonSearchDeviceRunLog_Click(object sender, EventArgs e)
  912. {
  913. if (TextDrrDeCode.Text != "")
  914. {
  915. GridDeviceRunLog.GetDataSQL = "SELECT * FROM DEVICERUNRECORD WHERE drr_decode like '%" + TextDrrDeCode.Text + "%'";
  916. }
  917. else
  918. {
  919. GridDeviceRunLog.GetDataSQL = "SELECT * FROM DEVICERUNRECORD";
  920. }
  921. GridDeviceRunLog.RefreshData();
  922. }
  923. #endregion
  924. #region 客户端参数设置
  925. private void ButtonSaveClientParam_Click(object sender, EventArgs e)
  926. {
  927. BaseUtil.SetCacheData("UpdateTime", UpdateTimeSpan.Value);
  928. XtraMessageBox.Show("保存成功!");
  929. }
  930. private void PageClientParam_VisibleChanged(object sender, EventArgs e)
  931. {
  932. if (PageClientParam.PageVisible)
  933. {
  934. decimal time = 0;
  935. if (decimal.TryParse(BaseUtil.GetCacheData("UpdateTime").ToString(), out time))
  936. {
  937. UpdateTimeSpan.Value = time;
  938. }
  939. }
  940. }
  941. #endregion
  942. private void Main_FormClosing(object sender, FormClosingEventArgs e)
  943. {
  944. dh.ExecuteSql("update devicerunstatus set dr_runstatus='disconnected'", "update");
  945. }
  946. }
  947. }