산업기술/Fastech

FAS_MoveLinearAbsPos/FAS_MoveLinearIncPos 실행 시, FMM_INVALID_SLAVE_NUM을 리턴하는 경우

야곰야곰+책벌레 2022. 2. 10. 11:38
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
반응형