ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 배터리 셀 정보 표시 대시보드 만들기
    카테고리 없음 2025. 7. 26. 13:09

    시작하기 전에 

    아래의 요청을 받았다.

    • 배터리 셀들의 정보를 한(one) CAN 메시지(CELL_INFO)로  받는다.
    • 메시지에는 셀 아이디 (idCell) 신호와 셀의 상태 신호들(s1, s2, s3, s4)이 있다.
      • 단일 아이디의 메시지에 여러 셀들의 정보를 전송한다. 일종의 멀티플렉서이다. 
      • idCell은 4 비트 신호다. 0 .. 15 까지 16개이다.
      • 상태 신호는 s1, s2, s3, s4로 4개이다. 실제로 전압, 온도 등이다. 
    • TSMaster 그래픽스창에 셀 별로 상태 신호 (총 16 x 4 = 64개)들을 셀 별로 출력할 수 있는가? 

    가능하다. 결과는 아래 그림과 같다. 

     

    TSMaster의 그래픽스창은 시스템 변수를 표시할 수 있다는 사실을 이용하여 아래와 같이 하였다.

    • 파이썬 미니프로그램으로 64개의 시스템 변수들을 생성한다.
    • CAN 신호를 idCell과 s1, s2, s3, s4에 따라 시스템 변수들에 복사한다.
    • 그래픽스창에 시스템 변수들을 출력하도록 한다. 

    이 방법을 설명한다. 

     

     

    개요

    • 예제를 위한 dbc 만들기 (dbc가 있으면 필요 없는 작업이다. 내겐 dbc가 없다.)   
    • 파이썬 미니프로그램 작성
    • 그래픽창 설정
    • 실행 결과

     

     

    예제를 위한 dbc 만들기

    • 내가 갖고 있는 CAN 트레이스는 베뉴에서 측정한 것이다.
    • 데이터 중에 셀 아이디 (idCell)로 사용할 신호가 있는 메시지를 골라야 한다. SAS11 (0x2B0) 메시지에 MsgCount라는 4 비트 신호가 있다. 이 신호를 idCell로 사용하기로 한다.

    예제를 위해 셀 아이디로 사용할 4 비트 카운터 신호가 필요하다. SAS11 메세지의 MsgCount 신호가 적합하다.

    • 아래 그림과 같이 메시지와 신호들을 재정의하였다.

    • 메시지 이름을 CELL_INFO로 변경하였다. 메시지 아이디는 그대로두었다. CAN 트레이스를 사용하기 위해서.
    • 16 비트 SAS_Angle 신호를 8 비트 s0와 s1 신호를 재정의했다. 8 비트 SAS_Speed 신호를 s2로, 8 비트 SAS_Stat 신호를 s3로 재정의 했다. 4 비트 checksum 신호는 그대로 두었다.
    • EPT.dbc로 저장하였다.

     

     

    파이썬 미니프로그램 작성

    • 아래의 순서대로 작성하였다.
      • 미니프로그램에서 메시지를 다룰 수 있도록 EPT.dbc를 임포트한다.
      • CELL_INFO 메시지를 다룰 글로벌 변수를 선언한다.
      • CAN 신호들을 분류해서 저장할 시스템 변수들을 생성한다.
      • CELL_INFO 메시지를 수신하면, 신호들을 시스템 변수들에 분류하여 저장한다.

     

    TSMaster에서 dbc를 임포트한다.

    • 미니프로그램에서 dbc에 정의된 메시지를 읽을 수 있도록 하기 위한 목적이다. 
    • 메인 메뉴/ Analysis/ Database/ Show CAN Database를 선택한다.
    • CAN Database 창에서 위 왼쪽 구석의 load CAN database file을 클릭한다. 파일 열기 창에서 EPT.dbc를 선택한다.
    • TSMaster에 dbc가 로드된다. 
    • 오른쪽 영역에서 CELL_INFO 메시지를 선택하면, 왼쪽 아래 영역의 Layout에서 메시지의 레이아웃을 볼 수 있다.

      

    • 파이썬 코드 에디터 창을 연다.
      • 나는 코딩 작업을 위한 별도 탭이 있는 것을 선호한다. TSMaster 화면 아래쪽 탭 선택 부분에 "+" 기호를 클릭하여 새 탭을 만든다. 나는 prog라고 이름을 지었다. 
      • 메인 메뉴/ Design/ Python Mini Program/ Add Python Code Editor를 선택한다.

    파이썬 코드 에디터 창을 연다.

    • dbc를 인클루드 한다.
      •  코드 에디터 창에서 Properties 탭을 선택한다.
      • Display Name에 코드 에디터 창의 이름을 입력한다. 나는 cell dashboard라고 했다. cell 상태를 표시하는 보드를 만들거니까. 
      • Program Name에 파이썬 코드 파일의 이름을 입력한다. 나는 Display Name과 동일한 이름을 사용했다.
      • [중요] 왼쪽 아래 Database Symbols 영역이 있다. 여기서 EPT.pdbc를 체크한다. 이 조치로 EPT.dbc에 정의한 메시지와 신호를 파이썬 코드에서 쉽게 사용할 수 있다. 
        • dbc vs. pdbc
          • TSMaster는 dbc를 로드할 때, pdbc 파일을 생성한다. dbc의 내용을 TSMaster 형식으로 저장하는 것으로 추측한다.
          • EPT.pdbc 파일은 "프로젝트 디렉토리\DB\CAN\EPT.pdbc"에 저장된다.

    EPT.dbc에 정의된 메시지와 신호를 미니프로그램의 코드에서 사용하기 위해 Database Symbols에서 EPT.pdbc를 체크한다.

     

     

    CELL_INFO 메시지를 다룰 글로벌 변수를 선언한다. - 1/2

    • EPT.dbc에서 선언한 CELL_INFO 메시지를 저장할 글로벌 변수 선언이 필요하다.
    • 코드 에디터 창에서 Symbols 탭을 선택한다.
    • 창의 왼쪽 영역에서 Global Definition을 선택한다. 
    • 창의 오른쪽 코드 영역에 빈 상태로 표시된다. (아래 그림은 코딩 후에 캡쳐한 것이라 코드가 있다.)

    글로벌 변수 정의를 위해 코드 에디터에서 Symbols/ Global Definition을 선택한다.

     

     

    CELL_INFO 메시지를 다룰 글로벌 변수를 선언한다.  - 2/2

    • 코드 에디터 창에서 Functions 탭을 선택한다.
    • CELL_INFO_1 메시지를 마우스 우클릭한다.
      • "_1"은 dbc를 임포트 할 때, 채널 1에 연결해서 붙은 것이다. 채널 2에 연결했다면 "_2"가 붙었을 것이다.
    • Insert into script를 선택한다. 코드 영역에 CELL_INFO_01 메시지를 다룰 수 있도록 코드가 추가된다.
      • 코드를 보면, Databases 모듈은 dbs라는 별칭으로 임포트한다.
      • CELL_INFO_1 변수를 TCELL_INFO_1() 클래스로 선언한다. TCELL_INFO_1 클래스는 dbc 모듈에 정의되어 있다.  이 방식을 이해하면, 직접 코드 영역에 타이핑해도 된다.
    • 시스템 변수를 만들 때 사용하려고, k_n_cell = 16, k_n_signal_per_cell = 4를 정의해 두었다.

     

     

    CAN 신호들을 분류해서 저장할 시스템 변수들을 생성한다.

    • 시스템 변수들은 미니프로그램이 시작될 때 생성되면 된다. 
      • Symbols에서 On Start 이벤트를 선택한다.
      • 마우스 우클릭하고, Add On Start를 선택한다.
      • 정의할 함수 이름을 입력한다. 나는 "create_sys_var"라고 했다.

    On Start 이벤트에 새 함수를 추가한다.

     

    새 함수의 이름을 정한다.

     

    • 나는 시스템 변수 이름을 아래 형식으로 정의하기로 하였다.
      • calc.c1_s2: 
        • calc: 계산된 값이라는 것을 표시하기 위해서 붙인 구분자이다. 
        • c1: 셀 1번
        • s2: s2 시그널
    • 셀이 16개있고 신호가 4개있다. 셀 아이디와 신호 번호로 이중 for 루프를 돌려 시스템 변수들을 생성한다.
    • TSMaster의 app.create_system_var()라는 함수로 변수를 시스템 변수를 생성할 수 있다.  

    app.create_system_var() 함수로 셀 별 신호를 저장할 시스템 변수들을 생성한다.

     

    • 코드 에디터 창의 Functions 탭을 선택하고, 검색창에 system_var라고 입력하여 시스템 변수 관련된 함수들을 찾고, 이들 중에서 내 용도에 맞는 함수를 찾았다.

    키워드 검색으로 함수를 찾을 수 있다.

     

    • create_system_var 함수를 선택하고, 창의 오른쪽 영역에서 Api Documents 탭을 선택하면, 함수 기능, 파라미터에 관한 설명과 예제 코드를 볼 수 있다. 

    Api Document 탭에서 함수 기능 및 파라미터 설명과 예제 코드를 볼 수 있다.

     

    • 미니프로그램을 종료할 때, 위 시스템 변수들을 제거해야 한다. 
      • On Stop 이벤트에 delete_sys_vars() 함수를 추가한다.
      • app.delete_system_var() 함수를 이용하여 시스템 변수들을 제거한다.

    미니프로그램이 종료될 때 시스템 변수들을 제거한다.

     

     

    CELL_INFO 메시지를 수신하면, 신호들을 시스템 변수들에 분류하여 저장한다.

    • CELL_INFO 메시지를 수신할 때마다 동작할 함수를 정의한다. 
      • On CAN Rx 이벤트에서 마우스 우클릭하여 새 함수를 추가한다.
      • CAN 메시지를 선택하는 창이 뜬다. CELL_INFO 메시지를 선택한다. 
      • 함수 이름으로 CELL_INFO라고 메시지 이름을 입력하였다. 그러면 함수 이름이 이해하기 좋게 정해진다. on_can_rx_CELL_INFO() 

    CELL_INFO 메시지를 수신할 때마다 수행할 함수를 On CAN Rx 이벤트를 이용하여 정의한다.

     

        if (ACAN.idx_chn != CH1): # if you want to filter channel
            return
    
    	# 수신한 메시지 ACAN을 CELL_INFO 메시지 구조로 파싱한다.
        CELL_INFO_1.FRawCAN = ACAN
        
        # CELL_INFO 메시지의 idCell 신호를 사용하는 방법이다. 
        # "메시지.신호" 이런 식으로 사용하면 된다. 직관적이다. 
        i_cell = int(CELL_INFO_1.idCell)
    
    	# 타당하지 않은 i_cell 값을 걸러낸다.
        if i_cell < 0 or i_cell >= k_n_cell:
            app.log_text(f'Invalid cell index: {i_cell}', lvlError)
            return
        
        for i_signal in range(k_n_signal_per_cell):
            # getattr를 사용하여 실제 신호 값을 가져온다.
            # s0, s1, s2, s3 신호를 임시로 저장한다.
            temp = getattr(CELL_INFO_1, f's{i_signal}')
    
    		# 신호를 셀 아이디와 신호에 맞는 시스템 변수에 저장한다.
            name_sys_var = f'calc.c{i_cell}_s{i_signal}' 
            app.set_system_var_double(name_sys_var, temp)

     

    • 메인 메뉴/ Simulation/ System Variables를 선택하여 System Variable Management 창을 연다. User Variables 탭을 보면 정의된 시스템 변수가 아무 것도 없다.

     

    • 코드 에디터 창의 run script 버튼을 클릭하여 미니프로그램을 실행한다. 
    • System Variable Management 창에 시스템 변수들이 채워진다.

     

    • 그래픽창 설정은 위와 같이 시스템 변수들이 정의된 상태에서 해야 한다.

     

    그래픽창 설정

    • 한(one) 그래픽창에 출력하기에는 64개 신호는 너무 많다. 그래픽창 4개에 나눠서 출력하기로 한다.
    • 메인 메뉴/ Analysis/ Graphics/ Add Graphic로 그래픽스창을 4개 만들었다.
    • 창들이 표시된 탭의 이름을 cell_dashboard로 변경하였다.

    출력할 신호들이 많아서 그래픽스창 4개에 표시한다.
    탭에서 마우스 우클릭하고 Rename tab...을 선택하여 탭 이름을 cell_dashboard로 변경하였다.

     

    • 한 그래픽스창에 4개 셀의 신호들을 표시할 것이다. 창을 4개 구역으로 분리한다. 그래픽스창 상단의 Options를 클릭하고 Increment Split을 선택하여 분리 영역을 추가하여 창을 4개의 분리 구역으로 나눈다.

    Increment Split을 이용하여 그래픽스창을 4개 구역으로 분리한다.

    • 시스템 변수를 추가할 분리 구역을 선택한다. 그래픽스창 상단의 "+" 기호를 클릭하고 Add System Variable...을 선택한다.

    • 시스템 변수창에서 그래픽창의 분리 구역에 표시할 신호들을 선택한다.

     

    • 분리 구역에 시스템 변수들이 표시된다.

    • 분리 구역의 이름 부분을 더블클릭하면 이름을 변경할 수 있다.

    • 그래픽스창의 상단 오른쪽 스패너 버튼을 클릭하면 창 설정을 변경할 수 있는 메뉴들이 있다. Rename Window로 창의 이름을 변경할 수 있다. 

    • 분리 영역에 셀의 4개 신호들이 분리되어 표시되도록 혹은 함께 표시되도록 설정할 수 있다.

    Options/ Y Axis Mode/ Separate Views를 선택하면 분리 영역의 신호들이 분리되어 표시된다.

     

    Options/ Y Axis Mode/ Display All Axes를 선택하면 분리 영역의 신호들이 함께 표시된다.

     

     

    실행 결과

    • CAN 트레이스를 재생하면서 결과를 확인한다.
    • 메인 메뉴/ Analysis/ Bus Replay를 클릭하여 Bus Playback 창을 연다.
    • Bus Playback 창에서 Offline Replay 탭을 선택한다.
    • 상단 메뉴에서 "+" 기호가 있는 아이콘을 클릭하여 재생할 트레이스 파일을 선택한다.
    • 파일 리스트 영역에 파일이 추가된다.
    • Start Playback 버튼을 클릭하여 트레이스를 재생한다.

    CAN 트레이스를 재생한다.

    • cell_m_n 창들에 cell_m, ..., cell_n 구역에 s1, s2, s3, s4가 분리되어 표시된다. 

     

     

    결론 

    • dbc에 정의된 메시지, 신호를 TSMaster의 미니프로그램에서 쉽고 편리하게 사용할 수 있다.
    • 미니프로그램을 이용하여 시스템 변수들을 생성/ 제거할 수 있다.
    • 시스템 변수들을 그래픽스창에 표시할 수 있다.
    • 그래픽스창을 필요에 따라 구역으로 분리하고, 신호들을 분리하여 출력할 수 있다.

     

     

    TSMaster 프로젝트

    • 첨부 TSMaster 프로젝트 폴더를 압축 해제하고, TSMaster에서 열면 위에서 설명한 내용을 직접 실행해 볼 수 있다.

    cell_dashboard.zip
    6.70MB

     

     

     

     

     

     

    목차 :: hsl's tsmaster 사용기