
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 기능 추가에 따라 첫번째 값 복구