주요 콘텐츠

Stateflow 데이터에 대한 연산

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

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

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

Stateflow 차트는 덧셈, 비교, 대입과 같은 표준 프로그래밍 연산을 지원합니다. 사용 가능한 특정 연산은 차트의 동작 언어에 따라 달라집니다.

  • 두 동작 언어는 모두 기본 산술(+, -, *) 및 비교(>, <, ==) 연산을 지원합니다.

  • C 동작 언어는 비트별 연산자(&, |)와 같은 연산을 추가로 지원합니다.

  • MATLAB 동작 언어는 C가 연산자로 수행하는 일부 연산에 대해 함수를 사용합니다.

모든 연산은 정수, 부동소수점 숫자, 부울 값을 포함한 Stateflow 데이터형에 사용할 수 있습니다. 자세한 내용은 동작 언어 구문으로서 MATLAB과 C의 차이점 항목을 참조하십시오.

산술 연산

산술 연산을 사용하여 센서 값, 제어 신호, 시스템 파라미터에 대한 계산을 수행합니다.

연산우선 수위설명

^

0

거듭제곱

voltage_squared = voltage ^ 2

*

1

곱셈

power = voltage * current

/

1

나눗셈efficiency = output_power / input_power

+

2

덧셈total_force = applied_force + friction_force

-

2

뺄셈error = setpoint - measured_value

비교 연산

비교 연산을 사용하여 제어 논리에서 조건과 임계값을 평가합니다.

연산우선 수위설명

>

4

보다 큼

if (temperature > max_temp)

<

4

보다 작음

if (pressure < min_pressure)

>=

4

보다 크거나 같음

if (speed >= target_speed)

<=

4

보다 작거나 같음

if (voltage <= safety_limit)

==

5

같음if (mode == CALIBRATION)

~=

5

같지 않음(MATLAB)if (status ~= READY)

!=

5

같지 않음(C)if (status != READY)

논리 연산

논리 연산을 사용하여 여러 조건을 결합합니다.

연산우선 수위MATLAB 동작 언어C 동작 언어
&&

9

논리 AND.

논리 AND.

||

10

논리 OR.

논리 OR.

~a

5

논리 NOT논리 NOT

!a

5

지원되지 않음논리 NOT

대입 연산

= 연산자를 사용하여 변수에 값을 대입합니다.

sensor_reading = adc_value;
control_output = pid_result;

C를 동작 언어로 사용하는 차트에 대해 다음과 같은 복합 대입 연산자를 사용할 수 있습니다.

연산동등

a += b

a = a + b

accumulator += sample

a -= b

a = a - b

error -= correction

a *= b

a = a * b

gain *= adjustment

a /= b

a = a / b

average /= sample_count

증가 및 감소

C를 동작 언어로 사용하는 차트에서 ++ 또는 –-를 사용하여 데이터 값을 증가시키거나 감소시킬 수 있습니다. 예를 들면 다음과 같습니다.

counter++; // Equivalent to counter = counter + 1
sample_index--; // Equivalent to sample_index = sample_index - 1

유형 변환 연산

Stateflow 차트에서 MATLAB 유형 함수를 사용할 수 있습니다.

pressure_int = int16(pressure_reading);
voltage_single = single(voltage_measurement);

cast 함수를 사용하는 방식은 동작 언어에 따라 다릅니다.

MATLAB을 동작 언어로 사용하는 차트에서는 다음을 사용하십시오.

result = cast(sensor_value, "int32");
scaled_value = cast(raw_data, "like", reference_signal);

C를 동작 언어로 사용하는 차트에서는 다음을 사용하십시오.

result = cast(sensor_value, int32);
scaled_value = cast(raw_data, type(reference_signal));

형변환 연산

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

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

숫자형 표현식을 명시적 데이터형으로 형변환하려면 형변환 함수 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));

이항 연산

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

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

연산

우선 수위

MATLAB을 동작 언어로 사용

C를 동작 언어로 사용

a & b

6

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

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

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

자세한 내용은 비트별 연산 항목과 C 언어 비트 연산 사용 항목을 참조하십시오.

a ^ b

7

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

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

a | b

8

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

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

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

자세한 내용은 비트별 연산 항목과 C 언어 비트 연산 사용 항목을 참조하십시오.

비트별 연산

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

연산

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

a >> b

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

a << b

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

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

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

참고

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

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

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

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

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

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

포인터 연산과 주소 연산

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

연산

설명

&a

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

*a

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

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

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

참고 항목

도움말 항목