목표

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

제작

1. System Variable제작

2. Input/Output Box를 드래그해서 제작 후, Property설정 후 System Variable 연결

3. 코드 제작 후 실행 확인

/*@!Encoding:65001*/

on start {
  // Initialize the CAN address when the program starts
  AdjustCANAddress();  
}

on sysvar sysvar::Engine::_btnTransmit {
  // Buffer to store the CAN address (maximum 8 characters + null terminator)
  char canAddress[9];  
  
  // Check if the button is pressed
  if(@this == 1) {
    // Retrieve the current CAN address
    GetCANAddress(canAddress);
    // Print the CAN address when the button is clicked
    write(":: Current CAN Address: %s", canAddress);
  }
}

// This event triggers when the CAN address input field changes
on sysvar sysvar::Engine::_txtCANAddress {
  // Adjust the CAN address whenever it is modified
  AdjustCANAddress();  
}

// Function to adjust the CAN address
void AdjustCANAddress() {
  // Buffer to hold the input CAN address (temporary storage)
  char buffer[128];  
  // Buffer to store a valid CAN address (max 8 characters + null terminator)
  char limit[9];  
  
  // Retrieve the current CAN address value from the system variable
  sysGetVariableString(sysvar::Engine::_txtCANAddress, buffer, elcount(buffer));
  
  // If the input field is empty, set a default CAN address
  if(strlen(buffer) <= 0) {
    sysSetVariableString(sysvar::Engine::_txtCANAddress, "18DA01F1");
  } 
  // If the input exceeds 8 characters, truncate it to 8 characters
  else if(strlen(buffer) > 8) {
    // Copy only the first 8 characters
    mbstrncpy(limit, buffer, 8);
    // Update the system variable with the trimmed address
    sysSetVariableString(sysvar::Engine::_txtCANAddress, limit);  
  }
}

// Function to retrieve the adjusted CAN address
void GetCANAddress(char buffer[]) {
  AdjustCANAddress();  // Ensure the CAN address is properly formatted
  
  // Retrieve the adjusted CAN address from the system variable
  sysGetVariableString(sysvar::Engine::_txtCANAddress, buffer, elcount(buffer));
  
  // Ensure the string is properly null-terminated
  buffer[strlen(buffer)] = '\\0';
}

'Programming > CANoe' 카테고리의 다른 글

CANoe UI 만들기: 버튼  (0) 2025.03.10
CANoe 함수: mbstrncpy  (0) 2025.03.10
CANoe 함수: strlen  (0) 2025.03.10
CANoe 함수: sysSetVariableString  (0) 2025.03.10
CANoe 함수: sysGetVariableString  (0) 2025.03.02
블로그 이미지

RIsN

,

목표

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

제작

1. Environment → System Variables → System Variables Configuration으로 이동

2. 오른쪽 클릭으로 New 선택

3. 수치 설정 후 OK

  • 초기값 (Initial Value)또한, 글로벌 설정에서 특정 옵션을 활성화한 경우, 측정이 시작될 때마다 시스템 변수는 이 초기값으로 리셋됩니다.
    1. 데이터 (Data 타입)
      • 값을 두 자리 16진수(HEX) 숫자로 입력하며, 값 사이를 공백(space) 으로 구분합니다.
      • 예시: 01 2A FF → 3바이트 데이터 (01, 2A, FF)
    2. 정수 배열 (Integer Array 타입)
      • 배열 요소를 Int32(32비트 정수) 값으로 입력하며, 값 사이를 세미콜론(;) 으로 구분합니다.
      • 예시: 5;8;33 → 크기가 3인 배열 ([5, 8, 33])
    3. 기타 데이터 타입 (Other Data Types)
      • 해당 데이터 타입의 값 범위 내에서 적절한 값을 입력해야 합니다.
  • 초기값을 지정하는 방법은 시스템 변수의 데이터 타입에 따라 다릅니다:
  • 초기값을 지정하면, 시스템 변수가 처음 정의될 때 해당 값으로 설정됩니다.
  • 값 할당 시 이벤트 (Events on Value Assignment)설정 가능한 이벤트 생성 방식은 다음과 같습니다:
    1. 마지막 값으로 한 번만 이벤트 발생 (One Event with Last Value)
      • 여러 값이 한 번에 할당되더라도, 가장 마지막에 할당된 값으로 단 한 번의 이벤트만 생성됩니다.
    2. 모든 값에 대해 이벤트 발생 (All Events)
      • 할당된 각각의 값에 대해 이벤트가 개별적으로 생성됩니다.
      • 이 경우, 모든 이벤트는 같은 타임스탬프(time stamp) 를 갖게 됩니다.
  • 시스템 변수의 값이 변경될 때 이벤트가 트리거되는데, 특정 옵션을 통해 여러 값이 동시에 할당될 경우 이벤트 생성 방식을 설정할 수 있습니다.

4. Panel에서 Button을 Drag로 생성

5. Property를 수정

6. Symbol Values의 Value 선택

7. 제작한 System Variable을 선택 후 OK

8. 버튼용 함수를 제작

// :: Transmit Button
on sysvar sysvar::Engine::_btnTransmit {
  // :: Click
  if(@this == 1) {
    write(":: Button Clicked");
  }
}

9. 실행 확인

 

'Programming > CANoe' 카테고리의 다른 글

CANoe UI 만들기: 텍스트 박스  (0) 2025.03.10
CANoe 함수: mbstrncpy  (0) 2025.03.10
CANoe 함수: strlen  (0) 2025.03.10
CANoe 함수: sysSetVariableString  (0) 2025.03.10
CANoe 함수: sysGetVariableString  (0) 2025.03.02
블로그 이미지

RIsN

,

목표

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

각 함수 설명

mbstrncpy

  • 멀티바이트 문자열(Multibyte String)에서 특정 길이만큼 문자를 복사하는 함수입니다.
  • 일반적인 strncpy(...) 함수와 다르게, 다국어(UTF-8, Shift-JIS 등) 환경에서도 정확한 문자 개수를 복사할 수 있도록 설계되었습니다.

사용법

void mbstrncpy(char dest[], char src[], long len);
  • dest → 복사할 대상 문자열 (버퍼)
  • src → 원본 문자열
  • len → 복사할 문자 개수 (-1을 입력하면 가능한 한 최대 길이를 복사)
  • 널 종료 문자(\0)는 자동으로 추가됨

예제

char source[50] = "Hello, World!";
char destination[20];

mbstrncpy(destination, source, 5);
write("Result: %s", destination);

➡️ "Hello"가 destination에 복사됨.

✅ 널 종료 문자(\0)는 자동으로 추가됨 (즉, strncpy(...)와 다르게 마지막 문자가 \0으로 보장됨).

✅ 다국어 문자열(일본어, 한글 등)에서 한 문자가 여러 바이트인 경우에도 정상 동작.

✅ len 매개변수를 -1로 설정하면 가능한 최대한의 문자열을 복사.

mbstrncpy_off

  • 문자열을 특정 위치(destOffset)에서부터 덮어쓰기(overwrite)하는 함수입니다.

사용법

void mbstrncpy_off(char dest[], long destOffset, char src[], long len);
  • dest → 변경할 대상 문자열
  • destOffset → 대상 문자열에서 복사를 시작할 위치 (문자 단위)
  • src → 원본 문자열
  • len → 복사할 문자 개수 (-1을 입력하면 가능한 최대한 복사)

예제

char s1[50] = "eine grüne "; // 독일어로 "a green"
char s2[10] = "Türen"; // 독일어로 "doors"

mbstrncpy_off(s1, 11, s2, 3);
write("Result: %s", s1);  // "eine grüne Tür"

비교

함수 기능 주요특징
mbstrncpy(dest, src, len) 멀티바이트 문자열 복사 다국어 지원, 최대 길이 설정 가능 (-1 사용 가능)
mbstrncpy_off(dest, offset, src, len) 특정 위치에서 문자열 덮어쓰기 지정된 오프셋에서 복사 가능
strncpy(dest, src, len) 일반 문자열 복사 다국어 지원 ❌, 바이트 단위로 동작

'Programming > CANoe' 카테고리의 다른 글

CANoe UI 만들기: 텍스트 박스  (0) 2025.03.10
CANoe UI 만들기: 버튼  (0) 2025.03.10
CANoe 함수: strlen  (0) 2025.03.10
CANoe 함수: sysSetVariableString  (0) 2025.03.10
CANoe 함수: sysGetVariableString  (0) 2025.03.02
블로그 이미지

RIsN

,

목표

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

각 함수 설명

strlen

  • **문자열의 길이(바이트 단위)**를 반환하는 함수입니다.
  • 즉, 주어진 문자열에서 널 종료 문자(\0) 이전까지의 문자 개수를 바이트 단위로 계산합니다.

사용방법

long strlen(char s[]);
  • s → 길이를 구할 문자열 (널 종료 문자 \0 포함)
  • 반환값 → 문자열의 길이(바이트 단위, long 타입)

예제

long length;
char buffer[100] = "CANalyzer";
length = strlen(buffer);
write("String length: %d", length);
  • 문자열 s의 길이를 측정하는데, 널 종료 문자(\0)는 포함하지 않음.
  • 예를 들어, "CANalyzer"라는 문자열의 길이는 9가 아니라 8 (C A N a l y z e r \0) 입니다.
    • 문자열을 저장할 때, 문자열 끝에 자동으로 \0이 추가됨.

strlen(…)과 다국어 문자열

  • strlen(…)은 한 문자가 여러 바이트로 표현되는 경우 주의가 필요합니다.
  • 특히 일본어, 한글, 특수 문자가 포함된 경우 예상과 다른 결과가 나올 수 있습니다.

일본어 문자열 예제 (Shift-JIS)

char buffer[100] = "こんにちは"; // "안녕하세요" (일본어)
long length = strlen(buffer);
write("String length: %d", length);

➡️ 예상 출력값: 10 (5개의 문자지만, Shift-JIS에서는 문자당 2바이트 필요)

➡️ 한 문자가 여러 바이트를 차지할 수 있으므로 주의가 필요.

'Programming > CANoe' 카테고리의 다른 글

CANoe UI 만들기: 버튼  (0) 2025.03.10
CANoe 함수: mbstrncpy  (0) 2025.03.10
CANoe 함수: sysSetVariableString  (0) 2025.03.10
CANoe 함수: sysGetVariableString  (0) 2025.03.02
CANoe 함수: elcount  (0) 2025.03.02
블로그 이미지

RIsN

,

목표

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

각 함수 설명

sysGetVariableString

  • 시스템 변수(System Variable) 중 문자열(String, char[]) 타입의 값을 설정(변경)하는 함수입니다.
  • CANoe에서 시스템 변수를 이용해 메시지 전송, ECU 상태 저장, 내부 변수 관리 등을 수행할 수 있으며, 이 함수는 문자열 변수 값을 동적으로 변경할 때 유용합니다.

함수의 반환값

반환값설명

0 정상적으로 실행됨 (성공)
1 네임스페이스를 찾을 수 없음 또는 동일한 네임스페이스를 중복 정의
2 변수를 찾을 수 없음 또는 동일한 변수를 중복 정의
3 네임스페이스에 대한 쓰기 권한 없음
4 변수의 타입이 char[]이 아님 (문자열이 아님)

form 1: 네임스페이스와 변수 이름을 문자열로 전달

long sysSetVariableString(char namespace[], char variable[], char value[]);
  • namespace → 시스템 변수가 속한 네임스페이스
  • variable → 변수 이름
  • value → 설정할 문자열 값

예제

sysSetVariableString("VehicleData", "SpeedText", "Fast");

➡️ “VehicleData” 네임스페이스의 “SpeedText” 변수 값을 “Fast”로 변경.

form 2: 시스템 변수의 전체 경로를 직접 지정

long sysSetVariableString(SysVarName, char value[]);
  • SysVarName → 시스템 변수의 전체 이름 (네임스페이스 포함)
  • value → 설정할 문자열 값

예제

sysSetVariableString(sysvar::VehicleData::SpeedText, "Fast");

➡️ “VehicleData::SpeedText” 시스템 변수 값을 “Fast”로 변경.

시스템 변수의 특정 요소 값 설정

시스템 변수가 구조체(struct) 또는 배열(array) 인 경우, 특정 요소만 설정할 수도 있습니다.

📌 예제 (배열 요소 값 변경)

sysSetVariableString(sysvarMember::XCP::ECU_2::KL2.Curve2[0], "NewValue");

➡️ “XCP::ECU_2::KL2.Curve2[0]” 배열의 첫 번째 요소 값을 “NewValue”로 변경.

'Programming > CANoe' 카테고리의 다른 글

CANoe 함수: mbstrncpy  (0) 2025.03.10
CANoe 함수: strlen  (0) 2025.03.10
CANoe 함수: sysGetVariableString  (0) 2025.03.02
CANoe 함수: elcount  (0) 2025.03.02
CANoe 함수: on sysvar  (0) 2025.03.02
블로그 이미지

RIsN

,

목표

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

각 함수 설명

sysGetVariableString

  • 시스템 변수(System Variable) 중 문자열(String, char[]) 타입의 값을 가져오는 함수입니다.
  • CANoe의 시스템 변수는 메시지, 신호, 내부 상태 관리 등에 사용되며, 이 함수는 문자열 값을 직접 읽어올 때 유용합니다.

함수의 반환값

반환값설명

0 정상적으로 실행됨 (성공)
1 네임스페이스를 찾을 수 없음 또는 동일한 네임스페이스를 중복 정의
2 변수를 찾을 수 없음 또는 동일한 변수를 중복 정의
3 네임스페이스에 대한 쓰기 권한 없음
4 변수의 타입이 char[]이 아님 (문자열이 아님)

form 1: 네임스페이스와 변수 이름을 문자열로 전달

long sysGetVariableString(char namespace[], char variable[], char buffer[], long bufferSize);
  • namespace → 시스템 변수가 속한 네임스페이스 이름
  • variable → 변수 이름
  • buffer → 가져온 문자열을 저장할 버퍼
  • bufferSize → 버퍼의 크기

예제

char buf[100];
sysGetVariableString("VehicleData", "SpeedText", buf, elcount(buf));
write("SpeedText: %s", buf);

➡️ “VehicleData” 네임스페이스의 “SpeedText” 시스템 변수를 읽어 “buf”에 저장한 후 출력.

form 2: 시스템 변수의 전체 경로를 직접 지정

long sysGetVariableString(SysVarName, char buffer[], long bufferSize);
  • SysVarName → 시스템 변수의 전체 이름 (네임스페이스 포함)
  • buffer → 값을 저장할 버퍼
  • bufferSize → 버퍼 크기

예제

char buf[100];
sysGetVariableString(sysvar::VehicleData::SpeedText, buf, elcount(buf));
write("SpeedText: %s", buf);

➡️ “VehicleData::SpeedText” 시스템 변수 값을 가져와 “buf”에 저장.

시스템 변수 포인터(sysvarString *)를 활용하여 동적으로 문자열 변수를 처리할 수도 있습니다.

예제

on key 'd'
{
  sysvarString * svString1;
  char buf[100];

  // getSysVarString 함수에서 시스템 변수 포인터 가져오기
  svString1 = getSysVarString(0);
  sysGetVariableString(svString1, buf, elcount(buf));
  write("Variable: %s, Value: %s", svString1.name, buf);

  // 값 변경
  sysSetVariableString(svString1, "OFF");
  sysGetVariableString(svString1, buf, elcount(buf));
  write("Variable: %s, Value is now: %s", svString1.name, buf);

  svString1 = getSysVarString(1);
  sysGetVariableString(svString1, buf, elcount(buf));
  write("Variable: %s, Value: %s", svString1.name, buf);
}

// 시스템 변수 선택 함수
sysvarString * getSysVarString(int cKey)
{
  switch (cKey)
  {
  case 0:
    return sysvar::FMW1::KeyString;
  case 1:
    return sysvar::DCM::SpeedSignalString;
  default:
    return sysvar::Engine::EngineStateString;
  }
}

'Programming > CANoe' 카테고리의 다른 글

CANoe 함수: strlen  (0) 2025.03.10
CANoe 함수: sysSetVariableString  (0) 2025.03.10
CANoe 함수: elcount  (0) 2025.03.02
CANoe 함수: on sysvar  (0) 2025.03.02
CANoe UI Panel 만들기: 시작, 종료 버튼  (0) 2025.02.28
블로그 이미지

RIsN

,

목표

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

각 함수 설명

elcount

배열(array)의 요소 개수를 반환하는 함수입니다.

하지만 배열의 사용 방식에 따라 반환값의 데이터 타입이 다릅니다.

예제

int numbers[5] = {1, 2, 3, 4, 5};

void example()
{
  dword size;
  size = elcount(numbers);  // 배열 크기 반환
  write("Array size: %d", size); // 출력: "Array size: 5"
}
블로그 이미지

RIsN

,

목표

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

각 함수 설명

on sysVar

🔹 기능

  • 시스템 변수의 값이 변경될 때 실행됨.
  • 동일한 시스템 변수에 대해 여러 CAPL 노드에서 독립적으로 반응 가능.

🛠 사용법

on sysVar 시스템변수_이름
{
  // 변경된 시스템 변수 값 가져오기
  int newValue = @this;
  write("New value: %d", newValue);
}

📌 예제

on sysVar Vehicle::Speed
{
  write("Speed Changed! New Value: %d", @this);
}

➡️ Vehicle::Speed 시스템 변수 값이 변경될 때마다 실행됨.

※메모: @this를 쓰려면 해당 변수가 int 혹은 float이어야 함

on sysVar_change

🔹 기능

  • 값이 변경될 때만 실행됨.
  • 같은 값이 연속해서 입력되면 실행되지 않음.

🛠 사용법

on sysVar_change 시스템변수_이름
{
  write("Value changed: %d", @this);
}

📌 예제

on sysVar_change Vehicle::RPM
{
  write("RPM Changed! New Value: %d", @this);
}

➡️ Vehicle::RPM 값이 변경될 때 실행됨.

➡️ 같은 값이 입력되면 실행되지 않음.

on sysVar_update

🔹 기능

  • 값이 변경되지 않아도, 업데이트가 발생하면 실행됨.
  • 센서 데이터나 주기적으로 업데이트되는 값 처리에 적합.

🛠 사용법

on sysVar_update 시스템변수_이름
{
  write("Variable Updated: %d", @this);
}

📌 예제

on sysVar_update Vehicle::Speed
{
  write("Speed Updated (Even if unchanged): %d", @this);
}

➡️ Vehicle::Speed가 변경되지 않아도 주기적으로 업데이트될 때 실행됨.

on sysVarMember

🔹 기능

  • 구조체(struct) 또는 배열(array)의 특정 멤버 값이 변경될 때 실행.
  • on sysVar과 같은 역할을 하지만, 특정 멤버 변수만 감지할 수 있음.

🛠 사용법

on sysVarMember 시스템변수_이름::멤버_이름
{
  write("Member value changed: %d", @this);
}

📌 예제

on sysVar Vehicle::Status::EngineTemp
{
  write("Engine Temperature Updated: %d", @this);
}

➡️ Vehicle::Status 구조체의 EngineTemp 값이 변경될 때 실행됨.

on sysVar (변수1 | 변수2 | …)

🔹 기능

  • 여러 개의 시스템 변수에 대한 감지를 한 번에 처리.
  • 모든 변수 타입이 동일해야 this 키워드 사용 가능.

🛠 사용법

on sysVar (변수1 | 변수2 | 변수3)
{
  write("Variable Changed: %s, New Value: %d", this.name, @this);
}

📌 예제

on sysVar (IO::DI_0 | IO::DI_1)
{
  write("Changed Variable: %s, New Value: %d", this.name, @this);
}

➡️ IO::DI_0 또는 IO::DI_1 값이 변경될 때 실행됨.

➡️ this.name을 사용하면 변경된 변수 이름을 출력할 수 있음.

블로그 이미지

RIsN

,

목표

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

,