Main Content

Stateflow 데이터에 대한 연산

Simulink® 모델의 Stateflow® 차트에는 상태 동작과 천이 동작에서 사용할 수 있는 연산을 정의하는 동작 언어 속성이 있습니다. 언어 속성은 다음과 같습니다.

  • MATLAB®을 동작 언어로 사용합니다.

  • C를 동작 언어로 사용합니다.

자세한 내용은 Differences Between MATLAB and C as Action Language Syntax 항목을 참조하십시오.

이항 연산

다음 표는 Stateflow 차트에 나오는 모든 이항 연산의 해석을 우선 순위(0 = 가장 높음, 10 = 가장 낮음)에 따라 요약한 것입니다. 이항 연산은 좌측 결합이므로 어떤 표현식에서든 우선 순위가 같은 연산자는 왼쪽에서 오른쪽으로 평가되어야 합니다. 다른 연산에 대한 계산 순서는 지정되지 않습니다. 다음 대입식을 예로 들어보겠습니다.

A = f() > g();
여기서 f()g()의 계산 순서는 지정되지 않습니다. 보다 예측 가능한 결과를 위해 계산 순서를 따르는 표현식을 여러 명령문으로 분할하는 것이 좋은 코딩 방법입니다.

연산

우선 수위

MATLAB을 동작 언어로 사용

C를 동작 언어로 사용

a ^ b

0

거듭제곱.

거듭제곱. 이 연산은 C 라이브러리 함수 pow와 동일합니다. 피연산자는 먼저 부동소수점 숫자로 형변환됩니다. 자세한 내용은 Call C Library Functions 항목을 참조하십시오.

C 언어 비트 연산 사용 차트 속성을 선택 해제하여 이 연산을 활성화합니다. 자세한 내용은 Enable C-bit operations 항목을 참조하십시오.

a * b

1

곱셈.

곱셈.

a / b

1

나눗셈.

나눗셈.

a %% b

1

지원되지 않음. rem 또는 mod 함수를 사용하십시오.

나머지. 정수가 아닌 피연산자는 먼저 정수로 형변환됩니다.

a + b

2

덧셈.

덧셈.

a - b

2

뺄셈.

뺄셈.

a >> b

3

지원되지 않음. bitshift 함수를 사용하십시오.

ab비트만큼 오른쪽으로 시프트합니다. 자세한 내용은 비트별 연산 항목을 참조하십시오.

a << b

3

지원되지 않음. bitshift 함수를 사용하십시오.

ab비트만큼 왼쪽으로 시프트합니다. 자세한 내용은 비트별 연산 항목을 참조하십시오.

a > b

4

비교, 보다 큼.

비교, 보다 큼.

a < b

4

비교, 보다 작음.

비교, 보다 작음.

a >= b

4

비교, 보다 크거나 같음.

비교, 보다 크거나 같음.

a <= b

4

비교, 보다 작거나 같음.

비교, 보다 작거나 같음.

a == b

5

비교, 같음.

비교, 같음.

a ~= b

5

비교, 같지 않음.

비교, 같지 않음.

a != b

5

지원되지 않음. 연산 a ~= b를 사용하십시오.

비교, 같지 않음.

a <> b

5

지원되지 않음. 연산 a ~= b를 사용하십시오.

비교, 같지 않음.

a & b

6

논리 AND. 비트별 AND를 사용하려면 bitand 함수를 사용하십시오.

  • 비트별 AND(디폴트 값). C 언어 비트 연산 사용 차트 속성을 선택하여 이 연산을 활성화합니다.

  • 논리 AND. C 언어 비트 연산 사용 차트 속성을 선택 해제하여 이 연산을 활성화합니다.

자세한 내용은 비트별 연산 항목과 Enable C-bit operations 항목을 참조하십시오.

a ^ b

7

지원되지 않음. 비트별 XOR을 사용하려면 bitxor 함수를 사용하십시오.

비트별 XOR(디폴트 값). C 언어 비트 연산 사용 차트 속성을 선택하여 이 연산을 활성화합니다. 자세한 내용은 비트별 연산 항목과 Enable C-bit operations 항목을 참조하십시오.

a | b

8

논리 OR. 비트별 OR을 사용하려면 bitor 함수를 사용하십시오.

  • 비트별 OR(디폴트 값). C 언어 비트 연산 사용 차트 속성을 선택하여 이 연산을 활성화합니다.

  • 논리 OR. C 언어 비트 연산 사용 차트 속성을 선택 해제하여 이 연산을 활성화합니다.

자세한 내용은 비트별 연산 항목과 Enable C-bit operations 항목을 참조하십시오.

a && b

9

논리 AND.

논리 AND.

a || b

10

논리 OR.

논리 OR.

단항 연산 및 동작

다음 표는 Stateflow 차트에 나오는 모든 단항 연산과 동작의 해석을 요약한 것입니다. 단항 연산의 특징은 다음과 같습니다.

  • 이항 연산자보다 우선 순위가 높습니다.

  • 우측 결합이므로 어떤 표현식에서든 연산자는 오른쪽에서 왼쪽으로 평가되어야 합니다.

연산

MATLAB을 동작 언어로 사용

C를 동작 언어로 사용

~a

논리 NOT. 비트별 NOT을 사용하려면 bitcmp 함수를 사용하십시오.

  • 비트별 NOT(디폴트 값). C 언어 비트 연산 사용 차트 속성을 선택하여 이 연산을 활성화합니다.

  • 논리 NOT. C 언어 비트 연산 사용 차트 속성을 선택 해제하여 이 연산을 활성화합니다.

자세한 내용은 비트별 연산 항목과 Enable C-bit operations 항목을 참조하십시오.

!a

지원되지 않음. 연산 ~a를 사용하십시오.

논리 NOT.

-a

음수.

음수.

a++

지원되지 않음. 표현식 a = a+1을 사용하십시오.

크게. a = a+1과 동일합니다.

a--

지원되지 않음. 표현식 a = a-1을 사용하십시오.

작게. a = a-1과 동일합니다.

대입 연산

다음 표는 Stateflow 차트에 나오는 대입 연산의 해석을 요약한 것입니다.

연산

MATLAB을 동작 언어로 사용

C를 동작 언어로 사용

a = b

단순 대입.

단순 대입.

a := b

지원되지 않음. 고정소수점 승격 규칙을 재정의하려면 형변환 연산을 사용하십시오. 형변환 연산 항목을 참조하십시오.

고정소수점 숫자 대입. Override Fixed-Point Promotion in C Charts 항목을 참조하십시오.

a += b

지원되지 않음. 표현식 a = a+b를 사용하십시오.

a = a+b와 동일합니다.

a -= b

지원되지 않음. 표현식 a = a-b를 사용하십시오.

a = a-b와 동일합니다.

a *= b

지원되지 않음. 표현식 a = a*b를 사용하십시오.

a = a*b와 동일합니다.

a /= b

지원되지 않음. 표현식 a = a/b를 사용하십시오.

a = a/b와 동일합니다.

a %%= b

지원되지 않음. 표현식 a = mod(a,b) 또는 a = rem(a,b)를 사용하십시오.

a = a%%b와 동일합니다.

a &= b

지원되지 않음. 표현식 a = bitand(a,b)를 사용하십시오.

a = a&b(비트별 AND)와 동일합니다. C 언어 비트 연산 사용 차트 속성을 선택하여 이 연산을 활성화합니다. 자세한 내용은 비트별 연산 항목과 Enable C-bit operations 항목을 참조하십시오.

a ^= b

지원되지 않음. 표현식 a = bitxor(a,b)를 사용하십시오.

a = a^b(비트별 XOR)와 동일합니다. C 언어 비트 연산 사용 차트 속성을 선택하여 이 연산을 활성화합니다. 자세한 내용은 비트별 연산 항목과 Enable C-bit operations 항목을 참조하십시오.

a |= b

지원되지 않음. 표현식 a = bitor(a,b)를 사용하십시오.

a = a|b(비트별 OR)와 동일합니다. C 언어 비트 연산 사용 차트 속성을 선택하여 이 연산을 활성화합니다. 자세한 내용은 비트별 연산 항목과 Enable C-bit operations 항목을 참조하십시오.

형변환 연산

한 유형의 값을 다른 유형으로 변환하려면 형변환 연산을 사용합니다. 데이터를 명시적 유형 또는 다른 변수의 유형으로 형변환할 수 있습니다.

명시적 데이터형으로 형변환하기

숫자형 표현식을 명시적 데이터형으로 형변환하려면 형변환 함수 double, single, int8, int16, int32, int64, uint8, uint16, uint32, uint64, boolean 중 하나를 사용합니다. 예를 들어 다음 명령문은 표현식 x+3을 16비트 부호 없는 정수로 형변환하고 값을 데이터 y에 대입합니다.

y = uint16(x+3);

또는 MATLAB을 동작 언어로 사용하는 차트에서는 cast 함수를 사용하고 "double", "single", "int8", "int16", "int32", "int64", "uint8", "uint16", "uint32", "uint64" 또는 "logical"을 입력 인수로 지정할 수 있습니다. 예를 들어 다음 명령문은 표현식 x+3을 16비트 부호 없는 정수로 형변환하고 값을 y에 대입합니다.

y = cast(x+3,"uint16");

표현식을 고정소수점 데이터형으로 형변환하기 위해 MATLAB을 동작 언어로 사용하는 차트에서는 fi (Fixed-Point Designer) 함수 호출을 지원합니다. 예를 들어 다음 명령문은 표현식 x+3을 워드 길이가 8비트이고 소수부 길이가 3비트인 부호 있는 고정소수점 값으로 형변환합니다.

y = fi(x+3,1,8,3);

C를 동작 언어로 사용하는 차트에서는 fixdt (Simulink) 표현식을 인수로 사용하여 cast 함수를 호출하십시오. 예를 들어 다음 명령문은 표현식 x+3을 워드 길이가 8비트이고 소수부 길이가 3비트인 부호 있는 고정소수점 값으로 형변환합니다.

y = cast(x+3,fixdt(1,8,3));

다른 데이터를 기반으로 형변환하기

형변환을 더 쉽게 하기 위해 숫자형 표현식을 다른 Stateflow 데이터와 동일한 유형으로 변환할 수 있습니다.

MATLAB을 동작 언어로 사용하는 차트에서는 "like" 키워드를 사용하여 cast 함수를 호출하십시오. 예를 들어 다음 명령문은 x+3의 값을 데이터 z의 값과 동일한 유형으로 변환하고 값을 y에 대입합니다.

y = cast(x+3,"like",z);

C를 동작 언어로 사용하는 차트에서 type 연산자는 기존 Stateflow 데이터의 유형을 반환합니다. cast 연산에서 명시적 유형 대신 이 반환 값을 사용하십시오. 예를 들어 다음 명령문은 x+3의 값을 데이터 z의 값과 동일한 유형으로 변환하고 값을 y에 대입합니다.

y = cast(x+3,type(z));

비트별 연산

다음 표는 C를 동작 언어로 사용하는 Stateflow 차트에 나오는 모든 비트별 연산의 해석을 요약한 것입니다.

연산

설명
a & b비트별 AND.
a | b비트별 OR.
a ^ b비트별 XOR.
~a비트별 NOT.

a >> b

ab비트만큼 오른쪽으로 시프트합니다.

a << b

ab비트만큼 왼쪽으로 시프트합니다.

비트 시프트 연산 a >> ba << b를 제외한 모든 비트별 연산은 C 언어 비트 연산 사용 차트 속성을 선택하여 활성화해야 합니다. Enable C-bit operations 항목을 참조하십시오.

비트별 연산은 이항 수준에서 정수에 대해 동작합니다. 정수가 아닌 피연산자는 먼저 정수로 형변환됩니다. 정수 피연산자는 C 승격 규칙에 따라 결과의 중간값을 결정합니다. 그런 다음 이 중간값은 연산 결과에 대해 지정한 유형으로 형변환됩니다.

참고

MATLAB을 동작 언어로 사용하는 차트에서는 비트별 연산이 지원되지 않습니다. 대신 함수 bitand, bitor, bitxor, bitnot 또는 bitshift를 사용하십시오.

비트별 연산 및 정수 오버플로

비트별 연산의 중간값을 대입하는 데 사용되는 묵시적 형변환으로 인해 오버플로가 발생할 수 있습니다. 결과의 가장 오른쪽 비트를 유지하고 예기치 않은 동작을 방지하려면 차트 속성 정수 오버플로 시 포화를 비활성화합니다.

예를 들어 다음 모델의 두 차트 모두 비트별 연산 y = ~u를 계산합니다. 차트는 32비트인 타깃의 정수 크기를 사용하여 이 연산의 중간값을 계산하므로 이 값의 가장 왼쪽 비트부터 24개의 비트는 모두 1입니다. 차트가 중간값을 y에 대입하면 uint8로의 형변환으로 인해 정수 오버플로가 발생합니다. 각 차트의 출력은 차트가 정수 오버플로를 처리하는 방식에 따라 달라집니다.

  • 정수 오버플로 시 포화가 활성화된 경우 차트는 비트별 연산의 결과를 포화시키고 값 0을 출력합니다.

  • 정수 오버플로 시 포화가 비활성화된 경우 차트는 비트별 연산의 결과를 래핑하고 가장 오른쪽 비트부터 8개의 비트를 출력합니다.

자세한 내용은 Saturate on integer overflow 항목을 참조하십시오.

포인터 연산과 주소 연산

다음 표는 C를 동작 언어로 사용하는 Stateflow 차트에 나오는 포인터 연산과 주소 연산의 해석을 요약한 것입니다.

연산

설명

&a

주소 연산. 사용자 지정 코드와 Stateflow 변수에 사용하십시오.

*a

포인터 연산. 사용자 지정 코드 변수에만 사용하십시오.

예를 들어 모델 sf_bus_demo에는 포인터를 인수로 받는 사용자 지정 C 함수가 포함되어 있습니다. 차트가 사용자 지정 코드 함수를 호출하면 차트는 & 연산을 사용하여 주소를 통해 Stateflow 데이터를 함수로 전달합니다. 자세한 내용은 Integrate Custom Structures in Stateflow Charts 항목을 참조하십시오.

MATLAB을 동작 언어로 사용하는 차트에서는 포인터 연산과 주소 연산이 지원되지 않습니다. 구조체에 대한 포인터는 읽기 전용 모드에서만 사용해야 하며 전달되는 호출 중에만 유효합니다.

애플리케이션 구현으로 연산 대체하기

Embedded Coder® 또는 Simulink Coder™가 있는 경우 코드 생성 중에 코드 대체 라이브러리(CRL)를 적용하도록 코드 생성기를 구성할 수 있습니다. 코드 생성기는 애플리케이션 요구 사항을 충족하도록 연산을 위해 생성하는 코드를 변경합니다. Embedded Coder를 사용하면 사용자 지정 코드 대체 라이브러리를 개발하고 적용할 수 있습니다.

코드 대체 라이브러리의 연산 항목은 정수나 고정소수점 피연산자, 그리고 결과 패턴을 지정할 수 있습니다. 다음 연산에 연산 항목을 사용할 수 있습니다.

  • 덧셈 +

  • 뺄셈 -

  • 곱셈 *

  • 나눗셈 /

예를 들어 다음 표현식에서 u1, u2, y가 코드 대체 라이브러리에 있는 덧셈 항목과 호환되는 유형을 가지고 있는 경우 덧셈 연산자 +를 타깃별 구현으로 대체할 수 있습니다.

y = u1 + u2

차트가 산술식에서 타깃의 정수 크기를 중간 유형으로 사용하므로 C 차트 의미 체계는 연산자 항목 일치를 제한합니다. 예를 들어 다음 산술식은 타깃의 정수에 대한 중간 덧셈을 계산합니다.

y = (u1 + u2) % 3
타깃의 정수 크기가 32비트이면 이 표현식을 코드 대체 라이브러리의 덧셈 연산자로 대체할 수 없으며 정밀도 손실 없이 부호 있는 16비트 결과를 생성할 수 없습니다.

MathWorks®에서 제공하는 코드 대체 라이브러리 사용에 대한 자세한 내용은 What Is Code Replacement? (Simulink Coder) 항목과 Code Replacement Libraries (Simulink Coder) 항목을 참조하십시오. 사용자 지정 코드 대체 라이브러리 개발에 대한 자세한 내용은 What Is Code Replacement Customization? (Embedded Coder) 항목과 Code You Can Replace From Simulink Models (Embedded Coder) 항목을 참조하십시오.

관련 항목