Main.cs 57 KB

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