diff --git a/HSI_HexagonMI_EF3/HSI.cpp b/HSI_HexagonMI_EF3/HSI.cpp index 3a6a865..5acdbed 100644 --- a/HSI_HexagonMI_EF3/HSI.cpp +++ b/HSI_HexagonMI_EF3/HSI.cpp @@ -32,8 +32,9 @@ static bool g_bOfflineOnly = false; //Z 8 - 280 5 // // -// -// +//V0.1.10 2024/04/07 +// --------------------------------------- +//1、配合专机2使用,增加了方向的传递接口 江苏高光半导体掩膜板瑕疵检测项目 // //////////////////////////////////////////////////////////////////////////////////////////////////// @@ -409,6 +410,37 @@ HSI_API HSI_STATUS WINAPI HSI_MOTION_SET_FOCUSSPEED_XYZ(double Speed) } +//=========================================================================== +HSI_API HSI_STATUS WINAPI HSI_MOTION_SET_DIRECTION_FLAG(int CurrentDirection) +{ + auto rStatus = HSI_STATUS_NORMAL; + if (g_pHSI_Motion) + { + rStatus = g_pHSI_Motion->SetMotionDirectionFlag(CurrentDirection); + } + else + { + rStatus = HSI_STATUS_FAILED; + } + return rStatus; + +} + +//=========================================================================== +HSI_API HSI_STATUS WINAPI HSI_MOTION_GET_DIRECTION_FLAG(int& CurrentDirection) +{ + auto rStatus = HSI_STATUS_NORMAL; + if (g_pHSI_Motion) + { + rStatus = g_pHSI_Motion->GetMotionDirectionFlag(CurrentDirection); + } + else + { + rStatus = HSI_STATUS_FAILED; + } + return rStatus; +} + #pragma endregion #define USE_Motion_API diff --git a/HSI_HexagonMI_EF3/HSI.h b/HSI_HexagonMI_EF3/HSI.h index aa4cb1c..5246c5d 100644 --- a/HSI_HexagonMI_EF3/HSI.h +++ b/HSI_HexagonMI_EF3/HSI.h @@ -21,7 +21,7 @@ #endif const int HSI_APIVersionMajor = 1; -const int HSI_APIVersionMinor = 9; +const int HSI_APIVersionMinor = 10; const int HSI_MaxStringLength = 255; // Maximum string length (buffer size - 1) /////////////////////////////////////////////////////////////////////////////// // Interface API @@ -456,7 +456,6 @@ HSI_API HSI_STATUS WINAPI HSI_MOTION_GET_POSITION_XYZ_CACHE(unsigned char* Cache // 第二阶段需要重写的API 函数 HSI_API HSI_STATUS WINAPI HSI_MOTION_IS_SUPPORTED(UINT& Types); -HSI_API HSI_STATUS WINAPI HSI_MOTION_GET_SPEED_XYZ(double& Speed); HSI_API HSI_STATUS WINAPI HSI_MOTION_SET_SPEED_XYZ(double Speed); HSI_API HSI_STATUS WINAPI HSI_MOTION_GET_ACCELERATION_XYZ(double& AccelX, double& AccelY, double& AccelZ); HSI_API HSI_STATUS WINAPI HSI_MOTION_SET_ACCELERATION_XYZ(double AccelX, double AccelY, double AccelZ); @@ -491,8 +490,10 @@ HSI_API HSI_STATUS WINAPI HSI_MOTION_SET_POSITION_EX(UINT AxisTypes, double Posi HSI_API HSI_STATUS WINAPI HSI_MOTION_GET_SPEED_EX(UINT AxisTypes, double& Speed); HSI_API HSI_STATUS WINAPI HSI_MOTION_GET_ACCELERATION_EX(UINT AxisTypes, double& Accel); HSI_API HSI_STATUS WINAPI HSI_MOTION_SET_ACCELERATION_EX(UINT AxisTypes, double Accel); - HSI_API HSI_STATUS WINAPI HSI_ILLUMINATION_SHUTDOWN(); +HSI_API HSI_STATUS WINAPI HSI_MOTION_SET_DIRECTION_FLAG(int CurrentDirection); //设置运动方向标志位,用于下层触发相机 +HSI_API HSI_STATUS WINAPI HSI_MOTION_GET_DIRECTION_FLAG(int& CurrentDirection); //获取运动方向标志位 + //暂未实现 //HSI_API HSI_STATUS WINAPI HSI_MOTION_SET_MAGNIFICATION(UINT AxisTypes, double mag, HSI_MOTION_MOVE_TYPE eType, double dSpeedGear); diff --git a/HSI_HexagonMI_EF3/HSI_Motion.cpp b/HSI_HexagonMI_EF3/HSI_Motion.cpp index 6ec3c02..84a2f22 100644 --- a/HSI_HexagonMI_EF3/HSI_Motion.cpp +++ b/HSI_HexagonMI_EF3/HSI_Motion.cpp @@ -138,6 +138,8 @@ HSI_Motion::HSI_Motion() m_IsUseTwentySixLight = 0; //是否启用26路灯光 0为不启用 1位启用 默认为0 m_IsUseEF3 = 0; //是否启用EF3 m_IsUseACS = 0; //是否启用ACS + m_IsUseSimulator = false; // 增加一个是否连接虚拟机的标志 + m_IsUseRocker = 0; //是否启用摇杆 0为不启用 1为启用旧摇杆,2为新摇杆, 默认为0 m_IsCloseRocker = 0; m_DeviceType = 0; //设备类型,0为通用设备,1为三激光, 2为大视野,3为转盘设备 默认为0 @@ -502,14 +504,19 @@ HSI_STATUS HSI_Motion::Startup(HWND _hWnd, bool _bOfflineOnly) g_pLogger->SendAndFlushWithTime( L"[ACS Motion] Wait for opening of communication with the controller... \n"); -#ifdef OFFLINE //如果定义离线模式 - handleACS = acsc_OpenCommSimulator(); -#else - // 10.0.0.100 - default IP address of the controller - handleACS = acsc_OpenCommEthernet(m_ACS_IPAddresses, ACSC_SOCKET_DGRAM_PORT); - // for the connection to the controller via local network or Internet - // hComm = acsc_OpenCommEthernet("10.0.0.100", ACSC_SOCKET_STREAM_PORT); + if (m_IsUseSimulator == 1) + { + handleACS = acsc_OpenCommSimulator(); + } + else + { + + // 10.0.0.100 - default IP address of the controller + handleACS = acsc_OpenCommEthernet(m_ACS_IPAddresses, ACSC_SOCKET_DGRAM_PORT); + // for the connection to the controller via local network or Internet + // hComm = acsc_OpenCommEthernet("10.0.0.100", ACSC_SOCKET_STREAM_PORT); + } if (handleACS == ACSC_INVALID) //打开失败 { g_pLogger->SendAndFlushWithTime(L"[ACS Motion] error while opening communication.\n"); @@ -523,7 +530,7 @@ HSI_STATUS HSI_Motion::Startup(HWND _hWnd, bool _bOfflineOnly) EventCallback(sEvenProp); return HSI_STATUS_FAILED; } -#endif + //使能电机 //int Axes[] = { ACSC_AXIS_1, ACSC_AXIS_0, ACSC_AXIS_8, -1 }; //根据电气层面定义,这里的0对应X轴,1对应Y轴,8对应Z轴 if (!acsc_EnableM(handleACS, ACSAxisNumbers, nullptr)) @@ -918,7 +925,7 @@ HSI_STATUS HSI_Motion::GetFirmwareVersion(byte* version) } } - g_pLogger->SendAndFlushWithTime(L"[GetFirmwareVersion] EF3 Firmware Version %S\n", version); + g_pLogger->SendAndFlushWithTime(L"[GetFirmwareVersion] EF3 Firmware Version %S \n", version); m_Thread_StateData = HSI_THREAD_RUNNING; SetEvent(m_hTriggerEventData); //触发事件,其中hEvent表示句柄,返回值:如果操作成功,则返回非零值,否则为0。 return HSI_STATUS_NORMAL; @@ -4272,6 +4279,7 @@ HSI_STATUS HSI_Motion::Load_EF3_Config_Inifile(CString GoogolIniFile) } m_IsUseEF3 = GetPrivateProfileInt(L"EF3", L"IS_USEEF3", 0, csAppPath); m_IsUseACS = GetPrivateProfileInt(L"EF3", L"IS_USEACS", 0, csAppPath); + m_IsUseSimulator = GetPrivateProfileInt(L"EF3", L"IS_USE_SIMULATOR", 0, csAppPath); m_ForSoft = GetPrivateProfileInt(L"SOFTWARE", L"USE_SOFTWARE", 0, csAppPath); // 从配置文件中读取IP地址 @@ -9690,4 +9698,85 @@ HSI_STATUS HSI_Motion::SetAllGears() return rStatus; } -//=========================================================================== \ No newline at end of file +//=========================================================================== +HSI_STATUS HSI_Motion::SetMotionDirectionFlag(int CurrentDirection) //用于向ACS特定变量写入 -1 或 1 +{ + g_pLogger->SendAndFlushWithTime(L"[SetMotionDirectionFlag] CurrentDirection = %d\n", CurrentDirection); + + // 判断输入是否为1或-1 + if (CurrentDirection != 1 && CurrentDirection != -1) + { + g_pLogger->SendAndFlushWithTime(L"[SetMotionDirectionFlag] Invalid direction flag\n"); + return HSI_STATUS_FAILED; + } + + auto rStatus = HSI_STATUS_NORMAL; + if (g_pHSI_Motion && handleACS != ACSC_INVALID) + { + int waitTowrite[1] = { CurrentDirection }; + if (!acsc_WriteInteger(handleACS, // communication handle + ACSC_NONE, // standard variable + "CurrentDirection", // variable name + ACSC_NONE, ACSC_NONE, // first dimension indexes + ACSC_NONE, ACSC_NONE, // no second dimension + waitTowrite, // pointer to the buffer contained values + // that must be written + NULL // waiting call + )) + { + + g_pLogger->SendAndFlushWithTime(L"[SetMotionDirectionFlag] transaction error : % d\n", acsc_GetLastError()); + ErrorsHandler(); + CurrentHomeMachineState = E_EF3_HOME_NONE; + rStatus = HSI_STATUS_FAILED; + } + + g_pLogger->SendAndFlushWithTime(L"[SetMotionDirectionFlag] ACS write OK\n"); + return rStatus; + + } + else + { + g_pLogger->SendAndFlushWithTime(L"[SetMotionDirectionFlag] ACS is not connected\n"); + rStatus = HSI_STATUS_FAILED; + } + +} + + +//=========================================================================== +HSI_STATUS HSI_Motion::GetMotionDirectionFlag(int& CurrentDirection) +{ + + auto rStatus = HSI_STATUS_NORMAL; + if (g_pHSI_Motion && handleACS != ACSC_INVALID) + { + int waitToRead[1] = { 0 }; + if (!acsc_ReadInteger(handleACS, // communication handle + ACSC_NONE, // standard variable + "CurrentDirection", // variable name + ACSC_NONE, ACSC_NONE, // first dimension indexes + ACSC_NONE, ACSC_NONE, // no second dimension + waitToRead, // pointer to the buffer contained values + // that must be written + NULL // waiting call + )) + { + g_pLogger->SendAndFlushWithTime(L"[GetMotionDirectionFlag] transaction error : % d\n", acsc_GetLastError()); + ErrorsHandler(); + rStatus = HSI_STATUS_FAILED; + } + else + { + g_pLogger->SendAndFlushWithTime(L"[GetMotionDirectionFlag] ACS read OK\n"); + CurrentDirection = waitToRead[0]; + } + return rStatus; + } + else + { + g_pLogger->SendAndFlushWithTime(L"[GetMotionDirectionFlag] ACS is not connected\n"); + rStatus = HSI_STATUS_FAILED; + } +} + diff --git a/HSI_HexagonMI_EF3/HSI_Motion.h b/HSI_HexagonMI_EF3/HSI_Motion.h index 157dbaf..45754a1 100644 --- a/HSI_HexagonMI_EF3/HSI_Motion.h +++ b/HSI_HexagonMI_EF3/HSI_Motion.h @@ -364,6 +364,13 @@ public: HSI_STATUS GlueDispenserStart(double xOffset, double yOffset, double qOffset); HSI_STATUS GetPntsDistance(double& ptpDistance, int& spTimeCount); + HSI_STATUS SetMotionDirectionFlag(int CurrentDirection); //特殊需求:向ACS层写入运动方向标志位,用于触发相机拍照 + // 获取当前运动方向标志位 + HSI_STATUS GetMotionDirectionFlag(int& CurrentDirection); //特殊需求:向ACS层读取运动方向标志位,用于触发相机拍照 + + // + + public: static int m_Thread_State; static HANDLE m_Thread_Id; @@ -472,6 +479,7 @@ public: int m_IsUseTwentySixLight; //是否启用26路灯光 0为不启用 1位启用 默认为0 int m_IsUseEF3; //是否启用EF3 int m_IsUseACS; //是否用ACS运动控制 + int m_IsUseSimulator; //是否启用模拟器 char m_ACS_IPAddresses[50]; // 定义字符串,存储ACS IP地址 int m_DeviceType; //设备类型,0为通用设备,1为三激光, 2为大视野,3为转盘设备 默认为0 diff --git a/HSI_HexagonMI_EF3/version.h b/HSI_HexagonMI_EF3/version.h index 649320e..1800c27 100644 --- a/HSI_HexagonMI_EF3/version.h +++ b/HSI_HexagonMI_EF3/version.h @@ -12,5 +12,5 @@ #define HSI_VERSION_REVNUM #define HSI_VERSION_BUILD_DATE _T(__DATE__ ) #define HSI_VERSION_BUILD_TIME _T(__TIME__ ) -#define HSI_FILE_DESCRIPTION "2025.03.11 / 17:19 " -#define HSI_FILE_CSDESCRIPTION _T("2025.03.11 / 17:19 ") +#define HSI_FILE_DESCRIPTION "2025.04.07 / 16:25 " +#define HSI_FILE_CSDESCRIPTION _T("2025.04.07 / 16:25 ") diff --git a/HSI_SEVENOCEAN_EF1_CsTest/HSI/HSI.cs b/HSI_SEVENOCEAN_EF1_CsTest/HSI/HSI.cs index c72af10..6768995 100644 --- a/HSI_SEVENOCEAN_EF1_CsTest/HSI/HSI.cs +++ b/HSI_SEVENOCEAN_EF1_CsTest/HSI/HSI.cs @@ -37,6 +37,13 @@ namespace HSI_SEVENOCEAN_EF1_CsTest.HSI [DllImport("HSI.dll", EntryPoint = "HSI_SHUTDOWM", CharSet = CharSet.Unicode)] public static extern HSI_STATUS Shutdown(); + [DllImport("HSI.dll", EntryPoint = "HSI_MOTION_SET_DIRECTION_FLAG", CharSet = CharSet.Unicode)] + public static extern HSI_STATUS SetDirectionFlag(int directionFlag); + + [DllImport("HSI.dll", EntryPoint = "HSI_MOTION_GET_DIRECTION_FLAG", CharSet = CharSet.Unicode)] + public static extern HSI_STATUS GetDirectionFlag(ref int directionFlag); + + // <<<< Out Interfacess //事件回调函数 public static void EventCallback(HSI_EVENT_TYPE eventType, HSI_EVENT_RESPONSE_TYPE responseType, diff --git a/HSI_SEVENOCEAN_EF1_CsTest/Program.cs b/HSI_SEVENOCEAN_EF1_CsTest/Program.cs index 211f1fb..bd6e4a0 100644 --- a/HSI_SEVENOCEAN_EF1_CsTest/Program.cs +++ b/HSI_SEVENOCEAN_EF1_CsTest/Program.cs @@ -50,6 +50,17 @@ namespace HSI_SEVENOCEAN_EF1_CsTest Marshal.Copy(intPtrEF3Version, EF3Version, 0, EF3Version.Length); Console.WriteLine("EF3 FirewareVerion Version: {0}", Encoding.UTF8.GetString(EF3Version)); + + #region 读写变量测试 + rStatus = Interface.SetDirectionFlag(-1); + Console.WriteLine("Interface.SetDirectionFlag: {0}", rStatus); + + int currentDir = 0; + rStatus = Interface.GetDirectionFlag(ref currentDir); + Console.WriteLine("Interface.GetDirectionFlag: {0}", currentDir); + + #endregion + #region 扫描功能测试 ////启动扫描 diff --git a/HSI_SEVENOCEAN_EF1_CsTest/bin/Debug/Config/EF3_Config.ini b/HSI_SEVENOCEAN_EF1_CsTest/bin/Debug/Config/EF3_Config.ini index 92ed18c..fa75c88 100644 Binary files a/HSI_SEVENOCEAN_EF1_CsTest/bin/Debug/Config/EF3_Config.ini and b/HSI_SEVENOCEAN_EF1_CsTest/bin/Debug/Config/EF3_Config.ini differ