목표

CANoe에서 사용 가능한 UI에 대해서 시간을 들여서 좀 더 상세히 확인

제작

1. Home → Panel → New Panel로 새로운 UI Panel을 제작

  • 위의 화면에서 저장 후 연결

2. Panel이 나오는 지 확인

※Panel이 나오지 않을 경우 아래에서 확인

※Panel의 윈도우 형식을 바꾸고 싶으면 오른쪽 버튼으로 설정

  • MDI(Multiple Document Interface) Window
    • 기본 CANoe Window 안에서 전부 관리하는 Window로 다른 Window랑 자석처럼 붙어서 편함
    • 메모: 노트북이 작아서 기본적으로 이걸 사용할 때가 많음
  • Standard Window
    • Pop Up처럼 띄워서 관리하는 Window
  • Docking Window
    • 기본 CANoe Window 안에 다른 Window랑 별개로 관리하는 Window

3. Vector Tool Environment에서 Toolbox의 Start Stop Control을 드래그해서 놓고 싶은 위치에 위치 후 저장

4. 버튼을 눌러서 실행 확인

블로그 이미지

RIsN

,

목표

  • Write를 통해 기본 실행 스크립트를 실행 확인

제작

1. 기본 CAPL Script에서 아래와 같은 코드를 사용
    ※내 경우는 Engine.can

// ::  Initializes variables, displays messages, and reads files before measurement starts (limited system functionality).
on preStart {
  write(":: Start the program");
}

// :: Executes at the start of measurement, enabling all system functions (e.g., timers, logging, bus messages).
on start {
}

// :: Handles pre-stop actions before measurement stops; DeferStop can delay the stop if needed.
on preStop { 
}

// :: Runs after measurement stops to perform final cleanup and logging (some settings may not take effect)
on stopMeasurement { 
}

2. 실행 확인

블로그 이미지

RIsN

,

목표

함수 정리 및 개인적인 시간이 있을 때 설명 읽어두기.

각 함수 설명

write

  • 기능
    • Write Window에 문자열을 출력할 때 사용됩니다.
    • C 언어의 printf와 유사하게 서식(format string)을 사용할 수 있습니다.예:→ Measurement started at 1234 ms 와 같은 출력이 나옴.
write("Measurement started at %d ms", getMsTime());
  • 제한사항
    • 컴파일러가 서식 문자열을 검사하지 않음 printf에서는 %d, %s 등과 함께 전달된 인자의 타입이 일치하지 않으면 경고 또는 오류를 발생시킵니다.→ 하지만 write에서는 이런 검사가 없기 때문에 잘못된 형식이 입력되면 예상치 못한 결과가 나올 수 있음.
    • 예를 들어, %d(정수) 자리에 문자열을 넣으면 예상할 수 없는 오류가 발생할 수 있음.
    • 메시지는 자동으로 개행(줄 바꿈)되어 출력됨→ 여러 개의 write 호출을 하면 자동으로 각각 새로운 줄에 출력됨.
  • 주의할 점
    • 사용자가 직접 형식이 올바른지 확인해야 함.
    • printf처럼 작동하지만, write는 출력 대상이 콘솔이 아니라 Write Window임.
    • 메시지 로깅이나 디버깅 용도로 적합함.
블로그 이미지

RIsN

,

C 언어에서 서식 문자열(format string)  printf, scanf 등의 함수에서 데이터를 특정 형식으로 출력하거나 입력받을 때 사용됩니다. 서식 문자열은 포맷 지정자(format specifier) 를 포함하며, 이를 통해 데이터를 원하는 형태로 변환할 수 있습니다.


1️⃣ 기본적인 포맷 지정자 (Format Specifiers)

포맷 지정자설명예제

%d 부호 있는 10진 정수 (int) printf("%d", 123);  123
%i %d와 동일 (int) printf("%i", 123);  123
%u 부호 없는 10진 정수 (unsigned int) printf("%u", 123);  123
%x 16진수 (소문자) printf("%x", 255);  ff
%X 16진수 (대문자) printf("%X", 255);  FF
%o 8진수 printf("%o", 10);  12
%f 실수 (float, double) printf("%f", 3.1415);  3.141500
%e 지수 표기법 (소문자 e) printf("%e", 3.1415);  3.141500e+00
%E 지수 표기법 (대문자 E) printf("%E", 3.1415);  3.141500E+00
%c 단일 문자 (char) printf("%c", 'A');  A
%s 문자열 (char 배열) printf("%s", "Hello");  Hello
%p 포인터 주소 (void*) printf("%p", ptr);  0x7ffdec1a5b78
%% % 출력 printf("%%");  %

🚨 주의: %d는 부호 있는 정수(signed int)이고, %u는 부호 없는 정수(unsigned int)입니다.


2️⃣ 가공된 출력 (출력 너비 및 정렬)

C 언어에서는 출력 형식을 좀 더 정교하게 조절할 수 있습니다.

✔ 출력 너비 (Minimum Width)

출력되는 값의 최소 너비를 설정할 수 있습니다.

printf("%10d\\n", 123);

 123 (10칸 확보 후 오른쪽 정렬)

printf("%-10d\\n", 123);

 123 (10칸 확보 후 왼쪽 정렬)


✔ 소수점 자리수 조절 (Precision)

실수 출력 시, 소수점 이하 자리수를 제한할 수 있습니다.

printf("%.2f\\n", 3.14159);

 3.14 (소수점 이하 2자리 출력)

printf("%.5f\\n", 3.1);

 3.10000 (소수점 이하 5자리까지 출력)


✔ 0 채우기 (Zero Padding)

숫자를 출력할 때 빈 자리를 0으로 채우는 것도 가능합니다.

printf("%05d\\n", 42);

 00042 (5자리 확보, 빈 공간을 0으로 채움)


✔ 정렬 (Left / Right Justification)

  • 기본적으로 숫자는 오른쪽 정렬됨.
    • 기호를 사용하면 왼쪽 정렬됨.
printf("%10d\\n", 123);  // 기본: 오른쪽 정렬
printf("%-10d\\n", 123); // 왼쪽 정렬

출력 결과:

       123
123

3️⃣ 확장된 포맷 옵션

✔ 부호(+/-) 강제 표시

  • %+d를 사용하면 양수라도 + 기호를 출력함.
  • 기본적으로 음수는 -``로 표시됨.
printf("%+d %+d\\n", 10, -10);

 +10 -10


✔ 공백( ``)으로 양수 표시

양수인 경우 + 대신 공백을 추가할 수도 있음.

printf("% d\\n", 10);
printf("% d\\n", -10);

 10
-10

✔ 16진수, 8진수의 Prefix 출력

  • %#x  0x를 붙여 출력
  • %#X  0X를 붙여 출력
  • %#o  0을 붙여 출력
printf("%#x\\n", 255);
printf("%#o\\n", 10);

0xff
012

4️⃣ 여러 개의 값 출력

포맷 지정자를 여러 개 사용할 수도 있습니다.

printf("Name: %s, Age: %d, Height: %.1fcm\\n", "Alice", 25, 167.5);

 Name: Alice, Age: 25, Height: 167.5cm

🚨 주의: printf의 포맷 지정자 개수와 인자의 개수가 일치해야 합니다.

잘못된 경우 예상치 못한 동작이 발생할 수 있음.


5️⃣ 잘못된 포맷 문자열의 문제점

C에서는 컴파일러가 printf의 포맷 문자열을 자동으로 검사하지 않습니다.

따라서 잘못된 형식을 사용하면 예측할 수 없는 오류가 발생할 수 있습니다.

int num = 42;
printf("%s\\n", num); // ⚠️ 정수를 문자열로 출력하려고 하면 오류 발생

 잘못된 결과 또는 프로그램 충돌 발생 가능 (Segmentation fault 등)

해결 방법: 적절한 포맷 지정자를 사용해야 함.

printf("%d\\n", num); // 올바른 사용법

6️⃣ scanf에서의 서식 지정자

scanf를 사용할 때도 같은 포맷 지정자를 사용하지만, 주소 연산자(&)를 붙여야 함.

int age;
float height;
char name[20];

printf("Enter your name, age, and height: ");
scanf("%s %d %f", name, &age, &height);

printf("Hello %s, you are %d years old and %.1f cm tall.\\n", name, age, height);

🚨 주의:

  • scanf("%s", name); → 문자열을 받을 때는 &를 붙이지 않음 (char 배열 자체가 주소이기 때문).
  • scanf("%d", &age); → 정수는 &를 붙여야 함 (int 변수의 주소 전달).
  • scanf("%f", &height); → 실수도 &를 붙여야 함.

7️⃣ 결론 (총 정리)

 C의 서식 문자열(format string)은 printf, scanf에서 데이터 출력을 조정하는 강력한 도구

 %d, %f, %s, %c 등의 포맷 지정자를 올바르게 사용해야 함

 출력 너비, 정렬, 소수점 자리수, 부호 표시 등을 세부적으로 조정 가능

 잘못된 포맷 지정자는 프로그램 충돌이나 예측할 수 없는 결과를 초래할 수 있음

블로그 이미지

RIsN

,

목표

함수 정리 및 개인적인 시간이 있을 때 설명 읽어두기.

각 함수 설명

on preStart

  • 측정 시작 전에 실행됨
  • 변수 초기화, 메시지 출력, 파일 읽기 가능
  • 하지만 시스템이 완전히 활성화되지 않았으므로 버스 메시지 전송 불가능

on start

  • 측정이 실제로 시작될 때 실행됨
  • 타이머 시작, 로깅 초기화, 버스로 메시지 전송 가능
  • 이 시점에서는 모든 시스템 기능을 사용할 수 있음

on preStop

  • 측정 중지 요청이 들어온 후 실행되며, 측정이 실제로 중지되기 전에 처리됨
  • 마지막으로 정리해야 할 작업 수행 가능 (예: ECU 종료 메시지 전송, 로그 저장 등)
  • DeferStop을 호출하면 측정 중지를 지연할 수 있음
    • 예: deferStop (5000);

on stopMeasurement

  • 측정이 완전히 중지된 후 실행됨
  • 환경 변수 등의 변경이 반영되지 않을 수도 있음
  • 로그 정리 등 종료 후 수행할 작업을 처리해야 함
블로그 이미지

RIsN

,

목표

  • 전송 Configuration에 기본이 되는 실행 스크립트를 제작

제작

1. Simulation Setup에서 아래 선을 선택해서 오른쪽 클릭
※왜인지 저 선을 뭐라고 부르는 지 찾을 수가 없음.

2. Insert Network Node 선택

※원하면 아래와 같이 Node Configuration에서 이름 등을 수정

3. 아래의 연필 혹은 오른쪽 클릭해서 Edit을 누르고 새로운 스크립트를 해당 노드와 연결

4. 아래와 같이 VectorCAPL Browser가 나오면 준비 완료

블로그 이미지

RIsN

,

목표

어떤 Window가 사라졌을 때 해당 Window를 띄우기.

방법

  1. Home → Write 선택

블로그 이미지

RIsN

,

1. Tester Present 서비스 개요

UDS(ISO 14229) 프로토콜에서 Tester Present(0x3E) 서비스는 ECU가 진단 세션을 유지하도록 하는 역할을 합니다. 진단 장치(테스터)가 특정 시간 동안 ECU에 진단 메시지를 보내지 않으면 ECU는 진단 세션을 자동으로 종료하고 기본 모드(default session)로 돌아가게 됩니다. 이를 방지하기 위해 주기적으로 Tester Present 메시지를 보내야 합니다.

2. Tester Present 서비스의 목적

  • ECU가 특정 진단 세션을 유지하도록 함
  • ECU가 세션 타임아웃을 하지 않도록 주기적으로 신호 전송
  • ECU가 특정 모드(예: extended session 또는 programming session)에서 계속 동작할 수 있도록 보장

3. 메시지 구조

Tester Present 서비스는 단순한 메시지 구조를 가지고 있습니다.

Byte설명

0x3E Tester Present 서비스 ID
0x00 또는 0x80 서브 기능(sub-function)
(응답) 0x7E 응답 메시지 (Positive Response)
(응답) 0x7F 0x3E 0x12 Negative Response (Subfunction Not Supported)
(응답) 0x7F 0x3E 0x78 Negative Response (Response Pending)

서브 기능 (Subfunction)

  • 0x00 (Zero Subfunction): 기본 Tester Present 메시지 (응답 필수)
  • 0x80 (Suppress Positive Response Bit 설정됨): ECU에서 응답을 보내지 않도록 설정 (Silent mode)

예제 요청/응답

  1. 기본 Tester Present 요청
    • 요청: 3E 00
    • 응답: 7E (Positive Response)
  2. Suppress Positive Response 요청
    • 요청: 3E 80
    • 응답 없음 (ECU가 응답하지 않음)
  3. Negative Response 예제
    • 요청: 3E 00
    • 응답: 7F 3E 12 (Subfunction Not Supported)
    • 응답: 7F 3E 78 (Response Pending, ECU가 처리 중)

4. Tester Present의 동작 방식

  1. 진단 장치(Tester)는 특정 진단 세션(예: ExtendedDiagnosticSession, ProgrammingSession)을 시작함.
  2. ECU는 특정 타임아웃(보통 5초~10초) 내에 새로운 진단 요청을 받지 않으면 기본 세션(default session)으로 돌아감.
  3. 이를 방지하기 위해 진단 장치는 주기적으로(예: 2~3초마다) Tester Present 메시지를 전송.
  4. ECU가 메시지를 받으면 타이머를 리셋하고 현재 세션을 유지.
  5. 특정 상황에서는 ECU가 바쁜 경우 0x7F 3E 78 (Response Pending)으로 응답할 수도 있음.

5. 주요 고려 사항

  • 진단 세션 유지: Extended 또는 Programming 세션에서는 주기적으로 3E 00을 보내야 세션이 종료되지 않음.
  • Suppress Positive Response: 3E 80을 사용하면 ECU가 응답하지 않으므로 통신 트래픽을 줄일 수 있음.
  • Response Pending: ECU가 바쁜 경우(예: Flashing 중) 0x7F 3E 78을 반환할 수 있음.
  • 세션별 필요 여부: Default Diagnostic Session에서는 Tester Present가 필요하지 않음.

6. 실무 적용 예시

차량 ECU Flashing 시나리오

  • ECU의 Flash Programming Mode(10 02 Programming Session)로 진입 후
  • 3E 00 메시지를 일정 간격으로 보내면서 세션 유지
  • Flashing 완료 후, 11 01 (ECU Reset)으로 리부팅

이처럼 Tester Present는 ECU와의 장기적인 진단 세션을 유지하는 핵심적인 역할을 합니다.

블로그 이미지

RIsN

,

목표

  • 모니터 Configuration을 작성해서 전송 Configuration이 어떤 신호를 보내왔는지 확인하기.
  • 진단통신을 전송할 프로그램을 이 Configuration으로 설정

  • Transmit 부분을 담당하는 메인 Configuration

제작

1. 새 프로젝트 제작

2. Channel Mapping의 VCI를 VN1610 Channel을 1로 설정

3. 준비 완료

블로그 이미지

RIsN

,

목표

  • 모니터 Configuration을 작성해서 전송 Configuration이 어떤 신호를 보내왔는지 확인하기.
  • 진단통신에서 ACK를 보내줄 프로그램을 이 모니터 Configuration으로 설정

  • Receive부분을 담당(우선은 Monitor, 다음으로 Simulator로 진화 예정) 

제작

1. 새 Configuration 제작

2. Channel Mapping의 VCI를 VN1610 Channel을 2로 설정

3. Start로 시작 후에 신호 받아보기

블로그 이미지

RIsN

,