From 7dcc5723014ce7f0985cf7fe905be19d7f47b248 Mon Sep 17 00:00:00 2001 From: TAO Cheng Date: Fri, 21 Feb 2014 20:14:36 +0800 Subject: [PATCH] =?UTF-8?q?Add=20Rotary=20axis=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .hgignore | 1 + .../Tools/UsbUtility/Debug/UtilityDebug.Log | 57 ++++++++++++++++++ .../Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc | 20 +++--- .../Tools/UsbUtility/UsbUtil/SO7_UtilDlg.cpp | 46 +++++++++++++- .../Tools/UsbUtility/UsbUtil/SO7_UtilDlg.h | 4 +- .../Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj | 2 +- .../Hsi/Tools/UsbUtility/UsbUtil/resource.h | 8 ++- .../Hsi/Tools/UsbUtility/UsbUtil_VS2010.suo | Bin 2355712 -> 2355712 bytes 8 files changed, 126 insertions(+), 12 deletions(-) diff --git a/.hgignore b/.hgignore index dd1a24a..fd455d2 100644 --- a/.hgignore +++ b/.hgignore @@ -34,3 +34,4 @@ PcDmis/Base/Interfac/Msi/Hsi/KeyenceTM065/LKIF_Multi_US英 PcDmis/Base/Interfac/Msi/Hsi/KeyenceTM065/LK-G通信用DLL-20090427 *.ipch *.opensdf +*.tmp 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 094bbbd..e2d58b2 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Debug/UtilityDebug.Log +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Debug/UtilityDebug.Log @@ -3293,3 +3293,60 @@ 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 +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 +Construct Cso7_Proto. +Unable to open device Init:Open device succeed . +_start_machine +Unable to open device Init:Open device succeed . +_start_machine +Destruct Cso7_Proto. +Construct Cso7_Proto. +Init:Open device succeed . +_start_machine +Construct Cso7_Proto. +Unable to open device Init:Open device succeed . +_start_machine +Exit: Exit_SO7Usb +Init:Open device succeed . +_start_machine +Exit: Exit_SO7Usb +Init:Open device succeed . +_start_machine +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 +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/Mv_Util.rc b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc index 89a48a5..c9a1c91 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 @@ -27,7 +27,7 @@ LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED // Dialog // -IDD_SO7_UTIL_DIALOG DIALOGEX 0, 0, 418, 486 +IDD_SO7_UTIL_DIALOG DIALOGEX 0, 0, 418, 496 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "SevenOcean Utility" FONT 8, "MS Shell Dlg", 400, 0, 0x1 @@ -90,7 +90,7 @@ BEGIN LTEXT "SegI",IDC_STATIC,236,72,16,8 LTEXT "SegII",IDC_STATIC,236,86,18,8 GROUPBOX "I/O Port Status",IDC_STATIC,321,14,72,111 - PUSHBUTTON "Exit",IDCANCEL,366,465,39,14 + PUSHBUTTON "Exit",IDCANCEL,366,475,39,14 LTEXT "x",IDC_STATIC,23,324,8,11 LTEXT "y",IDC_STATIC,23,338,8,11 LTEXT "z",IDC_STATIC,23,352,8,11 @@ -105,7 +105,7 @@ BEGIN EDITTEXT IDC_EDIT_ZM_POSITION_58,103,365,54,12,ES_AUTOHSCROLL | ES_READONLY | NOT WS_TABSTOP LTEXT "Scale Pulse",IDC_STATIC,40,309,36,8 LTEXT "mm",IDC_STATIC,123,310,12,8 - EDITTEXT IDC_EDIT_STATUS,15,404,385,56,ES_MULTILINE | ES_AUTOVSCROLL | ES_WANTRETURN | WS_VSCROLL + EDITTEXT IDC_EDIT_STATUS,15,403,223,86,ES_MULTILINE | ES_AUTOVSCROLL | ES_WANTRETURN | WS_VSCROLL LTEXT "ms",IDC_STATIC_SEC,212,384,16,9 EDITTEXT IDC_EDIT_UPDATE_FREQ,183,383,25,13,ES_AUTOHSCROLL | ES_READONLY GROUPBOX "Scale Display",IDC_STATIC,15,264,224,136 @@ -155,6 +155,12 @@ BEGIN COMBOBOX IDC_COMBO_OUTPORT_NUMBER,182,223,29,34,CBS_DROPDOWNLIST | CBS_SORT | WS_VSCROLL | WS_TABSTOP CONTROL "Inport",IDC_RADIO_READ_INPUT_PORT,"Button",BS_AUTORADIOBUTTON | WS_GROUP,344,227,36,10 CONTROL "Outport",IDC_RADIO_READ_OUTPUT_PORT,"Button",BS_AUTORADIOBUTTON,344,243,41,10 + GROUPBOX "Rotary",IDC_STATIC,252,402,155,70 + PUSHBUTTON "Home",IDC_BUTTON_HOME,263,419,34,15 + EDITTEXT IDC_EDIT_POSITION,264,445,36,14,ES_AUTOHSCROLL + CONTROL "Rel",IDC_RADIO_RELATIVE,"Button",BS_AUTORADIOBUTTON,308,448,27,8 + CONTROL "Abs",IDC_RADIO_ABSOLUTE,"Button",BS_AUTORADIOBUTTON,336,448,28,8 + PUSHBUTTON "Go",IDC_BUTTON_GO,365,445,34,15 END IDD_S07_UTIL_SEND_PARAMETER DIALOGEX 0, 0, 753, 481 @@ -266,7 +272,7 @@ BEGIN LTEXT "Y=",IDC_STATIC,90,302,10,8 EDITTEXT IDC_EDIT_INPUT_FILE,58,12,181,14,ES_AUTOHSCROLL LTEXT "Input File",IDC_STATIC,11,15,42,8 - PUSHBUTTON "Browse...",IDC_BUTTON_BROWSE,246,12,44,14 + PUSHBUTTON "Browse...",IDC_BUTTON_BROWSE,246,12,44,14,0,WS_EX_ACCEPTFILES GROUPBOX "速度参数",IDC_STATIC,17,29,273,254 LTEXT "X-1",IDC_STATIC,27,63,12,8 LTEXT "X-2",IDC_STATIC,27,78,12,8 @@ -493,7 +499,7 @@ BEGIN EDITTEXT IDC_EDIT_MOVE_TO_Y,41,101,53,12,ES_AUTOHSCROLL EDITTEXT IDC_EDIT_MOVE_TO_Z,41,124,53,12,ES_AUTOHSCROLL EDITTEXT IDC_EDIT_MOVE_TO_ZM,41,147,53,12,ES_AUTOHSCROLL - CONTROL "Reverse",IDC_CHECK_REVERSE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,108,91,43,10 + CONTROL "Reverse",IDC_CHECK_REVERSE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,105,91,43,10 PUSHBUTTON "Move To XYZ",IDC_BUTTON_MOVE_TO_XYZ,103,107,71,24,BS_MULTILINE PUSHBUTTON "Move To Zoom",IDC_BUTTON_MOVE_TO_ZOOM,103,136,71,24 PUSHBUTTON "Move To XYZ(JM)",IDC_BUTTON_MOVE_TO_XYZ_JM,180,78,71,24,BS_MULTILINE @@ -556,7 +562,7 @@ BEGIN PUSHBUTTON "Clear All",IDC_BUTTON_SO7_MOVETO_CLEAR_ALL_LOG,452,266,50,21 CONTROL "ErrPos",IDC_CHECK_SO7_MOVETO_FPGADATA,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,459,187,34,10 CONTROL "Auto Set Zero ",IDC_CHECK_SO7_MOTION_AUTO_SET_ZERO, - "Button",BS_AUTOCHECKBOX | WS_TABSTOP,108,75,59,10 + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,105,75,63,10 END IDD_SO7_UTIL_IMAGE_DLL DIALOGEX 0, 0, 377, 184 @@ -863,7 +869,7 @@ BEGIN LEFTMARGIN, 7 RIGHTMARGIN, 405 TOPMARGIN, 7 - BOTTOMMARGIN, 479 + BOTTOMMARGIN, 489 END IDD_S07_UTIL_SEND_PARAMETER, DIALOG 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 009646c..7b27a17 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 @@ -91,7 +91,7 @@ void CSO7_UtilDlg::DoDataExchange(CDataExchange* pDX) DDX_Control(pDX, IDC_BUTTON_SO7_MOVE_XR_YB, m_Button_MoveXRYB); DDX_Control(pDX, IDC_BUTTON_SO7_MOVE_XL_YF, m_Button_MoveXLYF); DDX_Control(pDX, IDC_BUTTON_SO7_MOVE_XL_YB, m_Button_MoveXLYB); - + DDX_Text(pDX, IDC_EDIT_POSITION, m_Rotary_Edit_Position); DDX_Control(pDX, IDC_EDIT_STATUS, m_edMSG); @@ -142,6 +142,8 @@ BEGIN_MESSAGE_MAP(CSO7_UtilDlg, CDialog) ON_BN_CLICKED(IDC_RADIO_READ_INPUT_PORT, &CSO7_UtilDlg::OnBnClickedRadioReadInputPort) ON_BN_CLICKED(IDC_RADIO_READ_OUTPUT_PORT, &CSO7_UtilDlg::OnBnClickedRadioReadOutputPort) ON_BN_CLICKED(IDC_BUTTON_MOTION_PARAMETER, &CSO7_UtilDlg::OnBnClickedButtonMotionParameter) + ON_BN_CLICKED(IDC_BUTTON_HOME, &CSO7_UtilDlg::OnBnClickedButtonHome) + ON_BN_CLICKED(IDC_BUTTON_GO, &CSO7_UtilDlg::OnBnClickedButtonGo) END_MESSAGE_MAP() @@ -1369,4 +1371,44 @@ void CSO7_UtilDlg::OnBnClickedCheckSo7TurnOnFffLaser() { m_pSO7_Proto->_send_cmd_SO7_CMD_COMMON_COMMAND(CT_MOTOR,CT_M_LASE_OFF,0); } -} \ No newline at end of file +} + +//================================================= +// Move one revolution 2**23 +// When the rotary stop, take the curr pos - ref pos. +// m_pSO7_Proto->g_machine.z._scale_pos._long_ +// +void CSO7_UtilDlg::OnBnClickedButtonHome() +{ + m_pSO7_Proto->g_machine.z._scale_pos._long_ = (long)m_pSO7_Proto->g_machine.z._d_cur_pos_ + (long)(2^23); + m_pSO7_Proto->_send_cmd_SO7_CMD_MOVE_TO_POS_Z(); + Sleep(200); + m_pSO7_Proto->_send_cmd_SO7_CMD_READ_ZSIGNAL_POS_Z(); + m_ZsignalPosZ=m_pSO7_Proto->g_machine.z._ZSignal_pos._long_; + m_pSO7_Proto->_send_cmd_SO7_CMD_READ_AXIS_XYZ(); + double lZ = m_pSO7_Proto->g_machine.z._scale_pos._long_; + lZ; + // set the home position. + // show the Z position in Angle + // show the signal position in Angle +} + +//================================================ +// Change Angle to Revolution +// +void CSO7_UtilDlg::OnBnClickedButtonGo() +{ + UpdateData(TRUE); + USES_CONVERSION; + const char* cMove_to_Rotary=T2A(m_Rotary_Edit_Position); + double dPos = atof(cMove_to_Rotary); + if (((CButton *)GetDlgItem(IDC_RADIO_RELATIVE))->GetCheck()) + { +// m_pSO7_Proto->g_machine.z._pos_fixed._long_ = atoi(cMove_to_Z) - (m_pSO7_Proto->g_machine.z._scale_pos._long_-m_pSO7_Proto->g_machine.z._lSet_Zero_Pos); + dPos; + } else + { +// m_pSO7_Proto->g_machine.z._pos_fixed._long_ = atoi(cMove_to_Z) - (m_pSO7_Proto->g_machine.z._scale_pos._long_-m_pSO7_Proto->g_machine.z._lSet_Zero_Pos); + }; + m_pSO7_Proto->_send_cmd_SO7_CMD_MOVE_TO_POS_Z(); +} 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 a93a88c..cc00485 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 @@ -25,7 +25,7 @@ public: CString m_Y_Pos; CString m_Z_Pos; CString m_Zm_Pos; - + CString m_Rotary_Edit_Position; CString m_csTop_Light_Value; CString m_csBom_Light_Value; CString m_csFan_Light_Value; @@ -118,4 +118,6 @@ public: afx_msg void OnBnClickedRadioReadInputPort(); afx_msg void OnBnClickedRadioReadOutputPort(); afx_msg void OnBnClickedButtonMotionParameter(); + afx_msg void OnBnClickedButtonHome(); + afx_msg void OnBnClickedButtonGo(); }; 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 654dbac..5649cb0 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 @@ -127,7 +127,7 @@ Disabled - WIN32;_WINDOWS;_DEBUG;_CRT_SECURE_NO_WARNINGS;_RELEASE_FULL_VERSION;%(PreprocessorDefinitions) + _RELEASE_SO7_CONTROLER_ONLY;WIN32;_WINDOWS;_DEBUG;_CRT_SECURE_NO_WARNINGS;_RELEASE_FULL_VERSION;%(PreprocessorDefinitions) true EnableFastChecks MultiThreadedDebugDLL 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 51257f0..e0f78fc 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/resource.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/resource.h @@ -685,7 +685,9 @@ #define IDC_RADIO_KEYENCE_LASER_LK_G 1584 #define IDC_BUTTON3 1585 #define IDC_BUTTONIDC_BUTTON_TESA_STAR_MOVETO 1585 +#define IDC_BUTTON_HOME 1585 #define IDC_BUTTON_INIT_SCAN_KEYENCE_LK_GLASER 1586 +#define IDC_BUTTON_GO 1586 #define IDC_EDIT_MEASURE_VALUE 1587 #define IDC_RADIO_OUT_EXTRACT 1588 #define IDC_RADIO_KEYENCE_LASER 1589 @@ -884,6 +886,10 @@ #define IDC_LIST_SO7_MOTION_CONFIG 1820 #define IDC_EDIT_SO7_MOTION_CONFIG_MSGOUT 1821 #define IDC_EDIT_SO7_PROGEAM_INTERCAL_TIME_PER_CNC 1822 +#define IDC_EDIT_POSITION 1824 +#define IDC_RADIO_RELATIVE 1825 +#define IDC_RADIO_ABS 1826 +#define IDC_RADIO_ABSOLUTE 1826 #define IDC_BUTTON_DIY_EXIT_BUTTON 32740 #define ID_EDIT_SO7_CONFIG_MOTION 32741 @@ -893,7 +899,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 189 #define _APS_NEXT_COMMAND_VALUE 32771 -#define _APS_NEXT_CONTROL_VALUE 1823 +#define _APS_NEXT_CONTROL_VALUE 1827 #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 5a002da62d5eb210ea85eb22a9f1b3a777c11dfe..1e654e5611876a09a63464f7f0c066e791f08597 100644 GIT binary patch delta 5075 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 X