TURBO PMAC QNA 게시판입니다.

궁금한점 있으시면 문의하세요. 답변은 댓글로 되어집니다.
 
내용에 그림을 삽입을 원할 경우, 파일첨부를 한 뒤 "본문 삽입"을 하시면 그림을 삽입 할 수 있습니다.

DeviceDPRGetVel() 함수사용 중 문제사항 문의드립니다.

조회수 4455 추천수 0 2017.05.16 10:11:35
iNT [주소복사 ->]    

안녕하세요.


몇 차례 문의드리고 교육도 받고 하면서 개발 진행 중

추가 문의드립니다.


DeviceDPRGetVel() 사용하여 Velocity 값을 읽어오는 도중 수차례 쓰레기 값을 읽어오는 현상입니다.

코드는 대략 아래와 같습니다.


mbDPRAvailabled = DeviceDPRAvailable(mdwDeviceNo);

if (mbDPRAvailabled) {

            mbDPREnabled = DeviceDPRRealTimeEx(mdwDeviceNo,

                0x0F, // Motor 1, 2, 3, 4

                100, // 100 servo cyle 마다 한번 씩 (1 servo cycle = 0.442 msec)

                TRUE);

}


int Read()

{

...

if (mbDPREnabled) {   // DPR 

            double dVelocity[TOTAL_MOTORS];

if (DeviceDPRUpdateRealtime(mdwDeviceNo)) {

for (int i = 0; i < TOTAL_MOTORS; i++) {

                    dVelocity[i] = DeviceDPRGetVel(mdwDeviceNo, i, 1000.0);

}

}

for(auto pos : dVelocity) {

printf("%lf", pos)

}

...

}


대략적으로 코드는 위와 같으며,

상위에서 Read() 함수를 200ms 마다 call 하게 됩니다.


로그 일부를 보면 아래와 같이 정상적인 값을 읽다가도

의미를 알 수 없는 값을 매우 빈번하게 읽어오기도 합니다.

[2017-05-16 09:57:48.106253] (0x000157fc) [debug] 8.624349 

[2017-05-16 09:57:48.112258] (0x000157fc) [debug] 8.599609 

[2017-05-16 09:57:48.119264] (0x000157fc) [debug] 0.000000 

[2017-05-16 09:57:48.125268] (0x000157fc) [debug] 0.000000 


[2017-05-16 09:57:48.334436] (0x000157fc) [debug] -92559631349317830736831783200707727132248687965119994463780864.000000 

[2017-05-16 09:57:48.339440] (0x000157fc) [debug] -92559631349317830736831783200707727132248687965119994463780864.000000 

[2017-05-16 09:57:48.343443] (0x000157fc) [debug] -92559631349317830736831783200707727132248687965119994463780864.000000 

[2017-05-16 09:57:48.347446] (0x000157fc) [debug] -92559631349317830736831783200707727132248687965119994463780864.000000  


DeviceDPRRealTimeEx() 함수에서 읽어오는 주기를 1000 Servo Cycle 까지 변경 해보았는데도 현상은 마찬가지였습니다.

혹시나 이 문제에 대하여 조언해주실 만한 내용 있으면 부탁드리겠습니다.


감사합니다.


iNT

2017.05.16 12:01
 

조금더 테스트 해보니,

DeviceDPRUpdateRealtime() 함수의  결과 값이 Return되기 전에 DeviceDPRGetVel()를 실행하였고,

결국 DeviceDPRGetVel()가 실행되지 않은 상태의 배열을 읽어서 쓰레기 값이 출력된 것 같습니다.

어느 정도의 delay time이 필요한 것인가요?

deltatau

2017.05.16 19:37
 
항상 저희 제품을 사용해 주셔서 감사합니다.

DeviceDPRGetVel() 함수 문제가 아니라 위의 코드가 일부 문제 있어 보입니다.
아래의 코드에서 만약 if (DeviceDPRUpdateRealtime(mdwDeviceNo)) 문장에서 False 경우 dVelocity[i]에 무슨 값이 들어가는 지 확인하셨나요?
DeviceDPRGetVel()은 타이밍과 관련이 없으니 구현하신 코드를 다시 확인해보시기 바랍니다.

       if (mbDPREnabled) {   // DPR 

            double dVelocity[TOTAL_MOTORS];

if (DeviceDPRUpdateRealtime(mdwDeviceNo)) {   // False 일 경우

for (int i = 0; i < TOTAL_MOTORS; i++) {

                    dVelocity[i] = DeviceDPRGetVel(mdwDeviceNo, i, 1000.0);  // dVelocity[i]가 어떤 값이 들어가나요?

}

}

for(auto pos : dVelocity) {

printf("%lf", pos)

}

       }



그럼.. 항상 즐거운 하루 되십시요.

iNT

2017.05.17 10:27
 

답변 감사드립니다.


1. 말씀하신 것 처럼 DeviceDPRUpdateRealtime(mdwDeviceNo) 함수가 False를 리턴 하는 경우에 이런 현상이 발생하는게 맞습니다.

타이밍에 대한 문의를 드린 것은  DeviceDPRUpdateRealtime(mdwDeviceNo) 함수에 대한 것이였으며,

이 함수의 리턴값을 로그로 찍어보면 아래와 같이 True / False가 유동적으로 나타납니다.

제가 궁금한 사항에 대하여 전달을 잘 못한 것 같습니다.

Server Start!

The server is running. Data Logging Start!

Server Start Success!

DeviceDPRUpdateRealtime() 1

DeviceDPRUpdateRealtime() 0

DeviceDPRUpdateRealtime() 1

DeviceDPRUpdateRealtime() 0

DeviceDPRUpdateRealtime() 1

DeviceDPRUpdateRealtime() 0

DeviceDPRUpdateRealtime() 1

DeviceDPRUpdateRealtime() 0

DeviceDPRUpdateRealtime() 1

DeviceDPRUpdateRealtime() 0

DeviceDPRUpdateRealtime() 1

DeviceDPRUpdateRealtime() 0

DeviceDPRUpdateRealtime() 1

DeviceDPRUpdateRealtime() 0

DeviceDPRUpdateRealtime() 1

DeviceDPRUpdateRealtime() 0

DeviceDPRUpdateRealtime() 1

DeviceDPRUpdateRealtime() 0

DeviceDPRUpdateRealtime() 1

DeviceDPRUpdateRealtime() 0

DeviceDPRUpdateRealtime() 1

DeviceDPRUpdateRealtime() 0

DeviceDPRUpdateRealtime() 1

DeviceDPRUpdateRealtime() 0

DeviceDPRUpdateRealtime() 1

DeviceDPRUpdateRealtime() 0

DeviceDPRUpdateRealtime() 1

DeviceDPRUpdateRealtime() 0

DeviceDPRUpdateRealtime() 1

DeviceDPRUpdateRealtime() 0

DeviceDPRUpdateRealtime() 1

DeviceDPRUpdateRealtime() 1

이러한 현상이 나는 원인과 해결책에 대하여 조언해주실 부분이 있으면 말씀해주세요.


2. Pmac Suite 설치시 함께 설치되는 예제(PmacTest - DPRRealTime.cpp)를 참고해보면 해당 함수를 사용할 때

아래와 같이 리턴 값의 True / False 여부를 확인하지 않고 DPRGet***() 함수들을 사용하고 있습니다.

 m_pDoc->DPRUpdateRealtime();  <------- True / False 확인 안함.


int servotimer = m_pDoc->DPRGetServoTimer();

sprintf(buf,"%d",servotimer);

m_ServoCounter.SetWindowText(buf);

double aDouble = m_pDoc->DPRPosition(iCurrentMotor-1,1);

sprintf(buf,"%11.1lf",aDouble);

m_ActualPosition.SetWindowText(buf);

이와 같이 사용해도 문제가 없는지 문의드립니다.


문의 드리기 전에 위와 같이 사용하고 테스트를 했더니 값이 정상적으로 올라옵니다.

값이 계속 변하는 것을 보니 업데이트가 되고 있는 것으로 생각됩니다.

다만 이렇게 사용해도 되는지 확인이 필요하여 문의드립니다.


3. 추가 적으로 단위에 관한 질문입니다.

M166을 온라인 커맨드로 날리면 Actual Velocity 값이 리턴되는데

메뉴얼에 보면 단위가 (1/[Ixx09*32] cts/cyc) 이라고 명시되어 있습니다.

또한 DeviceDPRGetVel() 함수로 얻어지는 Actual Velocity의 단위 또한 (1/[Ixx09*32] cts/cyc) 라고 명시되어 있습니다.


Ix09의 값은 확인해본 바로 96입니다. 96*32 = 3072

결국 DeviceDPRGetVel() 함수의 마지막 인자로 3072.0를 넣어주면 단위가 cts/cyc로 되는 것 같은데

단위를 맞춰주기 위해 곱해준 값인데 인자로 1.0을 넣을 때와 값이 달라집니다.

계산이 어떻게 되는건지 궁금합니다.


M166으로 얻어진 값을 3072로 나눈 값과

DeviceDPRGetVel() 함수의 마지막 인자로 3072.0를 넣어서 나온 값이 유사한데..

뭔가 잘 이해가 잘 안되네요.


결론만 말씀드리면,

DeviceGetResponse(mdwDeviceNo, response, 255, "M166");

DeviceDPRGetVel(mdwDeviceNo, i, 1.0);


두가 지 방법으로 얻어진 Velocity 값을 counts/servo cycle, counts/msec 등으로 변환을 하기위한 조언을 부탁드립니다.



감사합니다.

deltatau

2017.05.17 15:00
 
항상 저희 제품을 사용해 주셔서 감사합니다.

DeviceDPRUpdateRealtime 함수에서 DPR에 Update가 되면 True, 그렇지 않으면 False가 반환됩니다.
False가 반환된 것은 DPR에 Update가되 되었는데 사용자가 읽어가지 않은 상태에서
다시 DeviceDPRUpdateRealtime 함수를 실행하여  발생될 수도 있습니다.
예제처럼 반환 값을 확인하지 않아도 상관 없으며 True 일때만 DPR 값을 읽어오는 것도 괜찮습니다.
DeviceDPRGetVel의 단위는 전에도 설명 드렸듯이
 out = position / posscale
입니다.
위 공식대로 3072.0를 넣으면 나눈 값이 맞습니다.

저희 오므른 델타타우 코리아는 기술지원 부서가 따로 없어서 고객님의 요구사항에 맞게 맞춤식 지원이 어렵습니다.
모든 기술 지원은 한국오므론제어기기로 이관되었으니 대리점 또는 한국오므론제어기기로 연락하셔서 기술지원 및 교육 받으시기 바랍니다.

그럼.. 항상 즐거운 하루 되십시요.
List of Articles
번호
제목
글쓴이 날짜 조회수
1975 CMD vel 가 떠든 증상 file [1] Mr.Han 2017-07-10 4274
1974 ACC 24E2A카드로 스테핑모터 셋팅하는 방법 문의 [1] 주주주주주주 2017-07-06 4022
1973 UMAC <--> PLC(OMRON, 미쓰비시) EXCOM 통신 문의 [1] UMAC123 2017-05-14 5838
1972 장비를 킨 후 원점을 잡는 과정에서 일부 문제가 있습니다 [1] jace 2017-06-21 7076
1971 장비를 보호하면서 서보 제어 실험이 가능한지요? [1] 도전자 2017-06-21 3967
1970 모션프로그램에서 축 속도와 TA와의 관계 문의 [1] 홍재희 2017-06-19 4559
1969 직선(대각선) 보간 처리 방법 문의 [1] 박성우 2017-06-19 3654
1968 보정테이블 [1] 요괴인간 2017-06-14 3637
1967 최대속도가 307247.04Cts/s 이상 안되네요 [3] 홍재희 2017-06-01 4274
1966 Turbo PMAC - Axislink-32 통신 문의 [1] 햄볶는달팽이 2017-05-15 4070
1965 I/O신호 오동작 file [1] PID튜닝 2017-05-26 3724
1964 인포지션 밴드 관련 문의 [1] M4 CS 2017-05-27 3712
» DeviceDPRGetVel() 함수사용 중 문제사항 문의드립니다. [4] iNT 2017-05-16 4455
1962 UMAC IP주소 변경 관련 질문 [1] 피롭모션 2017-05-10 4142
1961 모션 프로그램 관련 질문드립니다. [1] 피롭모션 2017-04-26 4674
1960 DPRAM 사용 문의 드립니다. [1] iNT 2017-04-26 4323
1959 Motion Program과 PLC Program의 차이점 [1] 담덕대마왕 2017-04-26 4364
1958 TINI32보드 문의 [1] 초보FA 2017-04-25 3880
1957 Pmac Plot 에러 문의 file [2] gyucholly 2017-04-20 3998
1956 로터리 버퍼 에러 (?) [1] bychul2 2017-04-18 3990