版博士V2.0程序
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

574 lines
21 KiB

  1. using HalconDotNet;
  2. using ImageToolKits;
  3. using MaiMuAOI.SysCtrl;
  4. using MaiMuControl.Device;
  5. using MaiMuControl.Device.AxisDev;
  6. using MaiMuControl.Device.CamDev;
  7. using MaiMuControl.Utils;
  8. using Newtonsoft.Json;
  9. using OpenCvSharp;
  10. using ProductionControl.UI;
  11. using System;
  12. using System.Collections.Generic;
  13. using System.ComponentModel;
  14. using System.Data;
  15. using System.Drawing;
  16. using System.Linq;
  17. using System.Text;
  18. using System.Threading;
  19. using System.Threading.Tasks;
  20. using System.Windows.Forms;
  21. using ToolKits.EnumTool;
  22. using static MaiMuAOI.ImageProcessing.DefectLib;
  23. using static MaiMuAOI.ImageProcessing.SizeLib;
  24. namespace MaiMuAOI.SysUI.DefectPicShow
  25. {
  26. public partial class DebugTestFrm : Form
  27. {
  28. private SizeLibProp Sizeprop = new SizeLibProp();
  29. private DefectLibProp Defectprop = new DefectLibProp(ConfMgr.Instance.SysConfigParams.Defect_CutSize,
  30. ConfMgr.Instance.SysConfigParams.Defect_ReSize, ConfMgr.Instance.SysConfigParams.Defect_Thresholds);
  31. SynchronizationContext SyncContext1 = null;
  32. SynchronizationContext SyncContext2 = null;
  33. public DebugTestFrm()
  34. {
  35. InitializeComponent();
  36. UIStyle.SetUIStyle(this);
  37. this.uiTitel1.FatherForm = this;
  38. }
  39. private void DebugTestFrm_Load(object sender, EventArgs e)
  40. {
  41. this.Left = 600;
  42. //显示tS曲线
  43. cbTS.Items.Clear();
  44. Type VelType = typeof(VelocityCurveType);
  45. foreach (object s in Enum.GetValues(VelType))
  46. {
  47. string st = EnumExtension.GetEnumDescription((VelocityCurveType)s);
  48. cbTS.Items.Add(st);
  49. }
  50. cbTS.Text = cbTS.Items[0].ToString();
  51. cbTS.SelectedIndex = 0;
  52. cbDir.Items.Clear();
  53. cbDir.Items.Add("相对运动");
  54. cbDir.Items.Add("绝对运动");
  55. cbDir.Text = cbDir.Items[0].ToString();
  56. cbDir.SelectedIndex = 0;
  57. cbAxisName.Items.Clear();
  58. cbAxisName.Items.Add("X1轴");
  59. cbAxisName.Items.Add("X2轴");
  60. cbAxisName.Items.Add("Y轴");
  61. cbAxisName.Items.Add("Z轴");
  62. cbAxisName.Text = cbAxisName.Items[0].ToString();
  63. cbAxisName.SelectedIndex = 0;
  64. cbCH.Items.Clear();
  65. Type lightenum = typeof(LightChannelEnum);
  66. foreach (object s in Enum.GetValues(lightenum))
  67. {
  68. string st = EnumExtension.GetEnumDescription((LightChannelEnum)s);
  69. cbCH.Items.Add(st);
  70. }
  71. cbCH.Text = cbCH.Items[0].ToString();
  72. cbCH.SelectedIndex = 0;
  73. cbLensMotor.SelectedIndex = 8;
  74. timer2.Enabled = true;
  75. if(SysMgr.Instance.QGSts())
  76. button5.Text = "气缸松开";
  77. else
  78. button5.Text = "气缸加紧";
  79. if (SysMgr.Instance.ThicknessSts())
  80. BtnHeightAck.Text = "高度传感器上升";
  81. else
  82. BtnHeightAck.Text = "高度传感器下降";
  83. this.propertyGrid1.SelectedObject = Sizeprop;
  84. this.propertyGrid2.SelectedObject = Defectprop;
  85. //Sizeprop.deserialize("");
  86. this.propertyGrid1.Refresh();
  87. //DATA
  88. SysMgr.Instance.SizeLib.finishEvent += new System.Action<SizeTask>((task) =>
  89. {
  90. Sizeprop.PT1 = task.PT1;
  91. Sizeprop.PT2 = task.PT2;
  92. Sizeprop.Shanxian = task.Shanxian;
  93. //prop.RowP= task.RowP;
  94. Sizeprop.Circle_Ymm = task.Circle_Ymm;
  95. Sizeprop.Circle_Xmm = task.Circle_Xmm;
  96. Sizeprop.offsetX = task.offsetX;
  97. Sizeprop.offsetY = task.offsetY;
  98. Sizeprop.MarkPointList = task.MarkPointList;
  99. Sizeprop.resultInfo = task.isSucceed ? "成功" : task.resultInfo;
  100. this.refreshUI1();
  101. });
  102. //Defectprop.deserialize("");
  103. this.propertyGrid2.Refresh();
  104. //DATA
  105. SysMgr.Instance.DefectLib.finishEvent += new System.Action<DefectTask>((task) =>
  106. {
  107. DateTime t1 = DateTime.Now;
  108. var t2 = t1 - task.nowTime;
  109. var t3 = t2.Milliseconds;
  110. Defectprop.InformationList = JsonConvert.SerializeObject(task.informationList);
  111. Defectprop.resultInfo = task.isSucceed ? "成功" : task.resultInfo;
  112. this.refreshUI2();
  113. });
  114. }
  115. private void refreshUI1()
  116. {
  117. SyncContext1.Post(m =>
  118. {
  119. var result = m as string;
  120. propertyGrid1.Refresh();
  121. //txtLog.Text = szLog;//不显示
  122. //tbtnJogOnOff.Text = (prop.AxState == AxisState.STA_AX_EXT_JOG) ? "关闭Jog" : "开启Jog";
  123. //tbtnLeft.Enabled = tbtnRight.Enabled = (prop.AxState == AxisState.STA_AX_EXT_JOG);
  124. }, "异步操作完成结果");
  125. }
  126. private void refreshUI2()
  127. {
  128. SyncContext2.Post(m =>
  129. {
  130. var result = m as string;
  131. propertyGrid2.Refresh();
  132. //txtLog.Text = szLog;//不显示
  133. //tbtnJogOnOff.Text = (prop.AxState == AxisState.STA_AX_EXT_JOG) ? "关闭Jog" : "开启Jog";
  134. //tbtnLeft.Enabled = tbtnRight.Enabled = (prop.AxState == AxisState.STA_AX_EXT_JOG);
  135. }, "异步操作完成结果");
  136. }
  137. #region 前部相机
  138. private void btnTrg_Click(object sender, EventArgs e)
  139. {
  140. SysMgr.Instance.CamDevFront.ClearImageQueue();
  141. Acquisition acq = SysMgr.Instance.CamDevFront.Snap(1, 5000);
  142. if (acq.GrabStatus != "GrabPass")
  143. {
  144. ;
  145. }
  146. //ShowImage(acq.Image.CopyObj(1, -1));
  147. ShowImage1(acq.Image);
  148. }
  149. private void ShowImage1(HObject image)
  150. {
  151. lock (this)
  152. {
  153. Mat img = CamDev.HImageToMat(image);
  154. //imageBox1.ColorName = "red";
  155. imageBox1.SetInteractive(false);
  156. if (imageBox1.Image == null)
  157. imageBox1.RefreshWindow(img, ImageBox.ImageModeEnum.Zoom);//可以不显示区域
  158. else
  159. imageBox1.RefreshWindow(img, ImageBox.ImageModeEnum.Part);//可以不显示区域
  160. imageBox1.SetInteractive(true);
  161. //imageBox1.ColorName = "green";
  162. }
  163. }
  164. private void btnGrab_Click(object sender, EventArgs e)
  165. {
  166. if (this.btnGrab.Text == "连续拍照")
  167. {
  168. this.btnTrg.Enabled = false;
  169. this.btnGrab.Text = "停止拍照";
  170. timer1.Enabled = true;
  171. }
  172. else
  173. {
  174. this.btnTrg.Enabled = true;
  175. this.btnGrab.Text = "连续拍照";
  176. timer1.Enabled = false;
  177. }
  178. }
  179. private void timer1_Tick(object sender, EventArgs e)
  180. {
  181. SysMgr.Instance.CamDevFront.ClearImageQueue();
  182. Acquisition acq = SysMgr.Instance.CamDevFront.Snap(1, 100);
  183. if (acq.GrabStatus != "GrabPass")
  184. {
  185. return;
  186. //MessageBox.Show( "获取图片失败!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
  187. }
  188. //ShowImage(acq.Image.CopyObj(1, -1));
  189. ShowImage1(acq.Image);
  190. }
  191. private void button2_Click(object sender, EventArgs e)
  192. {
  193. if (!SysMgr.Instance.CamDevFront.SetExposure((double)numExposure.Value))
  194. {
  195. stslog.Text = "曝光设置失败!";
  196. return;
  197. }
  198. if (!SysMgr.Instance.CamDevFront.SetGain((double)numGain.Value))
  199. {
  200. stslog.Text = "增益设置失败!";
  201. return;
  202. }
  203. stslog.Text = "曝光-增益-帧率设置成功";
  204. }
  205. private void button6_Click(object sender, EventArgs e)
  206. {
  207. SysMgr.Instance.CamDevFront.CloseCamera();
  208. button2.Enabled = false;
  209. btnTrg.Enabled = false;
  210. btnGrab.Enabled = false;
  211. }
  212. private void button7_Click(object sender, EventArgs e)
  213. {
  214. try
  215. {
  216. Sizeprop.resultInfo = "";
  217. SysMgr.Instance.SizeLib.add(new SizeTask()
  218. {
  219. engineName = Sizeprop.EngineName,
  220. file_path = Sizeprop.BmpPath,
  221. //bmp =read2Bmp(prop.BmpPath),
  222. index = Sizeprop.Index,
  223. //finishEvent = (res) =>
  224. //{
  225. //}
  226. });
  227. }
  228. catch (Exception ex)
  229. {
  230. MessageBox.Show(ex.Message, "失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
  231. }
  232. }
  233. #endregion
  234. #region 后部相机
  235. private void ShowImage2(HObject image)
  236. {
  237. lock (this)
  238. {
  239. Mat img = CamDev.HImageToMat(image);
  240. imageBox2.SetInteractive(false);
  241. if (imageBox2.Image == null)
  242. imageBox2.RefreshWindow(img, ImageBox.ImageModeEnum.Zoom);//可以不显示区域
  243. else
  244. imageBox2.RefreshWindow(img, ImageBox.ImageModeEnum.Part);//可以不显示区域
  245. imageBox2.SetInteractive(true);
  246. }
  247. }
  248. private void btnTrg2_Click(object sender, EventArgs e)
  249. {
  250. SysMgr.Instance.CamDevBack.ClearImageQueue();
  251. Acquisition acq = SysMgr.Instance.CamDevBack.Snap(1, 5000);
  252. if (acq.GrabStatus != "GrabPass")
  253. {
  254. ;
  255. }
  256. ShowImage2(acq.Image);
  257. }
  258. private void timer3_Tick(object sender, EventArgs e)
  259. {
  260. SysMgr.Instance.CamDevBack.ClearImageQueue();
  261. Acquisition acq = SysMgr.Instance.CamDevBack.Snap(1, 100);
  262. if (acq.GrabStatus != "GrabPass")
  263. {
  264. return;
  265. }
  266. ShowImage2(acq.Image);
  267. }
  268. private void BtnGrab2_Click(object sender, EventArgs e)
  269. {
  270. if (this.BtnGrab2.Text == "连续拍照")
  271. {
  272. this.btnTrg2.Enabled = false;
  273. this.BtnGrab2.Text = "停止拍照";
  274. timer3.Enabled = true;
  275. }
  276. else
  277. {
  278. this.btnTrg2.Enabled = true;
  279. this.BtnGrab2.Text = "连续拍照";
  280. timer3.Enabled = false;
  281. }
  282. }
  283. private void BtnSet2_Click(object sender, EventArgs e)
  284. {
  285. if (!SysMgr.Instance.CamDevBack.SetExposure((double)numExp2.Value))
  286. {
  287. stslog.Text = "曝光设置失败!";
  288. return;
  289. }
  290. if (!SysMgr.Instance.CamDevBack.SetGain((double)numGain2.Value))
  291. {
  292. stslog.Text = "增益设置失败!";
  293. return;
  294. }
  295. stslog.Text = "曝光-增益-帧率设置成功";
  296. }
  297. private void BtnDisCam2_Click(object sender, EventArgs e)
  298. {
  299. SysMgr.Instance.CamDevBack.CloseCamera();
  300. BtnGrab2.Enabled = false;
  301. btnTrg2.Enabled = false;
  302. BtnSet2.Enabled = false;
  303. }
  304. private bool verifyThresholdsCount(string szThresholdsClass, int iThresholdsClassCount)
  305. {
  306. return szThresholdsClass.Trim().TrimEnd(new char[] { ',', ';' })
  307. .Split(new char[] { ',', ';' }).Count() == iThresholdsClassCount;
  308. }
  309. private void button8_Click(object sender, EventArgs e)
  310. {
  311. if (!Util.IsNumber(Defectprop.ThresholdsClass.Replace("-", "").Replace(",", "").Replace(";", "").Replace(".", "")))
  312. {
  313. MessageBox.Show("输入种类阀值与数量不一致!", "失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
  314. return;
  315. }
  316. if (!verifyThresholdsCount(Defectprop.ThresholdsClass, Defectprop.ThresholdsClassCount))
  317. {
  318. MessageBox.Show("输入种类阀值与数量不一致!", "失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
  319. return;
  320. }
  321. try
  322. {
  323. SysMgr.Instance.DefectLib.loadModelFile(Defectprop.ModelPath);
  324. Defectprop.resultInfo = "";
  325. SysMgr.Instance.DefectLib.add(new DefectTask()
  326. {
  327. nowTime = DateTime.Now,
  328. bmp = new Mat(Defectprop.BmpPath),
  329. cut_size = Defectprop.CutSize,
  330. resize = Defectprop.Resize,
  331. thresholds = Defectprop.Thresholds,
  332. thresholdsClass = Defectprop.ThresholdsClass,
  333. //finishEvent = (res) =>
  334. //{
  335. //}
  336. });
  337. }
  338. catch (Exception ex)
  339. {
  340. MessageBox.Show(ex.Message, "失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
  341. }
  342. }
  343. #endregion
  344. #region 轴移动
  345. private void btnMove_Click(object sender, EventArgs e)
  346. {
  347. if (SysMgr.Instance.AxisDev != null)
  348. {
  349. //测厚气缸缩回
  350. if(!SysMgr.Instance.ThicknessIsSafe())
  351. {
  352. stslog.Text = "高度传感器不在安全位置";
  353. return;
  354. }
  355. VelocityCurveParams _VelParams = new VelocityCurveParams();
  356. int axisNo = cbAxisName.SelectedIndex;
  357. _VelParams.Acc = (double)numAcc.Value;
  358. _VelParams.Dec = (double)numDec.Value;
  359. _VelParams.StartVel = (double)numST.Value;
  360. _VelParams.RunVel = (double)numET.Value;
  361. _VelParams.JerkT_S = cbTS.SelectedIndex;
  362. _VelParams.MM2PulseNum = SysMgr.Instance.GetMMtoPlus((AxisName)axisNo);
  363. if (cbDir.Text == "绝对运动")
  364. {
  365. stslog.Text = "绝对运动:" + numDist.Value.ToString();
  366. SysMgr.Instance.AxisDev.MoveAbsValue(axisNo, _VelParams, (double)numDist.Value);
  367. }
  368. else if (cbDir.Text == "相对运动")
  369. {
  370. stslog.Text = "相对运动:" + numDist.Value.ToString();
  371. SysMgr.Instance.AxisDev.MoveRelValue(axisNo, _VelParams, (double)numDist.Value);
  372. }
  373. }
  374. }
  375. private void btnJogP_MouseDown(object sender, MouseEventArgs e)
  376. {
  377. if (!SysMgr.Instance.ThicknessIsSafe())
  378. {
  379. stslog.Text = "高度传感器不在安全位置";
  380. return;
  381. }
  382. Button btn = sender as Button;
  383. int axisNo = cbAxisName.SelectedIndex;
  384. double val = 50;
  385. VelocityCurveParams velocityCurveParams = new VelocityCurveParams(100, 100, 0, 100, 1, SysMgr.Instance.GetMMtoPlus((AxisName)axisNo));
  386. if (btn.Name == "btnJogP")
  387. val = 50;
  388. else
  389. val = -50;
  390. SysMgr.Instance.AxisDev.MoveRelValue(axisNo, velocityCurveParams, val);
  391. }
  392. private void btnJogP_MouseUp(object sender, MouseEventArgs e)
  393. {
  394. int axisNo = cbAxisName.SelectedIndex;
  395. SysMgr.Instance.AxisDev.DecelStop(axisNo);
  396. }
  397. private void timer2_Tick(object sender, EventArgs e)
  398. {
  399. int axisNo = cbAxisName.SelectedIndex;
  400. try
  401. {
  402. numericUpDown1.Value = (decimal)SysMgr.Instance.AxisDev.GetFeedbackPos(axisNo) / SysMgr.Instance.GetMMtoPlus((AxisName)axisNo);
  403. }
  404. catch
  405. {
  406. numericUpDown1.Value = 0;
  407. }
  408. }
  409. #endregion
  410. #region 光源控制
  411. private void button4_Click(object sender, EventArgs e)
  412. {
  413. int ch = cbCH.SelectedIndex + 1;
  414. SysMgr.Instance.LightDev.SetLightDigitalValue(ch, (int)numericUpDown3.Value);
  415. }
  416. private void button1_Click(object sender, EventArgs e)
  417. {
  418. int ch = cbCH.SelectedIndex + 1;
  419. SysMgr.Instance.LightDev.OpenLight(ch);
  420. }
  421. private void button3_Click(object sender, EventArgs e)
  422. {
  423. int ch = cbCH.SelectedIndex + 1;
  424. SysMgr.Instance.LightDev.CloseLight(ch);
  425. }
  426. #endregion
  427. #region 产品加紧
  428. private void button5_Click(object sender, EventArgs e)
  429. {
  430. if (button5.Text == "气缸加紧")
  431. {
  432. button5.Text = "气缸松开";
  433. SysMgr.Instance.RunQG(true);
  434. }
  435. else
  436. {
  437. button5.Text = "气缸加紧";
  438. SysMgr.Instance.RunQG(false);
  439. }
  440. }
  441. #endregion
  442. #region 厚度
  443. private void BtnHeightAck_Click(object sender, EventArgs e)
  444. {
  445. if (BtnHeightAck.Text == "高度传感器下降")
  446. {
  447. BtnHeightAck.Text = "高度传感器上升";
  448. SysMgr.Instance.RunThickness(true);
  449. }
  450. else
  451. {
  452. BtnHeightAck.Text = "高度传感器下降";
  453. SysMgr.Instance.RunThickness(false);
  454. }
  455. }
  456. private void BtnReadHeight_Click(object sender, EventArgs e)
  457. {
  458. double val = SysMgr.Instance.ThicknessDev.GetValue();
  459. numHeightValue.Value = (decimal)val;
  460. }
  461. #endregion
  462. #region 张力
  463. private void btnReadTension_Click(object sender, EventArgs e)
  464. {
  465. double val = SysMgr.Instance.TensionDev.GetValue();
  466. numTensionValue.Value = (decimal)val;
  467. }
  468. #endregion
  469. #region 变焦
  470. private void btnLens_Click(object sender, EventArgs e)
  471. {
  472. int val = (int)SmallAxCmdPos.倍率0_58X;
  473. switch(cbLensMotor.SelectedIndex)
  474. {
  475. case 0:
  476. val = (int)SmallAxCmdPos.倍率0_58X;
  477. break;
  478. case 1:
  479. val = (int)SmallAxCmdPos.倍率1_0X;
  480. break;
  481. case 2:
  482. val = (int)SmallAxCmdPos.倍率1_5X;
  483. break;
  484. case 3:
  485. val = (int)SmallAxCmdPos.倍率2_0X;
  486. break;
  487. case 4:
  488. val = (int)SmallAxCmdPos.倍率2_5X;
  489. break;
  490. case 5:
  491. val = (int)SmallAxCmdPos.倍率3_0X;
  492. break;
  493. case 6:
  494. val = (int)SmallAxCmdPos.倍率3_5X;
  495. break;
  496. case 7:
  497. val = (int)SmallAxCmdPos.倍率4_0X;
  498. break;
  499. case 8:
  500. val = (int)SmallAxCmdPos.倍率4_5X;
  501. break;
  502. case 9:
  503. val = (int)SmallAxCmdPos.倍率5_0X;
  504. break;
  505. case 10:
  506. val = (int)SmallAxCmdPos.倍率5_5X;
  507. break;
  508. case 11:
  509. val = (int)SmallAxCmdPos.倍率6_0X;
  510. break;
  511. case 12:
  512. val = (int)SmallAxCmdPos.倍率6_5X;
  513. break;
  514. case 13:
  515. val = (int)SmallAxCmdPos.倍率7_0X;
  516. break;
  517. case 14:
  518. val = (int)SmallAxCmdPos.倍率7_5X;
  519. break;
  520. }
  521. SysMgr.Instance.LensMotorDev.MoveAbsPulse(0, new VelocityCurveParams(), val);
  522. //SysMgr.Instance.LensMotorDev.CheckDone(0, 10000);
  523. }
  524. private void btnLensM_Click(object sender, EventArgs e)
  525. {
  526. int val = (int)numLensPlus.Value;
  527. SysMgr.Instance.LensMotorDev.MoveAbsPulse(0, new VelocityCurveParams(), val);
  528. }
  529. #endregion
  530. }
  531. }