[개발 일지] Snet Test Program

타키탸키·2022년 2월 9일
0

개발 일지

목록 보기
4/11

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
      • for loop 활용
      • position 배열
    • 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
    • 유선/무선 시간 차이 실험
      • 유선이 1초(1000msec) 가량 더 빠름
    • 왕복 구동 중 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보다 시간 평균과 표준 편차가 더 낮음
    • timeBeginPeriodtimeEndPeriod
      • time resolution을 높여주는 윈도우 API
      • sleep 함수의 시간 오차를 줄이기 위해 사용
      • 사용 결과, 해상도를 높이기 전보다 평균과 표준 편차에서 유의미하게 더 낮은 수치를 보임

  • 03.02
    • timer를 통해 실시간으로 갱신되는 command position을 보여주는 display 기능 추가
    • Document에 수정한 내용 반영
      • stopwatch
    • 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를 고정 값이 아닌 사용자 입력 값을 사용하도록 변경
      • 0번 축이 아닌 다른 축도 구동 가능하다
  • 03.04
    • FormInterruptEvent 생성
      • 버튼을 통해 구동 방식(ptp, 보간) 선택 가능
      • 구동 방식에 따라 입력 값을 달리 설정할 수 있도록 여러 form으로 분화
      • FormSinglePTP, FormSingleLine 구현 완료
  • 03.07
    • FormMultiPTP 구현 완료
      • 다축 PTP 구동을 위한 Form
    • 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을 실행하는 DoJobInterruptDoJobPollingDoJob으로 통일
    • 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하는 코드 제거
      • StopJob 함수와 코드가 중복되어 제거
    • PollingInterruptEvent 방식 사이의 종속성 제거
      • 두 타입의 설정 기준이 Event 라디오 버튼의 checked 여부로 결정
      • Polling은 Polling 라디오 버튼에 따라 설정되도록 변경
      • Polling 방식은 interrupt table을 설정할 필요 없으므로 관련 함수 제거
    • InitInterruptTable 함수 내에 ClearInterruptEventTable 함수 추가
      • Function 방식으로 테스트 후, Event 방식으로 테스트할 때, count 1이 남아있는 문제
      • Table 설정을 등록하기 전에 이전에 사용한 데이터를 clear함으로써 해당 table 정보를 읽지 못하게 한다
    • Release 버튼 추가
      • ReleaseWaitingInterruptEventIsWaitingInterruptEvent API 추가에 따른 업데이트
      • Release 버튼을 클릭하면 StopWait 함수 호출하여 대기 상태 체크 후, release 진행
      • release 완료 시, MessageBox를 띄운다
      • 서보가 연결 안 된 축들을 대상으로 테스트 진행 >> 정상 동작 확인
  • 04.04
    • Oneshot 테스트 코드 추가
      • 인터럽트를 한 번만 발생시키는 oneshot 기능 추가
    • 원활한 실험을 위해 time count 기준을 왕복이 아닌 편도로 지정
      • queue count를 DoJob 함수에서 정의하지 않고 RepeatJob에서 확인
      • repeatNum 값 조정
    • Function 방식의 첫 값이 튀는 문제
      • 기존 코드에서는 튀는 값을 제외하고 결과 산출
      • oneshot 기능 추가에 따라 첫번째 값 복구
profile
There's Only One Thing To Do: Learn All We Can

0개의 댓글