728x90
반응형
FAS_MoveLinearIncPos(BYTE nNoOfBds, int* iBdID, long* lplIncPos, DWORD lFeedrate, WORD wAccelTime)
해당 포인터 변수들은 형식을 맞춰줘야 함.
int ↔ long 사이의 변환은 문제없음.
long ↔ double 사이의 변환은 문제 있음.
struct MotionParam
{
long axisCount;
long axisList[MotionMax_Axes];
double position[MotionMax_Axes];
double velocity[MotionMax_Axes];
};
MotionParam의 위치, 속도 등은 double로 선언되어 있어, FAS_MoveLinearIncPos에 사용하려면 변수를 casting 해야 한다. 기존 코드는 32bit 운영체제에서 작성했기 때문에 아래와 같이 작성되어 있다.
PE::FAS_MoveLinearIncPos((BYTE)param.axisCount, (int *)param.axisList, (long *)param.position, (DWORD)param.velocity[0], accTime);
하지만 64bit 운영체제에서는 double을 long으로 변환하면 정확도에 손실이 생기는 경우가 발생한다.
그렇기 때문에 일 대 일로 casting 해서 사용하는 것으로 수정하였다.
long position[MotionMax_Axes];
for (int i = 0; i < param.axisCount; i++)
position[i] = param.position[i];
ret = PE::FAS_MoveLinearIncPos((BYTE)param.axisCount, (int *)param.axisList, position, (DWORD)param.velocity[0], accTime);
이 문제는 32bit 운영체제에서는 발생하지 않고, 64bit 운영체제에서는 신경 써서 확인해야 한다.
728x90
반응형