-
TSMaster API를 사용하여 CAN 메시지 송신하기 (RBS)application 2025. 2. 7. 12:11
시작하기 전에
요즘 절대 다수의 차량 제어기들은 통신을 한다. 이들 중 상당수는 다른 제어기이 보내는 CAN 메시지들을 수신해야 정상 작동 상태가 된다.
CAN 메시지들을 공급하는 방법은 크게 두 가지다. 실제 다른 제어기들과 CAN 버스를 직접 연결하는 방법, CAN 버스 통신을 모사(시뮬레이션) 해주는 방법. 전자는 현실적으로 여러가지 어려움이 있다. 후자를 RBS (Remaining/Rest Bus Simulation)이라고 한다.
TSMaster GUI에서 TSMaster가 제공하는 기능들을 조작하여 RBS 하는 방법을 CAN 버스 시뮬레이션 (RBS: Remaining Bus Simulation) :: hsl's tsmaster 사용기, 트레이스를 이용한 RBS(Remaining Bus Simulation) :: hsl's tsmaster 사용기 등에서 설명하였다.
TSMaster는 API를 제공한다. API의 함수를 호출하여 TSMaster 기능들을 작동하는 프로그램을 작성하면, TSMaster를 시작하지 않고 RBS를 할 수 있다. 왜 이렇게 할까? 여러가지 이유들이 있다. 그들 중에 하나는 TSMaster를 사지 않고 CAN 인터페이스 하드웨어만 사면 된다는 점이다. 개발 완료된 RBS 프로그램을 대량으로 배포할 때 비용을 절감할 수 있다. 배포할 수량이 많을수록 비용 절감이 크다. 비용 절감이 클수록 프로그램 개발에 투자된 시간의 가치가 커진다.
Python 스크립트로 TSMaster API를 이용하여 CAN 메시지 송신을 시도한다.
개요
- (TSMaster API를 사용하기에 필요한 파일 설치를 위해서) TSMaster를 설치한다.
- 파이썬 코딩
- 실행
TSMaster 설치
- TSMaster API를 이용하려면 TSMaster가 설치되어 있어야 한다.
- 아래 링크에서 무료 TSMaster Lite 평가판(Free Trial)을 다운로드하여 설치한다.

TSMaster Lite의 Free Trial을 다운로드 받는다. 파이썬 코딩
- TSMaster가 설치된 디렉토리 아래 쪽에 TSMasterApi 디렉토리가 있다. TSMaster 설치 중 설정을 변경하지 않고 설치를 완료하면 아래 경로에 있다.
C:\Program Files (x86)\TOSUN\TSMaster\Data\SDK\examples\Python\windows\TSMasterApi- 디렉토리에는 아래 파일들이 있다.

- 코드를 저장할 디렉토리에 TSMasterApi 디렉토리를 복사-붙여넣기 한다. (파이썬 파일 이름이 TSMaster_Message_Send_and_Receive.py라면) 아래 그림과 같이 파이썬 파일이 있는 디렉토리에 TSMasterApi 디렉토리를 붙여넣는다.

실행할 파이썬 파일이 있는 디렉토리에 TSMasterApi 디렉토리를 붙여넣기 한다. - CAN과 CAN-FD 메시지를 송신하는 코드는 아래와 같다.
- CAN 메시지를 2개 정의한다. 0x100, 0x110
- 두 메시지를 1회씩 전송한 후에 각각 100msec, 200msec 주기로 전송한다.
- CAN-FD 메시지를 2개 정의한다. 0x200, 0x210
- 0x200은 150msec 주기로 전송한다.
- 0x210은 1회만 전송한다.
- 1초 동안 유지한 후 전송을 멈춘다.
- 나는 모비스 ESC와 연결한 상태에서 실험을 하였다. ESC가 송신한 메시지들이 잘 수신되었는 지 확인하기 위해 수신 메시지들을 화면에 출력하도록 하였다.
- 코드에 대한 설명은 커멘트를 참조하십시오.
import time from TSMasterApi import * # function def dlc_to_lengeth(dlc, is_can): ''' 아래 표에 따라 dlc(data length code) 값을 길이로 변환한다. CAN의 경우 dlc는 길이이다. CAN-FD의 경우, dlc는 길이가 아니다. dlc can can-fd 0 0 0 1 1 1 2 2 2 3 3 3 4 4 4 5 5 5 6 6 6 7 7 7 8 8 8 9 8 12 10 8 16 11 8 20 12 8 24 13 8 32 14 8 48 15 8 64 ''' length = [0, 1, 2, 3, 4, 5, 6, 7, 8, 12, 16, 20, 24, 32, 48, 64] if is_can: return min(length[dlc], 8) return length[dlc] def bytes_to_str(data, len_data): ''' (화면 출력을 위해) 바이트 배열을 문자열로 변환한다. 메시지 송수신과 무관하다. ''' return ' '.join([f'{data[i]:02x}' for i in range(len_data)]) ## main # 초기화 함수, TsMaster.dll 호출 시 반드시 초기화 함수를 먼저 호출해야 다른 함수들을 사용할 수 있다. _r = initialize_lib_tsmaster("TSMaster_demo".encode("utf8")) print(f'initialize_lib_tsmaster: {_r = :0x}') # CAN 채널 수 설정 _r = tsapp_set_can_channel_count(1) print(f'tsapp_set_can_channel_count: {_r = :0x}') # LIN 채널 수 설정 # 기본값은 0이지만, 함수 호출을 통해 LIN 채널을 0으로 설정하는 것이 좋다고 한다. _r = tsapp_set_lin_channel_count(0) print(f'tsapp_set_lin_channel_count: {_r = :0x}') # 아래는 TC1013 하드웨어의 1번 채널을 소프트웨어 1번 채널에 바인딩하는 코드 예제이다. # 현재 토선에서 제공하는 TSMaterApi 코드에 오류가 있어서 아래 CHANNEL_INDEX.CHN1 등의 정의를 사용할 수 없다. # 토선에 오류 수정을 요청하였다. # tsapp_set_mapping_verbose( # "TSMaster_demo".encode("utf8"), # TLIBApplicationChannelType.APP_CAN, # channel_index.CHN1, # "TC1013".encode("utf8"), # TLIBBusToolDeviceType.TS_USB_DEVICE, # TLIB_TS_Device_Sub_Type.TC1013, # 0, # CHANNEL_INDEX.CHN1, # True #) # Predefined values above causes compile error. I guess TSEnum.py needs to be modified. _r = tsapp_set_mapping_verbose( "TSMaster_demo".encode("utf8"), 0, 0, "TC1013".encode("utf8"), # 4번째 파라미터는 하드웨어 이름이다. 하드웨어 이름과 일치 할 필요는 없는 것 같다. 3, 13, # TOSUN의 다른 하드웨어는 6번째 파라미터만 수정하면 된다. 0, 0, # 1번 채널의 값은 0이다. True ) print(f'tsapp_set_mapping_verbose: {_r = :0x}') # 1채널의 보드레이트 설정 # 현재 토선에서 제공하는 TSMaterApi 코드에 오류가 있어서 아래 CHANNEL_INDEX.CHN1 등의 정의를 사용할 수 없다. # 토선에 오류 수정을 요청하였다. # tsapp_configure_baudrate_canfd( # CHANNEL_INDEX.CHN1, # 500, # 2000, # TLIBCANFDControllerType.lfdtISOCAN, # TLIBCANFDControllerMode.lfdmNormal, # TerResistor120Ohm #) _r = tsapp_configure_baudrate_canfd( 0, 500, 2000, 1, # 1은 CAN-FD controller type을 의미한다. 0, # 0은 일반 모드이다. True ) print(f'tsapp_configure_baudrate_canfd: {_r = :0x}') # 하드웨어를 CAN 버스에 온-라인 연결한다. if 0 == tsapp_connect(): print('connection successful') # fifo 기능을 활성화해야 receive 함수 사용 가능 tsfifo_enable_receive_fifo() print('receive fifo enabled') # CAN 메시지 전송. # 메시지를 준비하고 전송하는 두 단계로 되어있다. # 전송은 단일 프레임 전송과 주기 전송이 있다. # 전송할 CAN 메시지 0x100 생성 TCAN1 = TLIBCAN(FIdentifier=0x100, FData=[0, 1, 2, 3, 4, 5, 6, 7]) # CAN 메시지 0x100 전송 - 단일 프레임 _r = tsapp_transmit_can_async(TCAN1) print(f"transmit_can_async {TCAN1.FIdentifier:03x}: {_r = :0x}") # 전송할 CAN 메시지 0x110 생성 TCAN2 = TLIBCAN(FIdentifier=0x110, FData=[10, 11, 12, 13, 14, 15, 16, 17]) _r = tsapp_transmit_can_async(TCAN2) print(f"transmit_can_async {TCAN2.FIdentifier:03x}: {_r = :0x}") # CAN 메시지 전송 0x100 - 주기 전송 _r = tsapp_add_cyclic_msg_can(TCAN1, 100) # 전송 주기 100ms print(f"add_cyclic_msg_can {TCAN1.FIdentifier:03x}: {_r = :0x}") # CAN 메시지 전송 0x110 - 주기 전송 _r = tsapp_add_cyclic_msg_can(TCAN2, 200) # 전송 주기 200ms print(f"add_cyclic_msg_can {TCAN2.FIdentifier:03x}: {_r = :0x}") # CAN-FD 메시지 전송 # 방식은 CAN 메시지 전송과 동일하다. # CAN-FD 메시지 0x200 전송 - 단일 프레임 # CAN-FD 메시지는 데이터 길이가 64바이트까지 가능함 # 데이터 길이 8 TCANFD1 = TLIBCANFD(FIdentifier=0x200, FData=[20, 21, 22, 23, 24, 25, 26, 27]) _r = tsapp_transmit_canfd_async(TCANFD1) print(f"transmit_canfd_async {TCANFD1.FIdentifier:03x}: {_r = :0x}") # CAN-FD 메시지 0x200 전송 - 주기 전송 _r = tsapp_add_cyclic_msg_canfd(TCANFD1, 150) # 전송 주기 150ms print(f"add_cyclic_msg_canfd {TCANFD1.FIdentifier:03x}: {_r = :0x}") # CAN-FD 메시지 0x210 전송 - 단일 프레임 # 데이터 길이 16. FDLC로는 10이다. TCANFD2 = TLIBCANFD(FIdentifier=0x210, FDLC=10, FData=[30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45]) _r = tsapp_transmit_canfd_async(TCANFD2) print(f"transmit_canfd_async {TCANFD2.FIdentifier:03x}: {_r = :0x}") # k_wait_time_sec초 동안 대기한다. # 대기 시간 중에 주기 전송 메시지들은 전송된다. k_wait_time_sec = 1.0 time.sleep(k_wait_time_sec) # 주기 전송 메시지들 삭제 _r = tsapp_delete_cyclic_msgs() print(f'delete_cyclic_msgs: {_r = :0x}') # 처리할 CAN 메시지 수 cansize = c_int32(10_000) # CAN 메시지들을 저장할 버퍼를 정의한다. # 10_000은 반드시 숫자로 해야 한다. cansize로 해보니 에러가 발생한다. listcanmsg = (TLIBCAN * 10_000)() # 버퍼에 CAN-FD 메시지들은 없이 CAN 메시지들만 저장됨 _r = tsfifo_receive_can_msgs(listcanmsg, cansize, 0, 1) print(f'tsfifo_receive_can_msgs: {_r = :0x}') if _r == 0: # 0이면 버퍼에서 메시지들을 가져오는데 성공했다는 뜻이다. for i in range(cansize.value): # 각 필드의 의미와 정의는 아래와 같다. # from TSStruct.py # _fields_ = [("FIdxChn", c_uint8), # 채널 인덱스 # ("FProperties", c_uint8), # CAN 프레임 속성 # # [7] 0-normal frame, 1-error frame # # [6] 0-not logged, 1-already logged # # [5-3] tbd # # [2] 0-std frame, 1-extended frame # # [1] 0-data frame, 1-remote frame # # [0] dir: 0-RX, 1-TX # ("FDLC", c_uint8), # dlc from 0 to 8 # ("FReserved", c_uint8), # ("FIdentifier", c_int32), # ID # ("FTimeUs", c_int64), # timestamp in microseconds # ("FData", c_uint8 * 8), # data # ] # FData는 c_uint8 * 8로 정의되어 있음 data_buffer = bytes(listcanmsg[i].FData) # 실제 메시지 길이는 data_buffer 보다 작을 수 있음 len_data = dlc_to_lengeth(listcanmsg[i].FDLC, is_can=True) # FDLC에는 길이가 아닌 길이의 코드가 저장되어 있음 data = bytes_to_str(data_buffer, len_data) # CAN 메시지 출력 print(f'CAN: {listcanmsg[i].FIdentifier:03x} {listcanmsg[i].FProperties} @ {listcanmsg[i].FTimeUs/1_000_000:8.4f} {listcanmsg[i].FDLC:2} {len_data:2}: {data}') # 처리할 CAN-FD 메시지 수 canfdsize = c_int32(10_000) # CAN-FD 메시지들을 저장할 버퍼를 정의한다. listcanfdmsg = (TLIBCANFD * 10_000)() # 버퍼에는 CAN 메시지들과 CAN-FD 메시지들이 함께 저장된다. _r = tsfifo_receive_canfd_msgs(listcanfdmsg, canfdsize, 0, 1) print(f'tsfifo_receive_canfd_msgs: {_r = :0x}') if _r == 0: for i in range(canfdsize.value): # from TSStruct.py # _fields_ = [("FIdxChn", c_uint8), # channel index # ("FProperties", c_uint8), # CAN frame properties # # [7] 0-normal frame, 1-error frame # # [6] 0-not logged, 1-already logged # # [5-3] tbd # # [2] 0-std frame, 1-extended frame # # [1] 0-data frame, 1-remote frame # # [0] dir: 0-RX, 1-TX # ("FDLC", c_uint8), # dlc from 0 to 15 # ("FFDProperties", c_uint8), # CAN-FD frame properties CAN-FD에만 있고 CAN에는 없다. # # [2] ESI, The E RROR S TATE I NDICATOR (ESI) # flag is transmitted dominant by error active nodes, # recessive by error passive nodes. # ESI does not exist in CAN format frames # # [1] BRS, # If the bit is transmitted recessive, # the bit rate is switched # from the standard bit rate of the A RBITRATION P HASE # to the preconfigured alternate bit rate of the D ATA P HASE . # If it is transmitted dominant, the bit rate is not switched. # BRS does not exist in CAN format frames. # # [0] EDL: 0-normal CAN frame, 1-FD frame, added 2020-02-12, # The E XTENDED D # ("FIdentifier", c_int32), # ID # ("FTimeUs", c_uint64), # timestamp in microseconds # ("FData", c_uint8 * 64), # data # ] # FData는 c_uint8 * 64으로 정의되어 있다. 모든 CAN-FD 프레임은 메모리 공간에서 64 바이트를 차지한다. data_buffer = bytes(listcanfdmsg[i].FData) # FDLC에는 길이가 아닌 길이의 코드가 저장되어 있음 len_data = dlc_to_lengeth(listcanfdmsg[i].FDLC, is_can=False) # 실제 데이터 길이는 64 바이트 미만이면 data_buffer 보다 작다. # len_data는 실제 데이터 길이이다. len_data 까지 출력한다. data = bytes_to_str(data_buffer, len_data) # CAN-FD 메시지 출력 print(f'CAN-FD: {listcanfdmsg[i].FIdentifier:03x} {listcanfdmsg[i].FFDProperties} @ {listcanfdmsg[i].FTimeUs/1_000_000:8.4f} {listcanfdmsg[i].FDLC:2} {len_data:2}: {data}') # 연결 해제 _r = tsapp_disconnect() print(f'tsapp_disconnect: {_r = :0x}') # 종료 함수 # _r는 None. 포맷 스트링(:0x)을 적용하면 에러가 발생한다. _r = finalize_lib_tsmaster() print(f'finalize_lib_tsmaster: {_r = }')- 아래는 TSMasterApi 디렉토리의 파일들과 위 코드를 압축한 파일이다.
TSMaster_Message_Send_and_Receive.zip0.14MB실행
- 코드를 실행하기 전에 PC와 CAN 인터페이스 하드웨어와 제어기를 연결한다.
- 코드 파일이 있는 디렉토리에서 커맨드 창을 연다.
- 커맨드 창에 아래 명령을 입력하여 코드를 실행한다. python이 알려지지 않은 명령이라는 에러가 발생한다면, python이 PATH에 포함해야 한다. Python을 PATH에 추가하기 :: hsl's tsmaster 사용기
python TSMaster_Message_Send_and_Receive.py- 코드가 실행되면 CAN 인터페이스 하드웨어에 녹색 LED 등이 깜박인다.

CAN 통신이 중에 녹색 LED 등이 깜박인다. - 코드가 실행된 화면은 아래와 같다.

- 메시지 주기가 공차 내에서 설정대로 잘 전송된다.
CAN: 100 1 @ 0.1174 8 8: 00 01 02 03 04 05 06 07 # 0x100 전송 CAN: 100 1 @ 0.2173 8 8: 00 01 02 03 04 05 06 07 # 0x100 전송 주기 100msec ok CAN: 110 1 @ 0.2175 8 8: 0a 0b 0c 0d 0e 0f 10 11 # 0x110 전송 CAN: 100 1 @ 0.3174 8 8: 00 01 02 03 04 05 06 07 CAN: 100 1 @ 0.4175 8 8: 00 01 02 03 04 05 06 07 CAN: 110 1 @ 0.4178 8 8: 0a 0b 0c 0d 0e 0f 10 11 # 0x110 전송 주기 200msec ok CAN: 100 1 @ 0.5175 8 8: 00 01 02 03 04 05 06 07 CAN: 100 1 @ 0.6172 8 8: 00 01 02 03 04 05 06 07 CAN: 110 1 @ 0.6174 8 8: 0a 0b 0c 0d 0e 0f 10 11- CAN-FD 버퍼를 보면 송수신이 모두 잘 이뤄진 것을 볼 수 있다.
- 0x100, 0x110, 0x200 메시지들이 잘 송신되었다.
- ESC가 전송한 메시지들이 잘 수신되었다.
CAN-FD: 100 0 @ 0.7175 8 8: 00 01 02 03 04 05 06 07 # CAN-FD 버퍼에 CAN 메시지도 저장된다. CAN-FD: 06f 3 @ 0.7207 8 8: bb 37 5d 05 85 00 00 00 # ESC 전송 메시지가 잘 수신되었다. CAN-FD: 060 3 @ 0.7209 13 32: d9 bc 5d 00 00 01 01 00 0f 0f 0f 0f 00 ff 00 ff 00 00 05 04 00 08 ff 00 44 00 00 14 ff fa 00 00 CAN-FD: 0a0 3 @ 0.7211 12 24: f4 06 5d ff ff ff ff ff ff 3f ff 3f ff 3f ff 3f 00 3c 01 00 00 00 00 00 CAN-FD: 061 3 @ 0.7258 13 32: f9 07 5d 01 00 00 70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 CAN-FD: 575 3 @ 0.7261 13 32: 75 40 00 04 00 00 00 00 40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 CAN-FD: 06f 3 @ 0.7307 8 8: ce ff 5e 05 85 00 00 00 CAN-FD: 060 3 @ 0.7309 13 32: 13 57 5e 00 00 01 01 00 0f 0f 0f 0f 00 ff 00 ff 00 00 05 04 00 08 ff 00 44 00 00 14 ff fa 00 00 CAN-FD: 0a0 3 @ 0.7311 12 24: f1 5f 5e ff ff ff ff ff ff 3f ff 3f ff 3f ff 3f 00 3c 01 00 00 00 00 00 CAN-FD: 175 3 @ 0.7358 12 24: 27 e5 af 00 ff 03 00 00 00 01 00 00 00 00 00 00 0c 00 00 00 08 00 ff fa CAN-FD: 061 3 @ 0.7360 13 32: 33 ec 5e 01 00 00 70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 CAN-FD: 06f 3 @ 0.7407 8 8: 1d b8 5f 05 85 00 00 00 CAN-FD: 060 3 @ 0.7409 13 32: 55 0e 5f 00 00 01 01 00 0f 0f 0f 0f 00 ff 00 ff 00 00 05 04 00 08 ff 00 44 00 00 14 ff fa 00 00 CAN-FD: 0a0 3 @ 0.7411 12 24: f2 68 5f ff ff ff ff ff ff 3f ff 3f ff 3f ff 3f 00 3c 01 00 00 00 00 00 CAN-FD: 061 3 @ 0.7458 13 32: 75 b5 5f 01 00 00 70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 CAN-FD: 06f 3 @ 0.7507 8 8: 03 27 60 05 85 00 00 00 CAN-FD: 060 3 @ 0.7509 13 32: ba 27 60 00 00 01 01 00 0f 0f 0f 0f 00 ff 00 ff 00 00 05 04 00 08 ff 00 44 00 00 14 ff fa 00 00 CAN-FD: 0a0 3 @ 0.7511 12 24: 37 85 60 ff ff ff ff ff ff 3f ff 3f ff 3f ff 3f 00 3c 01 00 00 00 00 00 CAN-FD: 1f0 3 @ 0.7557 10 16: cf 5f 13 12 00 4c a0 00 00 00 00 00 00 00 00 00 CAN-FD: 061 3 @ 0.7560 13 32: 9a 9c 60 01 00 00 70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 CAN-FD: 175 3 @ 0.7561 12 24: 44 88 b0 00 ff 03 00 00 00 01 00 00 00 00 00 00 0c 00 00 00 08 00 ff fa CAN-FD: 06f 3 @ 0.7607 8 8: d0 60 61 05 85 00 00 00 CAN-FD: 060 3 @ 0.7609 13 32: fc 7e 61 00 00 01 01 00 0f 0f 0f 0f 00 ff 00 ff 00 00 05 04 00 08 ff 00 44 00 00 14 ff fa 00 00 CAN-FD: 0a0 3 @ 0.7611 12 24: 34 b2 61 ff ff ff ff ff ff 3f ff 3f ff 3f ff 3f 00 3c 01 00 00 00 00 00 CAN-FD: 061 3 @ 0.7658 13 32: dc c5 61 01 00 00 70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 CAN-FD: 200 1 @ 0.7674 8 8: 14 15 16 17 18 19 1a 1b # 0x110 메시지 송신 ok CAN-FD: 06f 3 @ 0.7707 8 8: a5 a8 62 05 85 00 00 00 CAN-FD: 060 3 @ 0.7709 13 32: 36 95 62 00 00 01 01 00 0f 0f 0f 0f 00 ff 00 ff 00 00 05 04 00 08 ff 00 44 00 00 14 ff fa 00 00 CAN-FD: 0a0 3 @ 0.7711 12 24: 31 eb 62 ff ff ff ff ff ff 3f ff 3f ff 3f ff 3f 00 3c 01 00 00 00 00 00 CAN-FD: 175 3 @ 0.7758 12 24: 47 bf b1 00 ff 03 00 00 00 01 00 00 00 00 00 00 0c 00 00 00 08 00 ff fa CAN-FD: 061 3 @ 0.7760 13 32: 16 2e 62 01 00 00 70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 CAN-FD: 06f 3 @ 0.7807 8 8: 76 ef 63 05 85 00 00 00 CAN-FD: 060 3 @ 0.7809 13 32: 70 cc 63 00 00 01 01 00 0f 0f 0f 0f 00 ff 00 ff 00 00 05 04 00 08 ff 00 44 00 00 14 ff fa 00 00 CAN-FD: 0a0 3 @ 0.7811 12 24: 32 dc 63 ff ff ff ff ff ff 3f ff 3f ff 3f ff 3f 00 3c 01 00 00 00 00 00 CAN-FD: 061 3 @ 0.7858 13 32: 50 77 63 01 00 00 70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 CAN-FD: 06f 3 @ 0.7907 8 8: 6e 28 64 05 85 00 00 00 CAN-FD: 060 3 @ 0.7909 13 32: 83 52 64 00 00 01 01 00 0f 0f 0f 0f 00 ff 00 ff 00 00 05 04 00 08 ff 00 44 00 00 14 ff fa 00 00 CAN-FD: 0a0 3 @ 0.7911 12 24: 3b 59 64 ff ff ff ff ff ff 3f ff 3f ff 3f ff 3f 00 3c 01 00 00 00 00 00 CAN-FD: 175 3 @ 0.7958 12 24: 42 e6 b2 00 ff 03 00 00 00 01 00 00 00 00 00 00 0c 00 00 00 08 00 ff fa CAN-FD: 061 3 @ 0.7960 13 32: a3 e9 64 01 00 00 70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 CAN-FD: 06f 3 @ 0.8007 8 8: bd 6f 65 05 85 00 00 00 CAN-FD: 060 3 @ 0.8009 13 32: c5 0b 65 00 00 01 01 00 0f 0f 0f 0f 00 ff 00 ff 00 00 05 04 00 08 ff 00 44 00 00 14 ff fa 00 00 CAN-FD: 0a0 3 @ 0.8011 12 24: 38 6e 65 ff ff ff ff ff ff 3f ff 3f ff 3f ff 3f 00 3c 01 00 00 00 00 00 CAN-FD: 1f0 3 @ 0.8057 10 16: 50 37 14 12 00 4c a0 00 00 00 00 00 00 00 00 00 CAN-FD: 061 3 @ 0.8060 13 32: e5 b0 65 01 00 00 70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 CAN-FD: 06f 3 @ 0.8107 8 8: c8 a7 66 05 85 00 00 00 CAN-FD: 060 3 @ 0.8109 13 32: 0f e0 66 00 00 01 01 00 0f 0f 0f 0f 00 ff 00 ff 00 00 05 04 00 08 ff 00 44 00 00 14 ff fa 00 00 CAN-FD: 0a0 3 @ 0.8111 12 24: 3d 37 66 ff ff ff ff ff ff 3f ff 3f ff 3f ff 3f 00 3c 01 00 00 00 00 00 CAN-FD: 175 3 @ 0.8158 12 24: 41 d1 b3 00 ff 03 00 00 00 01 00 00 00 00 00 00 0c 00 00 00 08 00 ff fa CAN-FD: 061 3 @ 0.8160 13 32: 2f 5b 66 01 00 00 70 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 CAN-FD: 100 0 @ 0.8174 8 8: 00 01 02 03 04 05 06 07 # 0x100 메시지 전송 주기 100msec ok CAN-FD: 110 0 @ 0.8177 8 8: 0a 0b 0c 0d 0e 0f 10 11 # 0x110 메시지 송신 ok결론
- 파이썬에서 TSMaster API의 함수를 호출하여 CAN 메시지들을 정의하여 송신하고, CAN 버스의 메시지들을 수신하였다.
- 이 방법을 이용하면 무료 TSMaster 버전을 이용하여 RBS를 구현할 수 있다.
참고
- 아래 링크에서 API 예제와 매뉴얼을 다운로드 받을 수 있다.
- 문서가 중국어로 되어있다. 중국어를 모르는 나는 마이크로소프트 워드에서 중국어 매뉴얼 pdf 파일을 열어, 워드의 번역 기능으로 영어로 번역하여 사용한다. 한국어로 번역하면 예제 코드의 영어 단어들이 한국어 낱말로 번역되어 코드가 망가지는 (내가 느끼기에는 큰) 단점이 있다.
- 토선은 두 종류의 API를 제공한다. TSMaster API와 libTSCAN API이다. 둘의 차이는 아래 표와 같다.
libTSCAN API TSMaster API 장점 1. x86/x64bit 지원
2. Windows 및 Linux 지원
Linux의 경우 libTSCANAPI.so를 사용해야 함
3. TSMaster에 종속되지 않음, 즉 TSMaster를 설치할 필요가 없음
4. C++ 런타임 라이브러리에 종속됨1. x86/x64bit 지원
2. Windows 지원
3. API가 많음
TSMaster의 거의 모든 API를 사용할 수 있음
TSMaster.dll의 래핑된 버전임
단점 1. API가 적음 1. Linux를 지원하지 않음
2. TSMaster에 종속됨. 즉, TSMaster를 설치해야 함
CAN 버스 시뮬레이션 (RBS: Remaining Bus Simulation) :: hsl's tsmaster 사용기(판넬 사용법 설명을 포함한다.)
Symbol Mapping: CAN 신호로 계산한 결과를 시스템 변수에 넣기 :: hsl's tsmaster 사용기
Symbol Mapping: 시스템 변수를 CAN 신호로 전송하기 :: hsl's tsmaster 사용기
TSMaster API를 사용하여 CAN 메시지 송신하기 (RBS) :: hsl's tsmaster 사용기
Python 미니프로그램: 코드에서 CAN 메시지의 신호를 읽는 방법 :: hsl's tsmaster 사용기
미니프로그램에서 CAN 신호와 시스템 변수 다루기 :: hsl's tsmaster 사용기
'application' 카테고리의 다른 글
SecOC (Secure On-board Communication) (0) 2025.02.09 CRC 리버스 엔지니어링하기 (0) 2025.02.09 Read Data By ID(DID)의 DID 스캐닝 측정 데이터 분석 (0) 2025.01.28 UDS DID(data identifier) 스캐닝 (0) 2025.01.27 진단 응답 해석하기 (2) 2025.01.26