From 2be151c6f9148d9326c9642866e0b92e086284f0 Mon Sep 17 00:00:00 2001
From: mrDarker <mr.darker@163.com>
Date: 星期五, 01 八月 2025 15:33:52 +0800
Subject: [PATCH] 1. 添加光谱传感器模块

---
 SourceCode/Bond/SGMeasurement/DLL/64bit/SGIFPJ.lib          |    0 
 SourceCode/Bond/SGMeasurement/res/menu_restore.ico          |    0 
 SourceCode/Bond/GangBond2860.sln                            |   14 
 SourceCode/Bond/SGMeasurement/framework.h                   |   49 
 SourceCode/Bond/SGMeasurement/DLL/ZY系列通信库参考手册-V2.3.pdf      |    0 
 SourceCode/Bond/SGMeasurement/res/SGMeasurement.ico         |    0 
 SourceCode/Bond/SGMeasurement/SGMeasurement.vcxproj         |  229 ++
 SourceCode/Bond/SGMeasurement/DLL/32bit/SGIF.h              | 1641 +++++++++++++++++++
 SourceCode/Bond/SGMeasurement/SGMeasurement.h               |   32 
 SourceCode/Bond/SGMeasurement/SGMeasurement.vcxproj.filters |   69 
 SourceCode/Bond/SGMeasurement/DLL/32bit/SGIFPJ.lib          |    0 
 SourceCode/Bond/SGMeasurement/DLL/64bit/SGIF.h              | 1641 +++++++++++++++++++
 SourceCode/Bond/SGMeasurement/SGMeasurement.rc              |    0 
 SourceCode/Bond/SGMeasurement/res/menu_close.ico            |    0 
 SourceCode/Bond/SGMeasurement/DLL/64bit/SGIFPJ.dll          |    0 
 SourceCode/Bond/SGMeasurement/resource.h                    |   45 
 SourceCode/Bond/SGMeasurement/SGMeasurementDlg.h            |  277 +++
 SourceCode/Bond/SGMeasurement/pch.h                         |   13 
 SourceCode/Bond/SGMeasurement/pch.cpp                       |    5 
 SourceCode/Bond/SGMeasurement/targetver.h                   |    8 
 SourceCode/Bond/SGMeasurement/SGMeasurement.cpp             |  104 +
 SourceCode/Bond/SGMeasurement/DLL/32bit/SGIFPJ.dll          |    0 
 SourceCode/Bond/SGMeasurement/SGMeasurement.vcxproj.user    |    6 
 SourceCode/Bond/SGMeasurement/SGMeasurementDlg.cpp          |  952 +++++++++++
 SourceCode/Bond/SGMeasurement/res/SGMeasurement.rc2         |    0 
 25 files changed, 5,083 insertions(+), 2 deletions(-)

diff --git a/SourceCode/Bond/GangBond2860.sln b/SourceCode/Bond/GangBond2860.sln
index e73e6fb..8cfa047 100644
--- a/SourceCode/Bond/GangBond2860.sln
+++ b/SourceCode/Bond/GangBond2860.sln
@@ -1,7 +1,7 @@
 锘�
 Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 16
-VisualStudioVersion = 16.0.31729.503
+# Visual Studio Version 17
+VisualStudioVersion = 17.13.35913.81 d17.13
 MinimumVisualStudioVersion = 10.0.40219.1
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BEQLibrary", "BEQLibrary\BEQLibrary.vcxproj", "{8421CE64-06F9-48F4-A3F3-ACFB683C94D4}"
 EndProject
@@ -16,6 +16,8 @@
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BoounionPLC", "BoounionPLC\BoounionPLC.vcxproj", "{6DC0600E-5588-4033-A281-3626A4F74B67}"
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "EAPSimulator", "EAPSimulator\EAPSimulator.vcxproj", "{9EA43050-B71C-47A7-AC90-F0D7A88C5F50}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SGMeasurement", "SGMeasurement\SGMeasurement.vcxproj", "{F8087F20-3A3E-18F2-09E3-9C139642EB58}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -81,6 +83,14 @@
 		{9EA43050-B71C-47A7-AC90-F0D7A88C5F50}.Release|x64.Build.0 = Release|x64
 		{9EA43050-B71C-47A7-AC90-F0D7A88C5F50}.Release|x86.ActiveCfg = Release|Win32
 		{9EA43050-B71C-47A7-AC90-F0D7A88C5F50}.Release|x86.Build.0 = Release|Win32
+		{F8087F20-3A3E-18F2-09E3-9C139642EB58}.Debug|x64.ActiveCfg = Debug|x64
+		{F8087F20-3A3E-18F2-09E3-9C139642EB58}.Debug|x64.Build.0 = Debug|x64
+		{F8087F20-3A3E-18F2-09E3-9C139642EB58}.Debug|x86.ActiveCfg = Debug|Win32
+		{F8087F20-3A3E-18F2-09E3-9C139642EB58}.Debug|x86.Build.0 = Debug|Win32
+		{F8087F20-3A3E-18F2-09E3-9C139642EB58}.Release|x64.ActiveCfg = Release|x64
+		{F8087F20-3A3E-18F2-09E3-9C139642EB58}.Release|x64.Build.0 = Release|x64
+		{F8087F20-3A3E-18F2-09E3-9C139642EB58}.Release|x86.ActiveCfg = Release|Win32
+		{F8087F20-3A3E-18F2-09E3-9C139642EB58}.Release|x86.Build.0 = Release|Win32
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
diff --git a/SourceCode/Bond/SGMeasurement/DLL/32bit/SGIF.h b/SourceCode/Bond/SGMeasurement/DLL/32bit/SGIF.h
new file mode 100644
index 0000000..bbfae94
--- /dev/null
+++ b/SourceCode/Bond/SGMeasurement/DLL/32bit/SGIF.h
@@ -0,0 +1,1641 @@
+
+
+#ifdef SGIF_EXPORTS
+#define EXP __declspec(dllexport)
+#else
+#define EXP __declspec(dllimport)
+#endif
+
+#include "Winsock2.h"
+#include "Ws2tcpip.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <windows.h>
+#pragma comment(lib, "WS2_32.lib")
+
+// Return Code List
+typedef enum {
+	RC_OK = 0x0000,				
+	// The operation is completed successfully.
+	///////////////////////////////////////////////
+	// Communication error from controller notification
+	//
+	RC_NAK_COMMAND = 0x1001,		// Command error
+	RC_NAK_COMMAND_LENGTH,			// Command length error
+	RC_NAK_TIMEOUT,					// Timeout
+	RC_NAK_CHECKSUM,				// Check sum error
+	RC_NAK_INVALID_STATE,			// Status error
+	RC_NAK_OTHER,					// Other error
+	RC_NAK_PARAMETER,				// Parameter error
+	RC_NAK_OUT_STAGE,				// OUT calculation count limitation error
+	RC_NAK_OUT_HEAD_NUM,			// No. of used head/OUT over error
+	RC_NAK_PARAM_RANGE_DATA_STORED,	// OUT No which data reserved over acctive out count
+	RC_NAK_OUT_INVALID_CALC,		// OUT which cannot be used for calculation was specified for calculation.
+	RC_NAK_OUT_VOID,				// OUT which specified for calculation is not found.
+	RC_NAK_INVALID_CYCLE,			// Unavailable sampling cycle
+	RC_NAK_CTRL_ERROR,				// Main unit error
+	RC_NAK_SRAM_ERROR,				// Setting value error
+	///////////////////////////////////////////////
+	// Communication DLL error notification
+	//
+	RC_ERR_OPEN_DEVICE = 0x2000,// Opening the device failed.
+	RC_ERR_NO_DEVICE,			// The device is not open.
+	RC_ERR_SEND,				// Command sending error
+	RC_ERR_RECEIVE,				// Response receiving error
+	RC_ERR_TIMEOUT,				// Timeout
+	RC_ERR_NODATA,				// No data
+	RC_ERR_NOMEMORY,			// No free memory
+
+	RC_ERR_DISCONNECT,			// Cable disconnection suspected
+	RC_ERR_UNKNOWN,				// Undefined error
+	RC_ERR_DEVID_OVER,			// over dev_id scale
+	RC_ERR_NET_NO_CONN,			// no connected at the deviceID 
+	RC_ERR_IP_EXISTED,
+	RC_ERR_SELECT,				// select of /socket error
+	RC_ERR_NULL_PARAMETER,		// NULL point exception from parameter
+	RC_ERR_DIY_FUNC,			// error due to dir function
+	RC_ERR_OVER_PARAMENTER,		// paramenter over the limition
+	RC_ERR_NOT_SUPPORT			// 功能不支持
+} RC;
+
+//device Version
+typedef enum {
+	SG3035 = 0,
+	SG3030 = 1,
+	SG3085 = 2,
+	SG3080 = 3,
+	SG5025 = 4,
+	SG5020 = 5,
+	SG5055 = 6,
+	SG5050 = 7,
+	SG5085 = 8,
+	SG5080 = 9,
+	SG5155 = 10,
+	SG5150 = 11,
+	SC04025 = 12,
+	SC03560 = 13,
+	SGI500 = 14,
+	SGI505 = 15,
+	SGI400 = 16,
+	SGI405 = 17,
+	SGI150 = 18,
+	SGI155 = 19,
+	SGI080 = 20,
+	SGI085 = 21,
+	SGI050 = 22,
+	SGI055 = 23,
+	SGI030 = 24,
+	SGI035 = 25,
+	SGI020 = 26,
+	SGI025 = 27,
+	SG3155 = 28,
+	SG3150 = 29,
+	SC01045 = 30,
+	SC10015 = 31,
+	SC20011 = 32,
+	SC01236 = 33,
+	SCI04025 = 34,
+	SCI03560 = 35,
+	SCI01045 = 36,
+	SCI10015 = 37,
+	SCI20011 = 38,
+	SCI01236 = 39,
+}SGIF_DEVICE_TYPE;
+
+// Measurement value structures
+typedef enum {
+	SGIF_FLOATRESULT_VALID,			// valid data
+	SGIF_FLOATRESULT_RANGEOVER_P,	// over range at positive (+) side
+	SGIF_FLOATRESULT_RANGEOVER_N,	// over range at negative (-) side
+	SGIF_FLOATRESULT_WAITING,		// Wait for comparator result
+	SGIF_FLOATRESULT_ALARM,			// alarm
+	SGIF_FLOATRESULT_INVALID,		// Invalid (error, etc.)
+} SGIF_FLOATRESULT;
+
+// Set ABLE
+typedef enum {
+	SGIF_ABLEMODE_AUTO,				// AUTO
+	SGIF_ABLEMODE_MANUAL,			// manual
+} SGIF_ABLEMODE;
+
+// Set Measurement Mode
+typedef enum {
+	SGIF_MEASUREMODE_NORMAL,						// normal
+	SGIF_MEASUREMODE_HALF_T,						// translucent object
+	SGIF_MEASUREMODE_TRAN_1,						// transparent object
+	SGIF_MEASUREMODE_TRAN_2,						// transparent object 2
+	SGIF_MEASUREMODE_MRS,							// multireflective object
+	SGIF_MEASUREMODE_OPAQUE = SGIF_MEASUREMODE_MRS,	// Semi opaque object
+} SGIF_MEASUREMODE;
+
+// Set Basic Point
+typedef enum {
+	SGIF_BASICPOINT_NEAR,			// NEAR
+	SGIF_BASICPOINT_FAR,			// FAR
+} SGIF_BASICPOINT;
+
+// Set Mounting Mode
+typedef enum {
+	SGIF_REFLECTIONMODE_DIFFUSION,	// diffuse reflection
+	SGIF_REFLECTIONMODE_MIRROR,		// specular reflection
+} SGIF_REFLECTIONMODE;
+
+// Set Median
+typedef enum {
+	SGIF_MEDIAN_OFF,				// OFF
+	SGIF_MEDIAN_7,					// 7 point
+	SGIF_MEDIAN_15,					// 15 point
+	SGIF_MEDIAN_31,					// 31 point
+} SGIF_MEDIAN;
+
+// Set LASER CTRL group.
+typedef enum {
+	SGIF_LASER_CTRL_GROUP_1,		// LASER CTRL 1
+	SGIF_LASER_CTRL_GROUP_2,		// LASER CTRL 2
+} SGIF_LASER_CTRL_GROUP;
+
+// Set a range.
+typedef enum {
+	SGIF_RANGE_CENTER,				// CENTER
+	SGIF_RANGE_FAR,					// FAR
+} SGIF_RANGE;
+
+// Set Mutual Interference Prevention Group
+typedef enum {
+	SGIF_MUTUAL_INTERFERENCE_PREVENTION_GROUP_A,	// Group A
+	SGIF_MUTUAL_INTERFERENCE_PREVENTION_GROUP_B,	// Group B
+	SGIF_MUTUAL_INTERFERENCE_PREVENTION_GROUP_C,	// Group C
+} SGIF_MUTUAL_INTERFERENCE_PREVENTION_GROUP;
+
+// Set calculation method.
+typedef enum {
+	SGIF_CALCMETHOD_HEADA,					// head A
+	SGIF_CALCMETHOD_HEADB,					// head B
+	SGIF_CALCMETHOD_HEAD_HEADA_PLUS_HEADB,	// head A+head B
+	SGIF_CALCMETHOD_HEAD_HEADA_MINUS_HEADB,	// head A-head B
+	SGIF_CALCMETHOD_HEAD_HEADA_TRANSPARENT,	// head A transparent object
+	SGIF_CALCMETHOD_HEAD_HEADB_TRANSPARENT,	// head B transparent object
+
+	SGIF_CALCMETHOD_HEAD = 0,	// head
+	SGIF_CALCMETHOD_OUT,		// OUT
+	SGIF_CALCMETHOD_ADD,		// ADD
+	SGIF_CALCMETHOD_SUB,		// SUB
+	SGIF_CALCMETHOD_AVE,		// AVE
+	SGIF_CALCMETHOD_MAX,		// MAX
+	SGIF_CALCMETHOD_MIN,		// MIN
+	SGIF_CALCMETHOD_PP,			// P-P
+} SGIF_CALCMETHOD;
+
+// Set Target Surface
+typedef enum {
+	SGIF_CALCTARGET_PEAK_1,		// peak 1
+	SGIF_CALCTARGET_PEAK_2,		// peak 2
+	SGIF_CALCTARGET_PEAK_3,		// peak 3
+	SGIF_CALCTARGET_PEAK_4,		// peak 4
+	SGIF_CALCTARGET_PEAK_1_2,	// peak 1-peak 2
+	SGIF_CALCTARGET_PEAK_1_3,	// peak 1-peak 3
+	SGIF_CALCTARGET_PEAK_1_4,	// peak 1-peak 4
+	SGIF_CALCTARGET_PEAK_2_3,	// peak 2-peak 3
+	SGIF_CALCTARGET_PEAK_2_4,	// peak 2-peak 4
+	SGIF_CALCTARGET_PEAK_3_4,	// peak 3-peak 4
+} SGIF_CALCTARGET;
+
+// Set Filter Mode
+typedef enum {
+	SGIF_FILTERMODE_MOVING_AVERAGE,			// moving average
+} SGIF_FILTERMODE;
+
+// Specify the filter parameter. (The number of averaging for moving average, or the cutoff frequency for LPF/HPF.) 
+
+typedef enum {
+	SGIF_FILTERPARA_AVE_1 = 0,		// 1 time
+	SGIF_FILTERPARA_AVE_4,			// 4 times
+	SGIF_FILTERPARA_AVE_16,			// 16 times
+	SGIF_FILTERPARA_AVE_64,			// 64 times
+	SGIF_FILTERPARA_AVE_256,		// 256 times
+	SGIF_FILTERPARA_AVE_1024,		// 1024 times
+	SGIF_FILTERPARA_AVE_4096,		// 4096 times
+	SGIF_FILTERPARA_AVE_16384,		// 16384 times
+	SGIF_FILTERPARA_AVE_65536,		// 65536 times
+	SGIF_FILTERPARA_AVE_262144,		// 262144 times
+
+}SGIF_FILTERPARA;
+
+// Set Trigger Mode
+typedef enum {
+	SGIF_TRIGGERMODE_EXT1,		// external trigger 1
+	SGIF_TRIGGERMODE_EXT2,		// external trigger 2
+} SGIF_TRIGGERMODE;
+
+// Set the Measurement Mode.
+typedef enum {
+	SGIF_CALCMODE_NORMAL,			// normal
+	SGIF_CALCMODE_PEAKHOLD,			// peak hold
+	SGIF_CALCMODE_BOTTOMHOLD,		// bottom hold
+	SGIF_CALCMODE_PEAKTOPEAKHOLD,	// peak-to-peak hold
+	SGIF_CALCMODE_SAMPLEHOLD,		// sample hold
+} SGIF_CALCMODE;
+
+// Set Minimum Display Unit
+typedef enum {
+	SGIF_DISPLAYUNIT_0000_01MM = 0,	// 0.01mm
+	SGIF_DISPLAYUNIT_000_001MM,		// 0.001mm
+	SGIF_DISPLAYUNIT_00_0001MM,		// 0.0001mm
+	SGIF_DISPLAYUNIT_0_00001MM,		// 0.00001mm
+	SGIF_DISPLAYUNIT_00000_1UM,		// 0.1um
+	SGIF_DISPLAYUNIT_0000_01UM,		// 0.01um
+	SGIF_DISPLAYUNIT_000_001UM,		// 0.001um
+
+} SGIF_DISPLAYUNIT;
+
+// Specify OUT
+typedef enum {
+	SGIF_OUTNO_01 = 0x0001,			// OUT01
+	SGIF_OUTNO_02 = 0x0002,			// OUT02
+	SGIF_OUTNO_03 = 0x0004,			// OUT03
+	SGIF_OUTNO_04 = 0x0008,			// OUT04
+	SGIF_OUTNO_ALL = 0x000F,		// All OUTs
+} SGIF_OUTNO;
+
+// Set Storage (Cycle)
+typedef enum {
+	SGIF_STORAGECYCLE_1,			// sampling rate x 1
+	SGIF_STORAGECYCLE_2,			// sampling rate x 2
+	SGIF_STORAGECYCLE_5,			// sampling rate x 5
+	SGIF_STORAGECYCLE_10,			// sampling rate x 10
+	SGIF_STORAGECYCLE_20,			// sampling rate x 20
+	SGIF_STORAGECYCLE_50,			// sampling rate x 50
+	SGIF_STORAGECYCLE_100,			// sampling rate x 100
+	SGIF_STORAGECYCLE_200,			// sampling rate x 200
+	SGIF_STORAGECYCLE_500,			// sampling rate x 500
+	SGIF_STORAGECYCLE_1000,			// sampling rate x 1000
+	SGIF_STORAGECYCLE_TIMING,		// Timing sync
+} SGIF_STORAGECYCLE;
+
+// Set Sampling Rate
+typedef enum {
+	//SG5000系列
+	SGIF_5000_SAMPLINGCYCLE_590KHZ,     // 590kHz
+	SGIF_5000_SAMPLINGCYCLE_400KHZ,		// 400kHz
+	SGIF_5000_SAMPLINGCYCLE_200KHZ,		// 200kHz
+	SGIF_5000_SAMPLINGCYCLE_88KHZ,		// 88kHz
+	SGIF_5000_SAMPLINGCYCLE_50KHZ,		// 50kHz
+	SGIF_5000_SAMPLINGCYCLE_20KHZ,		// 20kHz
+	SGIF_5000_SAMPLINGCYCLE_10KHZ,		// 10kHz
+	SGIF_5000_SAMPLINGCYCLE_5KHZ,		// 5kHz
+	SGIF_5000_SAMPLINGCYCLE_2KHZ,		// 2kHz
+	SGIF_5000_SAMPLINGCYCLE_1KHZ,		// 1kHz+
+
+	//SG3000系列
+	SGIF_3000_SAMPLINGCYCLE_88KHZ = 10,	// 88kHz
+	SGIF_3000_SAMPLINGCYCLE_50KHZ,		// 50kHz
+	SGIF_3000_SAMPLINGCYCLE_20KHZ,		// 20kHz
+	SGIF_3000_SAMPLINGCYCLE_10KHZ,		// 10kHz
+	SGIF_3000_SAMPLINGCYCLE_5KHZ,		// 5kHz
+	//SGIF_3000_SAMPLINGCYCLE_2KHZ,		// 2kHz
+	SGIF_3000_SAMPLINGCYCLE_1KHZ,		// 1kHz
+
+	//SCI系列
+	SCI_SAMPLINGCYCLE_33KHZ = 30,	// 33kHz
+	SCI_SAMPLINGCYCLE_20KHZ,		// 20kHz
+	SCI_SAMPLINGCYCLE_15KHZ,		// 15kHz
+	SCI_SAMPLINGCYCLE_10KHZ,		// 10kHz
+	SCI_SAMPLINGCYCLE_5KHZ,			// 5kHz
+	SCI_SAMPLINGCYCLE_2KHZ,			// 2kHz
+	SCI_SAMPLINGCYCLE_1KHZ,			// 1kHz
+	SCI_SAMPLINGCYCLE_05KHZ,		// 0.5kHz
+} SGIF_SAMPLINGCYCLE;
+
+// Set Mutual interference prevention
+typedef enum {
+	SGIF_MUTUAL_INTERFERENCE_PREVENTION_OFF,	// OFF
+	SGIF_MUTUAL_INTERFERENCE_PREVENTION_AB_ON,	// AB-ON
+	SGIF_MUTUAL_INTERFERENCE_PREVENTION_ABC_ON,	// ABC-ON
+} SGIF_MUTUAL_INTERFERENCE_PREVENTION;
+
+
+// Set Strobe Time
+typedef enum {
+	SGIF_STOROBETIME_2MS,		// 2ms
+	SGIF_STOROBETIME_5MS,		// 5ms
+	SGIF_STOROBETIME_10MS,		// 10ms
+	SGIF_STOROBETIME_20MS,		// 20ms
+} SGIF_STOROBETIME;
+
+// Mode Switch
+typedef enum {
+	SGIF_MODE_NORMAL,				// normal mode
+	SGIF_MODE_COMMUNICATION,		// setting mode
+} SGIF_MODE;
+
+
+//Encoder ext
+typedef enum {
+	SGIF_EmRunningMode_cont,//off
+	SGIF_EmRunningMode_time,
+	SGIF_EmRunningMode_trig,
+}SGIF_EmRunningMode;
+
+typedef enum {
+	SGIF_EmDirection_all,//+-
+	SGIF_EmDirection_pos,
+	SGIF_EmDirection_neg,
+}SGIF_EmDirection;
+
+typedef enum {
+	SGIF_EmEncoderInput_1x1,
+	SGIF_EmEncoderInput_2x1,
+	SGIF_EmEncoderInput_2x2,
+	SGIF_EmEncoderInput_2x4,
+}SGIF_EmEncoderInput;
+typedef enum {
+	SGIF_EmInputTime_100 = 100,
+	SGIF_EmInputTime_200 = 200,
+	SGIF_EmInputTime_500 = 500,
+	SGIF_EmInputTime_1000 = 1000,
+	SGIF_EmInputTime_2000 = 2000,
+	SGIF_EmInputTime_5000 = 5000,
+	SGIF_EmInputTime_10000 = 10000,
+	SGIF_EmInputTime_20000 = 20000,
+}SGIF_EmInputTime;
+
+
+// Measurement value
+typedef struct {
+	int					OutNo;			// OUT No(1-4)
+	SGIF_FLOATRESULT	FloatResult;	// valid or invalid data
+	float				Value;			// Measurement value
+} SGIF_FLOATVALUE_OUT;
+
+typedef struct {
+	SGIF_FLOATRESULT	FloatResult;	// valid or invalid data
+	float				Value;			// Measurement value
+} SGIF_FLOATVALUE;
+
+// IP address
+typedef struct {
+	IN_ADDR				IPAddress;
+} SGIF_OPENPARAM_ETHERNET;
+
+//Mask Minimum Display Unit(0.01mm)
+#define MASKUNIT 100 
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+	
+	EXP RC WINAPI SGIF_GetDeviceType(IN int DeviceID, OUT SGIF_DEVICE_TYPE* deviceType);
+
+	// Measured control commands
+	///
+	/// \brief SGIF_GetCameraSpotType	光斑类型(不支持SCI)
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param ControlType:				输出0:小光斑,1:大光斑
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_GetCameraSpotType(IN int DeviceID, OUT int *EissionSpotType);
+
+
+	///////////////////////////////////////////////
+	// Measurement control commands
+	//
+	// Measured value output (single)
+	///
+	/// \brief SGIF_GetCalcDataSingle	测量值输出
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo:					输出OUT编号
+	/// \param CalcData:				测量值
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_GetCalcDataSingle(IN int DeviceID, IN int OutNo, OUT SGIF_FLOATVALUE_OUT * CalcData);
+
+	// Measured value output (multiple)
+	///
+	/// \brief SGIF_GetCalcDataMulti	多个测量值输出
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo:					输出OUT编号组合
+	/// \param CalcData:				测量值数组
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_GetCalcDataMulti(IN int DeviceID, IN SGIF_OUTNO OutNo, OUT SGIF_FLOATVALUE_OUT * CalcData);
+
+	// Measured value output (ALL)
+	///
+	/// \brief SGIF_GetCalcDataALL		全部测量值输出
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param CalcData:				测量值数组
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_GetCalcDataALL(IN int DeviceID, OUT SGIF_FLOATVALUE_OUT * CalcData);
+
+	// Timing ON/OFF (single)
+	///
+	/// \brief SGIF_SetTimingSingle		计时ON/OFF(一个)
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo:					输出OUT编号
+	/// \param OnOff:					开或关
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_SetTimingSingle(IN int DeviceID, IN int OutNo, IN BOOL OnOff);
+
+	// Timing ON/OFF (multiple)
+	///
+	/// \brief SGIF_SetTimingMulti		计时ON/OFF(多个)
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo:					输出OUT编号组合
+	/// \param OnOff:					开或关
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_SetTimingMulti(IN int DeviceID, IN SGIF_OUTNO OutNo, IN BOOL OnOff);
+
+	// Timing ON/OFF (synchronous)
+	///
+	/// \brief SGIF_SetTimingSync		计时ON/OFF(同步)
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OnOff:					开或关
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_SetTimingSync(IN int DeviceID, IN BOOL OnOff);
+
+	// Auto-zero ON/OFF (single)
+	///
+	/// \brief SGIF_SetZeroSingle		自动归零(一个)
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo:					输出OUT编号
+	/// \param OnOff:					开或关
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_SetZeroSingle(IN int DeviceID, IN int OutNo, IN BOOL OnOff);
+
+	// Auto-zero ON/OFF (multiple)
+	///
+	/// \brief SGIF_SetZeroMulti		自动归零(多个)
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo:					输出OUT编号组合
+	/// \param OnOff:					开或关
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_SetZeroMulti(IN int DeviceID, IN SGIF_OUTNO OutNo, IN BOOL OnOff);
+
+	// Auto-zero ON/OFF (synchronous)
+	///
+	/// \brief SGIF_SetZeroSync			自动归零(同步)
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OnOff:					开或关
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_SetZeroSync(IN int DeviceID, IN BOOL OnOff);
+
+	// Measured value reset (single)
+	///
+	/// \brief SGIF_SetResetSingle		重置(一个)
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo:					输出OUT编号
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_SetResetSingle(IN int DeviceID, IN int OutNo);
+
+	// Measured value reset (multiple)
+	///
+	/// \brief SGIF_SetResetMulti		重置(多个)
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo:					输出OUT编号组合
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_SetResetMulti(IN int DeviceID, IN SGIF_OUTNO OutNo);
+
+	// Measured value reset (synchronous)
+	///
+	/// \brief SGIF_SetResetSync		重置(同步)
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_SetResetSync(IN int DeviceID);
+
+	// Program Change
+	///
+	/// \brief SGIF_SetProgramNo		程序切换
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param ProgramNo:				程序编号(0到7)
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_SetProgramNo(IN int DeviceID, IN int ProgramNo);
+
+	// Program Check
+	///
+	/// \brief SGIF_GetProgramNo		程序确认
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param ProgramNo:				程序编号(0到7)
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_GetProgramNo(IN int DeviceID, OUT int * ProgramNo);
+
+	// Starting the Data Storage
+	///
+	/// \brief SGIF_DataStorageStart	数据存储开始
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_DataStorageStart(IN int DeviceID);
+
+	// Stopping the Data Storage
+	///
+	/// \brief SGIF_DataStorageStop		数据存储停止
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_DataStorageStop(IN int DeviceID);
+
+	// Outputting the Data Storage
+	///
+	/// \brief SGIF_DataStorageGetData	数据存储数据输出
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					输出OUT编号
+	/// \param NumOfBuffer				缓冲区大小(最多可接受多少个数据)
+	/// \param OutBuffer				数据数组
+	/// \param NumReceived				实际接收的数据个数
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_DataStorageGetData(IN int DeviceID, IN int OutNo, IN int NumOfBuffer, OUT float * OutBuffer, OUT int *NumReceived);
+ 
+	// Initializing the Data Storage
+	///
+	/// \brief SGIF_DataStorageInit		数据存储初始化
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_DataStorageInit(IN int DeviceID);
+
+	// Data Storage Accumulation Status Output	
+	///
+	/// \brief SGIF_DataStorageGetStatus	数据存储状态输出
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param lsStorage					存储状态
+	/// \param NumStorageData				各输出口存储数量数组
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///
+	EXP RC WINAPI SGIF_DataStorageGetStatus(IN int DeviceID, OUT BOOL * lsStorage, OUT int  * NumStorageData);
+
+	///////////////////////////////////////////////
+	// Setting change commands
+	//
+
+	// Set Tolerance
+	///
+	/// \brief SGIF_SetTolerance			公差设定
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param OutNo						输出OUT编号
+	/// \param UpperLimit					上限,传入为有效数字(去掉小数点后的整形)
+	/// \param LowerLimit					下限,传入为有效数字(去掉小数点后的整形)
+	/// \param Hystersys					滞后,传入为有效数字(去掉小数点后的整形)
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///
+	EXP RC WINAPI SGIF_SetTolerance(IN int DeviceID, IN int OutNo, IN int UpperLimit, IN int LowerLimit, IN int Hystersys);
+
+	// Set ABLE
+	///
+	/// \brief SGIF_SetAbleMode				Able模式设定
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \param AbleMode						模式
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///
+	EXP RC WINAPI SGIF_SetAbleMode(IN int DeviceID, IN int HeadNo, IN SGIF_ABLEMODE AbleMode);
+
+	// Set ABLE Control Range
+	///
+	/// \brief SGIF_SetAbleMinMax			Able控制范围设定
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \param Min							下限
+	/// \param Max							上限
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///
+	EXP RC WINAPI SGIF_SetAbleMinMax(IN int DeviceID, IN int HeadNo, IN int Min, IN int Max);
+
+	// Set Detection mode
+	///
+	/// \brief SGIF_SetMeasureMode			测量模式设定
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \MeasureMode                        测量模式
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///
+	EXP RC WINAPI SGIF_SetMeasureMode(IN int DeviceID, IN int HeadNo, IN SGIF_MEASUREMODE MeasureMode);
+
+	// Set Base point
+	///
+	/// \brief SGIF_SetBasicPoint			基准点设定
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \param BasicPoint					基准点
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///
+	EXP RC WINAPI SGIF_SetBasicPoint(IN int DeviceID, IN int HeadNo, IN SGIF_BASICPOINT BasicPoint);
+
+	// Set Number of Times of Alarm Processing
+	///
+	/// \brief SGIF_SetNumAlarm				警报数量设定
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \param AlarmNum						警报数量
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///
+	EXP RC WINAPI SGIF_SetNumAlarm(IN int DeviceID, IN int HeadNo, IN int AlarmNum);
+
+	// Set Number of Times of Alarm Recovery
+	///
+	/// \brief SGIF_SetNumRecovery			恢复数量设定
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \param RecoveryNum					恢复次数
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///
+	EXP RC WINAPI SGIF_SetNumRecovery(IN int DeviceID, IN int HeadNo, IN int RecoveryNum);
+
+	// Set Alarm Level
+	///
+	/// \brief SGIF_SetAlarmLevel			警报级别设定
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \param AlarmLevel					警报级别
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///
+	EXP RC WINAPI SGIF_SetAlarmLevel(IN int DeviceID, IN int HeadNo, IN int AlarmLevel);
+
+	// Starting the ABLE Calibration
+	///
+	/// \brief SGIF_AbleStart				Able校准开始
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///
+	EXP RC WINAPI SGIF_AbleStart(IN int DeviceID, IN int HeadNo);
+
+	// Finishing the ABLE Calibration
+	///
+	/// \brief SGIF_AbleStop				Able校准完成
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///
+	EXP RC WINAPI SGIF_AbleStop(IN int DeviceID);
+
+	// Stopping the ABLE Calibration
+	///
+	/// \brief SGIF_AbleCancel				Able校准停止
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///
+	EXP RC WINAPI SGIF_AbleCancel(IN int DeviceID);
+
+	// Set Mounting Mode
+	///
+	/// \brief SGIF_SetReflectionMode		安装模式设定
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \param ReflectionMode				反射模式
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///
+	EXP RC WINAPI SGIF_SetReflectionMode(IN int DeviceID, IN int HeadNo, IN SGIF_REFLECTIONMODE ReflectionMode);
+
+	// Set Mask
+	///
+	/// \brief SGIF_SetMask					屏蔽设定
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \param OnOff						开关
+	/// \param HeadNo						点位1
+	/// \param HeadNo						点位2
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///
+	EXP RC WINAPI SGIF_SetMask(IN int DeviceID, IN int HeadNo, IN BOOL OnOff, IN int Pos1, IN int Pos2);
+
+	// Set Median
+	///
+	/// \brief SGIF_SetMedian				中位数设定
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \param Median						中位数
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///
+	EXP RC WINAPI SGIF_SetMedian(IN int DeviceID, IN int HeadNo, IN SGIF_MEDIAN Median);
+
+	// Set LASER CTRL group
+	///
+	/// \brief SGIF_SetLaserCtrlGroup		Laser Ctrl组设定
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \param LaserCtrlGroup				Laser Ctrl组
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_SetLaserCtrlGroup(IN int DeviceID, IN int HeadNo, IN SGIF_LASER_CTRL_GROUP LaserCtrlGroup);
+
+	// Set Mutual interference prevention group
+	///
+	/// \brief SGIF_SetMutualInterferencePreventionGroup		防止互相干扰组设定
+	/// \param DeviceID											设备ID号,范围为0-63.
+	/// \param HeadNo											传感头编号
+	/// \param Group											组
+	/// \return
+	///     >0:													失败.
+	///     =0:													成功.
+	///  
+	EXP RC WINAPI SGIF_SetMutualInterferencePreventionGroup(IN int DeviceID, IN int HeadNo, IN SGIF_MUTUAL_INTERFERENCE_PREVENTION_GROUP Group);
+
+	// Set Calculation method
+	///
+	/// \brief SGIF_SetCalcMethod		计算方式设定
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					输出OUT编号
+	/// \param CalcMethod				计算方法
+	/// \param HeadOutNo				传感头输出编号
+	/// \return
+	///     >0:													失败.
+	///     =0:													成功.
+	///  
+	EXP RC WINAPI SGIF_SetCalcMethod(IN int DeviceID, IN int OutNo, IN SGIF_CALCMETHOD CalcMethod, IN int HeadOutNo);
+
+	// Set Surface to be measured
+	///
+	/// \brief SGIF_SetCalcTarget		测量目标设定
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					输出OUT编号
+	/// \param CalcTarget				计算标签
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///  
+	EXP RC WINAPI SGIF_SetCalcTarget(IN int DeviceID, IN int OutNo, IN SGIF_CALCTARGET CalcTarget);
+
+	// Set OUT to be calculated (ADD, SUB)
+	///
+	/// \brief SGIF_SetOutAddSub		待计算的OUT(Add,Sub)设定
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					输出OUT编号
+	/// \param AddSub1					待计算的OUT
+	/// \param AddSub2					待计算的OUT
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///  
+	EXP RC WINAPI SGIF_SetOutAddSub(IN int DeviceID, IN int OutNo, IN int AddSub1, IN int AddSub2);
+
+	// Set OUT to be calculated (AVE, MAX, MIN, P-P)
+	///
+	/// \brief SGIF_SetOutOperation		待计算的OUT(Ave,Max,Min,P-P)设定
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					输出OUT编号
+	/// \param TargetOut				多个OUT组合
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///  
+	EXP RC WINAPI SGIF_SetOutOperation(IN int DeviceID, IN int OutNo, IN SGIF_OUTNO TargetOut);
+
+	// Set Scaling
+	///
+	/// \brief SGIF_SetScaling			缩放设定
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					输出OUT编号
+	/// \param InputValue1				点1的测量值(输入值),传有效数字(去掉小数点后的整形)
+	/// \param OutputValue1				点1的显示值(输出值),传有效数字(去掉小数点后的整形)
+	/// \param InputValue2				点2的测量值(输入值),传有效数字(去掉小数点后的整形)
+	/// \param OutputValue2				点2的显示值(输出值),传有效数字(去掉小数点后的整形)
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///  
+	EXP RC WINAPI SGIF_SetScaling(IN int DeviceID, IN int OutNo, IN int InputValue1, IN int OutputValue1, IN int InputValue2, IN int OutputValue2);
+
+	// Set Filter Mode
+	///
+	/// \brief SGIF_SetFilter			滤波器设定
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					输出OUT编号
+	/// \param FilterMode				滤波模式
+	/// \param FilterPara				滤波参数
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///  
+	EXP RC WINAPI SGIF_SetFilter(IN int DeviceID, IN int OutNo, IN SGIF_FILTERMODE FilterMode, IN SGIF_FILTERPARA FilterPara);
+
+	// Set Trigger Mode
+	///
+	/// \brief SGIF_SetTriggerMode		触发模式设定
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					输出OUT编号
+	/// \param TriggerMode				触发模式
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///  
+	EXP RC WINAPI SGIF_SetTriggerMode(IN int DeviceID, IN int OutNo, IN SGIF_TRIGGERMODE TriggerMode);
+
+	// Set Offset
+	///
+	/// \brief SGIF_SetOffset			偏移设定
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					输出OUT编号
+	/// \param Offset					偏移量
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///  
+	EXP RC WINAPI SGIF_SetOffset(IN int DeviceID, IN int OutNo, IN int Offset);
+
+	// Set Calculation Mode
+	///
+	/// \brief SGIF_SetCalcMode			检测模式(测量模式)设定
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					输出OUT编号
+	/// \param CalcMode					检测模式编号
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///  
+	EXP RC WINAPI SGIF_SetCalcMode(IN int DeviceID, IN int OutNo, IN SGIF_CALCMODE CalcMode);
+
+	// Set Minimum Display Unit
+	///
+	/// \brief SGIF_SetDisplayUnit		设定显示单位设定
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					输出OUT编号
+	/// \param DisplayUnit				显示单位
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///  
+	EXP RC WINAPI SGIF_SetDisplayUnit(IN int DeviceID, IN int OutNo, IN SGIF_DISPLAYUNIT DisplayUnit);
+
+	// Set Synchronization
+	///
+	/// \brief SGIF_SetSynchronization		同步设定
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param OutNo						输出OUT编号
+	/// \param OnOff						开关
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_SetSynchronization(IN int DeviceID, IN int OutNo, IN BOOL OnOff);
+
+	// Set Storage (OUT No. specification)
+	///
+	/// \brief SGIF_SetStorageTarget		存储(OUT编号规格)设定
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param OutNo						输出OUT编号
+	/// \param OnOff						开关
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_SetStorageTarget(IN int DeviceID, IN int OutNo, IN BOOL OnOff);
+
+	// Set Sampling Rate
+	///
+	/// \brief SGIF_SetSamplingCycle		采样周期设定
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param SamplingCycle				采样周期
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_SetSamplingCycle(IN int DeviceID, IN SGIF_SAMPLINGCYCLE SamplingCycle);
+
+	// Set Mutual Interference Prevention
+	///
+	/// \brief SGIF_SetMutualInterferencePrevention		防止互相干扰组设定
+	/// \param DeviceID									设备ID号,范围为0-63.
+	/// \param OnOff									组设定
+	/// \return
+	///     >0:											失败.
+	///     =0:											成功.
+	///  
+	EXP RC WINAPI SGIF_SetMutualInterferencePrevention(IN int DeviceID, IN SGIF_MUTUAL_INTERFERENCE_PREVENTION OnOff);
+
+	// Set Strobe Time
+	///
+	/// \brief SGIF_SetStrobeTime			选通时间设定
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param StrobeTime					选通时间
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_SetStrobeTime(IN int DeviceID, IN SGIF_STOROBETIME StrobeTime);
+
+	// Set Data Storage
+	///
+	/// \brief SGIF_SetDataStorage			数据存储设定
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param NumStorage					待存储数据的编号
+	/// \param StorageCycle					存储周期
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_SetDataStorage(IN int DeviceID, IN int NumStorage, IN SGIF_STORAGECYCLE StorageCycle);
+
+	// EncoderSetting
+	///
+	/// \brief SGIF_SetRunningMode			运行模式设置(不支持SCI设备)
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param runningmode					运行模式 0:OFF/1:定时/2:触发
+	/// \param CatchDirection               检测方向 0:正负计时/1:正计时/2:负计时
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_SetRunningMode(IN int DeviceID, IN SGIF_EmRunningMode Runningmode, IN SGIF_EmDirection CatchDirection);
+
+
+	// EncoderInputSetting
+	///
+	/// \brief SGIF_SetEncoderMode			编码器输入模式设置(不支持SCI设备)
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param Inputmode					运行模式 0:1相1递增/1:2相1递增/2:2相2递增,3:2相4递增
+	/// \param MinInputTime					最小输入时间
+	/// \param TrigInterval					触发间隔
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+
+	EXP RC WINAPI SGIF_SetEncoderMode(IN int DeviceID, IN SGIF_EmEncoderInput Inputmode,IN SGIF_EmInputTime InputTime,IN int TrigInterval);
+
+	// SGIF_SetFormula
+	///
+	/// \brief SGIF_SetFormula				设置配方
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param filePath						配方路径
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  derive
+
+	EXP RC WINAPI SGIF_SetFormula(IN int DeviceID, IN char* filePath );
+
+	// SGIF_SetFormula
+	///
+	/// \brief SGIF_SetFormula				设置配方
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param filePath						配方路径
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_DeriveFormula(IN int DeviceID, IN char* filePath);
+	///////////////////////////////////////////////
+	// Setting confirmation commands
+	//
+	// Get Tolerance
+	///
+	/// \brief SGIF_GetTolerance			公差设定获取
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param OutNo						输出OUT编号
+	/// \param UpperLimit					上限,传出为有效数字(去掉小数点后的整形)
+	/// \param LowerLimit					下限,传出为有效数字(去掉小数点后的整形)
+	/// \param Hysteresis					滞后,传出为有效数字(去掉小数点后的整形)
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_GetTolerance(IN int DeviceID, IN int OutNo, OUT int * UpperLimit, OUT int * LowerLimit, OUT int * Hysteresis);
+
+	// Get ABLE
+	///
+	/// \brief SGIF_GetAbleMode				Able设定获取
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \param AbleMode						Able模式
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_GetAbleMode(IN int DeviceID, IN int HeadNo, OUT SGIF_ABLEMODE * AbleMode);
+
+	// Get ABLE Control Range
+	///
+	/// \brief SGIF_GetAbleMinMax			Able控制范围获取
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \param Min							最小值
+	/// \param Max							最大值
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_GetAbleMinMax(IN int DeviceID, IN int HeadNo, OUT int * Min, OUT int * Max);
+
+	// Get Detection mode
+	///
+	/// \brief SGIF_GetMeasureMode			测量模式获取
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \param MeasureMode					测量模式
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_GetMeasureMode(IN int DeviceID, IN int HeadNo, OUT SGIF_MEASUREMODE * MeasureMode);
+
+	// Get Base point
+	///
+	/// \brief SGIF_GetBasicPoint			基准点获取
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \param BasicPoint					基准点
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_GetBasicPoint(IN int DeviceID, IN int HeadNo, OUT SGIF_BASICPOINT * BasicPoint);
+
+	// Get Number of Times of Alarm Processing
+	///
+	/// \brief SGIF_GetNumAlarm				警报处理次数获取
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \param AlarmNum						警报次数
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_GetNumAlarm(IN int DeviceID, IN int HeadNo, OUT int * AlarmNum);
+
+	// Get Number of Times of Alarm Recovery
+	///
+	/// \brief SGIF_GetNumRecovery			警报恢复次数获取
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \param RecoveryNum					恢复次数
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_GetNumRecovery(IN int DeviceID, IN int HeadNo, OUT int * RecoveryNum);
+
+	// Get Alarm Level
+	///
+	/// \brief SGIF_GetAlarmLevel			警报级别获取
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \param AlarmLevel					警报级别
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_GetAlarmLevel(IN int DeviceID, IN int HeadNo, OUT int * AlarmLevel);
+
+	// Get Mounting Mode
+	///
+	/// \brief SGIF_GetReflectionMode		安装模式获取
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \param ReflectionMode				反射模式
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_GetReflectionMode(IN int DeviceID, IN int HeadNo, OUT SGIF_REFLECTIONMODE * ReflectionMode);
+
+	// Get Mask
+	///
+	/// \brief SGIF_GetMask					屏蔽设定获取
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \param OnOff						开关
+	/// \param Pos1							位置1
+	/// \param Pos2							位置2
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_GetMask(IN int DeviceID, IN int HeadNo, OUT BOOL * OnOff, OUT int * Pos1, OUT int * Pos2);
+
+	// Get Median
+	///
+	/// \brief SGIF_GetMedian				中位数获取
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \param Median						中位数
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_GetMedian(IN int DeviceID, IN int HeadNo, OUT SGIF_MEDIAN * Median);
+
+	// Get LASER CTRL group
+	///
+	/// \brief SGIF_GetLaserCtrlGroup		Laser Ctrl组获取
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \param LaserCtrlGroup				Laser Ctrl组
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_GetLaserCtrlGroup(IN int DeviceID, IN int HeadNo, OUT SGIF_LASER_CTRL_GROUP * LaserCtrlGroup);
+
+	// Get Mutual interference prevention group
+	///
+	/// \brief SGIF_GetMutualInterferencePreventionGroup	防止互相干扰组获取
+	/// \param DeviceID										设备ID号,范围为0-63.
+	/// \param HeadNo										传感头编号
+	/// \param Group										组
+	/// \return
+	///     >0:												失败.
+	///     =0:												成功.
+	///  
+	EXP RC WINAPI SGIF_GetMutualInterferencePreventionGroup(IN int DeviceID, IN int HeadNo, OUT SGIF_MUTUAL_INTERFERENCE_PREVENTION_GROUP * Group);
+
+	// Get Calculation method
+	///
+	/// \brief SGIF_GetCalcMethod		计算方式获取
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					输出OUT编号
+	/// \param CalcMethod				计算方法
+	/// \param HeadOutNo				传感头或OUT编号
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///  
+	EXP RC WINAPI SGIF_GetCalcMethod(IN int DeviceID, IN int OutNo, OUT SGIF_CALCMETHOD * CalcMethod, OUT int * HeadOutNo);
+
+	// Get Surface to be measured
+	///
+	/// \brief SGIF_GetCalcTarget		测量目标获取
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					输出OUT编号
+	/// \param CalcTarget				计算标签
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///  
+	EXP RC WINAPI SGIF_GetCalcTarget(IN int DeviceID, IN int OutNo, OUT SGIF_CALCTARGET * CalcTarget);
+
+	// Get OUT to be calculated (ADD, SUB)
+	///
+	/// \brief SGIF_GetOutAddSub		待计算的OUT(Add,Sub)获取
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					输出OUT编号
+	/// \param AddSub1					待计算的OUT编号1
+	/// \param AddSub2					待计算的OUT编号2
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///  
+	EXP RC WINAPI SGIF_GetOutAddSub(IN int DeviceID, IN int OutNo, OUT int * AddSub1, OUT int * AddSub2);
+
+	// Get OUT to be calculated (AVE, MAX, MIN, P-P)
+	///
+	/// \brief SGIF_GetOutOperation		待计算的OUT(Ave,Max,Min,P-P)获取
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					输出OUT编号
+	/// \param TargetOut				多个OUT或HEAD组合
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///  
+	EXP RC WINAPI SGIF_GetOutOperation(IN int DeviceID, IN int OutNo, OUT SGIF_OUTNO * TargetOut);
+
+	// Get Scaling
+	///
+	/// \brief SGIF_GetScaling			缩放设定获取
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					输出OUT编号
+	/// \param InputValue1				点1的测量值(输入值),传出为有效数字(去掉小数点后的整形)
+	/// \param OutputValue1				点1的显示值(输出值),传出为有效数字(去掉小数点后的整形)
+	/// \param InputValue2				点2的测量值(输入值),传出为有效数字(去掉小数点后的整形)
+	/// \param OutputValue2				点2的显示值(输出值),传出为有效数字(去掉小数点后的整形)
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///  
+	EXP RC WINAPI SGIF_GetScaling(IN int DeviceID, IN int OutNo, OUT int * InputValue1, OUT int * OutputValue1, OUT int * InputValue2, OUT int * OutputValue2);
+
+	// Get Filter Mode
+	///
+	/// \brief SGIF_GetFilter			滤波器设定获取
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					输出OUT编号
+	/// \param FilterMode				滤波器模式
+	/// \param FilterPara				滤波参数
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///  
+	EXP RC WINAPI SGIF_GetFilter(IN int DeviceID, IN int OutNo, OUT SGIF_FILTERMODE * FilterMode, OUT SGIF_FILTERPARA * FilterPara);
+
+	// Get Trigger Mode
+	///
+	/// \brief SGIF_GetTriggerMode		触发模式获取
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					输出OUT编号
+	/// \param TriggerMode				触发模式
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///  
+	EXP RC WINAPI SGIF_GetTriggerMode(IN int DeviceID, IN int OutNo, OUT SGIF_TRIGGERMODE * TriggerMode);
+
+	// Get Offset
+	///
+	/// \brief SGIF_GetOffset			偏移获取
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					输出OUT编号
+	/// \param Offset					偏移量
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///  
+	EXP RC WINAPI SGIF_GetOffset(IN int DeviceID, IN int OutNo, OUT int * Offset);
+
+	// Get Calculation Mode
+	///
+	/// \brief SGIF_GetCalcMode			检测模式(测量模式)获取
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					输出OUT编号
+	/// \param CalcMode					测量模式
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///  
+	EXP RC WINAPI SGIF_GetCalcMode(IN int DeviceID, IN int OutNo, OUT SGIF_CALCMODE * CalcMode);
+
+	// Get Minimum Display Unit
+	///
+	/// \brief SGIF_GetDisplayUnit		显示最小单位获取
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					输出OUT编号
+	/// \param DisplayUnit				显示最小单位
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///  
+	EXP RC WINAPI SGIF_GetDisplayUnit(IN int DeviceID, IN int OutNo, OUT SGIF_DISPLAYUNIT * DisplayUnit);
+
+	// Get Synchronization
+	///
+	/// \brief SGIF_GetSynchronization		同步设定获取
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param OutNo						输出OUT编号
+	/// \param OnOff						开关
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_GetSynchronization(IN int DeviceID, IN int OutNo, OUT BOOL * OnOff);
+
+	// Get Storage (OUT No. specification)
+	///
+	/// \brief SGIF_GetStorageTarget		存储(OUT编号设定)获取
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param OutNo						输出OUT编号
+	/// \param OnOff						开关
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_GetStorageTarget(IN int DeviceID, IN int OutNo, OUT BOOL * OnOff);
+
+	// Get Sampling Rate
+	///
+	/// \brief SGIF_GetSamplingCycle		采样周期获取
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param SamplingCycle				采样周期
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_GetSamplingCycle(IN int DeviceID, OUT SGIF_SAMPLINGCYCLE * SamplingCycle);
+
+	// Get Mutual Interference Prevention
+	///
+	/// \brief SGIF_GetMutualInterferencePrevention		防止互相干扰获取
+	/// \param DeviceID									设备ID号,范围为0-63.
+	/// \param OnOff									开关
+	/// \return
+	///     >0:											失败.
+	///     =0:											成功.
+	///  
+	EXP RC WINAPI SGIF_GetMutualInterferencePrevention(IN int DeviceID, OUT SGIF_MUTUAL_INTERFERENCE_PREVENTION * OnOff);
+
+	// Get Strobe Time
+	///
+	/// \brief SGIF_GetStrobeTime		选通时间获取
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutputFormat				输出形式
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_GetStrobeTime(IN int DeviceID, OUT SGIF_STOROBETIME * StrobeTime);
+
+	// Get Data Storage
+	///
+	/// \brief SGIF_GetDataStorage		数据存储获取
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param NumStorage				带存储数据编号
+	/// \param StorageCycle				存储周期
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_GetDataStorage(IN int DeviceID, OUT int * NumStorage, OUT SGIF_STORAGECYCLE * StorageCycle);
+
+	// Get Active head count
+	///
+	/// \brief SGIF_GetNumOfUsedHeads		主动OUT计数获取
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param NumOfUsedHeads				主动OUT/传感头计数
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///
+	EXP RC WINAPI SGIF_GetNumOfUsedHeads(IN int DeviceID, OUT int * NumOfUsedHeads);
+
+	// Get Active OUT count
+	///
+	/// \brief SGIF_GetNumOfUsedOut			主动传感头计数获取
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param NumOfUsedHeads				主动OUT/传感头计数
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///
+	EXP RC WINAPI SGIF_GetNumOfUsedOut(IN int DeviceID, OUT int * NumOfUsedOut);
+
+	// Get Active Running Time
+	///
+	/// \brief SGIF_GetDeviceRuningTime		获取相机运行时长,单位s
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						0:控制器; 1-4:传感头编号
+	/// \param RuningTime					运行时间
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///
+	EXP RC WINAPI SGIF_GetDeviceRuningTime(IN int DeviceID, IN int HeadNo, OUT unsigned int * RuningTime);
+
+	///////////////////////////////////////////////
+	// Other commands
+	//
+	// Opens the Ethernet device.
+	///
+	/// \brief SGIF_OpenDeviceETHER			打开设备网络连接
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param OpenParam					网络连接参数
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///
+	EXP RC WINAPI SGIF_OpenDeviceETHER(IN int DeviceID, SGIF_OPENPARAM_ETHERNET * OpenParam,DWORD TIMEOUT=3);
+
+	// Closes the currently open device.
+	///
+	/// \brief SGIF_CloseDevice				关闭设备网络连接
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///
+	EXP RC WINAPI SGIF_CloseDevice(IN int DeviceID);
+
+	///////////////////////////////////////////////
+	// Mode change commands
+	//
+	// Mode Switch
+	///
+	/// \brief SGIF_SetMode					模式切换
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param Mode							模式
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///
+	EXP RC WINAPI SGIF_SetMode(IN int DeviceID, IN SGIF_MODE Mode);
+	
+	EXP RC WINAPI SGIF_Refresh(IN int DeviceID);
+
+	//////////////////////////////////////////////一次回调相关///////////////////////////////////////
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutBuffer				数据数组
+	/// \param NumReceived				实际接收的数据个数
+	///
+	typedef void(*SGIF_DataStorageOneTimeCallBack)(OUT int DeviceID);
+
+	///////////////////////////////////////////////
+	/// \brief SGIF_SetOneDataStorage		注册一次回调
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param SGIF_BatchOneTimeCallBack	回调函数
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///
+	EXP RC WINAPI SGIF_SetOneDataStorage(IN int DeviceID, IN SGIF_DataStorageOneTimeCallBack CallFunc);
+	//////////////////////////////////////////////////////////////////////////////////////////////
+
+	// Get encoder store value
+	/// \brief SGIF_GetEncoderStoreValue编码器值存储数据输出(仅SCI设备支持)
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					编码器编号
+	/// \param NumOfBuffer				缓冲区大小(最多可接受多少个数据)
+	/// \param OutBuffer				数据数组
+	/// \param NumReceived				实际接收的数据个数
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_GetEncoderStoreValue(IN int DeviceID, IN int OutNo, IN int NumOfBuffer, OUT int * OutBuffer, OUT int *NumReceived);
+
+	// Get encoder value
+	/// \brief SGIF_GetEncoderCurrentValue	读取编码器当前值(仅SCI设备支持)
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					编码器编号(1-3)
+	/// \param OutBuffer				数据指针
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_GetEncoderCurrentValue(IN int DeviceID, IN int OutNo, OUT int * OutBuffer);
+
+	// encoder Reset
+	/// \brief SGIF_EncoderReset		编码器值置零(仅SCI设备支持)
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					编码器编号(1-3)
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_EncoderReset(IN int DeviceID, IN int OutNo);
+
+	// Set Encoder Number
+	/// \brief SGIF_SetEncoderNumber	选择编码器(仅SCI设备支持)
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					编码器编号(1-3)
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_SetEncoderNumber(IN int DeviceID, IN int OutNo);
+
+	// Get encoder number
+	/// \brief SGIF_GetEncoderNumber	读取设置的编码器编号(仅SCI设备支持)
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutBuffer				数据指针
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_GetEncoderNumber(IN int DeviceID, OUT int * OutBuffer);
+
+	//Set Encoder Parameters
+	/// \brief SGIF_SetEncoderParameters设置编码器参数(仅SCI设备支持)
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					编码器编号(1-3)
+	/// \param InputMode				输入模式(0-3)
+	/// \param InputTime				最低输入时间(100,200,500,1000,2000,5000,10000,20000)(ns)
+	/// \param interval					间隔(1-10000)
+	/// \param OperatingMode			运行模式(0-2)
+	/// \param DetectionDirection		检测方向(0-2)
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_SetEncoderParameters(IN int DeviceID, IN int OutNo, IN int InputMode, IN int InputTime, IN int interval, IN int OperatingMode, IN int DetectionDirection);
+
+	//Get Encoder Parameters
+	/// \brief SGIF_GetEncoderParameters读取编码器参数(仅SCI设备支持)
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					编码器编号(1-3)
+	/// \param InputMode				输入模式(0-3)
+	/// \param InputTime				最低输入时间(100,200,500,1000,2000,5000,10000,20000)(ns)
+	/// \param interval					间隔(1-10000)
+	/// \param OperatingMode			运行模式(0-2)
+	/// \param DetectionDirection		检测方向(0-2)
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///4
+	EXP RC WINAPI SGIF_GetEncoderParameters(IN int DeviceID, IN int OutNo, OUT int * InputMode, OUT int * InputTime, OUT int * interval, OUT int * OperatingMode, OUT int * DetectionDirection);
+
+	//Set Analog Output
+	/// \brief SGIF_SetAnalogOutput		设置模拟量输出(仅SCI设备支持)
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					模拟量编号(1-3)
+	/// \param OutputChannel			输出通道(0-3)
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_SetAnalogOutput(IN int DeviceID, IN int OutNo, IN int OutputChannel);
+
+	// Retrieve Analog Output Channel Number
+	/// \brief SGIF_GetAnalogOutputChannel	获取模拟量输出通道编号(仅SCI设备支持)
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					模拟量编号(1-3)
+	/// \param OutBuffer				数据指针
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_GetAnalogOutputChannel(IN int DeviceID, IN int OutNo, OUT int * OutBuffer);
+
+	//Set IO Digital Output
+	/// \brief SGIF_SetIODigitalOutput	设置IO数字输出(仅SCI设备支持)
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					数字输出编号(1-4)
+	/// \param Level					输出位数(0:OFF,1:HI,2:GO,3:LO,4:STROBE)
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_SetIODigitalOutput(IN int DeviceID, IN int OutNo, IN int Level);
+
+	// Retrieve IO Digital Output Channel Number
+	/// \brief SGIF_GetIOOutputChannel	获取IO数字量输出通道编号(仅SCI设备支持)
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					数字输出编号(1-4)
+	/// \param OutBuffer				数据指针
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_GetIOOutputChannel(IN int DeviceID, IN int OutNo, OUT int * OutBuffer);
+#ifdef __cplusplus
+}
+#endif
diff --git a/SourceCode/Bond/SGMeasurement/DLL/32bit/SGIFPJ.dll b/SourceCode/Bond/SGMeasurement/DLL/32bit/SGIFPJ.dll
new file mode 100644
index 0000000..a64f8d2
--- /dev/null
+++ b/SourceCode/Bond/SGMeasurement/DLL/32bit/SGIFPJ.dll
Binary files differ
diff --git a/SourceCode/Bond/SGMeasurement/DLL/32bit/SGIFPJ.lib b/SourceCode/Bond/SGMeasurement/DLL/32bit/SGIFPJ.lib
new file mode 100644
index 0000000..f833c56
--- /dev/null
+++ b/SourceCode/Bond/SGMeasurement/DLL/32bit/SGIFPJ.lib
Binary files differ
diff --git a/SourceCode/Bond/SGMeasurement/DLL/64bit/SGIF.h b/SourceCode/Bond/SGMeasurement/DLL/64bit/SGIF.h
new file mode 100644
index 0000000..c63e77e
--- /dev/null
+++ b/SourceCode/Bond/SGMeasurement/DLL/64bit/SGIF.h
@@ -0,0 +1,1641 @@
+
+
+#ifdef SGIF_EXPORTS
+#define EXP __declspec(dllexport)
+#else
+#define EXP __declspec(dllimport)
+#endif
+
+#include "Winsock2.h"
+#include "Ws2tcpip.h"
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <windows.h>
+#pragma comment(lib, "WS2_32.lib")
+
+// Return Code List
+typedef enum {
+	RC_OK = 0x0000,				
+	// The operation is completed successfully.
+	///////////////////////////////////////////////
+	// Communication error from controller notification
+	//
+	RC_NAK_COMMAND = 0x1001,		// Command error
+	RC_NAK_COMMAND_LENGTH,			// Command length error
+	RC_NAK_TIMEOUT,					// Timeout
+	RC_NAK_CHECKSUM,				// Check sum error
+	RC_NAK_INVALID_STATE,			// Status error
+	RC_NAK_OTHER,					// Other error
+	RC_NAK_PARAMETER,				// Parameter error
+	RC_NAK_OUT_STAGE,				// OUT calculation count limitation error
+	RC_NAK_OUT_HEAD_NUM,			// No. of used head/OUT over error
+	RC_NAK_PARAM_RANGE_DATA_STORED,	// OUT No which data reserved over acctive out count
+	RC_NAK_OUT_INVALID_CALC,		// OUT which cannot be used for calculation was specified for calculation.
+	RC_NAK_OUT_VOID,				// OUT which specified for calculation is not found.
+	RC_NAK_INVALID_CYCLE,			// Unavailable sampling cycle
+	RC_NAK_CTRL_ERROR,				// Main unit error
+	RC_NAK_SRAM_ERROR,				// Setting value error
+	///////////////////////////////////////////////
+	// Communication DLL error notification
+	//
+	RC_ERR_OPEN_DEVICE = 0x2000,// Opening the device failed.
+	RC_ERR_NO_DEVICE,			// The device is not open.
+	RC_ERR_SEND,				// Command sending error
+	RC_ERR_RECEIVE,				// Response receiving error
+	RC_ERR_TIMEOUT,				// Timeout
+	RC_ERR_NODATA,				// No data
+	RC_ERR_NOMEMORY,			// No free memory
+
+	RC_ERR_DISCONNECT,			// Cable disconnection suspected
+	RC_ERR_UNKNOWN,				// Undefined error
+	RC_ERR_DEVID_OVER,			// over dev_id scale
+	RC_ERR_NET_NO_CONN,			// no connected at the deviceID 
+	RC_ERR_IP_EXISTED,
+	RC_ERR_SELECT,				// select of /socket error
+	RC_ERR_NULL_PARAMETER,		// NULL point exception from parameter
+	RC_ERR_DIY_FUNC,			// error due to dir function
+	RC_ERR_OVER_PARAMENTER,		// paramenter over the limition
+	RC_ERR_NOT_SUPPORT			// 功能不支持
+} RC;
+
+//device Version
+typedef enum {
+	SG3035 = 0,
+	SG3030 = 1,
+	SG3085 = 2,
+	SG3080 = 3,
+	SG5025 = 4,
+	SG5020 = 5,
+	SG5055 = 6,
+	SG5050 = 7,
+	SG5085 = 8,
+	SG5080 = 9,
+	SG5155 = 10,
+	SG5150 = 11,
+	SC04025 = 12,
+	SC03560 = 13,
+	SGI500 = 14,
+	SGI505 = 15,
+	SGI400 = 16,
+	SGI405 = 17,
+	SGI150 = 18,
+	SGI155 = 19,
+	SGI080 = 20,
+	SGI085 = 21,
+	SGI050 = 22,
+	SGI055 = 23,
+	SGI030 = 24,
+	SGI035 = 25,
+	SGI020 = 26,
+	SGI025 = 27,
+	SG3155 = 28,
+	SG3150 = 29,
+	SC01045 = 30,
+	SC10015 = 31,
+	SC20011 = 32,
+	SC01236 = 33,
+	SCI04025 = 34,
+	SCI03560 = 35,
+	SCI01045 = 36,
+	SCI10015 = 37,
+	SCI20011 = 38,
+	SCI01236 = 39,
+}SGIF_DEVICE_TYPE;
+
+// Measurement value structures
+typedef enum {
+	SGIF_FLOATRESULT_VALID,			// valid data
+	SGIF_FLOATRESULT_RANGEOVER_P,	// over range at positive (+) side
+	SGIF_FLOATRESULT_RANGEOVER_N,	// over range at negative (-) side
+	SGIF_FLOATRESULT_WAITING,		// Wait for comparator result
+	SGIF_FLOATRESULT_ALARM,			// alarm
+	SGIF_FLOATRESULT_INVALID,		// Invalid (error, etc.)
+} SGIF_FLOATRESULT;
+
+// Set ABLE
+typedef enum {
+	SGIF_ABLEMODE_AUTO,				// AUTO
+	SGIF_ABLEMODE_MANUAL,			// manual
+} SGIF_ABLEMODE;
+
+// Set Measurement Mode
+typedef enum {
+	SGIF_MEASUREMODE_NORMAL,						// normal
+	SGIF_MEASUREMODE_HALF_T,						// translucent object
+	SGIF_MEASUREMODE_TRAN_1,						// transparent object
+	SGIF_MEASUREMODE_TRAN_2,						// transparent object 2
+	SGIF_MEASUREMODE_MRS,							// multireflective object
+	SGIF_MEASUREMODE_OPAQUE = SGIF_MEASUREMODE_MRS,	// Semi opaque object
+} SGIF_MEASUREMODE;
+
+// Set Basic Point
+typedef enum {
+	SGIF_BASICPOINT_NEAR,			// NEAR
+	SGIF_BASICPOINT_FAR,			// FAR
+} SGIF_BASICPOINT;
+
+// Set Mounting Mode
+typedef enum {
+	SGIF_REFLECTIONMODE_DIFFUSION,	// diffuse reflection
+	SGIF_REFLECTIONMODE_MIRROR,		// specular reflection
+} SGIF_REFLECTIONMODE;
+
+// Set Median
+typedef enum {
+	SGIF_MEDIAN_OFF,				// OFF
+	SGIF_MEDIAN_7,					// 7 point
+	SGIF_MEDIAN_15,					// 15 point
+	SGIF_MEDIAN_31,					// 31 point
+} SGIF_MEDIAN;
+
+// Set LASER CTRL group.
+typedef enum {
+	SGIF_LASER_CTRL_GROUP_1,		// LASER CTRL 1
+	SGIF_LASER_CTRL_GROUP_2,		// LASER CTRL 2
+} SGIF_LASER_CTRL_GROUP;
+
+// Set a range.
+typedef enum {
+	SGIF_RANGE_CENTER,				// CENTER
+	SGIF_RANGE_FAR,					// FAR
+} SGIF_RANGE;
+
+// Set Mutual Interference Prevention Group
+typedef enum {
+	SGIF_MUTUAL_INTERFERENCE_PREVENTION_GROUP_A,	// Group A
+	SGIF_MUTUAL_INTERFERENCE_PREVENTION_GROUP_B,	// Group B
+	SGIF_MUTUAL_INTERFERENCE_PREVENTION_GROUP_C,	// Group C
+} SGIF_MUTUAL_INTERFERENCE_PREVENTION_GROUP;
+
+// Set calculation method.
+typedef enum {
+	SGIF_CALCMETHOD_HEADA,					// head A
+	SGIF_CALCMETHOD_HEADB,					// head B
+	SGIF_CALCMETHOD_HEAD_HEADA_PLUS_HEADB,	// head A+head B
+	SGIF_CALCMETHOD_HEAD_HEADA_MINUS_HEADB,	// head A-head B
+	SGIF_CALCMETHOD_HEAD_HEADA_TRANSPARENT,	// head A transparent object
+	SGIF_CALCMETHOD_HEAD_HEADB_TRANSPARENT,	// head B transparent object
+
+	SGIF_CALCMETHOD_HEAD = 0,	// head
+	SGIF_CALCMETHOD_OUT,		// OUT
+	SGIF_CALCMETHOD_ADD,		// ADD
+	SGIF_CALCMETHOD_SUB,		// SUB
+	SGIF_CALCMETHOD_AVE,		// AVE
+	SGIF_CALCMETHOD_MAX,		// MAX
+	SGIF_CALCMETHOD_MIN,		// MIN
+	SGIF_CALCMETHOD_PP,			// P-P
+} SGIF_CALCMETHOD;
+
+// Set Target Surface
+typedef enum {
+	SGIF_CALCTARGET_PEAK_1,		// peak 1
+	SGIF_CALCTARGET_PEAK_2,		// peak 2
+	SGIF_CALCTARGET_PEAK_3,		// peak 3
+	SGIF_CALCTARGET_PEAK_4,		// peak 4
+	SGIF_CALCTARGET_PEAK_1_2,	// peak 1-peak 2
+	SGIF_CALCTARGET_PEAK_1_3,	// peak 1-peak 3
+	SGIF_CALCTARGET_PEAK_1_4,	// peak 1-peak 4
+	SGIF_CALCTARGET_PEAK_2_3,	// peak 2-peak 3
+	SGIF_CALCTARGET_PEAK_2_4,	// peak 2-peak 4
+	SGIF_CALCTARGET_PEAK_3_4,	// peak 3-peak 4
+} SGIF_CALCTARGET;
+
+// Set Filter Mode
+typedef enum {
+	SGIF_FILTERMODE_MOVING_AVERAGE,			// moving average
+} SGIF_FILTERMODE;
+
+// Specify the filter parameter. (The number of averaging for moving average, or the cutoff frequency for LPF/HPF.) 
+
+typedef enum {
+	SGIF_FILTERPARA_AVE_1 = 0,		// 1 time
+	SGIF_FILTERPARA_AVE_4,			// 4 times
+	SGIF_FILTERPARA_AVE_16,			// 16 times
+	SGIF_FILTERPARA_AVE_64,			// 64 times
+	SGIF_FILTERPARA_AVE_256,		// 256 times
+	SGIF_FILTERPARA_AVE_1024,		// 1024 times
+	SGIF_FILTERPARA_AVE_4096,		// 4096 times
+	SGIF_FILTERPARA_AVE_16384,		// 16384 times
+	SGIF_FILTERPARA_AVE_65536,		// 65536 times
+	SGIF_FILTERPARA_AVE_262144,		// 262144 times
+
+}SGIF_FILTERPARA;
+
+// Set Trigger Mode
+typedef enum {
+	SGIF_TRIGGERMODE_EXT1,		// external trigger 1
+	SGIF_TRIGGERMODE_EXT2,		// external trigger 2
+} SGIF_TRIGGERMODE;
+
+// Set the Measurement Mode.
+typedef enum {
+	SGIF_CALCMODE_NORMAL,			// normal
+	SGIF_CALCMODE_PEAKHOLD,			// peak hold
+	SGIF_CALCMODE_BOTTOMHOLD,		// bottom hold
+	SGIF_CALCMODE_PEAKTOPEAKHOLD,	// peak-to-peak hold
+	SGIF_CALCMODE_SAMPLEHOLD,		// sample hold
+} SGIF_CALCMODE;
+
+// Set Minimum Display Unit
+typedef enum {
+	SGIF_DISPLAYUNIT_0000_01MM = 0,	// 0.01mm
+	SGIF_DISPLAYUNIT_000_001MM,		// 0.001mm
+	SGIF_DISPLAYUNIT_00_0001MM,		// 0.0001mm
+	SGIF_DISPLAYUNIT_0_00001MM,		// 0.00001mm
+	SGIF_DISPLAYUNIT_00000_1UM,		// 0.1um
+	SGIF_DISPLAYUNIT_0000_01UM,		// 0.01um
+	SGIF_DISPLAYUNIT_000_001UM,		// 0.001um
+
+} SGIF_DISPLAYUNIT;
+
+// Specify OUT
+typedef enum {
+	SGIF_OUTNO_01 = 0x0001,			// OUT01
+	SGIF_OUTNO_02 = 0x0002,			// OUT02
+	SGIF_OUTNO_03 = 0x0004,			// OUT03
+	SGIF_OUTNO_04 = 0x0008,			// OUT04
+	SGIF_OUTNO_ALL = 0x000F,		// All OUTs
+} SGIF_OUTNO;
+
+// Set Storage (Cycle)
+typedef enum {
+	SGIF_STORAGECYCLE_1,			// sampling rate x 1
+	SGIF_STORAGECYCLE_2,			// sampling rate x 2
+	SGIF_STORAGECYCLE_5,			// sampling rate x 5
+	SGIF_STORAGECYCLE_10,			// sampling rate x 10
+	SGIF_STORAGECYCLE_20,			// sampling rate x 20
+	SGIF_STORAGECYCLE_50,			// sampling rate x 50
+	SGIF_STORAGECYCLE_100,			// sampling rate x 100
+	SGIF_STORAGECYCLE_200,			// sampling rate x 200
+	SGIF_STORAGECYCLE_500,			// sampling rate x 500
+	SGIF_STORAGECYCLE_1000,			// sampling rate x 1000
+	SGIF_STORAGECYCLE_TIMING,		// Timing sync
+} SGIF_STORAGECYCLE;
+
+// Set Sampling Rate
+typedef enum {
+	//SG5000系列
+	SGIF_5000_SAMPLINGCYCLE_590KHZ,     // 590kHz
+	SGIF_5000_SAMPLINGCYCLE_400KHZ,		// 400kHz
+	SGIF_5000_SAMPLINGCYCLE_200KHZ,		// 200kHz
+	SGIF_5000_SAMPLINGCYCLE_88KHZ,		// 88kHz
+	SGIF_5000_SAMPLINGCYCLE_50KHZ,		// 50kHz
+	SGIF_5000_SAMPLINGCYCLE_20KHZ,		// 20kHz
+	SGIF_5000_SAMPLINGCYCLE_10KHZ,		// 10kHz
+	SGIF_5000_SAMPLINGCYCLE_5KHZ,		// 5kHz
+	SGIF_5000_SAMPLINGCYCLE_2KHZ,		// 2kHz
+	SGIF_5000_SAMPLINGCYCLE_1KHZ,		// 1kHz+
+
+	//SG3000系列
+	SGIF_3000_SAMPLINGCYCLE_88KHZ = 10,	// 88kHz
+	SGIF_3000_SAMPLINGCYCLE_50KHZ,		// 50kHz
+	SGIF_3000_SAMPLINGCYCLE_20KHZ,		// 20kHz
+	SGIF_3000_SAMPLINGCYCLE_10KHZ,		// 10kHz
+	SGIF_3000_SAMPLINGCYCLE_5KHZ,		// 5kHz
+	//SGIF_3000_SAMPLINGCYCLE_2KHZ,		// 2kHz
+	SGIF_3000_SAMPLINGCYCLE_1KHZ,		// 1kHz
+
+	//SCI系列
+	SCI_SAMPLINGCYCLE_33KHZ = 30,	// 33kHz
+	SCI_SAMPLINGCYCLE_20KHZ,		// 20kHz
+	SCI_SAMPLINGCYCLE_15KHZ,		// 15kHz
+	SCI_SAMPLINGCYCLE_10KHZ,		// 10kHz
+	SCI_SAMPLINGCYCLE_5KHZ,			// 5kHz
+	SCI_SAMPLINGCYCLE_2KHZ,			// 2kHz
+	SCI_SAMPLINGCYCLE_1KHZ,			// 1kHz
+	SCI_SAMPLINGCYCLE_05KHZ,		// 0.5kHz
+} SGIF_SAMPLINGCYCLE;
+
+// Set Mutual interference prevention
+typedef enum {
+	SGIF_MUTUAL_INTERFERENCE_PREVENTION_OFF,	// OFF
+	SGIF_MUTUAL_INTERFERENCE_PREVENTION_AB_ON,	// AB-ON
+	SGIF_MUTUAL_INTERFERENCE_PREVENTION_ABC_ON,	// ABC-ON
+} SGIF_MUTUAL_INTERFERENCE_PREVENTION;
+
+
+// Set Strobe Time
+typedef enum {
+	SGIF_STOROBETIME_2MS,		// 2ms
+	SGIF_STOROBETIME_5MS,		// 5ms
+	SGIF_STOROBETIME_10MS,		// 10ms
+	SGIF_STOROBETIME_20MS,		// 20ms
+} SGIF_STOROBETIME;
+
+// Mode Switch
+typedef enum {
+	SGIF_MODE_NORMAL,				// normal mode
+	SGIF_MODE_COMMUNICATION,		// setting mode
+} SGIF_MODE;
+
+
+//Encoder ext
+typedef enum {
+	SGIF_EmRunningMode_cont,//off
+	SGIF_EmRunningMode_time,
+	SGIF_EmRunningMode_trig,
+}SGIF_EmRunningMode;
+
+typedef enum {
+	SGIF_EmDirection_all,//+-
+	SGIF_EmDirection_pos,
+	SGIF_EmDirection_neg,
+}SGIF_EmDirection;
+
+typedef enum {
+	SGIF_EmEncoderInput_1x1,
+	SGIF_EmEncoderInput_2x1,
+	SGIF_EmEncoderInput_2x2,
+	SGIF_EmEncoderInput_2x4,
+}SGIF_EmEncoderInput;
+typedef enum {
+	SGIF_EmInputTime_100 = 100,
+	SGIF_EmInputTime_200 = 200,
+	SGIF_EmInputTime_500 = 500,
+	SGIF_EmInputTime_1000 = 1000,
+	SGIF_EmInputTime_2000 = 2000,
+	SGIF_EmInputTime_5000 = 5000,
+	SGIF_EmInputTime_10000 = 10000,
+	SGIF_EmInputTime_20000 = 20000,
+}SGIF_EmInputTime;
+
+
+// Measurement value
+typedef struct {
+	int					OutNo;			// OUT No(1-4)
+	SGIF_FLOATRESULT	FloatResult;	// valid or invalid data
+	float				Value;			// Measurement value
+} SGIF_FLOATVALUE_OUT;
+
+typedef struct {
+	SGIF_FLOATRESULT	FloatResult;	// valid or invalid data
+	float				Value;			// Measurement value
+} SGIF_FLOATVALUE;
+
+// IP address
+typedef struct {
+	IN_ADDR				IPAddress;
+} SGIF_OPENPARAM_ETHERNET;
+
+//Mask Minimum Display Unit(0.01mm)
+#define MASKUNIT 100 
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+	
+	EXP RC WINAPI SGIF_GetDeviceType(IN int DeviceID, OUT SGIF_DEVICE_TYPE* deviceType);
+
+	// Measured control commands
+	///
+	/// \brief SGIF_GetCameraSpotType	光斑类型(不支持SCI)
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param ControlType:				输出0:小光斑,1:大光斑
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_GetCameraSpotType(IN int DeviceID, OUT int *EissionSpotType);
+
+
+	///////////////////////////////////////////////
+	// Measurement control commands
+	//
+	// Measured value output (single)
+	///
+	/// \brief SGIF_GetCalcDataSingle	测量值输出
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo:					输出OUT编号
+	/// \param CalcData:				测量值
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_GetCalcDataSingle(IN int DeviceID, IN int OutNo, OUT SGIF_FLOATVALUE_OUT * CalcData);
+
+	// Measured value output (multiple)
+	///
+	/// \brief SGIF_GetCalcDataMulti	多个测量值输出
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo:					输出OUT编号组合
+	/// \param CalcData:				测量值数组
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_GetCalcDataMulti(IN int DeviceID, IN SGIF_OUTNO OutNo, OUT SGIF_FLOATVALUE_OUT * CalcData);
+
+	// Measured value output (ALL)
+	///
+	/// \brief SGIF_GetCalcDataALL		全部测量值输出
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param CalcData:				测量值数组
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_GetCalcDataALL(IN int DeviceID, OUT SGIF_FLOATVALUE_OUT * CalcData);
+
+	// Timing ON/OFF (single)
+	///
+	/// \brief SGIF_SetTimingSingle		计时ON/OFF(一个)
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo:					输出OUT编号
+	/// \param OnOff:					开或关
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_SetTimingSingle(IN int DeviceID, IN int OutNo, IN BOOL OnOff);
+
+	// Timing ON/OFF (multiple)
+	///
+	/// \brief SGIF_SetTimingMulti		计时ON/OFF(多个)
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo:					输出OUT编号组合
+	/// \param OnOff:					开或关
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_SetTimingMulti(IN int DeviceID, IN SGIF_OUTNO OutNo, IN BOOL OnOff);
+
+	// Timing ON/OFF (synchronous)
+	///
+	/// \brief SGIF_SetTimingSync		计时ON/OFF(同步)
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OnOff:					开或关
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_SetTimingSync(IN int DeviceID, IN BOOL OnOff);
+
+	// Auto-zero ON/OFF (single)
+	///
+	/// \brief SGIF_SetZeroSingle		自动归零(一个)
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo:					输出OUT编号
+	/// \param OnOff:					开或关
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_SetZeroSingle(IN int DeviceID, IN int OutNo, IN BOOL OnOff);
+
+	// Auto-zero ON/OFF (multiple)
+	///
+	/// \brief SGIF_SetZeroMulti		自动归零(多个)
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo:					输出OUT编号组合
+	/// \param OnOff:					开或关
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_SetZeroMulti(IN int DeviceID, IN SGIF_OUTNO OutNo, IN BOOL OnOff);
+
+	// Auto-zero ON/OFF (synchronous)
+	///
+	/// \brief SGIF_SetZeroSync			自动归零(同步)
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OnOff:					开或关
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_SetZeroSync(IN int DeviceID, IN BOOL OnOff);
+
+	// Measured value reset (single)
+	///
+	/// \brief SGIF_SetResetSingle		重置(一个)
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo:					输出OUT编号
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_SetResetSingle(IN int DeviceID, IN int OutNo);
+
+	// Measured value reset (multiple)
+	///
+	/// \brief SGIF_SetResetMulti		重置(多个)
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo:					输出OUT编号组合
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_SetResetMulti(IN int DeviceID, IN SGIF_OUTNO OutNo);
+
+	// Measured value reset (synchronous)
+	///
+	/// \brief SGIF_SetResetSync		重置(同步)
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_SetResetSync(IN int DeviceID);
+
+	// Program Change
+	///
+	/// \brief SGIF_SetProgramNo		程序切换
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param ProgramNo:				程序编号(0到7)
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_SetProgramNo(IN int DeviceID, IN int ProgramNo);
+
+	// Program Check
+	///
+	/// \brief SGIF_GetProgramNo		程序确认
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param ProgramNo:				程序编号(0到7)
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_GetProgramNo(IN int DeviceID, OUT int * ProgramNo);
+
+	// Starting the Data Storage
+	///
+	/// \brief SGIF_DataStorageStart	数据存储开始
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_DataStorageStart(IN int DeviceID);
+
+	// Stopping the Data Storage
+	///
+	/// \brief SGIF_DataStorageStop		数据存储停止
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_DataStorageStop(IN int DeviceID);
+
+	// Outputting the Data Storage
+	///
+	/// \brief SGIF_DataStorageGetData	数据存储数据输出
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					输出OUT编号
+	/// \param NumOfBuffer				缓冲区大小(最多可接受多少个数据)
+	/// \param OutBuffer				数据数组
+	/// \param NumReceived				实际接收的数据个数
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_DataStorageGetData(IN int DeviceID, IN int OutNo, IN int NumOfBuffer, OUT float * OutBuffer, OUT int *NumReceived);
+ 
+	// Initializing the Data Storage
+	///
+	/// \brief SGIF_DataStorageInit		数据存储初始化
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_DataStorageInit(IN int DeviceID);
+
+	// Data Storage Accumulation Status Output	
+	///
+	/// \brief SGIF_DataStorageGetStatus	数据存储状态输出
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param lsStorage					存储状态
+	/// \param NumStorageData				各输出口存储数量数组
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///
+	EXP RC WINAPI SGIF_DataStorageGetStatus(IN int DeviceID, OUT BOOL * lsStorage, OUT int  * NumStorageData);
+
+	///////////////////////////////////////////////
+	// Setting change commands
+	//
+
+	// Set Tolerance
+	///
+	/// \brief SGIF_SetTolerance			公差设定
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param OutNo						输出OUT编号
+	/// \param UpperLimit					上限,传入为有效数字(去掉小数点后的整形)
+	/// \param LowerLimit					下限,传入为有效数字(去掉小数点后的整形)
+	/// \param Hystersys					滞后,传入为有效数字(去掉小数点后的整形)
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///
+	EXP RC WINAPI SGIF_SetTolerance(IN int DeviceID, IN int OutNo, IN int UpperLimit, IN int LowerLimit, IN int Hystersys);
+
+	// Set ABLE
+	///
+	/// \brief SGIF_SetAbleMode				Able模式设定
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \param AbleMode						模式
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///
+	EXP RC WINAPI SGIF_SetAbleMode(IN int DeviceID, IN int HeadNo, IN SGIF_ABLEMODE AbleMode);
+
+	// Set ABLE Control Range
+	///
+	/// \brief SGIF_SetAbleMinMax			Able控制范围设定
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \param Min							下限
+	/// \param Max							上限
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///
+	EXP RC WINAPI SGIF_SetAbleMinMax(IN int DeviceID, IN int HeadNo, IN int Min, IN int Max);
+
+	// Set Detection mode
+	///
+	/// \brief SGIF_SetMeasureMode			测量模式设定
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \MeasureMode                        测量模式
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///
+	EXP RC WINAPI SGIF_SetMeasureMode(IN int DeviceID, IN int HeadNo, IN SGIF_MEASUREMODE MeasureMode);
+
+	// Set Base point
+	///
+	/// \brief SGIF_SetBasicPoint			基准点设定
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \param BasicPoint					基准点
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///
+	EXP RC WINAPI SGIF_SetBasicPoint(IN int DeviceID, IN int HeadNo, IN SGIF_BASICPOINT BasicPoint);
+
+	// Set Number of Times of Alarm Processing
+	///
+	/// \brief SGIF_SetNumAlarm				警报数量设定
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \param AlarmNum						警报数量
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///
+	EXP RC WINAPI SGIF_SetNumAlarm(IN int DeviceID, IN int HeadNo, IN int AlarmNum);
+
+	// Set Number of Times of Alarm Recovery
+	///
+	/// \brief SGIF_SetNumRecovery			恢复数量设定
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \param RecoveryNum					恢复次数
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///
+	EXP RC WINAPI SGIF_SetNumRecovery(IN int DeviceID, IN int HeadNo, IN int RecoveryNum);
+
+	// Set Alarm Level
+	///
+	/// \brief SGIF_SetAlarmLevel			警报级别设定
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \param AlarmLevel					警报级别
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///
+	EXP RC WINAPI SGIF_SetAlarmLevel(IN int DeviceID, IN int HeadNo, IN int AlarmLevel);
+
+	// Starting the ABLE Calibration
+	///
+	/// \brief SGIF_AbleStart				Able校准开始
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///
+	EXP RC WINAPI SGIF_AbleStart(IN int DeviceID, IN int HeadNo);
+
+	// Finishing the ABLE Calibration
+	///
+	/// \brief SGIF_AbleStop				Able校准完成
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///
+	EXP RC WINAPI SGIF_AbleStop(IN int DeviceID);
+
+	// Stopping the ABLE Calibration
+	///
+	/// \brief SGIF_AbleCancel				Able校准停止
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///
+	EXP RC WINAPI SGIF_AbleCancel(IN int DeviceID);
+
+	// Set Mounting Mode
+	///
+	/// \brief SGIF_SetReflectionMode		安装模式设定
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \param ReflectionMode				反射模式
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///
+	EXP RC WINAPI SGIF_SetReflectionMode(IN int DeviceID, IN int HeadNo, IN SGIF_REFLECTIONMODE ReflectionMode);
+
+	// Set Mask
+	///
+	/// \brief SGIF_SetMask					屏蔽设定
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \param OnOff						开关
+	/// \param HeadNo						点位1
+	/// \param HeadNo						点位2
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///
+	EXP RC WINAPI SGIF_SetMask(IN int DeviceID, IN int HeadNo, IN BOOL OnOff, IN int Pos1, IN int Pos2);
+
+	// Set Median
+	///
+	/// \brief SGIF_SetMedian				中位数设定
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \param Median						中位数
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///
+	EXP RC WINAPI SGIF_SetMedian(IN int DeviceID, IN int HeadNo, IN SGIF_MEDIAN Median);
+
+	// Set LASER CTRL group
+	///
+	/// \brief SGIF_SetLaserCtrlGroup		Laser Ctrl组设定
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \param LaserCtrlGroup				Laser Ctrl组
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_SetLaserCtrlGroup(IN int DeviceID, IN int HeadNo, IN SGIF_LASER_CTRL_GROUP LaserCtrlGroup);
+
+	// Set Mutual interference prevention group
+	///
+	/// \brief SGIF_SetMutualInterferencePreventionGroup		防止互相干扰组设定
+	/// \param DeviceID											设备ID号,范围为0-63.
+	/// \param HeadNo											传感头编号
+	/// \param Group											组
+	/// \return
+	///     >0:													失败.
+	///     =0:													成功.
+	///  
+	EXP RC WINAPI SGIF_SetMutualInterferencePreventionGroup(IN int DeviceID, IN int HeadNo, IN SGIF_MUTUAL_INTERFERENCE_PREVENTION_GROUP Group);
+
+	// Set Calculation method
+	///
+	/// \brief SGIF_SetCalcMethod		计算方式设定
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					输出OUT编号
+	/// \param CalcMethod				计算方法
+	/// \param HeadOutNo				传感头输出编号
+	/// \return
+	///     >0:													失败.
+	///     =0:													成功.
+	///  
+	EXP RC WINAPI SGIF_SetCalcMethod(IN int DeviceID, IN int OutNo, IN SGIF_CALCMETHOD CalcMethod, IN int HeadOutNo);
+
+	// Set Surface to be measured
+	///
+	/// \brief SGIF_SetCalcTarget		测量目标设定
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					输出OUT编号
+	/// \param CalcTarget				计算标签
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///  
+	EXP RC WINAPI SGIF_SetCalcTarget(IN int DeviceID, IN int OutNo, IN SGIF_CALCTARGET CalcTarget);
+
+	// Set OUT to be calculated (ADD, SUB)
+	///
+	/// \brief SGIF_SetOutAddSub		待计算的OUT(Add,Sub)设定
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					输出OUT编号
+	/// \param AddSub1					待计算的OUT
+	/// \param AddSub2					待计算的OUT
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///  
+	EXP RC WINAPI SGIF_SetOutAddSub(IN int DeviceID, IN int OutNo, IN int AddSub1, IN int AddSub2);
+
+	// Set OUT to be calculated (AVE, MAX, MIN, P-P)
+	///
+	/// \brief SGIF_SetOutOperation		待计算的OUT(Ave,Max,Min,P-P)设定
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					输出OUT编号
+	/// \param TargetOut				多个OUT组合
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///  
+	EXP RC WINAPI SGIF_SetOutOperation(IN int DeviceID, IN int OutNo, IN SGIF_OUTNO TargetOut);
+
+	// Set Scaling
+	///
+	/// \brief SGIF_SetScaling			缩放设定
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					输出OUT编号
+	/// \param InputValue1				点1的测量值(输入值),传有效数字(去掉小数点后的整形)
+	/// \param OutputValue1				点1的显示值(输出值),传有效数字(去掉小数点后的整形)
+	/// \param InputValue2				点2的测量值(输入值),传有效数字(去掉小数点后的整形)
+	/// \param OutputValue2				点2的显示值(输出值),传有效数字(去掉小数点后的整形)
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///  
+	EXP RC WINAPI SGIF_SetScaling(IN int DeviceID, IN int OutNo, IN int InputValue1, IN int OutputValue1, IN int InputValue2, IN int OutputValue2);
+
+	// Set Filter Mode
+	///
+	/// \brief SGIF_SetFilter			滤波器设定
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					输出OUT编号
+	/// \param FilterMode				滤波模式
+	/// \param FilterPara				滤波参数
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///  
+	EXP RC WINAPI SGIF_SetFilter(IN int DeviceID, IN int OutNo, IN SGIF_FILTERMODE FilterMode, IN SGIF_FILTERPARA FilterPara);
+
+	// Set Trigger Mode
+	///
+	/// \brief SGIF_SetTriggerMode		触发模式设定
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					输出OUT编号
+	/// \param TriggerMode				触发模式
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///  
+	EXP RC WINAPI SGIF_SetTriggerMode(IN int DeviceID, IN int OutNo, IN SGIF_TRIGGERMODE TriggerMode);
+
+	// Set Offset
+	///
+	/// \brief SGIF_SetOffset			偏移设定
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					输出OUT编号
+	/// \param Offset					偏移量
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///  
+	EXP RC WINAPI SGIF_SetOffset(IN int DeviceID, IN int OutNo, IN int Offset);
+
+	// Set Calculation Mode
+	///
+	/// \brief SGIF_SetCalcMode			检测模式(测量模式)设定
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					输出OUT编号
+	/// \param CalcMode					检测模式编号
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///  
+	EXP RC WINAPI SGIF_SetCalcMode(IN int DeviceID, IN int OutNo, IN SGIF_CALCMODE CalcMode);
+
+	// Set Minimum Display Unit
+	///
+	/// \brief SGIF_SetDisplayUnit		设定显示单位设定
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					输出OUT编号
+	/// \param DisplayUnit				显示单位
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///  
+	EXP RC WINAPI SGIF_SetDisplayUnit(IN int DeviceID, IN int OutNo, IN SGIF_DISPLAYUNIT DisplayUnit);
+
+	// Set Synchronization
+	///
+	/// \brief SGIF_SetSynchronization		同步设定
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param OutNo						输出OUT编号
+	/// \param OnOff						开关
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_SetSynchronization(IN int DeviceID, IN int OutNo, IN BOOL OnOff);
+
+	// Set Storage (OUT No. specification)
+	///
+	/// \brief SGIF_SetStorageTarget		存储(OUT编号规格)设定
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param OutNo						输出OUT编号
+	/// \param OnOff						开关
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_SetStorageTarget(IN int DeviceID, IN int OutNo, IN BOOL OnOff);
+
+	// Set Sampling Rate
+	///
+	/// \brief SGIF_SetSamplingCycle		采样周期设定
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param SamplingCycle				采样周期
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_SetSamplingCycle(IN int DeviceID, IN SGIF_SAMPLINGCYCLE SamplingCycle);
+
+	// Set Mutual Interference Prevention
+	///
+	/// \brief SGIF_SetMutualInterferencePrevention		防止互相干扰组设定
+	/// \param DeviceID									设备ID号,范围为0-63.
+	/// \param OnOff									组设定
+	/// \return
+	///     >0:											失败.
+	///     =0:											成功.
+	///  
+	EXP RC WINAPI SGIF_SetMutualInterferencePrevention(IN int DeviceID, IN SGIF_MUTUAL_INTERFERENCE_PREVENTION OnOff);
+
+	// Set Strobe Time
+	///
+	/// \brief SGIF_SetStrobeTime			选通时间设定
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param StrobeTime					选通时间
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_SetStrobeTime(IN int DeviceID, IN SGIF_STOROBETIME StrobeTime);
+
+	// Set Data Storage
+	///
+	/// \brief SGIF_SetDataStorage			数据存储设定
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param NumStorage					待存储数据的编号
+	/// \param StorageCycle					存储周期
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_SetDataStorage(IN int DeviceID, IN int NumStorage, IN SGIF_STORAGECYCLE StorageCycle);
+
+	// EncoderSetting
+	///
+	/// \brief SGIF_SetRunningMode			运行模式设置(不支持SCI设备)
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param runningmode					运行模式 0:OFF/1:定时/2:触发
+	/// \param CatchDirection               检测方向 0:正负计时/1:正计时/2:负计时
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_SetRunningMode(IN int DeviceID, IN SGIF_EmRunningMode Runningmode, IN SGIF_EmDirection CatchDirection);
+
+
+	// EncoderInputSetting
+	///
+	/// \brief SGIF_SetEncoderMode			编码器输入模式设置(不支持SCI设备)
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param Inputmode					运行模式 0:1相1递增/1:2相1递增/2:2相2递增,3:2相4递增
+	/// \param MinInputTime					最小输入时间
+	/// \param TrigInterval					触发间隔
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+
+	EXP RC WINAPI SGIF_SetEncoderMode(IN int DeviceID, IN SGIF_EmEncoderInput Inputmode,IN SGIF_EmInputTime InputTime,IN int TrigInterval);
+
+	// SGIF_SetFormula
+	///
+	/// \brief SGIF_SetFormula				设置配方
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param filePath						配方路径
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  derive
+
+	EXP RC WINAPI SGIF_SetFormula(IN int DeviceID, IN char* filePath );
+
+	// SGIF_SetFormula
+	///
+	/// \brief SGIF_SetFormula				设置配方
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param filePath						配方路径
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_DeriveFormula(IN int DeviceID, IN char* filePath);
+	///////////////////////////////////////////////
+	// Setting confirmation commands
+	//
+	// Get Tolerance
+	///
+	/// \brief SGIF_GetTolerance			公差设定获取
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param OutNo						输出OUT编号
+	/// \param UpperLimit					上限,传出为有效数字(去掉小数点后的整形)
+	/// \param LowerLimit					下限,传出为有效数字(去掉小数点后的整形)
+	/// \param Hysteresis					滞后,传出为有效数字(去掉小数点后的整形)
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_GetTolerance(IN int DeviceID, IN int OutNo, OUT int * UpperLimit, OUT int * LowerLimit, OUT int * Hysteresis);
+
+	// Get ABLE
+	///
+	/// \brief SGIF_GetAbleMode				Able设定获取
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \param AbleMode						Able模式
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_GetAbleMode(IN int DeviceID, IN int HeadNo, OUT SGIF_ABLEMODE * AbleMode);
+
+	// Get ABLE Control Range
+	///
+	/// \brief SGIF_GetAbleMinMax			Able控制范围获取
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \param Min							最小值
+	/// \param Max							最大值
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_GetAbleMinMax(IN int DeviceID, IN int HeadNo, OUT int * Min, OUT int * Max);
+
+	// Get Detection mode
+	///
+	/// \brief SGIF_GetMeasureMode			测量模式获取
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \param MeasureMode					测量模式
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_GetMeasureMode(IN int DeviceID, IN int HeadNo, OUT SGIF_MEASUREMODE * MeasureMode);
+
+	// Get Base point
+	///
+	/// \brief SGIF_GetBasicPoint			基准点获取
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \param BasicPoint					基准点
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_GetBasicPoint(IN int DeviceID, IN int HeadNo, OUT SGIF_BASICPOINT * BasicPoint);
+
+	// Get Number of Times of Alarm Processing
+	///
+	/// \brief SGIF_GetNumAlarm				警报处理次数获取
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \param AlarmNum						警报次数
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_GetNumAlarm(IN int DeviceID, IN int HeadNo, OUT int * AlarmNum);
+
+	// Get Number of Times of Alarm Recovery
+	///
+	/// \brief SGIF_GetNumRecovery			警报恢复次数获取
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \param RecoveryNum					恢复次数
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_GetNumRecovery(IN int DeviceID, IN int HeadNo, OUT int * RecoveryNum);
+
+	// Get Alarm Level
+	///
+	/// \brief SGIF_GetAlarmLevel			警报级别获取
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \param AlarmLevel					警报级别
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_GetAlarmLevel(IN int DeviceID, IN int HeadNo, OUT int * AlarmLevel);
+
+	// Get Mounting Mode
+	///
+	/// \brief SGIF_GetReflectionMode		安装模式获取
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \param ReflectionMode				反射模式
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_GetReflectionMode(IN int DeviceID, IN int HeadNo, OUT SGIF_REFLECTIONMODE * ReflectionMode);
+
+	// Get Mask
+	///
+	/// \brief SGIF_GetMask					屏蔽设定获取
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \param OnOff						开关
+	/// \param Pos1							位置1
+	/// \param Pos2							位置2
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_GetMask(IN int DeviceID, IN int HeadNo, OUT BOOL * OnOff, OUT int * Pos1, OUT int * Pos2);
+
+	// Get Median
+	///
+	/// \brief SGIF_GetMedian				中位数获取
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \param Median						中位数
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_GetMedian(IN int DeviceID, IN int HeadNo, OUT SGIF_MEDIAN * Median);
+
+	// Get LASER CTRL group
+	///
+	/// \brief SGIF_GetLaserCtrlGroup		Laser Ctrl组获取
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						传感头编号
+	/// \param LaserCtrlGroup				Laser Ctrl组
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_GetLaserCtrlGroup(IN int DeviceID, IN int HeadNo, OUT SGIF_LASER_CTRL_GROUP * LaserCtrlGroup);
+
+	// Get Mutual interference prevention group
+	///
+	/// \brief SGIF_GetMutualInterferencePreventionGroup	防止互相干扰组获取
+	/// \param DeviceID										设备ID号,范围为0-63.
+	/// \param HeadNo										传感头编号
+	/// \param Group										组
+	/// \return
+	///     >0:												失败.
+	///     =0:												成功.
+	///  
+	EXP RC WINAPI SGIF_GetMutualInterferencePreventionGroup(IN int DeviceID, IN int HeadNo, OUT SGIF_MUTUAL_INTERFERENCE_PREVENTION_GROUP * Group);
+
+	// Get Calculation method
+	///
+	/// \brief SGIF_GetCalcMethod		计算方式获取
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					输出OUT编号
+	/// \param CalcMethod				计算方法
+	/// \param HeadOutNo				传感头或OUT编号
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///  
+	EXP RC WINAPI SGIF_GetCalcMethod(IN int DeviceID, IN int OutNo, OUT SGIF_CALCMETHOD * CalcMethod, OUT int * HeadOutNo);
+
+	// Get Surface to be measured
+	///
+	/// \brief SGIF_GetCalcTarget		测量目标获取
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					输出OUT编号
+	/// \param CalcTarget				计算标签
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///  
+	EXP RC WINAPI SGIF_GetCalcTarget(IN int DeviceID, IN int OutNo, OUT SGIF_CALCTARGET * CalcTarget);
+
+	// Get OUT to be calculated (ADD, SUB)
+	///
+	/// \brief SGIF_GetOutAddSub		待计算的OUT(Add,Sub)获取
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					输出OUT编号
+	/// \param AddSub1					待计算的OUT编号1
+	/// \param AddSub2					待计算的OUT编号2
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///  
+	EXP RC WINAPI SGIF_GetOutAddSub(IN int DeviceID, IN int OutNo, OUT int * AddSub1, OUT int * AddSub2);
+
+	// Get OUT to be calculated (AVE, MAX, MIN, P-P)
+	///
+	/// \brief SGIF_GetOutOperation		待计算的OUT(Ave,Max,Min,P-P)获取
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					输出OUT编号
+	/// \param TargetOut				多个OUT或HEAD组合
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///  
+	EXP RC WINAPI SGIF_GetOutOperation(IN int DeviceID, IN int OutNo, OUT SGIF_OUTNO * TargetOut);
+
+	// Get Scaling
+	///
+	/// \brief SGIF_GetScaling			缩放设定获取
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					输出OUT编号
+	/// \param InputValue1				点1的测量值(输入值),传出为有效数字(去掉小数点后的整形)
+	/// \param OutputValue1				点1的显示值(输出值),传出为有效数字(去掉小数点后的整形)
+	/// \param InputValue2				点2的测量值(输入值),传出为有效数字(去掉小数点后的整形)
+	/// \param OutputValue2				点2的显示值(输出值),传出为有效数字(去掉小数点后的整形)
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///  
+	EXP RC WINAPI SGIF_GetScaling(IN int DeviceID, IN int OutNo, OUT int * InputValue1, OUT int * OutputValue1, OUT int * InputValue2, OUT int * OutputValue2);
+
+	// Get Filter Mode
+	///
+	/// \brief SGIF_GetFilter			滤波器设定获取
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					输出OUT编号
+	/// \param FilterMode				滤波器模式
+	/// \param FilterPara				滤波参数
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///  
+	EXP RC WINAPI SGIF_GetFilter(IN int DeviceID, IN int OutNo, OUT SGIF_FILTERMODE * FilterMode, OUT SGIF_FILTERPARA * FilterPara);
+
+	// Get Trigger Mode
+	///
+	/// \brief SGIF_GetTriggerMode		触发模式获取
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					输出OUT编号
+	/// \param TriggerMode				触发模式
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///  
+	EXP RC WINAPI SGIF_GetTriggerMode(IN int DeviceID, IN int OutNo, OUT SGIF_TRIGGERMODE * TriggerMode);
+
+	// Get Offset
+	///
+	/// \brief SGIF_GetOffset			偏移获取
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					输出OUT编号
+	/// \param Offset					偏移量
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///  
+	EXP RC WINAPI SGIF_GetOffset(IN int DeviceID, IN int OutNo, OUT int * Offset);
+
+	// Get Calculation Mode
+	///
+	/// \brief SGIF_GetCalcMode			检测模式(测量模式)获取
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					输出OUT编号
+	/// \param CalcMode					测量模式
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///  
+	EXP RC WINAPI SGIF_GetCalcMode(IN int DeviceID, IN int OutNo, OUT SGIF_CALCMODE * CalcMode);
+
+	// Get Minimum Display Unit
+	///
+	/// \brief SGIF_GetDisplayUnit		显示最小单位获取
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					输出OUT编号
+	/// \param DisplayUnit				显示最小单位
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///  
+	EXP RC WINAPI SGIF_GetDisplayUnit(IN int DeviceID, IN int OutNo, OUT SGIF_DISPLAYUNIT * DisplayUnit);
+
+	// Get Synchronization
+	///
+	/// \brief SGIF_GetSynchronization		同步设定获取
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param OutNo						输出OUT编号
+	/// \param OnOff						开关
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_GetSynchronization(IN int DeviceID, IN int OutNo, OUT BOOL * OnOff);
+
+	// Get Storage (OUT No. specification)
+	///
+	/// \brief SGIF_GetStorageTarget		存储(OUT编号设定)获取
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param OutNo						输出OUT编号
+	/// \param OnOff						开关
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_GetStorageTarget(IN int DeviceID, IN int OutNo, OUT BOOL * OnOff);
+
+	// Get Sampling Rate
+	///
+	/// \brief SGIF_GetSamplingCycle		采样周期获取
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param SamplingCycle				采样周期
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///  
+	EXP RC WINAPI SGIF_GetSamplingCycle(IN int DeviceID, OUT SGIF_SAMPLINGCYCLE * SamplingCycle);
+
+	// Get Mutual Interference Prevention
+	///
+	/// \brief SGIF_GetMutualInterferencePrevention		防止互相干扰获取
+	/// \param DeviceID									设备ID号,范围为0-63.
+	/// \param OnOff									开关
+	/// \return
+	///     >0:											失败.
+	///     =0:											成功.
+	///  
+	EXP RC WINAPI SGIF_GetMutualInterferencePrevention(IN int DeviceID, OUT SGIF_MUTUAL_INTERFERENCE_PREVENTION * OnOff);
+
+	// Get Strobe Time
+	///
+	/// \brief SGIF_GetStrobeTime		选通时间获取
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutputFormat				输出形式
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_GetStrobeTime(IN int DeviceID, OUT SGIF_STOROBETIME * StrobeTime);
+
+	// Get Data Storage
+	///
+	/// \brief SGIF_GetDataStorage		数据存储获取
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param NumStorage				带存储数据编号
+	/// \param StorageCycle				存储周期
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_GetDataStorage(IN int DeviceID, OUT int * NumStorage, OUT SGIF_STORAGECYCLE * StorageCycle);
+
+	// Get Active head count
+	///
+	/// \brief SGIF_GetNumOfUsedHeads		主动OUT计数获取
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param NumOfUsedHeads				主动OUT/传感头计数
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///
+	EXP RC WINAPI SGIF_GetNumOfUsedHeads(IN int DeviceID, OUT int * NumOfUsedHeads);
+
+	// Get Active OUT count
+	///
+	/// \brief SGIF_GetNumOfUsedOut			主动传感头计数获取
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param NumOfUsedHeads				主动OUT/传感头计数
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///
+	EXP RC WINAPI SGIF_GetNumOfUsedOut(IN int DeviceID, OUT int * NumOfUsedOut);
+
+	// Get Active Running Time
+	///
+	/// \brief SGIF_GetDeviceRuningTime		获取相机运行时长,单位s
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param HeadNo						0:控制器; 1-4:传感头编号
+	/// \param RuningTime					运行时间
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///
+	EXP RC WINAPI SGIF_GetDeviceRuningTime(IN int DeviceID, IN int HeadNo, OUT unsigned int * RuningTime);
+
+	///////////////////////////////////////////////
+	// Other commands
+	//
+	// Opens the Ethernet device.
+	///
+	/// \brief SGIF_OpenDeviceETHER			打开设备网络连接
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param OpenParam					网络连接参数
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///
+	EXP RC WINAPI SGIF_OpenDeviceETHER(IN int DeviceID, SGIF_OPENPARAM_ETHERNET * OpenParam,DWORD TIMEOUT=3);
+
+	// Closes the currently open device.
+	///
+	/// \brief SGIF_CloseDevice				关闭设备网络连接
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///
+	EXP RC WINAPI SGIF_CloseDevice(IN int DeviceID);
+
+	///////////////////////////////////////////////
+	// Mode change commands
+	//
+	// Mode Switch
+	///
+	/// \brief SGIF_SetMode					模式切换
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param Mode							模式
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///
+	EXP RC WINAPI SGIF_SetMode(IN int DeviceID, IN SGIF_MODE Mode);
+	
+	EXP RC WINAPI SGIF_Refresh(IN int DeviceID);
+
+	//////////////////////////////////////////////一次回调相关///////////////////////////////////////
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutBuffer				数据数组
+	/// \param NumReceived				实际接收的数据个数
+	///
+	typedef void(*SGIF_DataStorageOneTimeCallBack)(OUT int DeviceID);
+
+	///////////////////////////////////////////////
+	/// \brief SGIF_SetOneDataStorage		注册一次回调
+	/// \param DeviceID						设备ID号,范围为0-63.
+	/// \param SGIF_BatchOneTimeCallBack	回调函数
+	/// \return
+	///     >0:								失败.
+	///     =0:								成功.
+	///
+	EXP RC WINAPI SGIF_SetOneDataStorage(IN int DeviceID, IN SGIF_DataStorageOneTimeCallBack CallFunc);
+	//////////////////////////////////////////////////////////////////////////////////////////////
+
+	// Get encoder store value
+	/// \brief SGIF_GetEncoderStoreValue编码器值存储数据输出(仅SCI设备支持)
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					编码器编号
+	/// \param NumOfBuffer				缓冲区大小(最多可接受多少个数据)
+	/// \param OutBuffer				数据数组
+	/// \param NumReceived				实际接收的数据个数
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_GetEncoderStoreValue(IN int DeviceID, IN int OutNo, IN int NumOfBuffer, OUT int * OutBuffer, OUT int *NumReceived);
+
+	// Get encoder value
+	/// \brief SGIF_GetEncoderCurrentValue	读取编码器当前值(仅SCI设备支持)
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					编码器编号(1-3)
+	/// \param OutBuffer				数据指针
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_GetEncoderCurrentValue(IN int DeviceID, IN int OutNo, OUT int * OutBuffer);
+
+	// encoder Reset
+	/// \brief SGIF_EncoderReset		编码器值置零(仅SCI设备支持)
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					编码器编号(1-3)
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_EncoderReset(IN int DeviceID, IN int OutNo);
+
+	// Set Encoder Number
+	/// \brief SGIF_SetEncoderNumber	选择编码器(仅SCI设备支持)
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					编码器编号(1-3)
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_SetEncoderNumber(IN int DeviceID, IN int OutNo);
+
+	// Get encoder number
+	/// \brief SGIF_GetEncoderNumber	读取设置的编码器编号(仅SCI设备支持)
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutBuffer				数据指针
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_GetEncoderNumber(IN int DeviceID, OUT int * OutBuffer);
+
+	//Set Encoder Parameters
+	/// \brief SGIF_SetEncoderParameters设置编码器参数(仅SCI设备支持)
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					编码器编号(1-3)
+	/// \param InputMode				输入模式(0-3)
+	/// \param InputTime				最低输入时间(100,200,500,1000,2000,5000,10000,20000)(ns)
+	/// \param interval					间隔(1-10000)
+	/// \param OperatingMode			运行模式(0-2)
+	/// \param DetectionDirection		检测方向(0-2)
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_SetEncoderParameters(IN int DeviceID, IN int OutNo, IN int InputMode, IN int InputTime, IN int interval, IN int OperatingMode, IN int DetectionDirection);
+
+	//Get Encoder Parameters
+	/// \brief SGIF_GetEncoderParameters读取编码器参数(仅SCI设备支持)
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					编码器编号(1-3)
+	/// \param InputMode				输入模式(0-3)
+	/// \param InputTime				最低输入时间(100,200,500,1000,2000,5000,10000,20000)(ns)
+	/// \param interval					间隔(1-10000)
+	/// \param OperatingMode			运行模式(0-2)
+	/// \param DetectionDirection		检测方向(0-2)
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_GetEncoderParameters(IN int DeviceID, IN int OutNo, OUT int * InputMode, OUT int * InputTime, OUT int * interval, OUT int * OperatingMode, OUT int * DetectionDirection);
+
+	//Set Analog Output
+	/// \brief SGIF_SetAnalogOutput		设置模拟量输出(仅SCI设备支持)
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					模拟量编号(1-3)
+	/// \param OutputChannel			输出通道(0-3)
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_SetAnalogOutput(IN int DeviceID, IN int OutNo, IN int OutputChannel);
+
+	// Retrieve Analog Output Channel Number
+	/// \brief SGIF_GetAnalogOutputChannel	获取模拟量输出通道编号(仅SCI设备支持)
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					模拟量编号(1-3)
+	/// \param OutBuffer				数据指针
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_GetAnalogOutputChannel(IN int DeviceID, IN int OutNo, OUT int * OutBuffer);
+
+	//Set IO Digital Output
+	/// \brief SGIF_SetIODigitalOutput	设置IO数字输出(仅SCI设备支持)
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					数字输出编号(1-4)
+	/// \param Level					输出位数(0:OFF,1:HI,2:GO,3:LO,4:STROBE)
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_SetIODigitalOutput(IN int DeviceID, IN int OutNo, IN int Level);
+
+	// Retrieve IO Digital Output Channel Number
+	/// \brief SGIF_GetIOOutputChannel	获取IO数字量输出通道编号(仅SCI设备支持)
+	/// \param DeviceID					设备ID号,范围为0-63.
+	/// \param OutNo					数字输出编号(1-4)
+	/// \param OutBuffer				数据指针
+	/// \return
+	///     >0:							失败.
+	///     =0:							成功.
+	///
+	EXP RC WINAPI SGIF_GetIOOutputChannel(IN int DeviceID, IN int OutNo, OUT int * OutBuffer);
+#ifdef __cplusplus
+}
+#endif
diff --git a/SourceCode/Bond/SGMeasurement/DLL/64bit/SGIFPJ.dll b/SourceCode/Bond/SGMeasurement/DLL/64bit/SGIFPJ.dll
new file mode 100644
index 0000000..2b313cf
--- /dev/null
+++ b/SourceCode/Bond/SGMeasurement/DLL/64bit/SGIFPJ.dll
Binary files differ
diff --git a/SourceCode/Bond/SGMeasurement/DLL/64bit/SGIFPJ.lib b/SourceCode/Bond/SGMeasurement/DLL/64bit/SGIFPJ.lib
new file mode 100644
index 0000000..6607e7b
--- /dev/null
+++ b/SourceCode/Bond/SGMeasurement/DLL/64bit/SGIFPJ.lib
Binary files differ
diff --git "a/SourceCode/Bond/SGMeasurement/DLL/ZY\347\263\273\345\210\227\351\200\232\344\277\241\345\272\223\345\217\202\350\200\203\346\211\213\345\206\214-V2.3.pdf" "b/SourceCode/Bond/SGMeasurement/DLL/ZY\347\263\273\345\210\227\351\200\232\344\277\241\345\272\223\345\217\202\350\200\203\346\211\213\345\206\214-V2.3.pdf"
new file mode 100644
index 0000000..4695c56
--- /dev/null
+++ "b/SourceCode/Bond/SGMeasurement/DLL/ZY\347\263\273\345\210\227\351\200\232\344\277\241\345\272\223\345\217\202\350\200\203\346\211\213\345\206\214-V2.3.pdf"
Binary files differ
diff --git a/SourceCode/Bond/SGMeasurement/SGMeasurement.cpp b/SourceCode/Bond/SGMeasurement/SGMeasurement.cpp
new file mode 100644
index 0000000..2c3c2e6
--- /dev/null
+++ b/SourceCode/Bond/SGMeasurement/SGMeasurement.cpp
@@ -0,0 +1,104 @@
+锘�
+// SGMeasurement.cpp: 瀹氫箟搴旂敤绋嬪簭鐨勭被琛屼负銆�
+//
+
+#include "pch.h"
+#include "framework.h"
+#include "SGMeasurement.h"
+#include "SGMeasurementDlg.h"
+
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#endif
+
+
+// CSGMeasurementApp
+
+BEGIN_MESSAGE_MAP(CSGMeasurementApp, CWinApp)
+	ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
+END_MESSAGE_MAP()
+
+
+// CSGMeasurementApp 鏋勯��
+
+CSGMeasurementApp::CSGMeasurementApp()
+{
+	// 鏀寔閲嶆柊鍚姩绠$悊鍣�
+	m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_RESTART;
+
+	// TODO: 鍦ㄦ澶勬坊鍔犳瀯閫犱唬鐮侊紝
+	// 灏嗘墍鏈夐噸瑕佺殑鍒濆鍖栨斁缃湪 InitInstance 涓�
+}
+
+
+// 鍞竴鐨� CSGMeasurementApp 瀵硅薄
+
+CSGMeasurementApp theApp;
+
+
+// CSGMeasurementApp 鍒濆鍖�
+
+BOOL CSGMeasurementApp::InitInstance()
+{
+	// 濡傛灉搴旂敤绋嬪簭瀛樺湪浠ヤ笅鎯呭喌锛學indows XP 涓婇渶瑕� InitCommonControlsEx()
+	// 浣跨敤 ComCtl32.dll 鐗堟湰 6 鎴栨洿楂樼増鏈潵鍚敤鍙鍖栨柟寮忥紝鍒欓渶瑕� InitCommonControlsEx()銆傚惁鍒欙紝灏嗘棤娉曞垱寤虹獥鍙c��
+	INITCOMMONCONTROLSEX InitCtrls;
+	InitCtrls.dwSize = sizeof(InitCtrls);
+	// 灏嗗畠璁剧疆涓哄寘鎷墍鏈夎鍦ㄥ簲鐢ㄧ▼搴忎腑浣跨敤鐨�
+	// 鍏叡鎺т欢绫汇��
+	InitCtrls.dwICC = ICC_WIN95_CLASSES;
+	InitCommonControlsEx(&InitCtrls);
+
+	CWinApp::InitInstance();
+
+	// 鍒濆鍖� MFC RichEdit 鎺т欢
+	AfxInitRichEdit2();
+
+	AfxEnableControlContainer();
+
+	// 鍒涘缓 shell 绠$悊鍣紝浠ラ槻瀵硅瘽妗嗗寘鍚�
+	// 浠讳綍 shell 鏍戣鍥炬帶浠舵垨 shell 鍒楄〃瑙嗗浘鎺т欢銆�
+	CShellManager *pShellManager = new CShellManager;
+
+	// 婵�娲烩�淲indows Native鈥濊瑙夌鐞嗗櫒锛屼互渚垮湪 MFC 鎺т欢涓惎鐢ㄤ富棰�
+	CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));
+
+	// 鏍囧噯鍒濆鍖�
+	// 濡傛灉鏈娇鐢ㄨ繖浜涘姛鑳藉苟甯屾湜鍑忓皬
+	// 鏈�缁堝彲鎵ц鏂囦欢鐨勫ぇ灏忥紝鍒欏簲绉婚櫎涓嬪垪
+	// 涓嶉渶瑕佺殑鐗瑰畾鍒濆鍖栦緥绋�
+	// 鏇存敼鐢ㄤ簬瀛樺偍璁剧疆鐨勬敞鍐岃〃椤�
+	// TODO: 搴旈�傚綋淇敼璇ュ瓧绗︿覆锛�
+	// 渚嬪淇敼涓哄叕鍙告垨缁勭粐鍚�
+	SetRegistryKey(_T("搴旂敤绋嬪簭鍚戝鐢熸垚鐨勬湰鍦板簲鐢ㄧ▼搴�"));
+
+	CSGMeasurementDlg dlg;
+	m_pMainWnd = &dlg;
+	INT_PTR nResponse = dlg.DoModal();
+	if (nResponse == IDOK)
+	{
+		// TODO:鈥滅‘瀹氣�濇潵鍏抽棴瀵硅瘽妗嗙殑浠g爜
+	}
+	else if (nResponse == IDCANCEL)
+	{
+		// TODO:鈥滃彇娑堚�濇潵鍏抽棴瀵硅瘽妗嗙殑浠g爜 
+	}
+	else if (nResponse == -1)
+	{
+		TRACE(traceAppMsg, 0, "璀﹀憡: 瀵硅瘽妗嗗垱寤哄け璐ワ紝搴旂敤绋嬪簭灏嗘剰澶栫粓姝€�俓n");
+		TRACE(traceAppMsg, 0, "璀﹀憡: 濡傛灉鎮ㄥ湪瀵硅瘽妗嗕笂浣跨敤 MFC 鎺т欢锛屽垯鏃犳硶 #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS銆俓n");
+	}
+
+	// 鍒犻櫎涓婇潰鍒涘缓鐨� shell 绠$悊鍣ㄣ��
+	if (pShellManager != nullptr)
+	{
+		delete pShellManager;
+	}
+
+#if !defined(_AFXDLL) && !defined(_AFX_NO_MFC_CONTROLS_IN_DIALOGS)
+	ControlBarCleanUp();
+#endif
+
+	// 鐢变簬瀵硅瘽妗嗗凡鍏抽棴锛屾墍浠ュ皢杩斿洖 FALSE 浠ヤ究閫�鍑哄簲鐢ㄧ▼搴忥紝鑰屼笉鏄惎鍔ㄥ簲鐢ㄧ▼搴忕殑娑堟伅娉点��
+	return FALSE;
+}
\ No newline at end of file
diff --git a/SourceCode/Bond/SGMeasurement/SGMeasurement.h b/SourceCode/Bond/SGMeasurement/SGMeasurement.h
new file mode 100644
index 0000000..3819dce
--- /dev/null
+++ b/SourceCode/Bond/SGMeasurement/SGMeasurement.h
@@ -0,0 +1,32 @@
+锘�
+// SGMeasurement.h: PROJECT_NAME 搴旂敤绋嬪簭鐨勪富澶存枃浠�
+//
+
+#pragma once
+
+#ifndef __AFXWIN_H__
+	#error "鍦ㄥ寘鍚鏂囦欢涔嬪墠鍖呭惈 'pch.h' 浠ョ敓鎴� PCH"
+#endif
+
+#include "resource.h"		// 涓荤鍙�
+
+
+// CSGMeasurementApp:
+// 鏈夊叧姝ょ被鐨勫疄鐜帮紝璇峰弬闃� SGMeasurement.cpp
+//
+
+class CSGMeasurementApp : public CWinApp
+{
+public:
+	CSGMeasurementApp();
+
+// 閲嶅啓
+public:
+	virtual BOOL InitInstance();
+
+// 瀹炵幇
+
+	DECLARE_MESSAGE_MAP()
+};
+
+extern CSGMeasurementApp theApp;
diff --git a/SourceCode/Bond/SGMeasurement/SGMeasurement.rc b/SourceCode/Bond/SGMeasurement/SGMeasurement.rc
new file mode 100644
index 0000000..fd45e92
--- /dev/null
+++ b/SourceCode/Bond/SGMeasurement/SGMeasurement.rc
Binary files differ
diff --git a/SourceCode/Bond/SGMeasurement/SGMeasurement.vcxproj b/SourceCode/Bond/SGMeasurement/SGMeasurement.vcxproj
new file mode 100644
index 0000000..d26ab99
--- /dev/null
+++ b/SourceCode/Bond/SGMeasurement/SGMeasurement.vcxproj
@@ -0,0 +1,229 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|Win32">
+      <Configuration>Debug</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|Win32">
+      <Configuration>Release</Configuration>
+      <Platform>Win32</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Debug|x64">
+      <Configuration>Debug</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|x64">
+      <Configuration>Release</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <VCProjectVersion>17.0</VCProjectVersion>
+    <ProjectGuid>{F8087F20-3A3E-18F2-09E3-9C139642EB58}</ProjectGuid>
+    <Keyword>MFCProj</Keyword>
+    <RootNamespace>SGMeasurement</RootNamespace>
+    <WindowsTargetPlatformVersion>10.0.22621.0</WindowsTargetPlatformVersion>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v141</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+    <UseOfMfc>Dynamic</UseOfMfc>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v141</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+    <UseOfMfc>Dynamic</UseOfMfc>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <PlatformToolset>v141</PlatformToolset>
+    <CharacterSet>Unicode</CharacterSet>
+    <UseOfMfc>Dynamic</UseOfMfc>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+    <ConfigurationType>Application</ConfigurationType>
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <PlatformToolset>v141</PlatformToolset>
+    <WholeProgramOptimization>true</WholeProgramOptimization>
+    <CharacterSet>Unicode</CharacterSet>
+    <UseOfMfc>Dynamic</UseOfMfc>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings">
+  </ImportGroup>
+  <ImportGroup Label="Shared">
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+  </ImportGroup>
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <LinkIncremental>true</LinkIncremental>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <LinkIncremental>true</LinkIncremental>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <LinkIncremental>false</LinkIncremental>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <LinkIncremental>false</LinkIncremental>
+  </PropertyGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <ClCompile>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <SDLCheck>true</SDLCheck>
+      <PreprocessorDefinitions>_WINDOWS;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
+      <AdditionalIncludeDirectories>.\DLL\64bit;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <AdditionalLibraryDirectories>.\DLL\64bit;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <AdditionalDependencies>SGIFPJ.lib;%(AdditionalDependencies)</AdditionalDependencies>
+    </Link>
+    <Midl>
+      <MkTypLibCompatible>false</MkTypLibCompatible>
+      <ValidateAllParameters>true</ValidateAllParameters>
+      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+    </Midl>
+    <ResourceCompile>
+      <Culture>0x0804</Culture>
+      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+    </ResourceCompile>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+    <ClCompile>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <SDLCheck>true</SDLCheck>
+      <PreprocessorDefinitions>WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
+      <AdditionalIncludeDirectories>.\DLL\32bit;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <AdditionalLibraryDirectories>.\DLL\32bit;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <AdditionalDependencies>SGIFPJ.lib;%(AdditionalDependencies)</AdditionalDependencies>
+    </Link>
+    <Midl>
+      <MkTypLibCompatible>false</MkTypLibCompatible>
+      <ValidateAllParameters>true</ValidateAllParameters>
+      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+    </Midl>
+    <ResourceCompile>
+      <Culture>0x0804</Culture>
+      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+    </ResourceCompile>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+    <ClCompile>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <SDLCheck>true</SDLCheck>
+      <PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
+      <AdditionalIncludeDirectories>.\DLL\32bit;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+      <AdditionalLibraryDirectories>.\DLL\32bit;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <AdditionalDependencies>SGIFPJ.lib;%(AdditionalDependencies)</AdditionalDependencies>
+    </Link>
+    <Midl>
+      <MkTypLibCompatible>false</MkTypLibCompatible>
+      <ValidateAllParameters>true</ValidateAllParameters>
+      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+    </Midl>
+    <ResourceCompile>
+      <Culture>0x0804</Culture>
+      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+    </ResourceCompile>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <ClCompile>
+      <PrecompiledHeader>Use</PrecompiledHeader>
+      <WarningLevel>Level3</WarningLevel>
+      <FunctionLevelLinking>true</FunctionLevelLinking>
+      <IntrinsicFunctions>true</IntrinsicFunctions>
+      <SDLCheck>true</SDLCheck>
+      <PreprocessorDefinitions>_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <PrecompiledHeaderFile>pch.h</PrecompiledHeaderFile>
+      <AdditionalIncludeDirectories>.\DLL\64bit;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+    </ClCompile>
+    <Link>
+      <SubSystem>Windows</SubSystem>
+      <EnableCOMDATFolding>true</EnableCOMDATFolding>
+      <OptimizeReferences>true</OptimizeReferences>
+      <AdditionalLibraryDirectories>.\DLL\64bit;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <AdditionalDependencies>SGIFPJ.lib;%(AdditionalDependencies)</AdditionalDependencies>
+    </Link>
+    <Midl>
+      <MkTypLibCompatible>false</MkTypLibCompatible>
+      <ValidateAllParameters>true</ValidateAllParameters>
+      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+    </Midl>
+    <ResourceCompile>
+      <Culture>0x0804</Culture>
+      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+    </ResourceCompile>
+  </ItemDefinitionGroup>
+  <ItemGroup>
+    <ClInclude Include="framework.h" />
+    <ClInclude Include="pch.h" />
+    <ClInclude Include="Resource.h" />
+    <ClInclude Include="SGMeasurement.h" />
+    <ClInclude Include="SGMeasurementDlg.h" />
+    <ClInclude Include="targetver.h" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="pch.cpp">
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader>
+      <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader>
+    </ClCompile>
+    <ClCompile Include="SGMeasurement.cpp" />
+    <ClCompile Include="SGMeasurementDlg.cpp" />
+  </ItemGroup>
+  <ItemGroup>
+    <ResourceCompile Include="SGMeasurement.rc" />
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="res\SGMeasurement.rc2" />
+  </ItemGroup>
+  <ItemGroup>
+    <Image Include="res\menu_close.ico" />
+    <Image Include="res\menu_restore.ico" />
+    <Image Include="res\SGMeasurement.ico" />
+  </ItemGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets">
+  </ImportGroup>
+</Project>
\ No newline at end of file
diff --git a/SourceCode/Bond/SGMeasurement/SGMeasurement.vcxproj.filters b/SourceCode/Bond/SGMeasurement/SGMeasurement.vcxproj.filters
new file mode 100644
index 0000000..20f1cde
--- /dev/null
+++ b/SourceCode/Bond/SGMeasurement/SGMeasurement.vcxproj.filters
@@ -0,0 +1,69 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <Filter Include="婧愭枃浠�">
+      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
+      <Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
+    </Filter>
+    <Filter Include="澶存枃浠�">
+      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
+      <Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
+    </Filter>
+    <Filter Include="璧勬簮鏂囦欢">
+      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
+      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
+    </Filter>
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="SGMeasurement.h">
+      <Filter>澶存枃浠�</Filter>
+    </ClInclude>
+    <ClInclude Include="SGMeasurementDlg.h">
+      <Filter>澶存枃浠�</Filter>
+    </ClInclude>
+    <ClInclude Include="framework.h">
+      <Filter>澶存枃浠�</Filter>
+    </ClInclude>
+    <ClInclude Include="targetver.h">
+      <Filter>澶存枃浠�</Filter>
+    </ClInclude>
+    <ClInclude Include="Resource.h">
+      <Filter>澶存枃浠�</Filter>
+    </ClInclude>
+    <ClInclude Include="pch.h">
+      <Filter>澶存枃浠�</Filter>
+    </ClInclude>
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="SGMeasurement.cpp">
+      <Filter>婧愭枃浠�</Filter>
+    </ClCompile>
+    <ClCompile Include="SGMeasurementDlg.cpp">
+      <Filter>婧愭枃浠�</Filter>
+    </ClCompile>
+    <ClCompile Include="pch.cpp">
+      <Filter>婧愭枃浠�</Filter>
+    </ClCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <ResourceCompile Include="SGMeasurement.rc">
+      <Filter>璧勬簮鏂囦欢</Filter>
+    </ResourceCompile>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="res\SGMeasurement.rc2">
+      <Filter>璧勬簮鏂囦欢</Filter>
+    </None>
+  </ItemGroup>
+  <ItemGroup>
+    <Image Include="res\SGMeasurement.ico">
+      <Filter>璧勬簮鏂囦欢</Filter>
+    </Image>
+    <Image Include="res\menu_restore.ico">
+      <Filter>璧勬簮鏂囦欢</Filter>
+    </Image>
+    <Image Include="res\menu_close.ico">
+      <Filter>璧勬簮鏂囦欢</Filter>
+    </Image>
+  </ItemGroup>
+</Project>
\ No newline at end of file
diff --git a/SourceCode/Bond/SGMeasurement/SGMeasurement.vcxproj.user b/SourceCode/Bond/SGMeasurement/SGMeasurement.vcxproj.user
new file mode 100644
index 0000000..b42b538
--- /dev/null
+++ b/SourceCode/Bond/SGMeasurement/SGMeasurement.vcxproj.user
@@ -0,0 +1,6 @@
+锘�<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <RESOURCE_FILE>SGMeasurement.rc</RESOURCE_FILE>
+  </PropertyGroup>
+</Project>
\ No newline at end of file
diff --git a/SourceCode/Bond/SGMeasurement/SGMeasurementDlg.cpp b/SourceCode/Bond/SGMeasurement/SGMeasurementDlg.cpp
new file mode 100644
index 0000000..d6bc177
--- /dev/null
+++ b/SourceCode/Bond/SGMeasurement/SGMeasurementDlg.cpp
@@ -0,0 +1,952 @@
+锘�
+// SGMeasurementDlg.cpp: 瀹炵幇鏂囦欢
+//
+
+#include "pch.h"
+#include "framework.h"
+#include "SGMeasurement.h"
+#include "SGMeasurementDlg.h"
+#include "afxdialogex.h"
+#include "SGIF.h"
+
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#endif
+
+#define DeviceID 0
+
+// 鎵樼洏鍥炬爣 ID 涓庢秷鎭畯
+#define ID_TRAY_RESTORE		   2001				// 鎭㈠绐楀彛
+#define ID_TRAY_EXIT		   2002				// 閫�鍑虹▼搴�
+#define WM_TRAY_ICON_NOTIFY    (WM_USER + 1000) // 鎵樼洏鍥炬爣鍥炶皟娑堟伅 ID
+
+// 鎵樼洏鎻愮ず鏂囨湰瀹�
+#define TRAY_ICON_TOOLTIP_TEXT  _T("SGMeasurement")
+
+// 鏃ュ織棰滆壊瀹忓畾涔�
+#define LOG_COLOR_NORMAL   RGB(0, 0, 0)         // 鏅�氾細榛戣壊
+#define LOG_COLOR_SUCCESS  RGB(0, 128, 0)       // 鎴愬姛锛氱豢鑹�
+#define LOG_COLOR_ERROR    RGB(255, 0, 0)       // 閿欒锛氱孩鑹�
+#define LOG_COLOR_WARNING  RGB(255, 165, 0)     // 璀﹀憡锛氭鑹�
+#define LOG_COLOR_TIME     RGB(0, 0, 255)       // 鏃堕棿鎴筹細钃濊壊
+
+// 瀹氭椂鍣ㄧ浉鍏冲畯瀹氫箟
+#define TIMER_INTERVAL_MS		500
+#define TIMER_ID_OUTPUT_UPDATE	1
+
+class CAboutDlg : public CDialogEx
+{
+public:
+	CAboutDlg();
+
+// 瀵硅瘽妗嗘暟鎹�
+#ifdef AFX_DESIGN_TIME
+	enum { IDD = IDD_ABOUTBOX };
+#endif
+
+	protected:
+	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 鏀寔
+
+// 瀹炵幇
+protected:
+	DECLARE_MESSAGE_MAP()
+};
+
+CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
+{
+}
+
+void CAboutDlg::DoDataExchange(CDataExchange* pDX)
+{
+	CDialogEx::DoDataExchange(pDX);
+}
+
+BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
+END_MESSAGE_MAP()
+
+CSGMeasurementDlg::CSGMeasurementDlg(CWnd* pParent /*=nullptr*/)
+	: CDialogEx(IDD_SGMEASUREMENT_DIALOG, pParent)
+	, m_bConnected(false)
+	, m_bSaving(false)
+	, m_dOutValues{ 0.0, 0.0, 0.0, 0.0 }
+	, m_nUseTrigger(0)
+	, m_nSavePointCount(100000)
+	, m_fJumpThreshold(1.0f)
+	, m_nJumpWindow(3)
+	, m_nValleyMargin(0)
+	, m_nMinGlass1Count(10)
+	, m_nFixedCount(5)
+	, m_fMaxDelta(0.05f)
+	, m_nTrayIconID(0)
+	, m_bTrayIconCreated(FALSE)
+	, m_bExitingFromTray(FALSE)
+{
+	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
+}
+
+void CSGMeasurementDlg::DoDataExchange(CDataExchange* pDX)
+{
+	CDialogEx::DoDataExchange(pDX);
+	DDX_Text(pDX, IDC_EDIT_OUT1, m_dOutValues[0]);
+	DDX_Text(pDX, IDC_EDIT_OUT2, m_dOutValues[1]);
+	DDX_Text(pDX, IDC_EDIT_OUT3, m_dOutValues[2]);
+	DDX_Text(pDX, IDC_EDIT_OUT4, m_dOutValues[3]);
+	DDX_Control(pDX, IDC_RICHEDIT_LOG, m_editLog);
+	DDX_Check(pDX, IDC_CHECK_USE_TRIGGER, m_nUseTrigger);
+	DDX_Control(pDX, IDC_COMBO_OUTPUT_PORT, m_comboOutputPort);
+	DDX_Text(pDX, IDC_EDIT_STORE_COUNT, m_nSavePointCount);
+	DDX_Text(pDX, IDC_EDIT_JUMP_WINDOW, m_nJumpWindow);
+	DDX_Text(pDX, IDC_EDIT_VALLEY_MARGIN, m_nValleyMargin);
+	DDX_Text(pDX, IDC_EDIT_MIN_GLASS_COUNT, m_nMinGlass1Count);
+	DDX_Text(pDX, IDC_EDIT_FIXED_COUNT, m_nFixedCount);
+	DDX_Text(pDX, IDC_EDIT_JUMP_THRESHOLD, m_fJumpThreshold);
+	DDX_Text(pDX, IDC_EDIT_MAX_DELTA, m_fMaxDelta);
+}
+
+void CSGMeasurementDlg::ExitApplication()
+{
+	// 鏂紑璁惧杩炴帴锛堝宸茶繛鎺ワ級
+	if (m_bConnected) {
+		DisconnectFromDevice();
+	}
+
+	// 鍒犻櫎鎵樼洏鍥炬爣锛堝宸叉坊鍔狅級
+	if (m_bTrayIconCreated) {
+		Shell_NotifyIcon(NIM_DELETE, &m_trayIconData);
+		m_bTrayIconCreated = FALSE;
+	}
+
+	DestroyWindow();
+	CDialogEx::OnClose();
+}
+
+void CSGMeasurementDlg::UpdateControlStatus(BOOL bConnected, BOOL bStoring/* = FALSE*/)
+{
+	// 杩炴帴鎸夐挳鍜屾柇寮�鎸夐挳鐘舵�佷簰鏂�
+	GetDlgItem(IDC_BUTTON_CONNECT)->EnableWindow(!bConnected);
+	GetDlgItem(IDC_BUTTON_DISCONNECT)->EnableWindow(bConnected);
+
+	// IP鍦板潃杈撳叆鍙厑璁稿湪鏈繛鎺ユ椂淇敼
+	GetDlgItem(IDC_IPADDRESS)->EnableWindow(!bConnected);
+
+	// 瀛樺偍閰嶇疆鎺т欢浠呭湪宸茶繛鎺ヤ笖鏈紑濮嬪瓨鍌ㄦ椂鍏佽鎿嶄綔
+	BOOL bCanConfigure = bConnected && !bStoring;
+	/*GetDlgItem(IDC_CHECK_USE_TRIGGER)->EnableWindow(bCanConfigure);*/
+	GetDlgItem(IDC_COMBO_OUTPUT_PORT)->EnableWindow(bCanConfigure);
+	GetDlgItem(IDC_EDIT_STORE_COUNT)->EnableWindow(bCanConfigure);
+	GetDlgItem(IDC_EDIT_JUMP_THRESHOLD)->EnableWindow(bCanConfigure);
+	GetDlgItem(IDC_EDIT_JUMP_WINDOW)->EnableWindow(bCanConfigure);
+	GetDlgItem(IDC_EDIT_VALLEY_MARGIN)->EnableWindow(bCanConfigure);
+	GetDlgItem(IDC_EDIT_MIN_GLASS_COUNT)->EnableWindow(bCanConfigure);
+	GetDlgItem(IDC_EDIT_FIXED_COUNT)->EnableWindow(bCanConfigure);
+	GetDlgItem(IDC_EDIT_MAX_DELTA)->EnableWindow(bCanConfigure);
+	
+	// 瀛樺偍鐩稿叧鎸夐挳
+	GetDlgItem(IDC_BUTTON_RECEIVE_FROM_CTRL)->EnableWindow(bCanConfigure);
+	GetDlgItem(IDC_BUTTON_SEND_TO_CTRL)->EnableWindow(bCanConfigure);
+	GetDlgItem(IDC_BUTTON_CLEAR_STORE)->EnableWindow(bCanConfigure);
+	GetDlgItem(IDC_BUTTON_START_STORE)->EnableWindow(bCanConfigure);
+	GetDlgItem(IDC_BUTTON_STOP_STORE)->EnableWindow(bStoring);
+}
+
+void CSGMeasurementDlg::AppendLogLineBatchBegin()
+{
+	m_editLog.SetRedraw(FALSE);
+	m_editLog.SetEventMask(0); // 闃叉瑙﹀彂涓嶅繀瑕佺殑閫氱煡
+}
+
+void CSGMeasurementDlg::AppendLogLineBatchEnd()
+{
+	m_editLog.SetRedraw(TRUE);
+	m_editLog.Invalidate();    // 寮哄埗閲嶇粯
+	m_editLog.SetEventMask(ENM_CHANGE | ENM_SELCHANGE);
+}
+
+void CSGMeasurementDlg::TrimRichEditLineLimit(int nMaxLines)
+{
+	int nLineCount = m_editLog.GetLineCount();
+	if (nLineCount < nMaxLines) {
+		return;
+	}
+
+	// 鑾峰彇澶氫綑琛岀殑瀛楃鏁拌寖鍥�
+	int charIndex = m_editLog.LineIndex(nMaxLines);
+	m_editLog.SetSel(0, charIndex); // 閫変腑澶氫綑鍐呭
+	m_editLog.ReplaceSel(_T(""));   // 鍒犻櫎
+}
+
+void CSGMeasurementDlg::AppendLogLineRichStyled(const CString& content, COLORREF color /*= RGB(0, 0, 0)*/)
+{
+	if (!::IsWindow(GetSafeHwnd()) || !::IsWindow(m_editLog.GetSafeHwnd())) {
+		return;
+	}
+
+	// 鏃堕棿鎴�
+	CString strTimestamp;
+	CTime now = CTime::GetCurrentTime();
+	strTimestamp.Format(_T("[%02d:%02d:%02d] "), now.GetHour(), now.GetMinute(), now.GetSecond());
+
+	// 鎻掑叆鐐圭Щ鍒版渶鍚庯紙涔熷彲浠ヨ涓� 0 琛ㄧず椤堕儴锛�
+	m_editLog.SetSel(-1, -1);
+
+	// 鎻掑叆鏃堕棿锛堣摑鑹诧級
+	CHARFORMAT2 cfTime = {};
+	cfTime.cbSize = sizeof(cfTime);
+	cfTime.dwMask = CFM_COLOR;
+	cfTime.crTextColor = LOG_COLOR_TIME;
+	m_editLog.SetSelectionCharFormat(cfTime);
+	m_editLog.ReplaceSel(strTimestamp);
+
+	// 鎻掑叆鏃ュ織姝f枃锛堜紶鍏ラ鑹诧級
+	CHARFORMAT2 cfMsg = {};
+	cfMsg.cbSize = sizeof(cfMsg);
+	cfMsg.dwMask = CFM_COLOR;
+	cfMsg.crTextColor = color;
+	m_editLog.SetSelectionCharFormat(cfMsg);
+	m_editLog.ReplaceSel(content + _T("\r\n"));
+
+	// 闄愬埗鏈�澶ц鏁�
+	TrimRichEditLineLimit(100);
+}
+
+void CSGMeasurementDlg::HighlightAllMatches(const CString& strSearch, COLORREF clrHighlight/* = RGB(255, 165, 0)*/)
+{
+	if (strSearch.IsEmpty()) {
+		return;
+	}
+
+	long nStart = 0;
+	long nEnd = m_editLog.GetTextLength();
+	FINDTEXTEX ft = { 0 };
+	ft.chrg.cpMin = 0;
+	ft.chrg.cpMax = nEnd;
+	ft.lpstrText = strSearch.GetString();
+
+	// 楂樹寒鍓嶄笉娓呴櫎鍏ㄦ枃棰滆壊锛岄伩鍏嶅巻鍙插鑹叉贩娣�
+	while (m_editLog.FindText(FR_DOWN, &ft) != -1) {
+		m_editLog.SetSel(ft.chrgText.cpMin, ft.chrgText.cpMax);
+
+		CHARFORMAT2 cf = {};
+		cf.cbSize = sizeof(cf);
+		cf.dwMask = CFM_COLOR;
+		cf.crTextColor = clrHighlight;
+		m_editLog.SetSelectionCharFormat(cf);
+
+		// 涓嬫鎼滅储浠庡悗闈㈠紑濮�
+		ft.chrg.cpMin = ft.chrgText.cpMax;
+	}
+	m_editLog.SetSel(-1, 0);
+}
+
+void CSGMeasurementDlg::PrintSampleData(int nOutNo, const std::vector<float>& vecBuffer)
+{
+	int nReceived = static_cast<int>(vecBuffer.size());
+	if (vecBuffer.empty() || nReceived < 0) {
+		CString strError;
+		strError.Format(_T("OUT%d: 鎺ユ敹鏁版嵁涓虹┖鎴栨棤鏁堬紝鏃犳硶鎵撳嵃銆�"), nOutNo);
+		AppendLogLineRichStyled(strError, LOG_COLOR_WARNING);
+		return;
+	}
+
+	CString strLine;
+	for (int i = 0; i < nReceived; ++i) {
+		CString strOne;
+		strOne.Format(_T("%10.3f "), vecBuffer[i]);
+		strLine += strOne;
+
+		// 姣� 7 涓�艰緭鍑轰竴琛�
+		if ((i + 1) % 7 == 0 || i == nReceived - 1) {
+			AppendLogLineRichStyled(strLine, LOG_COLOR_NORMAL);
+			strLine.Empty();
+		}
+	}
+}
+
+bool CSGMeasurementDlg::ConnectToDevice()
+{
+	if (m_bConnected) {
+		AppendLogLineRichStyled(_T("璁惧宸茶繛鎺ワ紝璇峰厛鏂紑杩炴帴銆�"), LOG_COLOR_WARNING);
+		return false;
+	}
+
+	SGIF_OPENPARAM_ETHERNET stIpAddress = { 0 };
+
+	CIPAddressCtrl* pIPCtrl = (CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS);
+	if (!::IsWindow(pIPCtrl->GetSafeHwnd())) {
+		AppendLogLineRichStyled(_T("IP 鎺т欢鏃犳晥锛岃繛鎺ュけ璐ワ紒"), LOG_COLOR_ERROR);
+		return false;
+	}
+
+	pIPCtrl->GetAddress(
+		stIpAddress.IPAddress.S_un.S_un_b.s_b1,
+		stIpAddress.IPAddress.S_un.S_un_b.s_b2,
+		stIpAddress.IPAddress.S_un.S_un_b.s_b3,
+		stIpAddress.IPAddress.S_un.S_un_b.s_b4
+	);
+
+	RC nRet = SGIF_OpenDeviceETHER(DeviceID, &stIpAddress);
+	if (nRet == RC_OK) {
+		AppendLogLineRichStyled(_T("鎵撳紑杩炴帴鎴愬姛锛�"), LOG_COLOR_SUCCESS);
+
+		m_bConnected = TRUE;
+		UpdateControlStatus(TRUE, FALSE);
+		SetTimer(TIMER_ID_OUTPUT_UPDATE, TIMER_INTERVAL_MS, nullptr);
+		return true;
+	}
+	else {
+		CString strError;
+		strError.Format(_T("鎵撳紑杩炴帴澶辫触锛岄敊璇爜锛�%#X"), nRet);
+		AppendLogLineRichStyled(strError, LOG_COLOR_ERROR);
+
+		m_bConnected = FALSE;
+		UpdateControlStatus(FALSE, FALSE);
+		return false;
+	}
+}
+
+bool CSGMeasurementDlg::DisconnectFromDevice()
+{
+	if (!m_bConnected) {
+		AppendLogLineRichStyled(_T("璁惧鏈繛鎺ワ紝鏃犻渶鏂紑銆�"), LOG_COLOR_WARNING);
+		return false;
+	}
+
+	RC nRet = SGIF_CloseDevice(DeviceID);
+	if (nRet == RC_OK) {
+		if (m_bSaving) {
+			m_bSaving = FALSE;
+			nRet = SGIF_DataStorageStop(DeviceID);
+			if (nRet == RC_OK) {
+				AppendLogLineRichStyled(_T("鏁版嵁瀛樺偍宸插仠姝€��"), LOG_COLOR_SUCCESS);
+			}
+			else {
+				CString strError;
+				strError.Format(_T("鍋滄鏁版嵁瀛樺偍澶辫触锛岄敊璇爜锛�%#X"), nRet);
+				AppendLogLineRichStyled(strError, LOG_COLOR_ERROR);
+			}
+		}
+
+		AppendLogLineRichStyled(_T("鏂紑杩炴帴鎴愬姛锛�"), LOG_COLOR_SUCCESS);
+
+		m_bConnected = FALSE;
+		UpdateControlStatus(FALSE, FALSE);
+		KillTimer(TIMER_ID_OUTPUT_UPDATE);
+		return true;
+	}
+	else {
+		CString strError;
+		strError.Format(_T("鏂紑杩炴帴澶辫触锛岄敊璇爜锛�%#X"), nRet);
+		AppendLogLineRichStyled(strError, LOG_COLOR_ERROR);
+
+		UpdateControlStatus(m_bConnected, m_bSaving);
+		return false;
+	}
+}
+
+void CSGMeasurementDlg::CleanInvalidValuesInPlace(int nOutNo, std::vector<float>& vecData, float fInvalid/* = -999.0f*/)
+{
+	// 鎵惧埌绗竴涓湁鏁堝��
+	auto itStart = std::find_if(vecData.begin(), vecData.end(), [=](float v) { return v > fInvalid; });
+
+	// 鎵惧埌鏈�鍚庝竴涓湁鏁堝��
+	auto itEnd = std::find_if(vecData.rbegin(), vecData.rend(), [=](float v) { return v > fInvalid; }).base();
+
+	// 妫�鏌ユ槸鍚︽湁鏈夋晥鏁版嵁
+	if (itStart < itEnd) {
+		// 鍏堣杈�
+		std::vector<float> vecTrimmed(itStart, itEnd);
+
+		// 鍐嶇Щ闄や腑闂寸殑鏃犳晥鍊�
+		auto itNewEnd = std::remove_if(vecTrimmed.begin(), vecTrimmed.end(), [=](float v) { return v == fInvalid; });
+		vecTrimmed.erase(itNewEnd, vecTrimmed.end());
+
+		vecData = std::move(vecTrimmed);
+
+		CString strLog;
+		strLog.Format(_T("OUT%d: 宸茶鍓棤鏁堣竟鐣屾暟鎹紝鍓╀綑鏈夋晥鏁版嵁 %d 涓��"), nOutNo, static_cast<int>(vecData.size()));
+		AppendLogLineRichStyled(strLog, LOG_COLOR_NORMAL);
+
+		if (vecData.size() < 20) {
+			AppendLogLineRichStyled(_T("璀﹀憡锛氭湁鏁堟暟鎹噺杩囧皯锛屽彲鑳藉奖鍝嶅悗缁鐞嗐��"), LOG_COLOR_WARNING);
+		}
+		else {
+			CString strInfo;
+			strInfo.Format(_T("OUT%d: 鏈夋晥鏁版嵁鑼冨洿 [%f, %f]"), nOutNo, *std::min_element(vecData.begin(), vecData.end()), *std::max_element(vecData.begin(), vecData.end()));
+			AppendLogLineRichStyled(strInfo, LOG_COLOR_NORMAL);
+		}
+
+		PrintSampleData(nOutNo, vecData);
+	}
+	else {
+		vecData.clear();
+	}
+}
+
+bool CSGMeasurementDlg::SplitGlassSegments(int nOutNo, const std::vector<float>& vecData, std::vector<float>& vecGlass1, std::vector<float>& vecGlass2, float fJumpThreshold /*= 0.2f*/, int nWindow /*= 3*/, int nValleyMargin /*= 0*/, int nMinGlass1Count /*= 10*/)
+{
+	const int n = static_cast<int>(vecData.size());
+	if (n < 2 * nWindow + 1 + nMinGlass1Count) {
+		CString strError;
+		strError.Format(_T("OUT%d: 鏁版嵁閲忎笉瓒筹紝鑷冲皯闇�瑕� %d 涓偣鎵嶈兘杩涜鍒囧壊銆�"), nOutNo, 2 * nWindow + 1 + nMinGlass1Count);
+		AppendLogLineRichStyled(strError, LOG_COLOR_WARNING);
+		return false;
+	}
+
+	int nValleyIdx = -1;
+	for (int i = nWindow; i < n - nWindow - nMinGlass1Count; ++i) {
+		float fDelta = std::fabs(vecData[i + nWindow] - vecData[i - nWindow]);
+		if (fDelta > fJumpThreshold) {
+			// 鎵� valley 鐐癸紙绋嶅井寰�鍚庤烦鍑犳浠ラ伩寮�杈圭紭鎶栧姩锛�
+			int nSearchStart = i + nWindow + 2;
+			int nSearchEnd = min(nSearchStart + 10, n);
+
+			auto itValley = std::min_element(vecData.begin() + nSearchStart, vecData.begin() + nSearchEnd,
+				[](float a, float b) {
+					return (a > -900.0f && b > -900.0f) ? a < b : false;
+				});
+
+			if (itValley != vecData.begin() + nSearchEnd) {
+				nValleyIdx = static_cast<int>(std::distance(vecData.begin(), itValley));
+				break;
+			}
+		}
+	}
+
+	if (nValleyIdx < 0 || nValleyIdx < nMinGlass1Count) {
+		AppendLogLineRichStyled(_T("鏈壘鍒板悎閫� valley 鐐癸紝鎴� valley 澶潬鍓嶃��"), LOG_COLOR_WARNING);
+		return false;
+	}
+
+	// 浠� valley 澶勫紑濮嬪垏鍓诧紝鎴栬�呭線鍚庡亸绉�
+	int nCutStart = min(nValleyIdx + nValleyMargin, n);
+	vecGlass1.assign(vecData.begin(), vecData.begin() + nCutStart);
+	vecGlass2.assign(vecData.begin() + nCutStart, vecData.end());
+
+	int nGlass1Count = static_cast<int>(vecGlass1.size());
+	int nGlass2Count = static_cast<int>(vecGlass2.size());
+
+	// 鏃ュ織杈撳嚭
+	CString strLog;
+	strLog.Format(_T("OUT%d: 鍒囧壊鎴愬姛锛岀涓�鐗囩幓鐠冩暟鎹噺 %d锛岀浜岀墖鐜荤拑鏁版嵁閲� %d銆�"), nOutNo, nGlass1Count, nGlass2Count);
+	AppendLogLineRichStyled(strLog, LOG_COLOR_SUCCESS);
+
+	if (nGlass1Count < nMinGlass1Count) {
+		strLog.Format(_T("OUT%d: 绗竴鐗囩幓鐠冩暟鎹噺杩囧皯锛屽彲鑳藉奖鍝嶅悗缁鐞嗐��"), nOutNo);
+		AppendLogLineRichStyled(strLog, LOG_COLOR_WARNING);
+	}
+	if (nGlass2Count < nMinGlass1Count) {
+		strLog.Format(_T("OUT%d: 绗簩鐗囩幓鐠冩暟鎹噺杩囧皯锛屽彲鑳藉奖鍝嶅悗缁鐞嗐��"), nOutNo);
+		AppendLogLineRichStyled(strLog, LOG_COLOR_WARNING);
+	}
+
+	AppendLogLineRichStyled(_T("绗竴鐗囩幓鐠冩暟鎹細"), LOG_COLOR_NORMAL);
+	PrintSampleData(nOutNo, vecGlass1);
+
+	AppendLogLineRichStyled(_T("绗簩鐗囩幓鐠冩暟鎹細"), LOG_COLOR_NORMAL);
+	PrintSampleData(nOutNo, vecGlass2);
+
+	return !vecGlass1.empty() && !vecGlass2.empty();
+}
+
+bool CSGMeasurementDlg::ExtractStableRegionFixed(int nOutNo, const std::vector<float>& vecIn, std::vector<float>& vecOut, int nFixedCount/* = 5*/, float fMaxDelta/* = 0.04f*/)
+{
+	const int n = static_cast<int>(vecIn.size());
+	if (n < nFixedCount) {
+		CString strError;
+		strError.Format(_T("OUT%d: 鏁版嵁閲忎笉瓒筹紝鑷冲皯闇�瑕� %d 涓偣鎵嶈兘鎻愬彇绋冲畾鍖恒��"), nOutNo, nFixedCount);
+		return false;
+	}
+
+	int nBestStart = -1;
+	float fBestRange = FLT_MAX;
+
+	for (int i = 0; i <= n - nFixedCount; ++i) {
+		auto first = vecIn.begin() + i;
+		auto last = first + nFixedCount;
+
+		float fMinVal = *std::min_element(first, last);
+		float fMaxVal = *std::max_element(first, last);
+		float fRange = fMaxVal - fMinVal;
+
+		if (fRange <= fMaxDelta && fRange < fBestRange) {
+			fBestRange = fRange;
+			nBestStart = i;
+		}
+	}
+
+	if (nBestStart < 0) {
+		return false;
+	}
+
+	vecOut.assign(vecIn.begin() + nBestStart, vecIn.begin() + nBestStart + nFixedCount);
+
+	CString strLog;
+	strLog.Format(_T("OUT%d: 鎻愬彇绋冲畾鍖烘垚鍔燂紝璧峰鐐圭储寮� %d锛岃寖鍥� %.3f銆�"), nOutNo, nBestStart, fBestRange);
+	AppendLogLineRichStyled(strLog, LOG_COLOR_SUCCESS);
+
+	if (vecOut.size() < nFixedCount) {
+		CString strWarning;
+		strWarning.Format(_T("OUT%d: 鎻愬彇鐨勭ǔ瀹氬尯鏁版嵁閲忎笉瓒筹紝鍙兘褰卞搷鍚庣画澶勭悊銆�"), nOutNo);
+		AppendLogLineRichStyled(strWarning, LOG_COLOR_WARNING);
+	}
+
+	// 鎵撳嵃鎻愬彇鐨勭ǔ瀹氬尯鏁版嵁
+	AppendLogLineRichStyled(_T("鎻愬彇鐨勭ǔ瀹氬尯鏁版嵁锛�"), LOG_COLOR_NORMAL);
+	PrintSampleData(nOutNo, vecOut);
+
+	return true;
+}
+
+bool CSGMeasurementDlg::CalcGlassOffset(const std::vector<float>& vecGlass1, const std::vector<float>& vecGlass2, float& fAvg1, float& fAvg2, float& fOffset)
+{
+	if (vecGlass1.empty() || vecGlass2.empty()) {
+		AppendLogLineRichStyled(_T("绋冲畾鍖烘暟鎹负绌猴紝鏃犳硶璁$畻骞冲潎鍊煎拰鍋忕Щ銆�"), LOG_COLOR_WARNING);
+		return false;
+	}
+
+	auto CalcAverage = [](const std::vector<float>& data) -> float {
+		float sum = std::accumulate(data.begin(), data.end(), 0.0f);
+		return sum / static_cast<float>(data.size());
+	};
+
+	fAvg1 = CalcAverage(vecGlass1);
+	fAvg2 = CalcAverage(vecGlass2);
+	fOffset = std::fabs(fAvg2 - fAvg1);  // 绗簩鐗� - 绗竴鐗�
+
+	CString strLog;
+	strLog.Format(_T("绗竴鐗囩幓鐠冨钩鍧囧��: %.3f锛岀浜岀墖鐜荤拑骞冲潎鍊�: %.3f锛屽亸绉婚噺: %.3f"), fAvg1, fAvg2, fOffset);
+	AppendLogLineRichStyled(strLog, LOG_COLOR_SUCCESS);
+
+	return true;
+}
+
+BEGIN_MESSAGE_MAP(CSGMeasurementDlg, CDialogEx)
+	ON_WM_SYSCOMMAND()
+	ON_WM_PAINT()
+	ON_WM_QUERYDRAGICON()
+	ON_WM_TIMER()
+	ON_WM_MEASUREITEM()
+	ON_WM_DRAWITEM()
+	ON_WM_CLOSE()
+	ON_MESSAGE(WM_TRAY_ICON_NOTIFY, &CSGMeasurementDlg::OnTrayIconClick)
+	ON_COMMAND(ID_TRAY_RESTORE, &CSGMeasurementDlg::OnTrayRestore)
+	ON_COMMAND(ID_TRAY_EXIT, &CSGMeasurementDlg::OnTrayExit)
+	ON_BN_CLICKED(IDC_BUTTON_CONNECT, &CSGMeasurementDlg::OnBnClickedButtonConnect)
+	ON_BN_CLICKED(IDC_BUTTON_DISCONNECT, &CSGMeasurementDlg::OnBnClickedButtonDisconnect)
+	ON_BN_CLICKED(IDC_BUTTON_RECEIVE_FROM_CTRL, &CSGMeasurementDlg::OnBnClickedButtonReceiveFromCtrl)
+	ON_BN_CLICKED(IDC_BUTTON_SEND_TO_CTRL, &CSGMeasurementDlg::OnBnClickedButtonSendToCtrl)
+	ON_BN_CLICKED(IDC_BUTTON_CLEAR_STORE, &CSGMeasurementDlg::OnBnClickedButtonClearStore)
+	ON_BN_CLICKED(IDC_BUTTON_START_STORE, &CSGMeasurementDlg::OnBnClickedButtonStartStore)
+	ON_BN_CLICKED(IDC_BUTTON_STOP_STORE, &CSGMeasurementDlg::OnBnClickedButtonStopStore)
+	ON_BN_CLICKED(IDC_BUTTON_CLEAR_LOG, &CSGMeasurementDlg::OnBnClickedButtonClearLog)
+END_MESSAGE_MAP()
+
+BOOL CSGMeasurementDlg::OnInitDialog()
+{
+	CDialogEx::OnInitDialog();
+
+	// 灏嗏�滃叧浜�...鈥濊彍鍗曢」娣诲姞鍒扮郴缁熻彍鍗曚腑銆�
+
+	// IDM_ABOUTBOX 蹇呴』鍦ㄧ郴缁熷懡浠よ寖鍥村唴銆�
+	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
+	ASSERT(IDM_ABOUTBOX < 0xF000);
+
+	CMenu* pSysMenu = GetSystemMenu(FALSE);
+	if (pSysMenu != nullptr)
+	{
+		BOOL bNameValid;
+		CString strAboutMenu;
+		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
+		ASSERT(bNameValid);
+		if (!strAboutMenu.IsEmpty())
+		{
+			pSysMenu->AppendMenu(MF_SEPARATOR);
+			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
+		}
+	}
+
+	// 璁剧疆姝ゅ璇濇鐨勫浘鏍囥��  褰撳簲鐢ㄧ▼搴忎富绐楀彛涓嶆槸瀵硅瘽妗嗘椂锛屾鏋跺皢鑷姩
+	//  鎵ц姝ゆ搷浣�
+	SetIcon(m_hIcon, TRUE);			// 璁剧疆澶у浘鏍�
+	SetIcon(m_hIcon, FALSE);		// 璁剧疆灏忓浘鏍�
+
+	// TODO: 鍦ㄦ娣诲姞棰濆鐨勫垵濮嬪寲浠g爜
+	UpdateData(FALSE);
+	UpdateControlStatus(FALSE, FALSE);
+
+	// 鎵樼洏鍥炬爣鍒濆鍖�
+	m_trayIconData.cbSize = sizeof(NOTIFYICONDATA);  				// 璁剧疆鎵樼洏鍥炬爣鏁版嵁缁撴瀯鐨勫ぇ灏�
+	m_trayIconData.hWnd = m_hWnd;                    				// 璁剧疆绐楀彛鍙ユ焺
+	m_trayIconData.uID = m_nTrayIconID;              				// 璁剧疆鎵樼洏鍥炬爣 ID
+	m_trayIconData.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;  		// 璁剧疆鎵樼洏鍥炬爣鐨勬爣蹇楋紙鍥炬爣銆佹秷鎭�佹彁绀烘枃鏈級
+	m_trayIconData.uCallbackMessage = WM_TRAY_ICON_NOTIFY;   		// 璁剧疆鍥炶皟娑堟伅 WM_TRAY_ICON_NOTIFY
+	m_trayIconData.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);  	// 鍔犺浇鎵樼洏鍥炬爣
+	lstrcpy(m_trayIconData.szTip, TRAY_ICON_TOOLTIP_TEXT);   		// 璁剧疆鎵樼洏鎻愮ず鏂囨湰
+
+	// 娣诲姞鎵樼洏鍥炬爣
+	Shell_NotifyIcon(NIM_ADD, &m_trayIconData);
+	m_bTrayIconCreated = TRUE;
+
+	for (int i = 0; i < 4; i++) {
+		CString str;
+		str.Format(_T("OUT%d"), i + 1);
+		m_comboOutputPort.AddString(str);
+	}
+	m_comboOutputPort.SetCurSel(0);
+
+	// 鍒濆鍖朓P鍦板潃鎺т欢锛岃缃负榛樿IP鍦板潃
+	((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS))->SetAddress(192, 168, 0, 10);
+
+	// 鍒濆鍖栨棩蹇楁
+	AppendLogLineRichStyled(_T("鍑嗗灏辩华..."), LOG_COLOR_SUCCESS);
+
+	return TRUE;  // 闄ら潪灏嗙劍鐐硅缃埌鎺т欢锛屽惁鍒欒繑鍥� TRUE
+}
+
+void CSGMeasurementDlg::OnSysCommand(UINT nID, LPARAM lParam)
+{
+	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
+	{
+		CAboutDlg dlgAbout;
+		dlgAbout.DoModal();
+	}
+	else
+	{
+		CDialogEx::OnSysCommand(nID, lParam);
+	}
+}
+
+void CSGMeasurementDlg::OnPaint()
+{
+	if (IsIconic()) {
+		CPaintDC dc(this);
+
+		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
+
+		// 浣垮浘鏍囧湪宸ヤ綔鍖虹煩褰腑灞呬腑
+		int cxIcon = GetSystemMetrics(SM_CXICON);
+		int cyIcon = GetSystemMetrics(SM_CYICON);
+		CRect rect;
+		GetClientRect(&rect);
+		int x = (rect.Width() - cxIcon + 1) / 2;
+		int y = (rect.Height() - cyIcon + 1) / 2;
+
+		// 缁樺埗鍥炬爣
+		dc.DrawIcon(x, y, m_hIcon);
+	}
+	else {
+		CDialogEx::OnPaint();
+	}
+}
+
+//褰撶敤鎴锋嫋鍔ㄦ渶灏忓寲绐楀彛鏃剁郴缁熻皟鐢ㄦ鍑芥暟鍙栧緱鍏夋爣鏄剧ず銆�
+HCURSOR CSGMeasurementDlg::OnQueryDragIcon()
+{
+	return static_cast<HCURSOR>(m_hIcon);
+}
+
+void CSGMeasurementDlg::OnTimer(UINT_PTR nIDEvent)
+{
+	// TODO: 鍦ㄦ娣诲姞娑堟伅澶勭悊绋嬪簭浠g爜鍜�/鎴栬皟鐢ㄩ粯璁ゅ��
+	if (nIDEvent == TIMER_ID_OUTPUT_UPDATE) {
+		SGIF_FLOATVALUE_OUT value[4] = { 0 };
+		RC nRet = SGIF_GetCalcDataALL(DeviceID, value);
+		if (nRet == RC_OK) {
+			for (int i = 0; i < 4; ++i) {
+				m_dOutValues[i] = value[i].Value;
+			}
+
+			// 鏇存柊缁戝畾鎺т欢
+			UpdateData(FALSE);
+		}
+		else {
+			CString strError;
+			strError.Format(_T("鑾峰彇娴嬮噺鍊煎け璐ワ紝閿欒鐮侊細%#X"), nRet);
+			AppendLogLineRichStyled(strError, LOG_COLOR_ERROR);
+		}
+	}
+
+	CDialogEx::OnTimer(nIDEvent);
+}
+
+void CSGMeasurementDlg::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct)
+{
+	if (lpMeasureItemStruct->CtlType == ODT_MENU) {
+		lpMeasureItemStruct->itemHeight = 24;
+		lpMeasureItemStruct->itemWidth = 140;
+	}
+}
+
+void CSGMeasurementDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
+{
+	if (lpDrawItemStruct->CtlType != ODT_MENU) { 
+		return;
+	}
+
+	CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
+	CRect rc = lpDrawItemStruct->rcItem;
+	UINT id = lpDrawItemStruct->itemID;
+
+	// 鑳屾櫙
+	COLORREF bgColor = (lpDrawItemStruct->itemState & ODS_SELECTED) ? RGB(200, 220, 255) : RGB(255, 255, 255);
+	pDC->FillSolidRect(rc, bgColor);
+
+	// 鍥炬爣
+	HICON hIcon = nullptr;
+	if (id == ID_TRAY_RESTORE) {
+		hIcon = AfxGetApp()->LoadIcon(IDI_ICON_RESTORE);
+	}
+
+	if (id == ID_TRAY_EXIT) {
+		hIcon = AfxGetApp()->LoadIcon(IDI_ICON_EXIT);
+	}
+
+	if (hIcon) {
+		DrawIconEx(pDC->GetSafeHdc(), rc.left + 4, rc.top + 4, hIcon, 16, 16, 0, NULL, DI_NORMAL);
+	}
+
+	// 鏂囨湰
+	CString str;
+	if (id == ID_TRAY_RESTORE) { 
+		str = _T("鎭㈠鐣岄潰");
+	}
+
+	if (id == ID_TRAY_EXIT) { 
+		str = _T("閫�鍑虹▼搴�");
+	}
+
+	pDC->SetBkMode(TRANSPARENT);
+	pDC->SetTextColor(RGB(0, 0, 0));
+	pDC->DrawText(str, CRect(rc.left + 28, rc.top, rc.right, rc.bottom), DT_SINGLELINE | DT_VCENTER | DT_LEFT);
+}
+
+void CSGMeasurementDlg::OnClose()
+{
+	// TODO: 鍦ㄦ娣诲姞娑堟伅澶勭悊绋嬪簭浠g爜鍜�/鎴栬皟鐢ㄩ粯璁ゅ��
+	if (m_bExitingFromTray) {
+		// 浠庢墭鐩橀��鍑烘祦绋�
+		ExitApplication();
+	}
+	else {
+		// 姝e父鍏抽棴鎸夐挳
+		int nResult = AfxMessageBox(_T("鏄惁鏈�灏忓寲鍒版墭鐩橈紵"), MB_YESNO | MB_ICONQUESTION);
+		if (nResult == IDYES) {
+			ShowWindow(SW_HIDE);
+		}
+		else {
+			ExitApplication();
+		}
+	}
+}
+
+LRESULT CSGMeasurementDlg::OnTrayIconClick(WPARAM wParam, LPARAM lParam) {
+	if (wParam == m_nTrayIconID) {
+		if (LOWORD(lParam) == WM_LBUTTONUP) {
+			// 宸﹂敭鐐瑰嚮鎭㈠绐楀彛
+			ShowWindow(SW_SHOW);
+			SetForegroundWindow();
+		}
+		else if (LOWORD(lParam) == WM_RBUTTONUP) {
+			// 鍙抽敭鐐瑰嚮寮瑰嚭鑿滃崟
+			CMenu menu;
+			menu.CreatePopupMenu();
+			menu.AppendMenu(MF_OWNERDRAW, ID_TRAY_RESTORE, (LPCTSTR)ID_TRAY_RESTORE);
+			menu.AppendMenu(MF_OWNERDRAW, ID_TRAY_EXIT, (LPCTSTR)ID_TRAY_EXIT);
+
+			// 鍔犺浇鍥炬爣
+			HICON hIconRestore = (HICON)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON_RESTORE), IMAGE_ICON, 16, 16, LR_SHARED);
+			HICON hIconExit = (HICON)::LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON_EXIT), IMAGE_ICON, 16, 16, LR_SHARED);
+
+			// 璁剧疆鍥炬爣鍒拌彍鍗曢」
+			MENUITEMINFO mii = { sizeof(MENUITEMINFO) };
+			mii.fMask = MIIM_BITMAP;
+
+			// 鎭㈠鑿滃崟椤瑰浘鏍�
+			mii.hbmpItem = HBMMENU_CALLBACK;
+			menu.SetMenuItemInfo(ID_TRAY_RESTORE, &mii);
+
+			// 閫�鍑鸿彍鍗曢」鍥炬爣
+			mii.hbmpItem = HBMMENU_CALLBACK;
+			menu.SetMenuItemInfo(ID_TRAY_EXIT, &mii);
+
+			// 鑾峰彇榧犳爣褰撳墠浣嶇疆锛屽苟鏄剧ず鑿滃崟
+			POINT pt;
+			GetCursorPos(&pt);
+			SetForegroundWindow();
+			menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, this);
+		}
+	}
+	return 0;
+}
+
+void CSGMeasurementDlg::OnTrayRestore()
+{
+	ShowWindow(SW_SHOW);  	// 鎭㈠绐楀彛
+	SetForegroundWindow();  // 灏嗙獥鍙g疆浜庡墠绔�
+}
+
+void CSGMeasurementDlg::OnTrayExit()
+{
+	// 浠庢墭鐩樺浘鏍囪彍鍗曢�夋嫨鈥滈��鍑虹▼搴忊��
+	if (AfxMessageBox(_T("纭畾瑕侀��鍑虹▼搴忓悧锛�"), MB_YESNO | MB_ICONQUESTION) == IDYES) {
+		m_bExitingFromTray = TRUE;
+		PostMessage(WM_CLOSE);
+	}
+}
+
+void CSGMeasurementDlg::OnBnClickedButtonConnect()
+{
+	// TODO: 鍦ㄦ娣诲姞鎺т欢閫氱煡澶勭悊绋嬪簭浠g爜
+	ConnectToDevice();
+}
+
+void CSGMeasurementDlg::OnBnClickedButtonDisconnect()
+{
+	// TODO: 鍦ㄦ娣诲姞鎺т欢閫氱煡澶勭悊绋嬪簭浠g爜
+	DisconnectFromDevice();
+}
+
+void CSGMeasurementDlg::OnBnClickedButtonReceiveFromCtrl()
+{
+	// TODO: 鍦ㄦ娣诲姞鎺т欢閫氱煡澶勭悊绋嬪簭浠g爜
+	if (!m_bConnected) {
+		AppendLogLineRichStyled(_T("璁惧鏈繛鎺ワ紝璇峰厛杩炴帴璁惧銆�"), LOG_COLOR_WARNING);
+		return;
+	}
+}
+
+void CSGMeasurementDlg::OnBnClickedButtonSendToCtrl()
+{
+	// TODO: 鍦ㄦ娣诲姞鎺т欢閫氱煡澶勭悊绋嬪簭浠g爜
+	if (!m_bConnected) {
+		AppendLogLineRichStyled(_T("璁惧鏈繛鎺ワ紝璇峰厛杩炴帴璁惧銆�"), LOG_COLOR_WARNING);
+		return;
+	}
+}
+
+void CSGMeasurementDlg::OnBnClickedButtonClearStore()
+{
+	// TODO: 鍦ㄦ娣诲姞鎺т欢閫氱煡澶勭悊绋嬪簭浠g爜
+	if (!m_bConnected) {
+		AppendLogLineRichStyled(_T("璁惧鏈繛鎺ワ紝璇峰厛杩炴帴璁惧銆�"), LOG_COLOR_WARNING);
+		return;
+	}
+
+	if (m_bSaving) {
+		AppendLogLineRichStyled(_T("鏁版嵁瀛樺偍姝e湪杩涜涓紝璇峰厛鍋滄瀛樺偍銆�"), LOG_COLOR_WARNING);
+		return;
+	}
+
+	RC nRet = SGIF_DataStorageInit(DeviceID);
+	if (nRet == RC_OK) {
+		AppendLogLineRichStyled(_T("鏁版嵁瀛樺偍宸叉竻闄ゃ��"), LOG_COLOR_SUCCESS);
+	}
+	else {
+		CString strError;
+		strError.Format(_T("娓呴櫎鏁版嵁瀛樺偍澶辫触锛岄敊璇爜锛�%#X"), nRet);
+		AppendLogLineRichStyled(strError, LOG_COLOR_ERROR);
+	}
+}
+
+void CSGMeasurementDlg::OnBnClickedButtonStartStore()
+{
+	// TODO: 鍦ㄦ娣诲姞鎺т欢閫氱煡澶勭悊绋嬪簭浠g爜
+	if (m_bSaving) {
+		AppendLogLineRichStyled(_T("鏁版嵁瀛樺偍宸插湪杩涜涓紝璇峰厛鍋滄瀛樺偍銆�"), LOG_COLOR_WARNING);
+		return;
+	}
+
+	RC nRet = SGIF_DataStorageStart(DeviceID);
+	if (nRet == RC_OK) {
+		m_bSaving = TRUE;
+		AppendLogLineRichStyled(_T("鏁版嵁瀛樺偍宸插紑濮嬨��"), LOG_COLOR_SUCCESS);
+	}
+	else {
+		CString strError;
+		strError.Format(_T("寮�濮嬫暟鎹瓨鍌ㄥけ璐ワ紝閿欒鐮侊細%#X"), nRet);
+		AppendLogLineRichStyled(strError, LOG_COLOR_ERROR);
+	}
+
+	UpdateControlStatus(m_bConnected, m_bSaving);
+}
+
+void CSGMeasurementDlg::OnBnClickedButtonStopStore()
+{
+	// TODO: 鍦ㄦ娣诲姞鎺т欢閫氱煡澶勭悊绋嬪簭浠g爜
+	UpdateData(TRUE);
+
+	if (!m_bSaving) {
+		AppendLogLineRichStyled(_T("鏁版嵁瀛樺偍鏈湪杩涜涓紝璇峰厛寮�濮嬪瓨鍌ㄣ��"), LOG_COLOR_WARNING);
+		return;
+	}
+
+	RC nRet = SGIF_DataStorageStop(DeviceID);
+	if (nRet == RC_OK) {
+		m_bSaving = FALSE;
+		AppendLogLineRichStyled(_T("鏁版嵁瀛樺偍宸插仠姝€��"), LOG_COLOR_SUCCESS);
+
+		if (m_nUseTrigger) {
+			UpdateControlStatus(m_bConnected, m_bSaving);
+			AfxMessageBox(_T("褰撳墠鏄‖瑙﹀彂妯″紡锛岃妫�鏌ヨЕ鍙戝櫒鐘舵�併��"), MB_ICONINFORMATION);
+			return;
+		}
+
+		int nReceived = 0;
+		std::vector<float> vecBuffer(m_nSavePointCount, 0.0f);
+
+		int nSel = m_comboOutputPort.GetCurSel();
+		if (CB_ERR == nSel) {
+			AppendLogLineRichStyled(_T("璇烽�夋嫨涓�涓湁鏁堢殑杈撳嚭绔彛銆�"), LOG_COLOR_WARNING);
+			return;
+		}
+
+		int nOutNo = nSel + 1;
+		nRet = SGIF_DataStorageGetData(DeviceID, nOutNo, m_nSavePointCount, vecBuffer.data(), &nReceived);
+
+		CString strLog;
+		if (nRet == RC_OK) {
+			vecBuffer.resize(nReceived);
+			CleanInvalidValuesInPlace(nOutNo, vecBuffer);
+
+			std::vector<float> vecGlass1, vecGlass2;
+			if (SplitGlassSegments(nOutNo, vecBuffer, vecGlass1, vecGlass2, m_fJumpThreshold, m_nJumpWindow, m_nValleyMargin, m_nMinGlass1Count)) {
+
+				std::vector<float> vecStableGlass1, vecStableGlass2;
+				bool bStable1 = ExtractStableRegionFixed(nOutNo, vecGlass1, vecStableGlass1, m_nFixedCount, m_fMaxDelta);
+				bool bStable2 = ExtractStableRegionFixed(nOutNo, vecGlass2, vecStableGlass2, m_nFixedCount, m_fMaxDelta);
+
+				float fAvg1 = 0.0f, fAvg2 = 0.0f, fOffset = 0.0f;
+				if (bStable1 && bStable2) {
+					AppendLogLineRichStyled(_T("鎴愬姛鎻愬彇鍒颁袱鐗囩幓鐠冪殑绋冲畾鍖烘暟鎹��"), LOG_COLOR_SUCCESS);
+					CalcGlassOffset(vecStableGlass1, vecStableGlass2, fAvg1, fAvg2, fOffset);
+				}
+				else {
+					AppendLogLineRichStyled(_T("鏈兘鎻愬彇鍒扮ǔ瀹氬尯鏁版嵁锛屾棤娉曟甯歌绠楀亸绉汇��"), LOG_COLOR_WARNING);
+					CalcGlassOffset(vecGlass1, vecGlass2, fAvg1, fAvg2, fOffset);
+				}
+			}
+			else {
+				AppendLogLineRichStyled(_T("鏈兘璇嗗埆鍑轰袱鐗囩幓鐠冪殑鏁版嵁銆�"), LOG_COLOR_WARNING);
+			}
+		}
+		else {
+			strLog.Format(_T("璇诲彇 OUT%d 鏁版嵁澶辫触锛岄敊璇爜锛�%#X"), nOutNo, nRet);
+			AppendLogLineRichStyled(strLog, LOG_COLOR_ERROR);
+		}
+	}
+	else {
+		CString strError;
+		strError.Format(_T("鍋滄鏁版嵁瀛樺偍澶辫触锛岄敊璇爜锛�%#X"), nRet);
+		AppendLogLineRichStyled(strError, LOG_COLOR_ERROR);
+	}
+
+	UpdateControlStatus(m_bConnected, m_bSaving);
+}
+
+void CSGMeasurementDlg::OnBnClickedButtonClearLog()
+{
+	// TODO: 鍦ㄦ娣诲姞鎺т欢閫氱煡澶勭悊绋嬪簭浠g爜
+	if (::IsWindow(m_editLog.GetSafeHwnd())) {
+		m_editLog.SetWindowText(_T(""));
+	}
+}
\ No newline at end of file
diff --git a/SourceCode/Bond/SGMeasurement/SGMeasurementDlg.h b/SourceCode/Bond/SGMeasurement/SGMeasurementDlg.h
new file mode 100644
index 0000000..873636d
--- /dev/null
+++ b/SourceCode/Bond/SGMeasurement/SGMeasurementDlg.h
@@ -0,0 +1,277 @@
+锘�
+// SGMeasurementDlg.h: 澶存枃浠�
+//
+
+#pragma once
+#include <vector>
+#include <numeric>
+#include <algorithm>
+
+// CSGMeasurementDlg 瀵硅瘽妗�
+class CSGMeasurementDlg : public CDialogEx
+{
+// 鏋勯��
+public:
+	CSGMeasurementDlg(CWnd* pParent = nullptr);	// 鏍囧噯鏋勯�犲嚱鏁�
+
+// 瀵硅瘽妗嗘暟鎹�
+#ifdef AFX_DESIGN_TIME
+	enum { IDD = IDD_SGMEASUREMENT_DIALOG };
+#endif
+
+	protected:
+	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 鏀寔
+
+// 瀹炵幇
+protected:
+	HICON m_hIcon;
+
+	// 鐢熸垚鐨勬秷鎭槧灏勫嚱鏁�
+	virtual BOOL OnInitDialog();
+	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
+	afx_msg void OnPaint();
+	afx_msg HCURSOR OnQueryDragIcon();
+	afx_msg void OnTimer(UINT_PTR nIDEvent);
+	afx_msg void OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct);
+	afx_msg void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct);
+	afx_msg void OnClose();
+	afx_msg LRESULT OnTrayIconClick(WPARAM wParam, LPARAM lParam);
+	afx_msg void OnTrayRestore();
+	afx_msg void OnTrayExit();
+	afx_msg void OnBnClickedButtonConnect();
+	afx_msg void OnBnClickedButtonDisconnect();
+	afx_msg void OnBnClickedButtonReceiveFromCtrl();
+	afx_msg void OnBnClickedButtonSendToCtrl();
+	afx_msg void OnBnClickedButtonClearStore();
+	afx_msg void OnBnClickedButtonStartStore();
+	afx_msg void OnBnClickedButtonStopStore();
+	afx_msg void OnBnClickedButtonClearLog();
+	DECLARE_MESSAGE_MAP()
+
+private:
+	void ExitApplication();
+
+	/**
+	 * @brief 鏇存柊鐣岄潰鎺т欢鐨勫彲鐢ㄧ姸鎬併��
+	 *
+	 * 鏍规嵁璁惧杩炴帴鐘舵�� `bConnected` 鍜屽瓨鍌ㄧ姸鎬� `bStoring` 鍔ㄦ�佹帶鍒剁晫闈笂鎸夐挳銆�
+	 * 缂栬緫妗嗐�佷笅鎷夋绛夋帶浠剁殑鍙敤/绂佺敤鐘舵�併��
+	 *
+	 * @param bConnected 璁惧褰撳墠鏄惁宸茶繛鎺ワ紝TRUE 琛ㄧず宸茶繛鎺ワ紝FALSE 琛ㄧず鏈繛鎺ャ��
+	 * @param bStoring 褰撳墠鏄惁姝e湪杩涜鏁版嵁瀛樺偍锛孴RUE 琛ㄧず姝e湪瀛樺偍銆�
+	 */
+	void UpdateControlStatus(BOOL bConnected, BOOL bStoring = FALSE);
+
+	/**
+	 * @brief 鍚姩鎵归噺鏃ュ織杩藉姞锛屾殏鍋滆嚜鍔ㄦ粴鍔紝鎻愰珮鎬ц兘銆�
+	 */
+	void AppendLogLineBatchBegin();
+
+	/**
+	 * @brief 缁撴潫鎵归噺鏃ュ織杩藉姞锛屾仮澶嶈嚜鍔ㄦ粴鍔ㄥ苟鍒锋柊鏄剧ず銆�
+	 */
+	void AppendLogLineBatchEnd();
+
+	/**
+	 * @brief 闄愬埗瀵屾枃鏈涓殑鏈�澶ц鏁帮紝閬垮厤鏃ュ織杩囧瀵艰嚧鎬ц兘闂銆�
+	 *
+	 * @param maxLines 鏈�澶т繚鐣欑殑琛屾暟锛岄粯璁ゅ�间负 100銆�
+	 */
+	void TrimRichEditLineLimit(int maxLines = 100);
+
+	/**
+	 * @brief 鍚戞棩蹇楃獥鍙h拷鍔犱竴鏉″甫棰滆壊鏍峰紡鐨勬棩蹇楄銆�
+	 *
+	 * @param content 鏃ュ織鍐呭銆�
+	 * @param color 瀛椾綋棰滆壊锛岄粯璁や负榛戣壊銆�
+	 */
+	void AppendLogLineRichStyled(const CString& content, COLORREF color = RGB(0, 0, 0));
+
+	/**
+	 * @brief 楂樹寒鏃ュ織涓墍鏈夊尮閰嶆寚瀹氬瓧绗︿覆鐨勯儴鍒嗐��
+	 *
+	 * @param strSearch 瑕佸尮閰嶇殑瀛楃涓层��
+	 * @param clrHighlight 楂樹寒棰滆壊锛岄粯璁や负姗欒壊锛圧GB(255, 165, 0)锛夈��
+	 */
+	void HighlightAllMatches(const CString& strSearch, COLORREF clrHighlight = RGB(255, 165, 0));
+
+	/**
+	 * @brief 浠ユ牸寮忓寲鏂瑰紡杈撳嚭鎸囧畾閫氶亾鐨勬祴閲忔暟鎹牱鏈埌鏃ュ織銆�
+	 *
+	 * 姣忚杈撳嚭鍥哄畾鏁伴噺锛堝 7锛変釜娴偣鏁版嵁锛屽甫鏃堕棿鎴炽�侀�氶亾缂栧彿鏍囪瘑锛屼究浜庤皟璇曟煡鐪嬨��
+	 *
+	 * @param nOutNo 杈撳嚭绔彛缂栧彿锛岀敤浜庢爣璇嗘棩蹇楁潵婧愶紝濡� OUT1銆丱UT2 绛夈��
+	 * @param vecBuffer 娴嬮噺鏁版嵁缂撳瓨锛屽皢琚�愯鎵撳嵃鍒版棩蹇椾腑銆�
+	 */
+	void PrintSampleData(int nOutNo, const std::vector<float>& vecBuffer);
+
+	/**
+	 * @brief 灏濊瘯杩炴帴鍒版祴閲忚澶囥��
+	 *
+	 * @return true 琛ㄧず杩炴帴鎴愬姛锛宖alse 琛ㄧず杩炴帴澶辫触銆�
+	 */
+	bool ConnectToDevice();
+
+	/**
+	 * @brief 鏂紑涓庢祴閲忚澶囩殑杩炴帴銆�
+	 *
+	 * @return true 琛ㄧず鏂紑鎴愬姛锛宖alse 琛ㄧず鏂紑澶辫触銆�
+	 */
+	bool DisconnectFromDevice();
+
+	/**
+	 * @brief 鍘熷湴娓呴櫎鏃犳晥鍊硷紙濡� -999.0f锛夊苟鏇存柊鏁版嵁銆�
+	 *
+	 * @param nOutNo 杈撳嚭閫氶亾缂栧彿锛岀敤浜庢棩蹇楄褰曘��
+	 * @param vecData 杈撳叆杈撳嚭鏁版嵁瀹瑰櫒锛屽唴閮ㄥ皢琚氨鍦拌鍓��
+	 * @param fInvalid 鏃犳晥鍊肩殑鍒ゆ柇闃堝�硷紝榛樿鍊间负 -999.0f銆�
+	 */
+	void CleanInvalidValuesInPlace(int nOutNo, std::vector<float>& vecData, float fInvalid = -999.0f);
+
+	/**
+	 * @brief 灏嗘湁鏁堟暟鎹垏鍓叉垚涓ゆ鐜荤拑鏁版嵁锛圙lass1 涓� Glass2锛夈��
+	 *
+	 * @param nOutNo 杈撳嚭閫氶亾缂栧彿锛岀敤浜庢棩蹇楄褰曘��
+	 * @param validData 杈撳叆鐨勬湁鏁堟暟鎹紙搴斿凡瑁佸壀杈圭晫锛夈��
+	 * @param vecGlass1 杈撳嚭绗竴娈电幓鐠冩暟鎹��
+	 * @param vecGlass2 杈撳嚭绗簩娈电幓鐠冩暟鎹��
+	 * @param fJumpThreshold 璺冲彉闃堝�硷紝鐢ㄤ簬妫�娴嬫暟鎹殑鏄庢樉鏂偣銆�
+	 * @param nWindow 璺冲彉鍒ゆ柇鐨勫墠鍚庣獥鍙e搴︺��
+	 * @param nValleyMargin valley 鐐逛箣鍚庡灏戜釜鐐逛綔涓哄疄闄呭垏鍓茬偣銆�
+	 * @param nMinGlass1Count 绗竴娈垫渶灏戞湁鏁堢偣鏁伴檺鍒躲��
+	 *
+	 * @return true 琛ㄧず鍒囧壊鎴愬姛锛宖alse 琛ㄧず澶辫触锛堜緥濡傛暟鎹笉瓒虫垨鏃犳槑鏄捐烦鍙橈級銆�
+	 */
+	bool SplitGlassSegments(int nOutNo, const std::vector<float>& validData,
+		std::vector<float>& vecGlass1, std::vector<float>& vecGlass2,
+		float fJumpThreshold = 1.0f, int nWindow = 3, int nValleyMargin = 0,
+		int nMinGlass1Count = 10);
+
+	/**
+	 * @brief 浠庤緭鍏ユ暟鎹腑鎻愬彇涓�涓浐瀹氶暱搴︾殑绋冲畾鍖洪棿銆�
+	 *
+	 * @param nOutNo 杈撳嚭閫氶亾缂栧彿锛岀敤浜庢棩蹇楄褰曘��
+	 * @param vecIn 杈撳叆鍘熷鏁版嵁銆�
+	 * @param vecOut 杈撳嚭鎻愬彇鐨勭ǔ瀹氬尯鍩熸暟鎹��
+	 * @param nFixedCount 绋冲畾鍖哄煙鐨勭偣鏁拌姹傦紙蹇呴』鍥哄畾鏁伴噺锛夈��
+	 * @param fMaxDelta 鍏佽鐨勬渶澶ф尝鍔ㄨ寖鍥达紙鏈�澶у�� - 鏈�灏忓�硷級銆�
+	 *
+	 * @return true 琛ㄧず鎴愬姛鎵惧埌绋冲畾鍖洪棿锛宖alse 琛ㄧず鏈壘鍒般��
+	 */
+	bool ExtractStableRegionFixed(int nOutNo, 
+		const std::vector<float>& vecIn,
+		std::vector<float>& vecOut,
+		int nFixedCount = 5, float fMaxDelta = 0.05f);
+
+	/**
+	 * @brief 璁$畻涓ょ墖鐜荤拑绋冲畾鍖哄煙鐨勫钩鍧囧�煎拰鍋忕Щ閲忋��
+	 *
+	 * @param vecGlass1 绗竴娈电ǔ瀹氭暟鎹��
+	 * @param vecGlass2 绗簩娈电ǔ瀹氭暟鎹��
+	 * @param fAvg1 杩斿洖绗竴娈电殑骞冲潎鍊笺��
+	 * @param fAvg2 杩斿洖绗簩娈电殑骞冲潎鍊笺��
+	 * @param fOffset 杩斿洖涓ゆ鐨勫亸绉诲�硷紙缁濆鍊煎樊锛夈��
+	 *
+	 * @return true 琛ㄧず璁$畻鎴愬姛锛宖alse 琛ㄧず杈撳叆鏃犳晥锛堝绌烘暟鎹級銆�
+	 */
+	bool CalcGlassOffset(const std::vector<float>& vecGlass1,
+		const std::vector<float>& vecGlass2,
+		float& fAvg1, float& fAvg2, float& fOffset);
+
+	// === 绯荤粺鐘舵�佷笌杩愯鏁版嵁 ===
+
+	/**
+	 * @brief 褰撳墠鏄惁宸茶繛鎺ュ埌浼犳劅鍣ㄦ帶鍒跺櫒
+	 */
+	bool m_bConnected;
+
+	/**
+	 * @brief 褰撳墠鏄惁姝e湪杩涜鏁版嵁瀛樺偍
+	 */
+	bool m_bSaving;
+
+	/**
+	 * @brief 鍥涗釜杈撳嚭绔彛鐨勫綋鍓嶈绠楃粨鏋滐紙濡傚亸绉婚噺鎴栧帤搴︾瓑锛�
+	 */
+	double m_dOutValues[4];
+
+	// === 瀛樺偍璁剧疆鐩稿叧 ===
+
+	/**
+	 * @brief 鏄惁浣跨敤纭欢瑙﹀彂淇″彿锛�0=鍚︼紝1=鏄級
+	 */
+	int m_nUseTrigger;
+
+	/**
+	 * @brief 姣忔閲囬泦鐨勬暟鎹偣鏁伴噺
+	 */
+	int m_nSavePointCount;
+
+	/**
+	 * @brief 杈撳嚭绔彛閫夋嫨涓嬫媺妗嗘帶浠讹紙鐢ㄤ簬璁剧疆閲囬泦绔彛锛�
+	 */
+	CComboBox m_comboOutputPort;
+
+	// === 璺冲彉妫�娴嬩笌鐜荤拑璇嗗埆鍙傛暟锛圫plitGlassSegments 浣跨敤锛� ===
+
+	/**
+	 * @brief 璺冲彉闃堝�硷紙渚嬪 0.2mm锛夛紝鐢ㄤ簬妫�娴嬩袱鐗囩幓鐠冧箣闂寸殑楂樺害璺冲彉
+	 */
+	float m_fJumpThreshold;
+
+	/**
+	 * @brief 璺冲彉妫�娴嬬獥鍙e崐瀹藉害锛堢敤浜庡樊鍒嗚绠楋級
+	 */
+	int m_nJumpWindow;
+
+	/**
+	 * @brief valley 鐐瑰彸绉荤殑鍋忕Щ閲忥紝鐢ㄤ簬鏈�缁堢‘瀹氬垎鍓茬偣
+	 */
+	int m_nValleyMargin;
+
+	/**
+	 * @brief 绗竴鐗囩幓鐠冩渶灏戞墍闇�鐨勬暟鎹偣鏁�
+	 */
+	int m_nMinGlass1Count;
+
+	// === 绋冲畾鍖哄煙鎻愬彇鍙傛暟锛圗xtractStableRegionFixed 浣跨敤锛� ===
+
+	/**
+	 * @brief 姣忔绋冲畾鍖哄煙瑕佹彁鍙栫殑鍥哄畾鏁版嵁鐐规暟
+	 */
+	int m_nFixedCount;
+
+	/**
+	 * @brief 鏈�澶у厑璁告尝鍔ㄨ寖鍥达紙渚嬪 0.05mm锛夛紝鍒ゆ柇鏄惁涓衡�滅ǔ瀹氣�濆尯鍩�
+	 */
+	float m_fMaxDelta;
+
+	// === 鏃ュ織鎺т欢 ===
+
+	/**
+	 * @brief 瀵屾枃鏈帶浠讹紝鐢ㄤ簬杈撳嚭甯﹂鑹茬殑鏃ュ織淇℃伅
+	 */
+	CRichEditCtrl m_editLog;
+
+	// === 鎵樼洏鍥炬爣绠$悊 ===
+
+	/**
+	 * @brief 鎵樼洏鍥炬爣鐩稿叧鏁版嵁缁撴瀯锛圢OTIFYICONDATA锛�
+	 */
+	NOTIFYICONDATA m_trayIconData;
+
+	/**
+	 * @brief 鎵樼洏鍥炬爣鐨勫敮涓� ID
+	 */
+	UINT m_nTrayIconID;
+
+	/**
+	 * @brief 鏍囪鎵樼洏鍥炬爣鏄惁宸叉垚鍔熷垱寤�
+	 */
+	BOOL m_bTrayIconCreated;
+
+	/**
+	 * @brief 鏍囪绋嬪簭鏄惁閫氳繃鎵樼洏鍥炬爣閫�鍑�
+	 */
+	BOOL m_bExitingFromTray;
+};
diff --git a/SourceCode/Bond/SGMeasurement/framework.h b/SourceCode/Bond/SGMeasurement/framework.h
new file mode 100644
index 0000000..5672fb5
--- /dev/null
+++ b/SourceCode/Bond/SGMeasurement/framework.h
@@ -0,0 +1,49 @@
+锘�#pragma once
+
+#ifndef VC_EXTRALEAN
+#define VC_EXTRALEAN            // 浠� Windows 澶翠腑鎺掗櫎鏋佸皯浣跨敤鐨勮祫鏂�
+#endif
+
+#include "targetver.h"
+
+#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS      // 鏌愪簺 CString 鏋勯�犲嚱鏁板皢鏄樉寮忕殑
+
+// 鍏抽棴 MFC 鐨勪竴浜涘父瑙佷笖缁忓父鍙斁蹇冨拷鐣ョ殑闅愯棌璀﹀憡娑堟伅
+#define _AFX_ALL_WARNINGS
+
+#include <afxwin.h>         // MFC 鏍稿績缁勪欢鍜屾爣鍑嗙粍浠�
+#include <afxext.h>         // MFC 鎵╁睍
+
+
+#include <afxdisp.h>        // MFC 鑷姩鍖栫被
+
+
+
+#ifndef _AFX_NO_OLE_SUPPORT
+#include <afxdtctl.h>           // MFC 瀵� Internet Explorer 4 鍏叡鎺т欢鐨勬敮鎸�
+#endif
+#ifndef _AFX_NO_AFXCMN_SUPPORT
+#include <afxcmn.h>             // MFC 瀵� Windows 鍏叡鎺т欢鐨勬敮鎸�
+#endif // _AFX_NO_AFXCMN_SUPPORT
+
+#include <afxcontrolbars.h>     // MFC 鏀寔鍔熻兘鍖哄拰鎺у埗鏉�
+
+
+
+
+
+
+
+
+
+#ifdef _UNICODE
+#if defined _M_IX86
+#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
+#elif defined _M_X64
+#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
+#else
+#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
+#endif
+#endif
+
+
diff --git a/SourceCode/Bond/SGMeasurement/pch.cpp b/SourceCode/Bond/SGMeasurement/pch.cpp
new file mode 100644
index 0000000..b6fb8f4
--- /dev/null
+++ b/SourceCode/Bond/SGMeasurement/pch.cpp
@@ -0,0 +1,5 @@
+锘�// pch.cpp: 涓庨缂栬瘧鏍囧ご瀵瑰簲鐨勬簮鏂囦欢
+
+#include "pch.h"
+
+// 褰撲娇鐢ㄩ缂栬瘧鐨勫ご鏃讹紝闇�瑕佷娇鐢ㄦ婧愭枃浠讹紝缂栬瘧鎵嶈兘鎴愬姛銆�
diff --git a/SourceCode/Bond/SGMeasurement/pch.h b/SourceCode/Bond/SGMeasurement/pch.h
new file mode 100644
index 0000000..9660927
--- /dev/null
+++ b/SourceCode/Bond/SGMeasurement/pch.h
@@ -0,0 +1,13 @@
+锘�// pch.h: 杩欐槸棰勭紪璇戞爣澶存枃浠躲��
+// 涓嬫柟鍒楀嚭鐨勬枃浠朵粎缂栬瘧涓�娆★紝鎻愰珮浜嗗皢鏉ョ敓鎴愮殑鐢熸垚鎬ц兘銆�
+// 杩欒繕灏嗗奖鍝� IntelliSense 鎬ц兘锛屽寘鎷唬鐮佸畬鎴愬拰璁稿浠g爜娴忚鍔熻兘銆�
+// 浣嗘槸锛屽鏋滄澶勫垪鍑虹殑鏂囦欢涓殑浠讳綍涓�涓湪鐢熸垚涔嬮棿鏈夋洿鏂帮紝瀹冧滑鍏ㄩ儴閮藉皢琚噸鏂扮紪璇戙��
+// 璇峰嬁鍦ㄦ澶勬坊鍔犺棰戠箒鏇存柊鐨勬枃浠讹紝杩欏皢浣垮緱鎬ц兘浼樺娍鏃犳晥銆�
+
+#ifndef PCH_H
+#define PCH_H
+
+// 娣诲姞瑕佸湪姝ゅ棰勭紪璇戠殑鏍囧ご
+#include "framework.h"
+
+#endif //PCH_H
diff --git a/SourceCode/Bond/SGMeasurement/res/SGMeasurement.ico b/SourceCode/Bond/SGMeasurement/res/SGMeasurement.ico
new file mode 100644
index 0000000..d56fbcd
--- /dev/null
+++ b/SourceCode/Bond/SGMeasurement/res/SGMeasurement.ico
Binary files differ
diff --git a/SourceCode/Bond/SGMeasurement/res/SGMeasurement.rc2 b/SourceCode/Bond/SGMeasurement/res/SGMeasurement.rc2
new file mode 100644
index 0000000..12feacc
--- /dev/null
+++ b/SourceCode/Bond/SGMeasurement/res/SGMeasurement.rc2
Binary files differ
diff --git a/SourceCode/Bond/SGMeasurement/res/menu_close.ico b/SourceCode/Bond/SGMeasurement/res/menu_close.ico
new file mode 100644
index 0000000..3c1c21b
--- /dev/null
+++ b/SourceCode/Bond/SGMeasurement/res/menu_close.ico
Binary files differ
diff --git a/SourceCode/Bond/SGMeasurement/res/menu_restore.ico b/SourceCode/Bond/SGMeasurement/res/menu_restore.ico
new file mode 100644
index 0000000..fdb135f
--- /dev/null
+++ b/SourceCode/Bond/SGMeasurement/res/menu_restore.ico
Binary files differ
diff --git a/SourceCode/Bond/SGMeasurement/resource.h b/SourceCode/Bond/SGMeasurement/resource.h
new file mode 100644
index 0000000..9286258
--- /dev/null
+++ b/SourceCode/Bond/SGMeasurement/resource.h
@@ -0,0 +1,45 @@
+锘�//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ 鐢熸垚鐨勫寘鍚枃浠躲��
+// 渚� SGMeasurement.rc 浣跨敤
+//
+#define IDM_ABOUTBOX                    0x0010
+#define IDD_ABOUTBOX                    100
+#define IDS_ABOUTBOX                    101
+#define IDD_SGMEASUREMENT_DIALOG        102
+#define IDR_MAINFRAME                   128
+#define IDI_ICON_RESTORE                130
+#define IDI_ICON_EXIT                   131
+#define IDC_IPADDRESS                   1000
+#define IDC_BUTTON_CONNECT              1001
+#define IDC_BUTTON_DISCONNECT           1002
+#define IDC_EDIT_OUT1                   1003
+#define IDC_EDIT_OUT2                   1004
+#define IDC_EDIT_OUT3                   1005
+#define IDC_EDIT_OUT4                   1006
+#define IDC_CHECK_USE_TRIGGER           1007
+#define IDC_EDIT_STORE_COUNT            1008
+#define IDC_COMBO_OUTPUT_PORT           1009
+#define IDC_BUTTON_START_STORE          1010
+#define IDC_BUTTON_STOP_STORE           1011
+#define IDC_BUTTON_CLEAR_STORE          1012
+#define IDC_BUTTON_RECEIVE_FROM_CTRL    1013
+#define IDC_BUTTON_SEND_TO_CTRL         1014
+#define IDC_RICHEDIT_LOG                1015
+#define IDC_BUTTON_CLEAR_LOG            1016
+#define IDC_EDIT_JUMP_THRESHOLD         1017
+#define IDC_EDIT_JUMP_WINDOW            1018
+#define IDC_EDIT_VALLEY_MARGIN          1019
+#define IDC_EDIT_MIN_GLASS_COUNT        1020
+#define IDC_EDIT_FIXED_COUNT            1021
+#define IDC_EDIT_MAX_DELTA              1022
+
+// Next default values for new objects
+// 
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE        132
+#define _APS_NEXT_COMMAND_VALUE         32771
+#define _APS_NEXT_CONTROL_VALUE         1023
+#define _APS_NEXT_SYMED_VALUE           101
+#endif
+#endif
diff --git a/SourceCode/Bond/SGMeasurement/targetver.h b/SourceCode/Bond/SGMeasurement/targetver.h
new file mode 100644
index 0000000..79934a3
--- /dev/null
+++ b/SourceCode/Bond/SGMeasurement/targetver.h
@@ -0,0 +1,8 @@
+锘�#pragma once
+
+// 鍖呮嫭 SDKDDKVer.h 灏嗗畾涔夊彲鐢ㄧ殑鏈�楂樼増鏈殑 Windows 骞冲彴銆�
+
+//濡傛灉瑕佷负浠ュ墠鐨� Windows 骞冲彴鐢熸垚搴旂敤绋嬪簭锛岃鍖呮嫭 WinSDKVer.h锛屽苟
+// 灏� _WIN32_WINNT 瀹忚缃负瑕佹敮鎸佺殑骞冲彴锛岀劧鍚庡啀鍖呮嫭 SDKDDKVer.h銆�
+
+#include <SDKDDKVer.h>

--
Gitblit v1.9.3