# 对专机2的支持,新增对ACS 全局变量的接口,支持写入方向

This commit is contained in:
zhengxuan.zhang
2025-04-07 16:27:40 +08:00
parent 6ad8cfcd14
commit ce5c58e450
8 changed files with 165 additions and 17 deletions
+34 -2
View File
@@ -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
+4 -3
View File
@@ -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);
+99 -10
View File
@@ -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;
}
//===========================================================================
//===========================================================================
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;
}
}
+8
View File
@@ -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
+2 -2
View File
@@ -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 ")
+7
View File
@@ -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,
+11
View File
@@ -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
////启动扫描