diff --git a/HSI_HexagonMI_EF3/HSI.cpp b/HSI_HexagonMI_EF3/HSI.cpp
index 222d788..d644871 100644
--- a/HSI_HexagonMI_EF3/HSI.cpp
+++ b/HSI_HexagonMI_EF3/HSI.cpp
@@ -309,13 +309,53 @@ HSI_API HSI_STATUS WINAPI HSI_MOTION_IS_HOMED(bool& bHomed)
}
return rStatus;
}
-#pragma endregion
-#ifdef USE_Motion_API
-
-#pragma region 后续考虑
//===========================================================================
-HSI_API HSI_STATUS WINAPI HSI_MOTION_IS_SUPPORTED(UINT &Types)
+HSI_API HSI_STATUS WINAPI HSI_EF3MOTION_GET_SPEED_XYZ(int axis, double& Speed)
+{
+ auto rStatus = HSI_STATUS_NORMAL;
+ if (g_pHSI_Motion)
+ {
+ rStatus = g_pHSI_Motion->GetSpeedXyz(axis, Speed);
+ }
+ else
+ {
+ rStatus = HSI_STATUS_FAILED;
+ }
+ return rStatus;
+}
+
+//===========================================================================
+HSI_API HSI_STATUS WINAPI HSI_MOTION_SET_SPEED_EX(UINT AxisTypes, double Speed)
+{
+ auto rStatus = HSI_STATUS_NORMAL;
+ if (g_pHSI_Motion)
+ {
+ rStatus = g_pHSI_Motion->SetSpeedEx(AxisTypes, Speed);
+ }
+ else
+ {
+ rStatus = HSI_STATUS_FAILED;
+ }
+ return rStatus;
+}
+//===========================================================================
+HSI_API HSI_STATUS WINAPI HSI_MOTION_GET_DIO(UINT IOChannel, UINT& _Status)
+{
+ auto rStatus = HSI_STATUS_NORMAL;
+ if (g_pHSI_Motion)
+ {
+ rStatus = g_pHSI_Motion->GetDIO(IOChannel, _Status);
+ }
+ else
+ {
+ rStatus = HSI_STATUS_FAILED;
+ }
+ return rStatus;
+}
+
+//===========================================================================
+HSI_API HSI_STATUS WINAPI HSI_MOTION_IS_SUPPORTED(UINT& Types)
{
auto rStatus = HSI_STATUS_NORMAL;
if (g_bOfflineOnly == 0)
@@ -335,20 +375,13 @@ HSI_API HSI_STATUS WINAPI HSI_MOTION_IS_SUPPORTED(UINT &Types)
}
return rStatus;
}
-//===========================================================================
-HSI_API HSI_STATUS WINAPI HSI_EF3MOTION_GET_SPEED_XYZ(int axis,double &Speed)
-{
- auto rStatus = HSI_STATUS_NORMAL;
- if (g_pHSI_Motion)
- {
- rStatus = g_pHSI_Motion->GetSpeedXyz(axis,Speed);
- }
- else
- {
- rStatus = HSI_STATUS_FAILED;
- }
- return rStatus;
-}
+#pragma endregion
+
+#ifdef USE_Motion_API
+
+#pragma region 后续考虑
+
+
//===========================================================================
HSI_API HSI_STATUS WINAPI HSI_MOTION_GET_FOCUSSPEED_XYZ(double &Speed)
{
@@ -604,20 +637,7 @@ HSI_API HSI_STATUS WINAPI HSI_MOTION_SET_POSITION_R(UINT AxisTypes, double Posi
UNREFERENCED_PARAMETER(bWait);
return HSI_STATUS_NOT_SUPPORTED;
}
-//===========================================================================
-HSI_API HSI_STATUS WINAPI HSI_MOTION_GET_DIO(UINT IOChannel, UINT& _Status)
-{
- auto rStatus = HSI_STATUS_NORMAL;
- if (g_pHSI_Motion)
- {
- rStatus = g_pHSI_Motion->GetDIO(IOChannel,_Status);
- }
- else
- {
- rStatus = HSI_STATUS_FAILED;
- }
- return rStatus;
-}
+
//===========================================================================
HSI_API HSI_STATUS WINAPI HSI_MOTION_SET_DIO(UINT IOChannel, UINT _Status)
{
@@ -922,20 +942,7 @@ HSI_API HSI_STATUS WINAPI HSI_MOTION_GET_SPEED_EX(UINT AxisTypes, double &Speed)
}
return rStatus;
}
-//===========================================================================
-HSI_API HSI_STATUS WINAPI HSI_MOTION_SET_SPEED_EX(UINT AxisTypes, double Speed)
-{
- auto rStatus = HSI_STATUS_NORMAL;
- if (g_pHSI_Motion)
- {
- rStatus = g_pHSI_Motion->SetSpeedEx(AxisTypes, Speed);
- }
- else
- {
- rStatus = HSI_STATUS_FAILED;
- }
- return rStatus;
-}
+
//===========================================================================
HSI_API HSI_STATUS WINAPI HSI_MOTION_GET_ACCELERATION_EX(UINT AxisTypes, double &Accel)
{
diff --git a/HSI_HexagonMI_EF3/HSI.h b/HSI_HexagonMI_EF3/HSI.h
index e70c052..bc8a3c1 100644
--- a/HSI_HexagonMI_EF3/HSI.h
+++ b/HSI_HexagonMI_EF3/HSI.h
@@ -20,8 +20,8 @@
#define HSI_API extern "C" __declspec(dllimport)
#endif
-const int HSI_APIVersionMajor = 0;
-const int HSI_APIVersionMinor = 0;
+const int HSI_APIVersionMajor = 1;
+const int HSI_APIVersionMinor = 9;
const int HSI_MaxStringLength = 255; // Maximum string length (buffer size - 1)
///////////////////////////////////////////////////////////////////////////////
// Interface API
@@ -426,9 +426,10 @@ HSI_API HSI_STATUS WINAPI HSI_MOTION_SET_POSITION_XYZ(UINT AxisTypes, double Pos
double PositionZ, HSI_MOTION_MOVE_TYPE eType, double dSpeedGear);
HSI_API HSI_STATUS WINAPI HSI_MOTION_ABORT_MOTION();
HSI_API HSI_STATUS WINAPI HSI_MOTION_IS_HOMED(bool& bHomed);
+HSI_API HSI_STATUS WINAPI HSI_MOTION_GET_DIO(UINT IOChannel, UINT& _Status);
+HSI_API HSI_STATUS WINAPI HSI_MOTION_SET_DIO(UINT IOChannel, UINT _Status);
-
-//HSI_API HSI_STATUS WINAPI HSI_MOTION_IS_SUPPORTED(UINT &Types);
+HSI_API HSI_STATUS WINAPI HSI_MOTION_IS_SUPPORTED(UINT &Types);
//HSI_API HSI_STATUS WINAPI HSI_MOTION_GET_SPEED_XYZ(double &Speed);
//HSI_API HSI_STATUS WINAPI HSI_MOTION_SET_SPEED_XYZ(double Speed);
//HSI_API HSI_STATUS WINAPI HSI_MOTION_GET_ACCELERATION_XYZ(double &AccelX, double &AccelY, double &AccelZ);
@@ -447,8 +448,7 @@ HSI_API HSI_STATUS WINAPI HSI_MOTION_IS_HOMED(bool& bHomed);
//HSI_API HSI_STATUS WINAPI HSI_MOTION_GET_POSITION_R(UINT AxisTypes, double &PositionR, double &Time);
//HSI_API HSI_STATUS WINAPI HSI_MOTION_SET_POSITION_R(UINT AxisTypes, double PositionR, HSI_MOTION_AXIS_R_MOVE_TYPE DirectionType, bool bWait);
//HSI_API HSI_STATUS WINAPI HSI_MOTION_SET_PLAN_SCAN(double *pdStartPosX, double *pdStartPosY, double *pdStartPosZ, double *pdEndPosX, double *pdEndPosY, double *pdEndPosZ, double *pdStepDis, bool *pbTrig, int iCount);
-//HSI_API HSI_STATUS WINAPI HSI_MOTION_GET_DIO(UINT IOChannel, UINT& _Status);
-//HSI_API HSI_STATUS WINAPI HSI_MOTION_SET_DIO(UINT IOChannel, UINT _Status);
+
//HSI_API HSI_STATUS WINAPI HSI_MOTION_DCC_SCAN_SET_DATA(UINT AxisTypes, HSI_SCAN_MOTION_TYPE eType, UINT lTrigNumber, double* dTrigDis);
//HSI_API HSI_STATUS WINAPI HSI_MOTION_DCC_SCAN_START();
//HSI_API HSI_STATUS WINAPI HSI_MOTION_DCC_SCAN_STOP();
diff --git a/HSI_HexagonMI_EF3/HSI_HexagonMI_EF3.vcxproj b/HSI_HexagonMI_EF3/HSI_HexagonMI_EF3.vcxproj
index bfd2364..dd867a7 100644
--- a/HSI_HexagonMI_EF3/HSI_HexagonMI_EF3.vcxproj
+++ b/HSI_HexagonMI_EF3/HSI_HexagonMI_EF3.vcxproj
@@ -106,7 +106,9 @@
$(LocalDebuggerWorkingDirectory)\ACS;%(AdditionalLibraryDirectories)
- copy "$(TargetDir)$(ProjectName).dll" "$(SolutionDir)HSI_SEVENOCEAN_EF1_CsTest\bin\Debug\HSI.dll"
+ copy "$(TargetDir)$(ProjectName).dll" "$(SolutionDir)HSI_SEVENOCEAN_EF1_CsTest\bin\Debug\HSI.dll"
+copy "$(TargetDir)$(ProjectName).dll" "C:\Hexagon\Metus2021\HSI.dll"
+copy "$(TargetDir)$(ProjectName).dll" "E:\HexagonProjects\2022-05-鐩寸嚎鐢垫満骞冲彴\EF3-Interfac\PcDmis\Base\Interfac\Msi\Hsi\Tools\UsbUtility\HSI_Sevenocean_EF1_WPFTest\bin\x64\Debug\HSI.dll"
version.cmd
diff --git a/HSI_HexagonMI_EF3/HSI_Motion.cpp b/HSI_HexagonMI_EF3/HSI_Motion.cpp
index 28392c0..45a8334 100644
--- a/HSI_HexagonMI_EF3/HSI_Motion.cpp
+++ b/HSI_HexagonMI_EF3/HSI_Motion.cpp
@@ -4545,7 +4545,13 @@ HSI_STATUS HSI_Motion::SpecialMotorMove(short AxisNumber, double Position)
}
//========================IO===================================================
-HSI_STATUS HSI_Motion::GetDIO(UINT IOChannel, UINT& _Status)
+/**
+ * \brief
+ * \param IOChannel
+ * \param _Status
+ * \return
+ */
+HSI_STATUS HSI_Motion::GetDIOOld(UINT IOChannel, UINT& _Status)
{
auto rStatus = HSI_STATUS_NORMAL;
if (g_pHSI_Motion)
@@ -4597,7 +4603,63 @@ HSI_STATUS HSI_Motion::GetDIO(UINT IOChannel, UINT& _Status)
}
return rStatus;
}
+HSI_STATUS HSI_Motion::GetDIO(UINT IOChannel, UINT& _Status)
+{
+ auto rStatus = HSI_STATUS_NORMAL;
+ if (g_pHSI_Motion)
+ {
+ if (m_SO7_Serial.m_RecvData[0] == 2)
+ {
+ if (IOChannel == HSI_MOTION_INPUT_LIMIT_SWITCH)
+ {
+ _Status = m_SO7_Serial.m_RecvData[33];
+ }
+ if (IOChannel == HSI_MOTION_INPUT_ALARM)
+ {
+ _Status = m_SO7_Serial.m_RecvData[40];
+ }
+ if (IOChannel == HSI_MOTION_INPUT_CH1) //获取通用输入
+ {
+ _Status = m_SO7_Serial.m_RecvData[34];
+ _Status = (m_SO7_Serial.m_RecvData[35] | (_Status << 8)) & 0xffff;
+ }
+ if (IOChannel == HSI_MOTION_OUTPUT_CH1) //获取通用输出
+ {
+ _Status = m_SO7_Serial.m_RecvData[36];
+ _Status = (m_SO7_Serial.m_RecvData[37] | (_Status << 8)) & 0xffff;
+ }
+ m_axisStatus = m_SO7_Serial.m_RecvData[58];
+ m_axisAlarmStatus = m_SO7_Serial.m_RecvData[59];
+ }
+ else if (m_bISUseMoreLights > 0)
+ {
+ if (m_Led8MotionFlag[m_selectedIndex])
+ {
+ if (tReciveData[0] == 0x05)
+ {
+ _Status = tReciveData[2];
+ }
+ }
+ else
+ {
+ if (tReciveData[0] == 0x05)
+ {
+ _Status = tReciveData[1] << 24 | tReciveData[1] << 16 | tReciveData[3] << 8 | tReciveData[4];
+ }
+ }
+ }
+ else
+ {
+ g_pLogger->SendAndFlushWithTime(L"[GetDIO] failed\n");
+ }
+ }
+ //-----------TEST Begin------------------
+ _Status = 0;
+
+ //-----------TEST End------------------
+ return rStatus;
+}
//===========================================================================
HSI_STATUS HSI_Motion::SetDIO(UINT IOChannel, UINT _Status)
{
@@ -6613,7 +6675,13 @@ bool HSI_Motion::SpeedPercentJoyStick(int AxisNum, long& Speed, int& DirveSpeed,
}
//===========================================================================
-HSI_STATUS HSI_Motion::GetSpeedXyz(int AxisNum, double& Speed)
+/**
+ * \brief 获取单轴设置的速度
+ * \param AxisNum
+ * \param Speed
+ * \return
+ */
+HSI_STATUS HSI_Motion::GetSpeedXyzOld(int AxisNum, double& Speed)
{
g_pLogger->SendAndFlushWithTime(L"[GetSpeedXyz] In\n");
auto rStatus = HSI_STATUS_NORMAL;
@@ -6630,6 +6698,22 @@ HSI_STATUS HSI_Motion::GetSpeedXyz(int AxisNum, double& Speed)
return rStatus;
}
+HSI_STATUS HSI_Motion::GetSpeedXyz(int AxisNum, double& Speed)
+{
+ g_pLogger->SendAndFlushWithTime(L"[GetSpeedXyz] In\n");
+ auto rStatus = HSI_STATUS_NORMAL;
+ short AxisNumber = AxisConvertIndex(AxisNum);
+ if (1 == m_iSpeedType)
+ {
+ Speed = m_SetPotion_DriveSpeed[AxisNumber] * (m_Resolution[AxisNumber] * 50);
+ }
+ else
+ {
+ Speed = m_SetPotion_DriveSpeed[AxisNumber];
+ }
+ g_pLogger->SendAndFlushWithTime(L"[GetSpeedXyz] Out\n");
+ return rStatus;
+}
//===========================================================================
HSI_STATUS HSI_Motion::SetSpeedXyz(double Speed)
{
@@ -6986,7 +7070,13 @@ HSI_STATUS HSI_Motion::GetSpeedEx(UINT AxisTypes, double& Speed)
}
//===========================================================================
-HSI_STATUS HSI_Motion::SetSpeedEx(UINT AxisTypes, double Speed)
+/**
+ * \brief 设置单轴运动速度
+ * \param AxisTypes
+ * \param Speed
+ * \return
+ */
+HSI_STATUS HSI_Motion::SetSpeedExOld(UINT AxisTypes, double Speed)
{
auto rStatus = HSI_STATUS_NORMAL;
g_pLogger->SendAndFlushWithTime(L"[SetSpeedEx] In\n");
@@ -7067,6 +7157,86 @@ HSI_STATUS HSI_Motion::SetSpeedEx(UINT AxisTypes, double Speed)
return rStatus;
}
+HSI_STATUS HSI_Motion::SetSpeedEx(UINT AxisTypes, double Speed)
+{
+ auto rStatus = HSI_STATUS_NORMAL;
+ g_pLogger->SendAndFlushWithTime(L"[SetSpeedEx] In\n");
+ short AxisNumber = AxisConvertIndex(AxisTypes);
+ if (Speed <= 0)
+ {
+ m_SetPotion_DriveSpeed[AxisNumber] = 0;
+ }
+ if (1 == m_iSpeedType)
+ {
+ if (Speed >= 65000 * (m_Resolution[AxisNumber] * 50))
+ {
+ m_SetPotion_DriveSpeed[AxisNumber] = 65000;
+ }
+ }
+ else
+ {
+ if (Speed >= 65000)
+ {
+ m_SetPotion_DriveSpeed[AxisNumber] = 65000;
+ }
+ }
+ if (AxisNumber >= 1 && AxisNumber <= 4)
+ {
+ if (m_ForSoft == 1)
+ {
+ if (m_motorType == 1)
+ {
+ if (1 == m_iSpeedType)
+ {
+ m_SetPotion_DriveSpeed[1] = static_cast(Speed) / (m_Resolution[1] * 50);
+ }
+ else
+ {
+ m_SetPotion_DriveSpeed[1] = static_cast(Speed);
+ }
+ }
+ else
+ {
+ g_pLogger->SendAndFlushWithTime(L"[SetSpeedEx] AxisNumber = %d,Speed = %f \n", AxisNumber, Speed);
+ //if (!bSaveSpeedFlag)
+ //{
+ // bSaveSpeedFlag = true;
+ // m_SaveAxisNum = AxisNumber;
+ // m_SaveAxisSpeed = m_SetPotion_DriveSpeed[AxisNumber];
+ // g_pLogger->SendAndFlushWithTime(L"[SetSpeedEx] m_SaveAxisNum = %d,m_SaveAxisSpeed = %d \n", m_SaveAxisNum, m_SaveAxisSpeed);
+ //}
+ //if (bSaveSpeedFlag && ((int)Speed == m_SetPotion_DriveSpeed[1] * (m_Resolution[1] * 50)))
+ //{
+ // bSaveSpeedFlag = false;
+ // m_SetPotion_DriveSpeed[m_SaveAxisNum] = m_SaveAxisSpeed;
+ // return rStatus;
+ //}
+ if (1 == m_iSpeedType)
+ {
+ m_SetPotion_DriveSpeed[AxisNumber] = static_cast(Speed / (m_Resolution[AxisNumber] * 50));
+ }
+ else
+ {
+ m_SetPotion_DriveSpeed[AxisNumber] = static_cast(Speed);
+ }
+ g_pLogger->SendAndFlushWithTime(L"[SetSpeedEx] AxisNumber = %d\n", AxisNumber);
+ }
+ }
+ else
+ {
+ if (m_motorType == 1)
+ {
+ m_SetPotion_DriveSpeed[AxisNumber] = static_cast(Speed / (m_Resolution[AxisNumber] * 50));
+ }
+ else
+ {
+ m_SetPotion_DriveSpeed[AxisNumber] = static_cast(Speed / (m_Resolution[AxisNumber] * 50));
+ }
+ }
+ }
+ g_pLogger->SendAndFlushWithTime(L"[SetSpeedEx] Out\n");
+ return rStatus;
+}
//===========================================================================
HSI_STATUS HSI_Motion::GetAccelerationEx(UINT AxisTypes, double& Accel)
{
diff --git a/HSI_HexagonMI_EF3/HSI_Motion.h b/HSI_HexagonMI_EF3/HSI_Motion.h
index 81ae8e6..17064e7 100644
--- a/HSI_HexagonMI_EF3/HSI_Motion.h
+++ b/HSI_HexagonMI_EF3/HSI_Motion.h
@@ -182,7 +182,14 @@ public:
*/
HSI_STATUS IsHomed(bool& bHomed);
HSI_STATUS IsHomedOld(bool& bHomed);
+ /**
+ * \brief 获取单轴运动速度
+ * \param AxisNum
+ * \param Speed
+ * \return
+ */
HSI_STATUS GetSpeedXyz(int AxisNum, double& Speed);
+ HSI_STATUS GetSpeedXyzOld(int AxisNum, double& Speed);
HSI_STATUS SetSpeedXyz(double Speed);
HSI_STATUS GetFocusSpeed(double& Speed);
HSI_STATUS SetFocusSpeed(double Speed);
@@ -195,7 +202,7 @@ public:
HSI_STATUS GetDeadBand(double& DeadbandX, double& DeadbandY, double& DeadbandZ, double& DeadbandR);
HSI_STATUS GetRefreshDeadBand(double& Deadband);
/**
- * \brief
+ * \brief Jog运动
* \param AxisTypes
* \param Speed
* \return
@@ -264,8 +271,20 @@ public:
*/
HSI_STATUS AbortMotion();
HSI_STATUS AbortMotionOld();
-
+ /**
+ * \brief
+ * \param IOChannel
+ * \param _Status
+ * \return
+ */
HSI_STATUS GetDIO(UINT IOChannel, UINT& _Status);
+ HSI_STATUS GetDIOOld(UINT IOChannel, UINT& _Status);
+ /**
+ * \brief
+ * \param IOChannel
+ * \param _Status
+ * \return
+ */
HSI_STATUS SetDIO(UINT IOChannel, UINT _Status);
HSI_STATUS GetAxisStatus(int* _Status);
HSI_STATUS GetAppPath(CString& Path);
@@ -283,7 +302,14 @@ public:
HSI_STATUS SetPositionStep(UINT AxisTypes, double Position, HSI_MOTION_MOVE_TYPE eType, double dSpeedGear);
HSI_STATUS SetPositionEx(UINT AxisTypes, double Position, HSI_MOTION_MOVE_TYPE eType, double dSpeedGear);
HSI_STATUS GetSpeedEx(UINT AxisTypes, double& Speed);
+ /**
+ * \brief 设置单轴运动速度
+ * \param AxisTypes
+ * \param Speed
+ * \return
+ */
HSI_STATUS SetSpeedEx(UINT AxisTypes, double Speed);
+ HSI_STATUS SetSpeedExOld(UINT AxisTypes, double Speed);
HSI_STATUS GetAccelerationEx(UINT AxisTypes, double& Accel);
HSI_STATUS SetAccelerationEx(UINT AxisTypes, double Accel);
HSI_STATUS SetTriggerLight(int triggleNum, int delayLighting, int delayLightBefor, int triggleMode,
diff --git a/HSI_HexagonMI_EF3/version.h b/HSI_HexagonMI_EF3/version.h
index 64155d7..97831f4 100644
--- a/HSI_HexagonMI_EF3/version.h
+++ b/HSI_HexagonMI_EF3/version.h
@@ -12,5 +12,5 @@
#define HSI_VERSION_REVNUM
#define HSI_VERSION_BUILD_DATE _T(__DATE__ )
#define HSI_VERSION_BUILD_TIME _T(__TIME__ )
-#define HSI_FILE_DESCRIPTION "2022.10.19 / 20:17 "
-#define HSI_FILE_CSDESCRIPTION _T("2022.10.19 / 20:17 ")
+#define HSI_FILE_DESCRIPTION "2022.10.20 / 12:06 "
+#define HSI_FILE_CSDESCRIPTION _T("2022.10.20 / 12:06 ")
diff --git a/HSI_SEVENOCEAN_EF1_CsTest/HSI/HSI.cs b/HSI_SEVENOCEAN_EF1_CsTest/HSI/HSI.cs
index 69a3f69..e37e7b5 100644
--- a/HSI_SEVENOCEAN_EF1_CsTest/HSI/HSI.cs
+++ b/HSI_SEVENOCEAN_EF1_CsTest/HSI/HSI.cs
@@ -177,8 +177,8 @@ namespace HSI_SEVENOCEAN_EF1_CsTest.HSI
[DllImport("HSI.dll", EntryPoint = "HSI_MOTION_ABORT_MOTION", CharSet = CharSet.Unicode)]
public static extern Def.HSI_STATUS AbortMotion();
- //[DllImport("HSI.dll", EntryPoint = "HSI_MOTION_GET_DIO", CharSet = CharSet.Unicode)]
- //public static extern Def.HSI_STATUS GetDIO(uint ioChannel, ref uint status);
+ [DllImport("HSI.dll", EntryPoint = "HSI_MOTION_GET_DIO", CharSet = CharSet.Unicode)]
+ public static extern Def.HSI_STATUS GetDIO(uint ioChannel, ref uint status);
//[DllImport("HSI.dll", EntryPoint = "HSI_MOTION_SET_DIO", CharSet = CharSet.Unicode)]
//public static extern Def.HSI_STATUS SetDIO(uint ioChannel, uint status);
diff --git a/HSI_SEVENOCEAN_EF1_CsTest/bin/Debug/Config/EF3_Config.ini b/HSI_SEVENOCEAN_EF1_CsTest/bin/Debug/Config/EF3_Config.ini
index ad11e48..aeeaa9a 100644
Binary files a/HSI_SEVENOCEAN_EF1_CsTest/bin/Debug/Config/EF3_Config.ini and b/HSI_SEVENOCEAN_EF1_CsTest/bin/Debug/Config/EF3_Config.ini differ