From 58b492b6fbd4763ed98deaa3c6be8cf8dcfdda25 Mon Sep 17 00:00:00 2001 From: TAO Cheng Date: Mon, 12 May 2014 21:51:02 +0800 Subject: [PATCH] =?UTF-8?q?MachineInterfaceDll.dll=E6=96=B0=E5=A2=9EIO?= =?UTF-8?q?=E5=8F=A3=E8=AF=BB=E5=86=99=E8=AE=BE=E7=BD=AE=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Base/Interfac/Msi/Hsi/ART/ART_PCI8622.cpp | 2 +- .../Msi/Hsi/Animatics/Animatics_Proto.cpp | 16 ++ .../Msi/Hsi/Animatics/Animatics_Proto.h | 16 -- .../Interfac/Msi/Hsi/SevenOcean/SO7_Proto.cpp | 188 ++++++++++++++- .../Interfac/Msi/Hsi/SevenOcean/SO7_Proto.h | 12 + .../Tools/UsbUtility/Debug/UtilityDebug.Log | 1 + .../MachineInterfaceDll.cpp | 39 +++ .../MachineInterfaceDll/MachineInterfaceDll.h | 10 + .../MachineInterfaceDll.rc | Bin 4676 -> 4676 bytes .../MachineInterfaceDll.vcxproj | 4 + .../MachineInterfaceDll.vcxproj.user | 3 +- .../Tools/UsbUtility/UsbUtil/SO7_UtilDlg.cpp | 9 - .../Hsi/Tools/UsbUtility/UsbUtil_VS2010.suo | Bin 125440 -> 127488 bytes .../UsbUtility/Win32TestDll/Win32TestDll.cpp | 225 +++++++++++------- 14 files changed, 412 insertions(+), 113 deletions(-) diff --git a/PcDmis/Base/Interfac/Msi/Hsi/ART/ART_PCI8622.cpp b/PcDmis/Base/Interfac/Msi/Hsi/ART/ART_PCI8622.cpp index 0e5644b..6cbd3f6 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/ART/ART_PCI8622.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/ART/ART_PCI8622.cpp @@ -382,7 +382,7 @@ BOOL CART_PCI8622::GetData(double (*_Data)[HALF_SIZE_WORDS],int* _DataNumber) { ADData = ((ADBuffer[m_SegmentID][Index])); // ½«Ô­Âëת»»Îªµçѹֵ - dVolt = static_cast(((m_AD_LSB_MAX/m_AD_LSB_RANGE) * ADData - m_AD_LSB_HALF)); + dVolt = static_cast(((m_AD_LSB_MAX/m_AD_LSB_RANGE) * (ADData&0xFFFF) - m_AD_LSB_HALF)); _Data[nADChannel][_DataNumber[nADChannel]]=dVolt; _DataNumber[nADChannel]+=1; nADChannel++; diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Animatics/Animatics_Proto.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Animatics/Animatics_Proto.cpp index ac61bf3..bbdc1f5 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Animatics/Animatics_Proto.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/Animatics/Animatics_Proto.cpp @@ -5,6 +5,22 @@ #include "math.h" +#define HBIT0 0X0001 +#define HBIT1 0X0002 +#define HBIT2 0X0004 +#define HBIT3 0X0008 +#define HBIT4 0X0010 +#define HBIT5 0X0020 +#define HBIT6 0X0040 +#define HBIT7 0X0080 +#define HBIT8 0X0100 +#define HBIT9 0X0200 +#define HBIT10 0X0400 +#define HBIT11 0X0800 +#define HBIT12 0X1000 +#define HBIT13 0X2000 +#define HBIT14 0X4000 +#define HBIT15 0X8000 #define MAX_IN_BUFF_SIZE 1024 //***** Static Data ***** diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Animatics/Animatics_Proto.h b/PcDmis/Base/Interfac/Msi/Hsi/Animatics/Animatics_Proto.h index 2c80c1c..611ddba 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Animatics/Animatics_Proto.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/Animatics/Animatics_Proto.h @@ -23,22 +23,6 @@ using namespace INTEGMOTORINTERFACELib; #define THREAD_RUNNING_STATE 0 #define THREAD_PAUSED 1 #define THREAD_EXIT -1 -#define HBIT0 0X0001 -#define HBIT1 0X0002 -#define HBIT2 0X0004 -#define HBIT3 0X0008 -#define HBIT4 0X0010 -#define HBIT5 0X0020 -#define HBIT6 0X0040 -#define HBIT7 0X0080 -#define HBIT8 0X0100 -#define HBIT9 0X0200 -#define HBIT10 0X0400 -#define HBIT11 0X0800 -#define HBIT12 0X1000 -#define HBIT13 0X2000 -#define HBIT14 0X4000 -#define HBIT15 0X8000 #pragma pack(push) diff --git a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto.cpp b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto.cpp index 284d3e9..99afd18 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto.cpp @@ -4271,6 +4271,179 @@ SSI_STATUS_MOTION CSO7_Proto::so7_light_set_lamp_state(double dTopLightPercent,d }; +//================================================================== +SSI_STATUS_MOTION CSO7_Proto::so7_GetDIO(int Channel,BYTE& bDISts) +{ + char Addr(0); + switch(Channel) + { + case INPORT_J2: + { + Addr=ESO7_CONTROLLER_INPUT_PORT_ADDR; + break; + } + case OUTPORT_J1: + { + Addr=ESO7_CONTROLLER_WOUTPUT_PORT_ADDR; + break; + } + case OUTPORT_J3: + { + Addr=ESO7_CONTROLLER_OUTPUT_PORT_ADDR; + break; + } + case LIMIT_SWITCH_J4: + { + Addr=ESO7_CONTROLLER_LIMIT_SWITCH_ADDR; + break; + } + default: + { + Addr=-1; + break; + } + } + if (Addr>=0) + { + _send_cmd_SO7_CMD_READ_INPUT_PORT_STATUS(Addr); + bDISts=static_cast(g_machine.InPortStatus); + return SSI_STATUS_MOTION_NORMAL; + } + else + { + bDISts=0; + return SSI_STATUS_MOTION_INVALID_PARAMETERS; + } +} +//================================================================== +SSI_STATUS_MOTION CSO7_Proto::so7_SetDO(int Channel,BYTE bDOSts) +{ + char cSetIOStatusAddr(0); + char cSetValue(0); + switch(Channel) + { + case OUTPORT_J1: + { + if (bDOSts&HBIT0) + { + _send_cmd_SO7_CMD_COMMON_COMMAND(CT_MOTOR,CT_M_LASE_ON,0); + } + else + { + _send_cmd_SO7_CMD_COMMON_COMMAND(CT_MOTOR,CT_M_LASE_OFF,0); + } + Sleep(5); + if (bDOSts&HBIT1) + { + cSetIOStatusAddr=1; + cSetValue=1; + } + else + { + cSetIOStatusAddr=1; + cSetValue=0; + } + _send_cmd_SO7_CMD_COMMON_COMMAND_DATA(CT_DATA,CT_WRITE_IO_DAT,cSetIOStatusAddr,cSetValue); + Sleep(5); + if (bDOSts&HBIT2) + { + cSetIOStatusAddr=2; + cSetValue=1; + } + else + { + cSetIOStatusAddr=2; + cSetValue=0; + } + _send_cmd_SO7_CMD_COMMON_COMMAND_DATA(CT_DATA,CT_WRITE_IO_DAT,cSetIOStatusAddr,cSetValue); + Sleep(5); + break; + } + case OUTPORT_J3: + { + if (bDOSts&HBIT0) + { + _send_cmd_SO7_CMD_COMMON_COMMAND(CT_MOTOR,CT_M_PROBE_OFF,0); + Sleep(5); + _send_cmd_SO7_CMD_COMMON_COMMAND(CT_MOTOR,CT_LASE_TIMMER_ON,0); + } + else + { + _send_cmd_SO7_CMD_COMMON_COMMAND(CT_MOTOR,CT_M_PROBE_ON,0); + Sleep(5); + _send_cmd_SO7_CMD_COMMON_COMMAND(CT_MOTOR,CT_LASE_TIMMER_OFF,0); + } + Sleep(5); + if (bDOSts&HBIT1) + { + cSetIOStatusAddr=11; + cSetValue=1; + } + else + { + cSetIOStatusAddr=11; + cSetValue=0; + } + _send_cmd_SO7_CMD_COMMON_COMMAND_DATA(CT_DATA,CT_WRITE_IO_DAT,cSetIOStatusAddr,cSetValue); + Sleep(5); + if (bDOSts&HBIT2) + { + cSetIOStatusAddr=12; + cSetValue=1; + } + else + { + cSetIOStatusAddr=12; + cSetValue=0; + } + _send_cmd_SO7_CMD_COMMON_COMMAND_DATA(CT_DATA,CT_WRITE_IO_DAT,cSetIOStatusAddr,cSetValue); + Sleep(5); + if (bDOSts&HBIT3) + { + cSetIOStatusAddr=13; + cSetValue=1; + } + else + { + cSetIOStatusAddr=13; + cSetValue=0; + } + _send_cmd_SO7_CMD_COMMON_COMMAND_DATA(CT_DATA,CT_WRITE_IO_DAT,cSetIOStatusAddr,cSetValue); + Sleep(5); + if (bDOSts&HBIT4) + { + cSetIOStatusAddr=14; + cSetValue=1; + } + else + { + cSetIOStatusAddr=14; + cSetValue=0; + } + _send_cmd_SO7_CMD_COMMON_COMMAND_DATA(CT_DATA,CT_WRITE_IO_DAT,cSetIOStatusAddr,cSetValue); + Sleep(5); + if (bDOSts&HBIT5) + { + cSetIOStatusAddr=15; + cSetValue=1; + } + else + { + cSetIOStatusAddr=15; + cSetValue=0; + } + _send_cmd_SO7_CMD_COMMON_COMMAND_DATA(CT_DATA,CT_WRITE_IO_DAT,cSetIOStatusAddr,cSetValue); + Sleep(5); + break; + } + default: + { + break; + } + } + return SSI_STATUS_MOTION_NORMAL; +} + //********************************************************************************// //*******************************************************************************// @@ -4287,7 +4460,10 @@ SSI_STATUS_MOTION CSO7_Proto::_send_cmd_SO7_CMD_MOVE_X(char SpeedGear) *(ep_buff[EP_02_CMD_IDX]._buffer+2) = SpeedGear; TRACE1("[MOVE_X]:%d\n",static_cast(SpeedGear)); - + if (g_machine.s_machine_config.motion.m_DebugOutputEnable>=1) + { + g_pLogger->SendAndFlushWithTime(_T("Jog X:%d.\n"),SpeedGear); + } ep_buff[EP_02_CMD_IDX]._size = 0x03; ep_buff[EP_81_DATA_IDX]._size = 0x03; @@ -4308,7 +4484,10 @@ SSI_STATUS_MOTION CSO7_Proto::_send_cmd_SO7_CMD_MOVE_Y(char SpeedGear) *(ep_buff[EP_02_CMD_IDX]._buffer+2) = SpeedGear; TRACE1("[MOVE_Y]:%d\n",static_cast(SpeedGear)); - + if (g_machine.s_machine_config.motion.m_DebugOutputEnable>=1) + { + g_pLogger->SendAndFlushWithTime(_T("Jog Y:%d.\n"),SpeedGear); + } ep_buff[EP_02_CMD_IDX]._size = 0x03; ep_buff[EP_81_DATA_IDX]._size = 0x03; @@ -4329,7 +4508,10 @@ SSI_STATUS_MOTION CSO7_Proto::_send_cmd_SO7_CMD_MOVE_Z(char SpeedGear) *(ep_buff[EP_02_CMD_IDX]._buffer+2) = SpeedGear; TRACE1("[MOVE_Z]:%d\n",static_cast(SpeedGear)); - + if (g_machine.s_machine_config.motion.m_DebugOutputEnable>=1) + { + g_pLogger->SendAndFlushWithTime(_T("Jog Z:%d.\n"),SpeedGear); + } ep_buff[EP_02_CMD_IDX]._size = 0x03; ep_buff[EP_81_DATA_IDX]._size = 0x03; diff --git a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto.h b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto.h index da93cd1..4b85c7e 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/SO7_Proto.h @@ -57,6 +57,15 @@ #define EIGHT_SEGS 8 #define FIVE_RINGS 5 +#define HBIT0 0X01 +#define HBIT1 0X02 +#define HBIT2 0X04 +#define HBIT3 0X08 +#define HBIT4 0X10 +#define HBIT5 0X20 +#define HBIT6 0X40 +#define HBIT7 0X80 + const long MAX_INTENSITY = 0x3FF; #define MAXLIGHTVALUE 255 #define MINLIGHTVALUE 1 @@ -453,6 +462,9 @@ public: SSI_STATUS_MOTION so7_light_set_light(); SSI_STATUS_MOTION so7_light_set_lamp_state(double dTopLightPercent,double dBottomLightPercent,double dCoaxialLightPercent,double dReservedLightPercent,double dRingLightPercent,char cOuterRingLightSwitch,char cInnerRingLightSwitch); + SSI_STATUS_MOTION so7_GetDIO(int Channel,BYTE& bDISts); + SSI_STATUS_MOTION so7_SetDO(int Channel,BYTE bDOSts); + SSI_STATUS_MOTION _send_cmd_SO7_CMD_MOVE_X(char SpeedGear); SSI_STATUS_MOTION _send_cmd_SO7_CMD_MOVE_Y(char SpeedGear); SSI_STATUS_MOTION _send_cmd_SO7_CMD_MOVE_Z(char SpeedGear); 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 8074332..c4acbf2 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Debug/UtilityDebug.Log +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/Debug/UtilityDebug.Log @@ -4565,3 +4565,4 @@ Destruct Cso7_Proto. Usb Port Initialized. Usb Port Initialized. Usb Port Initialized. +Usb Port Initialized. diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/MachineInterfaceDll.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/MachineInterfaceDll.cpp index 2f905f0..04dbc74 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/MachineInterfaceDll.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/MachineInterfaceDll.cpp @@ -461,6 +461,45 @@ EXP_IMP SSI_STATUS_MOTION Illumination_SetLampState(double dTopLightPercent,doub return SSI_STATUS_MOTION_NORMAL; } } + +//==============================IO================================================ +EXP_IMP SSI_STATUS_MOTION Machine_GetDIO(EIO_PORT Channel,BYTE& bDISts) +{ + if (!g_bOfflineOnly) + { + if (m_pSO7_Proto) + { + return m_pSO7_Proto->so7_GetDIO(static_cast(Channel),bDISts); + } + else + { + return SSI_STATUS_MACHINE_UNINITIALIZED; + } + } + else + { + return SSI_STATUS_MOTION_NORMAL; + } +} +EXP_IMP SSI_STATUS_MOTION Machine_SetDO(EIO_PORT Channel,BYTE bDOSts) +{ + if (!g_bOfflineOnly) + { + if (m_pSO7_Proto) + { + return m_pSO7_Proto->so7_SetDO(static_cast(Channel),bDOSts); + } + else + { + return SSI_STATUS_MACHINE_UNINITIALIZED; + } + } + else + { + return SSI_STATUS_MOTION_NORMAL; + } +} +//==============================CMD================================================ EXP_IMP SSI_STATUS_MOTION SEND_SYS_COMMAND(char Cmd,char SubCmd,char Type,char Data) { if (!g_bOfflineOnly) diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/MachineInterfaceDll.h b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/MachineInterfaceDll.h index 34aeac2..e06b26f 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/MachineInterfaceDll.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/MachineInterfaceDll.h @@ -29,6 +29,13 @@ enum EHOME_MACHINE_MODE HOME_R=30, HOME_TOATAL=255 }; +enum EIO_PORT +{ + INPORT_J2=0,//Effective bit:0-5 + OUTPORT_J1,//Effective bit:0-2 + OUTPORT_J3,//Effective bit:0-5 + LIMIT_SWITCH_J4//Effective bit:0-5 +}; enum SSI_STATUS_MOTION { SSI_STATUS_MOTION_NORMAL = 0, @@ -71,6 +78,9 @@ extern "C" //==============================Illumination======================================= //Range value:0.0-100.0 EXP_IMP SSI_STATUS_MOTION Illumination_SetLampState(double dTopLightPercent,double dBottomLightPercent,double dCoaxialLightPercent,double dReservedLightPercent,double dRingLightPercent,char cOuterRingLightSwitch,char cInnerRingLightSwitch); + //==============================IO================================================ + EXP_IMP SSI_STATUS_MOTION Machine_GetDIO(EIO_PORT Channel,BYTE& bDISts); + EXP_IMP SSI_STATUS_MOTION Machine_SetDO(EIO_PORT Channel,BYTE bDOSts); //==============================CMD================================================ EXP_IMP SSI_STATUS_MOTION SEND_SYS_COMMAND(char Cmd,char SubCmd,char Type,char Data); diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/MachineInterfaceDll.rc b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/MachineInterfaceDll.rc index e12db99b5d6e40d82731639fb41bf84bcef131f0..94ae5ea4053e8d47643eff6c7b05ca41027029d6 100644 GIT binary patch delta 42 vcmX@2aztgrDh@{D$*VaG8I3pJ<@nA7U0Wll7#5e2liLn3xF+U6~ delta 42 vcmX@2aztgrDh@`Y$*VaG8I3mI<@nA7U0Wll7#5e2liLn3xFyag; diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/MachineInterfaceDll.vcxproj b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/MachineInterfaceDll.vcxproj index 3f4a3b1..9b3cbc2 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/MachineInterfaceDll.vcxproj +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/MachineInterfaceDll.vcxproj @@ -57,6 +57,10 @@ true ..\..\..\..\..\..\..\ThirdParty\UsbSupport\LibUsb_Win\Lib\Msvc\libusb.lib;%(AdditionalDependencies) + + xcopy "$(OutDir)\MachineInterfaceDll.dll" ..\Debug\MachineInterface\*.* /D /F /Y +xcopy "$(OutDir)\MachineInterfaceDll.lib" ..\Debug\MachineInterface\*.* /D /F /Y + diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/MachineInterfaceDll.vcxproj.user b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/MachineInterfaceDll.vcxproj.user index 896ef3b..6edece1 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/MachineInterfaceDll.vcxproj.user +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/MachineInterfaceDll/MachineInterfaceDll.vcxproj.user @@ -1,8 +1,7 @@  - - + ..\Debug\MachineInterface\HoleEdgeInspect.exe WindowsLocalDebugger \ No newline at end of file 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 d244be6..0b45695 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 @@ -25,15 +25,6 @@ #include "SO7_UtilDlg.h" // CSO7_UtilDlg ¶Ô»°¿ò -#define HBIT0 0X01 -#define HBIT1 0X02 -#define HBIT2 0X04 -#define HBIT3 0X08 -#define HBIT4 0X10 -#define HBIT5 0X20 -#define HBIT6 0X40 -#define HBIT7 0X80 - extern CPSerial* m_pSO7_PCDSerial; extern CSO7_Proto* m_pSO7_Proto; extern CXBOXController* XBoxPlayer; 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 d14645cc839fb3a1f2fe0d1217f1f5d4502499a5..2dd81fee371e43034ed495f663bae2bf002da53f 100644 GIT binary patch delta 5090 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