Snet Test Program
- Snet 모션 제어기 기능 추가에 따른 테스트 프로그램 제작
세부 일정
- 02.09
- Snet Api 연결
- 최신 dll 파일을 project 디렉토리의 Debug 파일에 넣음
- namespace(
EMotionSnetBase
) 추가
- Connect, Disconnect 기능 구현
- 02.14
- Interrupt UI 추가
- start button 이벤트 코드 작성
- C의
timeGetTime
함수 marshalling
PollingThread
클래스 생성 후 로직 분리
- point-to-point move
dwell
- dwell 시간만큼 이송 정지
Thread.Sleep
- Snet 기기와 연결 test
- 02.15
- Job class 추가
Job
: 일련의 동작 모음
- `
switch case
구문 활용
- 토큰 번호에 따른 job을 반복 수행한다
- Job list를 생성하는 함수와 Job list 배열을 생성하는 함수 작성
- Job과 PollingThread 기능 분화
- Form과 PollingThread 분리
- Form-Job-PollingThread
Job Move
함수 추가
switch case
를 통해 축 별로 move 연속 동작
- 02.16
- 유선/무선 시간 차이 실험
- 왕복 구동 중 motion done을 빨리 발생하는 오류 수정
- move 함수를 모두 실행한 후에 motion done check하는 것으로 수정
- Snet 2번 축 오류에 따라 3번 축 구동
- 케이블을 꽂았다 빼면 amp fault 오류 발생
- 원인: 제어기와 실제 연결된 축으로, 케이블을 빼면 fault 오류 발생
- Repeat Number 설정을 위한 반복 구동 구현
- 앞서 발생한 early motion done check error 발생
- 기존 motion done 구현 코드를 수정함으로써 해결(
매뉴얼을 잘 읽자😂😂😂)
- motion done 상태가 확인되면 dwell만큼 휴식 후 loop 탈출
- Job List에 Repeat Number 인자 추가
- Repeat Number 적용 후에도 동작 성공 확인
- 02.18
- pollingThread 클래스를 제거하고 Waiting 클래스 생성
- IController 인터페이스 - Polling 클래스 / Interrupt 클래스
- Polling 클래스에서는 polling motion done을, Interrupt 클래스에서는 interrpt mtion done을 체크한다
- Job 목록의 자료 구조를 List에서 Queue로 변경
- Queue를 생성하고 repeatNum만큼 for loop를 돌면서 Queue에 작업을 추가(lambda)한다
- 스레드로 Job 실행 함수를 호출
- Task와 async await을 활용하여 하나의 task가 끝날 때까지 대기 후, 최종적으로 계산된 수행 시간을 메세지 박스에 띄운다
- Job 실행 함수 내부에서 motion done을 체크하고 motion done 시, Job을 실행한 후에 Queue에서 제거한다
- 02.21
- SnetTestProgram 문서화
- StopWatch 브랜치 생성 후, timeGetTime과 기능 비교
- StopWatch 사용 시, timeGetTime보다 시간 평균과 표준 편차가 더 낮음
timeBeginPeriod
와 timeEndPeriod
- time resolution을 높여주는 윈도우 API
- sleep 함수의 시간 오차를 줄이기 위해 사용
- 사용 결과, 해상도를 높이기 전보다 평균과 표준 편차에서 유의미하게 더 낮은 수치를 보임
- 03.02
- timer를 통해 실시간으로 갱신되는 command position을 보여주는 display 기능 추가
- Document에 수정한 내용 반영
- child form title 변경
FormConnect
>> Connect
FormInterrupt
>> Interrupt
- logger 클래스 추가
- 로그 파일을 작성하기 위한 클래스
- motion done time 확인이 끝나면 로그 파일에 기록을 남긴다
- Log child form 추가
- log history를 볼 수 있는 form
- Load 버튼을 통해 기록된 로그 파일을 리스트뷰로 불러온다
- 03.03
axis 선택을 위한 checkbox 제작
- 보간 운동을 위한 축과 위치 text box 추가
- 4개의 축과 4개의 위치를 받을 수 있다
- 결과를 위한 display box도 4개로 추가
- 다축 직선 보간 운동, 다축 원호 보간 운동 테스트 코드 작성
- 단축 왕복 운동에서 axis를 고정 값이 아닌 사용자 입력 값을 사용하도록 변경
- 03.04
FormInterruptEvent
생성
- 버튼을 통해 구동 방식(ptp, 보간) 선택 가능
- 구동 방식에 따라 입력 값을 달리 설정할 수 있도록 여러 form으로 분화
- FormSinglePTP, FormSingleLine 구현 완료
- 03.07
- FormMultiPTP 구현 완료
- textbox 공백에 대한
TryParse
return 값이 0이 됨에 따라 axis 0으로 인식하는 문제
TryToParse
함수 추가
- TryParse가 실패하여 0을 반환하면 -1을 axis 값에 넣는다
- axis 값이 -1이면 axisCnt 값이 올라가지 않고 display에도 표시되지 않는다
private static int TryToParse(string txt)
{
int ax;
bool result = int.TryParse(txt, out ax);
if (result)
return ax;
else
return -1;
}
- 03.08
- MultiPTP 축 간 소요 시간 측정을 위해 task 분리 작업 중
- SNET API 업데이트에 따른 SnetDevice 클래스 갱신
- 03.10
- InterruptWait 클래스에
WaitMotionDone
함수 추가
- event 방식으로 구현
- interrupt table 값 설정 후, interrupt를 enable 한 뒤에 interrupt wait
Job 클래스에 InterruptWait 인스턴스 생성
job을 실행하는 DoJobInterrupt
함수 추가
- 각각의 Wait 객체를
IControllerWait
인터페이스로 통일
- job을 실행하는
DoJobInterrupt
와 DoJobPolling
을 DoJob
으로 통일
- Connect 실패를 대비하여
try catch
문 추가
- FormInterrupt에 Polling과 Interrupt 방식을 나눠줄 checkbox 추가
SetWait
함수에 의해 IControllerWait
인터페이스에 들어가는 클래스가 달라진다
- InterruptWait 클래스의 WaitMotionDone 함수 수정
- 이송 중(!motionDone)일 때, motion done interrupt를 기다린다
- 이미 motion done 상태이면 interrupt가 발생하지 않기 때문
- 03.11
- Checkbox >> Radiobox
- 중복 선택 방지를 위해 Radiobox로 변경
- 버그를 수정한 dll 파일 갱신
- 비트 연산자 오류
- push 함수 내부에서 wait을 release하는 함수 부재
- 디버그 테스트를 위한 반복 실행 구현
- job을 생성하는 부분에서 repeat을 실행하는 기존 코드로부터
RepeatJob
함수를 통해 DoJob
을 여러번 수행하는 코드로 수정
- motion done이 확인되었을 때, dequeue가 되므로 queue 사본을 만들어 계속해서 새로운 queue가 돌 수 있도록 설정
- 시간을 중첩해서 반환할 수 있도록 total 변수 안에 갱신되는 time을 삽입
- Max, Min, Avg를 계산해주는
CalcTime
함수 설계
- Max는 리스트로 받아 아웃라이어 처리
- Min과 Avg는 하나의 값으로 통일
- 03.14
- 버그를 수정한 dll 파일 갱신
- 비트 연산자는 문서와 api 상의 axisType이 달라 발생한 문제
- push 함수 내부에 release 함수 추가
- Max, Min, Avg 각각의 연산에 따른
CalcTime
함수 구현
- 로그에 max, min, avg 기록
- max 값은 maxList 중 가장 큰 3개의 값을 내림차순으로 보여준다
- Polling vs. Interrupt(Event 방식)
- 각각 10회씩 반복 구동한 결과
Interrupt Event
방식이 매우 빠른 편
- 03.15
- interrupt Routine 실행을 위한 라디오 버튼 및 InterruptRoutine 클래스 추가
IControllerWait
을 구현하는 클래스
WaitMotionDone
함수 구현
- EventWaitHandle을 통해 interrupt 발생 여부 check
- InterruptRoutine 클래스의
InitInterruptTable
함수 인자 변경
- Radio button 이벤트가 다른 라디오 버튼들과 독립적이므로 bool 인자 받을 필요 없음
- 03.16
- EventWaitHandle 적용 완료
- 콜백 함수 내부에서 eventWaitHandle 객체
.Set()
WaitMotionDone
함수에서 motion done을 체크하고 eventWaitHandle 객체를 .WaitOne()
후, .Reset()
avg
계산 결과 오류
avg
연산은 가장 마지막에 나온 total 값을 count 값에 나눠주면 되기 때문에 따로 함수로 정의할 필요 없음
- 따라서,
CalcTimeAvg
함수 삭제 후에 반복문 밖에서 avg 연산 정의
- Logger 코드 추가
- 하나의 Job 당 time을 리스트에 추가하여 전체 sequence에서 도출된 time 값을 log에 남김
- API 파일 갱신
- 회의 결과에 따라 기존 콜백 함수를 활용한
InterruptEventRoutine
함수의 명칭을 InterruptEventFunction
으로 수정
Routine
이라는 이름을 가진 코드 전체 수정
- Radio Button 초기값 수정
- event가 change되지 않으면 SetWait에 값이 넘어가지 않으므로 Polling 테스트 타입에 초기값 설정
- 03.17
- API에서 eventhandle을 넘기는 부분의 시간 해상도 변경
- timeBeginPeriod / timeEndPeriod
- Debug 코드와 EventHandle을 set하는 코드 자리 변경
- I/O 출력에 걸리는 시간이 더 오래 걸림에 따라 set을 먼저 한 후, Debug 코드 출력
- 기존 코드에 비해 경과 시간 빨라짐
- 두 번 연속 동작 시, Queue에 data가 쌓인 상태로 시작하지 않도록
.Clear()
코드 추가
- List의 내용을 log에 남기기 위해
WriteLogList
함수 추가
- 처음 원소만 날짜와 함께 출력
- 10의 배수 인덱스마다 줄 바꿈
- 무한 구동 시, min 값 오류 수정
- min 값에 time이 아닌 total 값이 잘못 들어감
- Count display 추가
- 무한 구동 중 count 수를 알기 위해 timer 추가
- 03.21
startPos-endPos-startPos
에서 startPos-endPos
로 구동 방식 변경
- OS 업데이트에 따라 지령 위치와 시작 위치를 설정해야 한다
maxList
코드 변경
- 리스트를 내림차순으로 정렬하던 기존 방식
- linq를 활용하여 maxList를 정렬하고
.Take()
를 통해 원하는 개수만큼 추출
- Timeout 에러 코드 변경
TimeOut
이 아닌 InterruptEventFailedWaiting
으로 변경
- 03.22
- 사용자 입력 시, 지령 코드와 같은 시작 위치를 입력하면 에러 메세지 띄우기
- 에러 메세지가 뜨면 Form을 닫고 프로그램을 종료한다
- 리스트의 첫번째 값 제외하기
- 리스트의 첫번째에서 에러가 나는 경우가 많으므로 더 정확한 결과를 위해 제외하기로 결정
- avg는 total에서 첫번째 리스트의 원소를 빼고 repeatNum으로 나눔
- timeList와 min도
.Skip()
을 통해 첫번째 원소를 제외한 나머지 리스트 원소에서 추출
- 최종 반환 값도 total에서 첫번째 리스트의 원소를 뺀 결과 값
InterruptFunction
방식에서 디버그 코드 제거
- I/O 출력에 따라 경과되는 시간을 감안하여 디버그 코드 제거 결정
- 기존보다 더 빠른 속도를 보임
tbType
추가
- 프로그램 구동 중, interrupt type을 보여주기 위해 display 추가
- check box에 따라
SetType
함수에 들어가는 type이 달라진다
SetType
에서 Job 클래스의 멤버 변수에 type을 넣어준다
- Log에도 interrupt type이 표시된다
- Log에
count
추가
- 03.24
.csproj
파일 삭제
- x86, x64 설정에서 오류가 발생함에 따라 설정을 기본값으로 돌리기 위해 삭제
- Job 클래스에
Type
프로퍼티 추가
- 이제 Polling이 기본값으로 설정되어 있어도 display에 자동으로 Polling이 설정된다
- 03.25
- 로그에 기록되는 카운트 변수를
repeatNum
이 아닌 cnt
로 변경
- 무한 구동 시, -1이 아닌
cnt
값이 기록된다
Job
클래스의 변수 영역 변경
- 전역 변수로 정의된
_avg
, _cnt
, _timeList
를 지역 변수로 변경
- 무한 구동을 위한 코드에서
enable == false
시, break
하는 코드 제거
Polling
과 InterruptEvent
방식 사이의 종속성 제거
- 두 타입의 설정 기준이 Event 라디오 버튼의 checked 여부로 결정
Polling
은 Polling 라디오 버튼에 따라 설정되도록 변경
Polling
방식은 interrupt table을 설정할 필요 없으므로 관련 함수 제거
InitInterruptTable
함수 내에 ClearInterruptEventTable
함수 추가
Function
방식으로 테스트 후, Event
방식으로 테스트할 때, count 1이 남아있는 문제
- Table 설정을 등록하기 전에 이전에 사용한 데이터를 clear함으로써 해당 table 정보를 읽지 못하게 한다
Release
버튼 추가
ReleaseWaitingInterruptEvent
및 IsWaitingInterruptEvent
API 추가에 따른 업데이트
Release
버튼을 클릭하면 StopWait
함수 호출하여 대기 상태 체크 후, release 진행
- release 완료 시, MessageBox를 띄운다
- 서보가 연결 안 된 축들을 대상으로 테스트 진행 >> 정상 동작 확인
- 04.04
Oneshot
테스트 코드 추가
- 인터럽트를 한 번만 발생시키는 oneshot 기능 추가
- 원활한 실험을 위해 time count 기준을 왕복이 아닌 편도로 지정
- queue count를
DoJob
함수에서 정의하지 않고 RepeatJob
에서 확인
- repeatNum 값 조정
Function
방식의 첫 값이 튀는 문제
- 기존 코드에서는 튀는 값을 제외하고 결과 산출
- oneshot 기능 추가에 따라 첫번째 값 복구