[개발 일지] SNET ECAT Configurator

타키탸키·2022년 12월 20일
0

개발 일지

목록 보기
9/11

12.19

객체 다이어그램

  • 메시지 브로커가 변경되어도 클라이언트 코드에는 영향을 주지 않는다

클래스 다이어그램

  • 메시지 브로커를 유연하게 변경할 수 있도록 런타임 연결 구현체가 메시지 브로커의 구현체가 아닌 인터페이스에 의존하도록 설계하였다
  • 추후 런타임 연결부가 변경될 것을 고려하여 인터페이스화 했다

분리

  • 객체의 사용 영역과 객체를 생성하고 구성하는 영역으로 분리했다
  • RuntimeCreator가 객체의 생성과 구성을 도맡음에 따라 메시지 브로커가 변경되어도 사용 영역의 코드에 영향을 주지 않도록 설계했다

업데이트

  • 런타임 연결부와 메시지 브로커의 역할을 분리했다
    • 공유하고 있던 메서드를 역할에 따라 분리했다
    • 런타임: Initialize, Connect, Status, Error
    • 메시지 브로커: Connect, Read, Send
  • RuntimeCreator
    • 의존성 주입을 위한 설정용 구조체
    • 런타임 연결부를 수정하지 않고 메시지 브로커를 변경할 수 있다
    • 생성자 DI를 통해 메시지 브로커 타입을 결정할 수 있다
    • 원하는 메시지 브로커 객체를 런타임 메시지 브로커 객체를 생성하는 RuntimeMessageBroker 함수의 반환값으로 넣어준다
    • RuntimeConnection 함수에서 해당 함수를 호출하여 런타임 연결 구현체의 생성자에 원하는 메시지 브로커 객체를 주입할 수 있다
    • 메시지 브로커 타입을 변경하고 싶을 때는 해당 함수의 반환값만 변경하면 된다
  • 런타임 연결 구현체의 생성자
    • 메시지 브로커 객체를 주입 받기 위해 생성자가 필요하다
    • Go에는 생성자 개념이 없다
    • 구조체를 초기화 하려면 구조체가 속하는 패키지 내부에 생성자 함수를 정의해야 한다
      • 함수 이름으로 New + 구조체 이름으로 설정하는 것이 관례이다
    • 초기화 후에는 초기화 된 구조체를 반환한다
    • 메시지 브로커 타입은 생성자에서 결정하고 나머지 멤버인 Device는 Initialize 함수를 통해 설정되도록 설계했다

12.20

업데이트

  • 런타임 연결 구현체에서 InitializeImpl 함수 삭제
    • 런타임 메시지 브로커 객체를 주입하는 InitializeImpl 함수를 삭제
    • 객체 생성과 주입 코드를 분리하지 않고 생성자 하나로 두 과정을 모두 진행하도록 코드 변경
  • Redis 연결을 종료하는 코드 분리
    • defer를 통한 지연은 하나의 프로세스 안에서 유효하다
    • 연결 종료 코드를 각각의 수행(send, read) 코드의 끝 부분에 추가
    • 추후, 병행성 처리를 고려하여 하나의 defer로 연결 종료를 지연하도록 설계할 예정
  • main 함수 변경
    • main에서 직접 Redis 코드를 사용하지 않고 RuntimeConnection 객체 생성 시 주입된 Redis 객체를 활용하도록 코드 변경
    • Initialize 함수를 통해 타겟 디바이스 설정
    • 런타임 연결 구현체의 Connect 함수를 호출하여 간접적으로 Redis와 연결
  • 테스트를 위한 임시 조치
    • Send 함수의 파라미터를 map[string]string에서 string으로 변경
    • Read 함수의 파라미터를 구조체 포인터에서 string 포인터로 변경
    • PUBLISH가 아닌 SET으로 간단한 동작 확인
  • 런타임과 함께 테스트 진행
    • 런타임이 보내오는 데이터에 따라 구조체 생성
      • Error Code, Error Description, Status
    • 데이터를 JSON으로 송신하기 위한 marshalling 코드 추가
      • byte 슬라이스로 변환하여 전송
    • 수신한 데이터를 브라우저 상에 띄움

런타임 사용 방법

  1. 콘솔창을 열어 런타임 실행 명령어 입력
  2. 제어기 전원 ON
  3. Redis Client 실행
  4. (테스트용) PUBLISH 명령어 실행 - escape sequence for JSON
  5. (테스트용) HGETALL 명령어 실행

12.21

  • RedisMessageBroker 구조체 멤버 추가
    • Redis에 연결 시, 넘기는 파라미터를 고정값이 아닌 변수로 설정
    • 이에 필요한 networkip 인자를 멤버로 추가
    • main에서 설정할 수 있도록 Initialize 함수에 파라미터로 추가
    • ip는 사용 전에 :6379 포트와 concat
  • goroutine 추가
    • 연결 상태를 실시간으로 받아오기 위한 병행성 처리
    • 원하는 status 값을 받아올 때까지 무한루프
    • 원하는 status 값을 받으면 루프를 탈출하여 브라우저에 결과 띄움
    • channel을 통해 데이터 전송
    • select를 통해 조건에 따라 분기 가능
  • timeout 추가
    • 무한루프 방지를 위한 timeout 설정
    • channel과 time.After를 통해 쉽게 구현 가능
    • 루프를 돌다가 설정한 시간을 초과할 때까지 탈출하지 못하면 timeout 처리

12.22

  • disconnect 함수 추가
    • 연결 상태를 확인하기 위해 disconnect 기능 추가
  • connstate 핸들러 추가
    • 연결 상태를 담당하는 connection state 확인용 핸들러
  • route 변경
    • connect state는 index에서 처리
    • connect와 disconnect는 각자의 이름의 route에서 처리
  • 무한루프 탈출 조건 변경
    • 기존에는 Connected 상태를 받으면 탈출하도록 설정
    • 다양한 상태를 받아야 하므로 메시지가 빈 문자열이 아니면 탈출하도록 코드 변경
  • Connect 구조체 추가
    • 테스트를 위한 임시 데이터
    • Status 값을 제외한 나머지 값들을 임의로 채워놓고 JSON으로 인코딩하여 브라우저에 전송
  • 클라이언트에 상태 갱신 기능 추가
    • useState 훅을 통해 연결 상태 데이터 갱신
      • 수신할 데이터에 맞게 객체로 초기화
    • useEffect 훅을 통해 랜더링할 때마다 갱신된 데이터 반영되도록 설정
      • setConnection에 응답으로 받아온 데이터를 인자로 전달
    • disconnect 버튼 추가
    • form에 connection status를 받아올 때만 상태가 표시되도록 하는 코드 추가
      • JSX 문법에 따라 삼항 연산자로 구현
  • ip 변경
    • 외부에서 접근 가능하도록 localhost에서 구체적인 ip 주소로 변경

12.23

업데이트

  • Status 함수 이름 변경
    • 연결 상태를 읽어오는 Status 함수
    • 다른 용도를 위해 설계되었다는 점이 보고됨에 따라 Connection으로 이름 변경
  • Read 함수 파라미터 변경
    • 테스트를 위해 설정했던 string에서 구조체 타입으로 변경
    • 테스트용 Connect 구조체 제거
      • Read에서 가져온 구조체 값을 직접 활용
  • RuntimeConnection 인터페이스 삭제
    • 추후 RuntimeConnection 기능의 변화가 없을 것으로 판단되어 삭제
    • 기존 RuntimeConnectionImpl로 대체

클래스 다이어그램

  • RuntimeConnection은 구체 클래스로 활용
    • 추후 변경 사항이 고려되지 않음

결과


  • union 데모 시연
    • 회의실 인터넷으로 접근 가능 확인
    • 동시에 노트북으로 접근 가능 확인
      • 회의실 인터넷에서 연결하면 노트북으로도 동일하게 연결 상태 확인 가능

12.26

  • package 이름 변경
    • 테스트를 위해 rconntmp로 설정했던 패키지의 이름을 rtconn으로 변경
    • rconn 패키지 삭제

12.27

  • EtherCAT 관련 struct 생성
    • ethercat 패키지 생성

12.29

  • EtherCAT 관련 sturct의 Method 로직 구현(임시)
    • 함수 선언 및 타입 매칭

12.30

  • Scan 기능 레이아웃
    • 병행 처리를 위한 goroutine 추가
  • ConnInfo struct 이름 변경
    • ConnInfo의 필드가 여러 기능에서 재활용 되는 만큼 connection에 한정되지 않도록 이름 변경
    • 변경된 이름: StatusInfo
  • Node 정보를 위한 NodeInfo struct 생성
    • 실제 Node를 담을 Node 멤버 변수의 타입을 [][]byte로 설정
      • 추후 변경 예정
    • byte 형으로 넘어오는 데이터를 Node Count 값만큼 받아야 한다
      • 동적 할당
  • Node 정보를 읽기 위한 ReadNode method 추가
    • 기존 Read method가 파라미터로 StatusInfo를 받으므로 NodeInfo를 받을 수 있는 새로운 함수가 필요
      • 임시 method
      • 추후에 Read method 하나로 두 타입을 다 받을 수 있도록 설계 재검토 예정
profile
There's Only One Thing To Do: Learn All We Can

0개의 댓글