From 842c95f8b14c7cb008ea6313ab0211b46a1305e2 Mon Sep 17 00:00:00 2001 From: TAO Cheng Date: Mon, 21 Oct 2013 11:31:34 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9ELK=5FH=E6=BF=80=E5=85=89?= =?UTF-8?q?=E5=AF=B9=E8=AF=9D=E6=A1=86=EF=BC=8C=E6=96=B0=E5=A2=9E=E5=A4=9A?= =?UTF-8?q?=E7=A7=8D=E5=A4=8D=E4=BD=8D=E6=96=B9=E5=BC=8F=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Base/Interfac/Msi/Hsi/SevenOcean/CMD_H.h | 13 ++ .../Interfac/Msi/Hsi/SevenOcean/SO7_Proto.cpp | 6 +- .../Interfac/Msi/Hsi/SevenOcean/SO7_Proto.h | 2 +- .../Tools/UsbUtility/Debug/UtilityDebug.Log | 40 ++++ .../Tools/UsbUtility/Release/UtilityDebug.Log | 5 + .../UsbUtility/UsbUtil/KeyenceLKH_Dlg.cpp | 207 ++++++++++++++++++ .../Tools/UsbUtility/UsbUtil/KeyenceLKH_Dlg.h | 44 ++++ .../UsbUtility/UsbUtil/Keyence_UtilDlg.cpp | 2 +- .../Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc | 63 ++++-- .../Tools/UsbUtility/UsbUtil/SO7_UtilDlg.cpp | 66 +++++- .../Tools/UsbUtility/UsbUtil/SO7_UtilDlg.h | 2 +- .../Tools/UsbUtility/UsbUtil/So7_Option.cpp | 29 ++- .../Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj | 3 + .../UsbUtil/Usb_Util.vcxproj.filters | 6 + .../Hsi/Tools/UsbUtility/UsbUtil/resource.h | 9 +- .../Hsi/Tools/UsbUtility/UsbUtil_VS2010.suo | Bin 2355712 -> 2355712 bytes 16 files changed, 467 insertions(+), 30 deletions(-) create mode 100644 PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/KeyenceLKH_Dlg.cpp create mode 100644 PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/KeyenceLKH_Dlg.h diff --git a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/CMD_H.h b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/CMD_H.h index e5063c4..c6031e8 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/CMD_H.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/CMD_H.h @@ -347,4 +347,17 @@ CT_CLEAR_PROBE_FLAG, CT_READ_IO_DAT, CT_WRITE_IO_DAT +}; + +enum EHOME_MODE +{ + CT_HOME_XYZ=1, + CT_HOME_X=10, + CT_HOME_Y, + CT_HOME_Z, + CT_HOME_XY=20, + CT_HOME_XZ, + CT_HOME_YZ, + + CT_HOME_TOATAL=255 }; \ No newline at end of file diff --git a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto.cpp b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto.cpp index 7de40be..2e2340f 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto.cpp @@ -2764,9 +2764,9 @@ SSI_STATUS_MOTION CSO7_Proto::so7_motion_probe_on_off_(bool _bOnOff) }; //============================================================== -SSI_STATUS_MOTION CSO7_Proto::so7_motion_reset_worktable_lower_left() +SSI_STATUS_MOTION CSO7_Proto::so7_motion_reset_worktable_lower_left(char _HomeMode) { - _send_cmd_SO7_CMD_COMMON_COMMAND(CT_MOTOR,CT_M_RESET_LEFT,1); + _send_cmd_SO7_CMD_COMMON_COMMAND(CT_MOTOR,CT_M_RESET_LEFT,_HomeMode); return SSI_STATUS_MOTION_NORMAL; }; @@ -2868,7 +2868,7 @@ SSI_STATUS_MOTION CSO7_Proto::so7_motion_Dcc_Home() m_bHomingActive = true; // Tell the world we need to home the stage // Home - so7_motion_reset_worktable_lower_left(); + so7_motion_reset_worktable_lower_left(CT_HOME_XYZ); g_pLogger->SendAndFlushPerMode(_T("so7_motion_reset_worktable_lower_left.\n")); TRACE0(" - waiting for X,Y,Zm to stop moving\n"); diff --git a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto.h b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto.h index 7362309..8f4f3c1 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto.h @@ -341,7 +341,7 @@ public: SSI_STATUS_MOTION _start_machine(); SSI_STATUS_MOTION _shutdown_machine(); SSI_STATUS_MOTION so7_motion_probe_on_off_(bool _bOnOff); - SSI_STATUS_MOTION so7_motion_reset_worktable_lower_left(); + SSI_STATUS_MOTION so7_motion_reset_worktable_lower_left(char _HomeMode); SSI_STATUS_MOTION so7_motion_reset_worktable_top_right(); SSI_STATUS_MOTION so7_motion_stop_motor_to_get_laser_data(); SSI_STATUS_MOTION so7_motion_laser_on_off(bool _bOnOff); diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Debug/UtilityDebug.Log b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Debug/UtilityDebug.Log index 8663987..a4221e8 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Debug/UtilityDebug.Log +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Debug/UtilityDebug.Log @@ -2173,3 +2173,43 @@ Init:Open device succeed . _start_machine Exit: Exit_SO7Usb Destruct Cso7_Proto. +Construct Cso7_Proto. +Destruct Cso7_Proto. +Construct Cso7_Proto. +Init:Open device succeed . +_start_machine +Exit: Exit_SO7Usb +Destruct Cso7_Proto. +Construct Cso7_Proto. +Init:Open device succeed . +_start_machine +Exit: Exit_SO7Usb +Destruct Cso7_Proto. +Construct Cso7_Proto. +Init:Open device succeed . +_start_machine +Exit: Exit_SO7Usb +Destruct Cso7_Proto. +Construct Cso7_Proto. +Init:Open device succeed . +_start_machine +Exit: Exit_SO7Usb +Init:Open device succeed . +_start_machine +Exit: Exit_SO7Usb +Init:Open device succeed . +_start_machine +Exit: Exit_SO7Usb +Init:Open device succeed . +_start_machine +Exit: Exit_SO7Usb +Destruct Cso7_Proto. +Construct Cso7_Proto. +Init:Open device succeed . +_start_machine +Exit: Exit_SO7Usb +Init:Open device succeed . +_start_machine +Exit: Exit_SO7Usb +Init:Open device succeed . +_start_machine diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Release/UtilityDebug.Log b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Release/UtilityDebug.Log index c63ebc0..92ffdf4 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Release/UtilityDebug.Log +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Release/UtilityDebug.Log @@ -122,3 +122,8 @@ Init:Open device succeed . _start_machine Exit: Exit_SO7Usb Destruct Cso7_Proto. +Construct Cso7_Proto. +Init:Open device succeed . +_start_machine +Exit: Exit_SO7Usb +Destruct Cso7_Proto. diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/KeyenceLKH_Dlg.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/KeyenceLKH_Dlg.cpp new file mode 100644 index 0000000..08fc10d --- /dev/null +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/KeyenceLKH_Dlg.cpp @@ -0,0 +1,207 @@ +// KeyenceLKH_Dlg.cpp : implementation file +// + +#include "stdafx.h" +#include "resource.h" +#include "..\..\..\Keyence\Keyence_Laser_LK_H.h" +#include "..\..\..\SevenOcean\SO7_Proto.h" +#include "KeyenceLKH_Dlg.h" +#include "afxdialogex.h" + +extern CKeyence_Laser_LK_H* m_pKeyence_Laser_LK_H; + +// CKeyenceLKH_Dlg dialog + +IMPLEMENT_DYNAMIC(CKeyenceLKH_Dlg, CDialog) + +CKeyenceLKH_Dlg::CKeyenceLKH_Dlg(CWnd* pParent /*=NULL*/) + : CDialog(CKeyenceLKH_Dlg::IDD, pParent) +{ + +} + +CKeyenceLKH_Dlg::~CKeyenceLKH_Dlg() +{ +} + +void CKeyenceLKH_Dlg::DoDataExchange(CDataExchange* pDX) +{ + DDX_Control(pDX, IDC_EDIT_TEST_KEYENCE_MESSAGE, m_edMSG); + + CDialog::DoDataExchange(pDX); +} + + +BEGIN_MESSAGE_MAP(CKeyenceLKH_Dlg, CDialog) + ON_WM_TIMER() + ON_BN_CLICKED(IDC_BUTTON_KEYENCE_LASER_GET_DATA, &CKeyenceLKH_Dlg::OnBnClickedButtonKeyenceLaserGetData) + ON_BN_CLICKED(IDC_BUTTON_SCAN_KEYENCE_LK_H_LASER, &CKeyenceLKH_Dlg::OnBnClickedButtonScanKeyenceLkHLaser) + ON_BN_CLICKED(IDC_BUTTON_STOP_SCAN_KEYENCE_LK_H_LASER, &CKeyenceLKH_Dlg::OnBnClickedButtonStopScanKeyenceLkHLaser) + ON_BN_CLICKED(IDC_BUTTON_TEST_KEYENCE_CLEAR_LOG, &CKeyenceLKH_Dlg::OnBnClickedButtonTestKeyenceClearLog) + ON_BN_CLICKED(IDC_CHECK_CONTINUE_READ_LASER_VALUE, &CKeyenceLKH_Dlg::OnBnClickedCheckContinueReadLaserValue) + ON_EN_KILLFOCUS(IDC_EDIT_TEST_LK_G_INTERVAL, &CKeyenceLKH_Dlg::OnEnKillfocusEditTestLkGInterval) + ON_BN_CLICKED(IDCANCEL, &CKeyenceLKH_Dlg::OnBnClickedCancel) +END_MESSAGE_MAP() + + +// CKeyenceLKH_Dlg message handlers +//====================================================== +BOOL CKeyenceLKH_Dlg::OnInitDialog() +{ + CDialog::OnInitDialog(); + m_LK_H_BTN_StartGetData=FALSE; + m_LK_H_Interval=100; + ((CButton*)(GetDlgItem(IDC_EDIT_TEST_LK_G_INTERVAL)))->SetWindowText(_T("100")); + m_pKeyence_Laser_LK_H->KeyenceLaserInit(); + + return TRUE; // return TRUE unless you set the focus to a control +} + +void CKeyenceLKH_Dlg::OnBnClickedButtonKeyenceLaserGetData() +{ + if (((CButton*)(GetDlgItem(IDC_CHECK_CONTINUE_READ_LASER_VALUE)))->GetCheck()) + { + if (m_LK_H_BTN_StartGetData) + { + KillTimer(1); + m_LK_H_BTN_StartGetData=FALSE; + ((CButton*)GetDlgItem(IDC_BUTTON_KEYENCE_LASER_GET_DATA))->SetWindowTextW(_T("Get Data")); + } + else + { + m_LK_H_BTN_StartGetData=TRUE; + SetTimer(1,m_LK_H_Interval,NULL); + ((CButton*)GetDlgItem(IDC_BUTTON_KEYENCE_LASER_GET_DATA))->SetWindowTextW(_T("STOP")); + } + } + else + { + Show_LKH_Data(); + } + GetDlgItem(IDC_EDIT_TEST_KEYENCE_SETFOCUS)->SetFocus(); + +} + + +//================================================================================================ +void CKeyenceLKH_Dlg::OnBnClickedButtonScanKeyenceLkHLaser() +{ + // TODO: Add your control notification handler code here +} + + +//================================================================================================ +void CKeyenceLKH_Dlg::OnBnClickedButtonStopScanKeyenceLkHLaser() +{ + // TODO: Add your control notification handler code here +} + + +//================================================================================================ +void CKeyenceLKH_Dlg::OnBnClickedButtonTestKeyenceClearLog() +{ + m_edMSG.SetWindowText(_T("")); +} + +//================================================================================================ +void CKeyenceLKH_Dlg::OnBnClickedCheckContinueReadLaserValue() +{ + if (((CButton*)(GetDlgItem(IDC_CHECK_CONTINUE_READ_LASER_VALUE)))->GetCheck()==FALSE) + { + ((CButton*)GetDlgItem(IDC_BUTTON_KEYENCE_LASER_GET_DATA))->SetWindowTextW(_T("Get Data")); + KillTimer(1); + } + GetDlgItem(IDC_EDIT_TEST_KEYENCE_SETFOCUS)->SetFocus(); + +} + +//================================================================================================ +void CKeyenceLKH_Dlg::OnEnKillfocusEditTestLkGInterval() +{ + UpdateData(TRUE); + USES_CONVERSION; + CString csTmp; + (GetDlgItem(IDC_EDIT_TEST_LK_G_INTERVAL))->GetWindowText(csTmp); + const char* cTempValue=T2A(csTmp); + m_LK_H_Interval=atoi(cTempValue); + GetDlgItem(IDC_EDIT_TEST_KEYENCE_SETFOCUS)->SetFocus(); +} + +//================================================================================================ +BOOL CKeyenceLKH_Dlg::Get_LKH_Data(double& _dOUT1,double& _dOUT2) +{ + float fLaserVaule1(0.0),fLaserVaule2(0.0); + m_pKeyence_Laser_LK_H->Get_KeyenceLaserData(&fLaserVaule1,&fLaserVaule2); + _dOUT1=static_cast(fLaserVaule1); + _dOUT2=static_cast(fLaserVaule2); + return TRUE; + +} + +//================================================================================================ +void CKeyenceLKH_Dlg::Show_LKH_Data() +{ + CString csLaserValue; + double LaserVaule1(0.0),LaserVaule2(0.0); + Get_LKH_Data(LaserVaule1,LaserVaule2); + csLaserValue.Format(_T("%.4f"),LaserVaule1); + GetDlgItem(IDC_EDIT_LASER_VALUE1)->SetWindowText(csLaserValue); + csLaserValue.Format(_T("%.4f"),LaserVaule2); + GetDlgItem(IDC_EDIT_LASER_VALUE2)->SetWindowText(csLaserValue); +} + +//================================================================================================ +void CKeyenceLKH_Dlg::OnBnClickedCancel() +{ + + CDialog::OnCancel(); +} +//===================================================================================== +//Print message on edit control +void CKeyenceLKH_Dlg::OutputWithScroll(const CString &strNewText,CEdit &edtOutput) +{ + CString strOutput; + edtOutput.GetWindowText(strOutput); + strOutput += strNewText; + if ("\r\n" != strOutput.Right(2)) + { + strOutput += "\r\n"; + } + + int iCount = strOutput.GetLength(); + + edtOutput.SetRedraw(FALSE); + edtOutput.SetWindowText(strOutput); + int iLine = edtOutput.GetLineCount(); + edtOutput.LineScroll(iLine, 0); + edtOutput.SetSel(iCount, iCount); + edtOutput.SetRedraw(TRUE); +} + +//================================================================================================ +void CKeyenceLKH_Dlg::OnTimer(UINT_PTR nIDEvent) +{ + switch(nIDEvent) + { + case 1:Show_LKH_Data(); + break; + } + CDialog::OnTimer(nIDEvent); +} + +//================================================================================================ +BOOL CKeyenceLKH_Dlg::PreTranslateMessage(MSG* pMsg) +{ + if(pMsg->message==WM_KEYDOWN) + { + if (pMsg->wParam==VK_SPACE) + { + OnBnClickedButtonKeyenceLaserGetData(); + } + else if(pMsg->wParam==VK_RETURN || pMsg->wParam==VK_ESCAPE) + { + return TRUE; + } + } + return CDialog::PreTranslateMessage(pMsg); +} \ No newline at end of file diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/KeyenceLKH_Dlg.h b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/KeyenceLKH_Dlg.h new file mode 100644 index 0000000..c0b8190 --- /dev/null +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/KeyenceLKH_Dlg.h @@ -0,0 +1,44 @@ +#pragma once + + +// CKeyenceLKH_Dlg dialog + +class CKeyenceLKH_Dlg : public CDialog +{ + DECLARE_DYNAMIC(CKeyenceLKH_Dlg) + +public: + CKeyenceLKH_Dlg(CWnd* pParent = NULL); // standard constructor + virtual ~CKeyenceLKH_Dlg(); + +// Dialog Data + enum { IDD = IDD_DIALOG_TEST_KEYENCE_LK_H }; + +protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support + virtual BOOL OnInitDialog(); + + DECLARE_MESSAGE_MAP() +private: + CEdit m_edMSG; + int m_LK_H_Interval; + BOOL m_LK_H_BTN_StartGetData; + + BOOL Get_LKH_Data(double& _dOUT1,double& _dOUT2); + void Show_LKH_Data(); + void OutputWithScroll(const CString &strNewText,CEdit &edtOutput); + +public: + afx_msg BOOL PreTranslateMessage(MSG* pMsg); + afx_msg void OnTimer(UINT_PTR nIDEvent); + + afx_msg void OnBnClickedButtonKeyenceLaserGetData(); + afx_msg void OnBnClickedButtonScanKeyenceLkHLaser(); + afx_msg void OnBnClickedButtonStopScanKeyenceLkHLaser(); + afx_msg void OnBnClickedButtonTestKeyenceClearLog(); + afx_msg void OnBnClickedCheckContinueReadLaserValue(); + afx_msg void OnEnKillfocusEditTestLkGInterval(); + + + afx_msg void OnBnClickedCancel(); +}; diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Keyence_UtilDlg.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Keyence_UtilDlg.cpp index 4b6f776..8ac8df5 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Keyence_UtilDlg.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Keyence_UtilDlg.cpp @@ -9,7 +9,7 @@ #include #include "..\..\..\Keyence\Keyence_Laser.h" #include "..\..\..\Keyence\Keyence_Laser_LK_H.h" -#include "..\..\..\Keyence\\Keyence_Proto.h" +#include "..\..\..\Keyence\Keyence_Proto.h" #include "..\..\..\SevenOcean\SO7_Proto.h" #include "Keyence_UtilDlg.h" diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc index 4bab68e..9068971 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc @@ -61,10 +61,10 @@ BEGIN PUSHBUTTON "Y+",IDC_BUTTON_SO7_MOVE_Y_FRONT,154,159,25,12 PUSHBUTTON "Y-",IDC_BUTTON_SO7_MOVE_Y_BACK,154,180,25,12 PUSHBUTTON "X+",IDC_BUTTON_SO7_MOVE_X_RIGHT,180,169,25,12 - PUSHBUTTON "Home XYZ",IDC_BUTTON_SO7_RESET_XYZ,274,140,76,14,BS_MULTILINE - PUSHBUTTON "Hoom Manual",IDC_BUTTON_MANUAL_HOME,274,157,76,14 - PUSHBUTTON "Home Worktable Left",IDC_BUTTON_RESET_WORKTABLE,274,174,76,14 - PUSHBUTTON "Home Worktable Right",IDC_BUTTON_RESET_WORKTABLE_RIGHT,274,191,76,14 + PUSHBUTTON "Home XYZ",IDC_BUTTON_SO7_RESET_XYZ,277,154,76,14,BS_MULTILINE + PUSHBUTTON "Hoom Manual",IDC_BUTTON_MANUAL_HOME,277,135,76,14 + PUSHBUTTON "Home DCC",IDC_BUTTON_RESET_WORKTABLE,277,192,40,14 + PUSHBUTTON "Home Worktable Right",IDC_BUTTON_RESET_WORKTABLE_RIGHT,277,173,76,14 PUSHBUTTON "Move\n To",IDC_BUTTON_MOVE_TO,359,142,32,27,BS_MULTILINE PUSHBUTTON "Auto Zoom",IDC_BUTTON_AUTO_ZOOM,359,177,32,27,BS_MULTILINE PUSHBUTTON "Set Reset Flag",IDC_BUTTON_SET_RESET_FLAG,27,235,61,14 @@ -155,6 +155,7 @@ BEGIN LTEXT "Addr",IDC_STATIC,287,351,16,8 LTEXT "Data",IDC_STATIC,287,373,16,8 COMBOBOX IDC_COMBO_RWDATA_ADDR,307,348,45,30,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP + COMBOBOX IDC_COMBO_SO7_HOMEMODE,324,192,27,30,CBS_DROPDOWN | CBS_SORT | WS_VSCROLL | WS_TABSTOP END IDD_S07_UTIL_SEND_PARAMETER DIALOGEX 0, 0, 753, 481 @@ -384,10 +385,12 @@ BEGIN CONTROL "IP Camera",IDC_RADIO_SO7_IP_CAMERA,"Button",BS_AUTORADIOBUTTON,48,111,62,10 CONTROL "控制器(USB)",IDC_RADIO_CONTROLLER,"Button",BS_AUTORADIOBUTTON,175,39,69,10 CONTROL "控制器(RS232)",IDC_RADIO__SO7_RS232,"Button",BS_AUTORADIOBUTTON,175,57,77,10 - CONTROL "Keyence激光",IDC_RADIO_KEYENCE_LASER,"Button",BS_AUTORADIOBUTTON,175,75,76,10 + CONTROL "LK_G激光",IDC_RADIO_KEYENCE_LASER,"Button",BS_AUTORADIOBUTTON,175,75,76,10 + CONTROL "LK_H激光",IDC_RADIO_KEYENCE_LASER_LK_H,"Button",BS_AUTORADIOBUTTON,175,93,76,10 + CONTROL "LJ_G激光",IDC_RADIO_KEYENCE_LASER3,"Button",BS_AUTORADIOBUTTON | NOT WS_VISIBLE,175,111,76,10 CONTROL "Verifcation algorithm",IDC_RADIO_SO7_VERIFICATION_ALGORITHM, - "Button",BS_AUTORADIOBUTTON,175,93,81,10 - CONTROL "Image.dll",IDC_RADIO_TEST_IMAGE_DLL,"Button",BS_AUTORADIOBUTTON,175,111,45,10 + "Button",BS_AUTORADIOBUTTON | NOT WS_VISIBLE,48,138,81,10 + CONTROL "Image.dll",IDC_RADIO_TEST_IMAGE_DLL,"Button",BS_AUTORADIOBUTTON | NOT WS_VISIBLE,48,149,45,10 DEFPUSHBUTTON "OK",IDOK,181,145,50,14 PUSHBUTTON "Cancel",IDCANCEL,241,145,50,14 GROUPBOX "测试选项",IDC_STATIC,29,15,243,120 @@ -1968,7 +1971,7 @@ BEGIN CONTROL "Dump PRS",IDC_RADIO_DUMP_PRS,"Button",BS_AUTORADIOBUTTON,27,85,60,10 END -IDD_DIALOG_TEST_KEYENCE DIALOGEX 0, 0, 741, 349 +IDD_DIALOG_TEST_KEYENCE DIALOGEX 0, 0, 740, 353 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Keyence Utility" FONT 8, "MS Shell Dlg", 400, 0, 0x1 @@ -1989,14 +1992,14 @@ BEGIN PUSHBUTTON "Get Data",IDC_BUTTON_INIT_KEYENCE_LASER,576,28,90,65 PUSHBUTTON "Clear All",IDC_BUTTON_TEST_KEYENCE_CLEAR_LOG,687,161,37,20 PUSHBUTTON "Save as...",IDC_BUTTON_TEST_KEYENCE_SAVE_LOG,687,217,37,20 - PUSHBUTTON "Exit",IDCANCEL,684,328,50,14 + PUSHBUTTON "Exit",IDCANCEL,688,328,50,14 EDITTEXT IDC_EDIT_LASER_VALUE1,348,32,98,26,ES_CENTER | ES_AUTOHSCROLL EDITTEXT IDC_EDIT_LASER_VALUE2,348,66,98,26,ES_CENTER | ES_AUTOHSCROLL PUSHBUTTON "Begin Scan",IDC_BUTTON_SCAN_KEYENCE_LK_GLASER,27,298,50,14,NOT WS_VISIBLE PUSHBUTTON "Stop Scan",IDC_BUTTON_STOP_SCAN_KEYENCE_LK_GLASER,31,295,50,14,NOT WS_VISIBLE PUSHBUTTON "Get Data",IDC_BUTTON_GET_SCAN_DATA_KEYENCE_LK_GLASER,25,295,50,14,NOT WS_VISIBLE - GROUPBOX "LKIF.DLL",IDC_STATIC,12,11,722,313 - EDITTEXT IDC_EDIT_TEST_KEYENCE_MESSAGE,22,104,649,207,ES_MULTILINE | ES_AUTOVSCROLL | ES_WANTRETURN | WS_VSCROLL + GROUPBOX "LKIF.DLL",IDC_STATIC,16,11,722,313 + EDITTEXT IDC_EDIT_TEST_KEYENCE_MESSAGE,22,107,649,207,ES_MULTILINE | ES_AUTOVSCROLL | ES_WANTRETURN | WS_VSCROLL GROUPBOX "Program No. Setting",IDC_STATIC,19,20,276,78 LTEXT "Interval",IDC_STATIC,475,40,26,8 LTEXT "ms",IDC_STATIC,549,40,10,8 @@ -2046,6 +2049,30 @@ BEGIN PUSHBUTTON "Replay Startup",IDC_BUTTON_REPLAY_STARTUP,11,26,69,17 END +IDD_DIALOG_TEST_KEYENCE_LK_H DIALOGEX 0, 0, 512, 337 +STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Keyence Utility" +FONT 8, "MS Shell Dlg", 400, 0, 0x1 +BEGIN + EDITTEXT IDC_EDIT_TEST_LK_G_INTERVAL,227,39,40,14,ES_RIGHT | ES_AUTOHSCROLL + CONTROL "Continuous",IDC_CHECK_CONTINUE_READ_LASER_VALUE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,226,60,52,10 + PUSHBUTTON "Get Data",IDC_BUTTON_KEYENCE_LASER_GET_DATA,300,28,90,65 + PUSHBUTTON "Clear All",IDC_BUTTON_TEST_KEYENCE_CLEAR_LOG,457,182,37,20 + PUSHBUTTON "Exit",IDCANCEL,456,317,50,14 + EDITTEXT IDC_EDIT_LASER_VALUE1,72,31,98,26,ES_CENTER | ES_AUTOHSCROLL + EDITTEXT IDC_EDIT_LASER_VALUE2,72,65,98,26,ES_CENTER | ES_AUTOHSCROLL + EDITTEXT IDC_EDIT_TEST_KEYENCE_MESSAGE,26,113,423,177,ES_MULTILINE | ES_AUTOVSCROLL | ES_WANTRETURN | WS_VSCROLL + LTEXT "Interval",-1,199,39,26,8 + LTEXT "ms",-1,273,39,10,8 + GROUPBOX "Get Data",-1,195,22,95,74 + GROUPBOX "Readout",-1,26,20,163,76 + LTEXT "OUT1",-1,38,41,19,8 + LTEXT "OUT2",-1,37,70,19,8 + PUSHBUTTON "Stop Scan",IDC_BUTTON_STOP_SCAN_KEYENCE_LK_H_LASER,444,71,50,14,NOT WS_VISIBLE + PUSHBUTTON "Begin Scan",IDC_BUTTON_SCAN_KEYENCE_LK_H_LASER,444,35,50,14,NOT WS_VISIBLE + EDITTEXT IDC_EDIT_TEST_KEYENCE_SETFOCUS,7,317,40,14,ES_AUTOHSCROLL | NOT WS_VISIBLE +END + ///////////////////////////////////////////////////////////////////////////// // @@ -2154,9 +2181,9 @@ BEGIN IDD_DIALOG_TEST_KEYENCE, DIALOG BEGIN LEFTMARGIN, 7 - RIGHTMARGIN, 402 - TOPMARGIN, 7 - BOTTOMMARGIN, 207 + RIGHTMARGIN, 738 + TOPMARGIN, 11 + BOTTOMMARGIN, 349 END IDD_DIALOG_KEYENCE_DLG, DIALOG @@ -2166,6 +2193,14 @@ BEGIN TOPMARGIN, 7 BOTTOMMARGIN, 165 END + + IDD_DIALOG_TEST_KEYENCE_LK_H, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 506 + TOPMARGIN, 11 + BOTTOMMARGIN, 331 + END END #endif // APSTUDIO_INVOKED diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_UtilDlg.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_UtilDlg.cpp index 5a95d55..d4177cf 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_UtilDlg.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_UtilDlg.cpp @@ -240,6 +240,30 @@ BOOL CSO7_UtilDlg::OnInitDialog() GetDlgItem(IDC_EDIT_SO7_READ_IO_STATUS_ADDRESS)->SetWindowTextW(_T("4")); GetDlgItem(IDC_EDIT_RWDATA_DATA)->SetWindowTextW(_T("0")); + ((CComboBox *)GetDlgItem(IDC_COMBO_SO7_HOMEMODE))->ResetContent(); + int ComboIndex=0; + csTmp=_T("XYZ"); + ((CComboBox *)GetDlgItem(IDC_COMBO_SO7_HOMEMODE))->InsertString(ComboIndex,csTmp); + csTmp=_T("X"); + ComboIndex++; + ((CComboBox *)GetDlgItem(IDC_COMBO_SO7_HOMEMODE))->InsertString(ComboIndex,csTmp); + csTmp=_T("Y"); + ComboIndex++; + ((CComboBox *)GetDlgItem(IDC_COMBO_SO7_HOMEMODE))->InsertString(ComboIndex,csTmp); + csTmp=_T("Z"); + ComboIndex++; + ((CComboBox *)GetDlgItem(IDC_COMBO_SO7_HOMEMODE))->InsertString(ComboIndex,csTmp); + csTmp=_T("XY"); + ComboIndex++; + ((CComboBox *)GetDlgItem(IDC_COMBO_SO7_HOMEMODE))->InsertString(ComboIndex,csTmp); + csTmp=_T("XZ"); + ComboIndex++; + ((CComboBox *)GetDlgItem(IDC_COMBO_SO7_HOMEMODE))->InsertString(ComboIndex,csTmp); + csTmp=_T("YZ"); + ComboIndex++; + ((CComboBox *)GetDlgItem(IDC_COMBO_SO7_HOMEMODE))->InsertString(ComboIndex,csTmp); + ((CComboBox *)GetDlgItem(IDC_COMBO_SO7_HOMEMODE))->SetCurSel(0); + CString csPath; m_pSO7_Proto->GetAppPath(csPath); m_pSO7_Proto->Load_SevenOcean_Inifile(csPath+_T("\\Utility_Config.ini")); @@ -774,8 +798,46 @@ void CSO7_UtilDlg::OnEnKillfocusEditLightSwitch() void CSO7_UtilDlg::OnBnClickedButtonResetWorktable() { - - m_pSO7_Proto->so7_motion_reset_worktable_lower_left(); + int iSel=((CComboBox *)GetDlgItem(IDC_COMBO_SO7_HOMEMODE))->GetCurSel(); + switch(iSel) + { + case 0: + { + m_HomeMode=CT_HOME_XYZ; + break; + } + case 1: + { + m_HomeMode=CT_HOME_X; + break; + } + case 2: + { + m_HomeMode=CT_HOME_Y; + break; + } + case 3: + { + m_HomeMode=CT_HOME_Z; + break; + } + case 4: + { + m_HomeMode=CT_HOME_XY; + break; + } + case 5: + { + m_HomeMode=CT_HOME_XZ; + break; + } + case 6: + { + m_HomeMode=CT_HOME_YZ; + break; + } + } + m_pSO7_Proto->so7_motion_reset_worktable_lower_left(m_HomeMode); } diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_UtilDlg.h b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_UtilDlg.h index ce0ec4d..f50c62a 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_UtilDlg.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_UtilDlg.h @@ -57,7 +57,7 @@ public: long m_ZsignalPosX; long m_ZsignalPosY; long m_ZsignalPosZ; - + char m_HomeMode; void UpdateIOStatus(); void TestZSignal(); void OutputWithScroll(const CString &strNewText,CEdit &edtOutput); diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Option.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Option.cpp index f543444..c7add88 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Option.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Option.cpp @@ -28,6 +28,7 @@ #include "..\..\..\Keyence\Keyence_Laser_LK_H.h" #include "..\..\..\Keyence\\Keyence_Proto.h" #include "Keyence_UtilDlg.h" +#include "KeyenceLKH_Dlg.h" #include "..\..\..\SevenOcean\dll.h" #include "..\..\..\SevenOcean\So7_Interface.h" @@ -174,7 +175,27 @@ void CSo7_Option::OnBnClickedOk() delete m_pEF8000_Interface; m_pEF8000_Interface=NULL; } - } + } + else if(((CButton *)GetDlgItem(IDC_RADIO_KEYENCE_LASER_LK_H))->GetCheck()) + { + if (!m_pSO7_Proto) + { + m_pSO7_Proto = new CSO7_Proto(); + } + if (!m_pKeyence_Laser_LK_H) + { + m_pKeyence_Laser_LK_H=new CKeyence_Laser_LK_H(); + } + + CKeyenceLKH_Dlg* pKeyence_LKHDlg=new CKeyenceLKH_Dlg(); + pKeyence_LKHDlg->DoModal(); + delete pKeyence_LKHDlg; + + delete m_pKeyence_Laser_LK_H; + m_pKeyence_Laser_LK_H=NULL; + delete m_pSO7_Proto; + m_pSO7_Proto=NULL; + } else if(((CButton *)GetDlgItem(IDC_RADIO_KEYENCE_LASER))->GetCheck()) { if (!m_pSO7_Proto) @@ -189,10 +210,6 @@ void CSo7_Option::OnBnClickedOk() { m_pKeyence_Laser = new CKeyence_Laser(); } - if (!m_pKeyence_Laser_LK_H) - { - m_pKeyence_Laser_LK_H=new CKeyence_Laser_LK_H(); - } CKeyence_UtilDlg* pKeyence_UtilDlg=new CKeyence_UtilDlg(); pKeyence_UtilDlg->DoModal(); @@ -200,8 +217,6 @@ void CSo7_Option::OnBnClickedOk() delete m_pKeyence_Laser; m_pKeyence_Laser=NULL; - delete m_pKeyence_Laser_LK_H; - m_pKeyence_Laser_LK_H=NULL; delete m_pKeyence_Proto; m_pKeyence_Proto=NULL; delete m_pSO7_Proto; diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj index 746be7e..49cd387 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj @@ -135,6 +135,7 @@ Level4 EditAndContinue true + $(IntDir)vc$(ProjectName).pdb _DEBUG;%(PreprocessorDefinitions) @@ -326,6 +327,7 @@ + @@ -397,6 +399,7 @@ + diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj.filters b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj.filters index 03e9427..22cd7b7 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj.filters +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj.filters @@ -166,6 +166,9 @@ Sources Files + + Sources Files + @@ -366,6 +369,9 @@ Header Files + + Header Files + diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/resource.h b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/resource.h index 31cc045..46af8f2 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/resource.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/resource.h @@ -686,6 +686,7 @@ #define IDC_RADIO_KEYENCE_LASER 1589 #define IDC_BUTTON_GET_SCAN_DATA_KEYENCE_LK_GLASER 1590 #define IDC_EDIT_TEST_KEYENCE_MESSAGE 1591 +#define IDC_RADIO_KEYENCE_LASER3 1591 #define IDC_RADIO_MACHINE_KEYENCE_TM3000 1592 #define IDC_BUTTON_GET_SCAN_DATA_KEYENCE_LK_HLASER 1593 #define IDC_RADIO_KEYENCE_LASER_LK_H 1594 @@ -811,6 +812,7 @@ #define IDD_SO7_UTIL_MANUAL_MACHINE 1716 #define IDC_BUTTON_READ_PROGRAM 1717 #define IDD_SO7_VIDEOCARD_TC4000 1718 +#define IDD_DIALOG_TEST_KEYENCE_LK_H 1719 #define IDC_RADIO_SPEED_SLOW 1770 #define IDC_RADIO_SCALE 1772 #define IDC_EDIT_SPEED_X 1773 @@ -842,6 +844,11 @@ #define IDC_EDIT4 1797 #define IDC_EDIT_MOTION_SPEEDZ 1797 #define IDC_EDIT_MOTION_SPEEDX 1798 +#define IDC_BUTTON_SCAN_KEYENCE_LK_H_LASER 1799 +#define IDC_BUTTON_STOP_SCAN_KEYENCE_LK_H_LASER 1800 +#define IDC_BUTTON_KEYENCE_LASER_GET_DATA 1801 +#define IDC_COMBO1 1802 +#define IDC_COMBO_SO7_HOMEMODE 1802 // Next default values for new objects // @@ -849,7 +856,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 188 #define _APS_NEXT_COMMAND_VALUE 32771 -#define _APS_NEXT_CONTROL_VALUE 1799 +#define _APS_NEXT_CONTROL_VALUE 1803 #define _APS_NEXT_SYMED_VALUE 104 #endif #endif diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil_VS2010.suo b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil_VS2010.suo index ac0c4bcfe9d64efeb6b120b44ed9630c5b08c8b9..9f5aea1552079e8c58e109962daf6bd46d32819c 100644 GIT binary patch delta 11620 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 delta 9615 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