Contenido principal

Operaciones para datos de Stateflow

Los gráficos de Stateflow® en los modelos de Simulink® tienen una propiedad del lenguaje de acción que define las operaciones que puede utilizar en acciones de estado y transición. Las propiedades del lenguaje son:

  • MATLAB® como lenguaje de acción.

  • C como lenguaje de acción.

Los gráficos de Stateflow admiten operaciones de programación estándar como suma, comparación y asignación. Las operaciones específicas disponibles dependen del lenguaje de acción del gráfico.

  • Ambos lenguajes de acción admiten aritmética básica (+, -, *) y comparación (>, <, ==).

  • El lenguaje de acción de C admite operaciones adicionales como operadores bit por bit (&, |).

  • El lenguaje de acción de MATLAB utiliza funciones para algunas operaciones que C realiza con operadores.

Todas las operaciones funcionan con tipos de datos de Stateflow, incluidos enteros, números de punto flotante y valores booleanos. Para obtener más información, consulte Diferencias entre MATLAB y C como sintaxis de lenguaje de acción.

Operaciones aritméticas

Utilice operaciones aritméticas para realizar cálculos con valores de sensores, señales de control y parámetros de sistema.

OperaciónPrecedenciaDescripciónEjemplo

^

0

Potencia

voltage_squared = voltage ^ 2

*

1

Multiplicación

power = voltage * current

/

1

Divisiónefficiency = output_power / input_power

+

2

Sumatotal_force = applied_force + friction_force

-

2

Restaerror = setpoint - measured_value

Operaciones de comparación

Utilice operaciones de comparación para evaluar condiciones y umbrales en la lógica de control.

OperaciónPrecedenciaDescripciónEjemplo

>

4

Mayor que

if (temperature > max_temp)

<

4

Menor que

if (pressure < min_pressure)

>=

4

Mayor que o igual a

if (speed >= target_speed)

<=

4

Menor que o igual a

if (voltage <= safety_limit)

==

5

Igual aif (mode == CALIBRATION)

~=

5

No igual a (MATLAB)if (status ~= READY)

!=

5

No igual a (C)if (status != READY)

Operaciones lógicas

Use operaciones lógicas para combinar múltiples condiciones.

OperaciónPrecedenciaLenguaje de acción de MATLABLenguaje de acción C
&&

9

AND lógico.

AND lógico.

||

10

OR lógico.

OR lógico.

~a

5

NOT lógicoNOT lógico

!a

5

No se admiteNOT lógico

Operaciones de asignación

Asigne valores a variables con el operador =:

sensor_reading = adc_value;
control_output = pid_result;

Para gráficos que utilizan C como lenguaje de acción, puede utilizar estos operadores de asignación compuestos.

OperaciónEquivalenteEjemplo

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

Aumento y disminución

En los gráficos que utilizan C como lenguaje de acción, puede utilizar ++ o –- para aumentar o disminuir los valores de los datos. Por ejemplo:

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

Operaciones de conversión de tipos

Puede utilizar funciones de tipo de MATLAB en cualquier gráfico de Stateflow.

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

El uso de la función cast es diferente dependiendo del lenguaje de acción.

En gráficos que utilizan MATLAB como lenguaje de acción, utilice:

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

En gráficos que utilizan C como lenguaje de acción, utilice:

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

Operaciones de conversión de tipos

Para convertir un valor de un tipo a otro tipo, utilice operaciones de conversión de tipos. Puede convertir datos a un tipo explícito o al tipo de otra variable.

Convertir a tipo de datos explícito

Para convertir una expresión numérica a un tipo de datos explícito, utilice una de estas funciones de conversión de tipos: double, single, int8, int16, int32, int64, uint8, uint16, uint32, uint64 y boolean. Por ejemplo, esta instrucción convierte la expresión x+3 a un entero de 16 bits sin signo y asigna el valor a los datos y:

y = uint16(x+3);

Como alternativa, en gráficos que utilizan MATLAB como lenguaje de acción, puede usar la función cast y especificar "double", "single", "int8", "int16", "int32", "int64", "uint8", "uint16", "uint32", "uint64" o "logical" como argumento de entrada. Por ejemplo, esta instrucción convierte la expresión x+3 a un entero de 16 bits sin signo y asigna el valor a y:

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

Para convertir una expresión a un tipo de punto fijo, los gráficos que utilizan MATLAB como lenguaje de acción admiten llamar a la función fi (Fixed-Point Designer). Por ejemplo, esta instrucción convierte la expresión x+3 a un valor de punto fijo con signo con una longitud de palabra de ocho bits y una longitud de fracción de tres bits:

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

En gráficos que utilizan C como lenguaje de acción, llame a la función cast usando una expresión fixdt (Simulink) como argumento. Por ejemplo, esta instrucción convierte la expresión x+3 a un valor de punto fijo con signo con una longitud de palabra de ocho bits y una longitud de fracción de tres bits:

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

Convertir tipos basándose en otros datos

Para facilitar la conversión de tipos, puede convertir el tipo de una expresión numérica al mismo tipo que otros datos de Stateflow.

En gráficos que utilizan MATLAB como lenguaje de acción, llame a la función cast con la palabra clave "like". Por ejemplo, esta instrucción convierte el valor de x+3 al mismo tipo que el de los datos z y asigna el valor a y:

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

En los gráficos que utilizan C como lenguaje de acción, el operador type devuelve el tipo de datos de Stateflow existentes. Utilice este valor devuelto en lugar de un tipo explícito en una operación cast. Por ejemplo, esta instrucción convierte el valor de x+3 al mismo tipo que el de los datos z y asigna el valor a y:

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

Operaciones binarias

Esta tabla resume la interpretación de todas las operaciones binarias de gráficos de Stateflow según su orden de precedencia (0 = mayor, 10 = menor). Las operaciones binarias son asociativas por la izquierda, de modo que, en cualquier expresión, los operadores con la misma precedencia se evalúan de izquierda a derecha. No se especifica el orden de evaluación para otras operaciones. Por ejemplo, en esta asignación

A = f() > g();
no se especifica el orden de evaluación de f() y g(). Para obtener resultados más predecibles, una práctica de codificación recomendada consiste en dividir expresiones que dependen del orden de evaluación en múltiples instrucciones.

Operación

Precedencia

MATLAB como lenguaje de acción

C como lenguaje de acción

a & b

6

AND lógico. Para AND bit por bit, utilice la función bitand.

  • AND bit por bit (valor predeterminado). Habilite esta operación seleccionando la propiedad de gráfico Enable C-bit operations,

  • AND lógico. Habilite esta operación eliminando la propiedad de gráfico Enable C-bit operations.

Para obtener más información, consulte Operaciones bit por bit y Enable C-bit operations.

a ^ b

7

No se admite. Para XOR bit por bit, utilice la función bitxor.

XOR bit por bit (valor predeterminado). Habilite esta operación seleccionando la propiedad de gráfico Enable C-bit operations. Para obtener más información, consulte Operaciones bit por bit y Enable C-bit operations.

a | b

8

OR lógico. Para OR bit por bit, utilice la función bitor.

  • OR bit por bit (valor predeterminado). Habilite esta operación seleccionando la propiedad de gráfico Enable C-bit operations.

  • OR lógico. Habilite esta operación eliminando la propiedad de gráfico Enable C-bit operations.

Para obtener más información, consulte Operaciones bit por bit y Enable C-bit operations.

Operaciones bit por bit

Esta tabla resume la interpretación de todas las operaciones bit por bit de los gráficos de Stateflow que utilizan C como lenguaje de acción.

Operación

Descripción
a & bAND bit por bit.
a | bOR bit por bit.
a ^ bXOR bit por bit.
~aNOT bit por bit.

a >> b

Desplace a a la derecha b bits.

a << b

Desplace a a la izquierda b bits.

Exceptuando las operaciones de desplazamiento de bits a >> b y a << b, debe habilitar todas las operaciones bit por bit seleccionando la propiedad de gráfico Enable C-bit operations. Para obtener más información, consulte Enable C-bit operations.

Las operaciones bit por bit funcionan en enteros en el nivel binario. Primero, los operandos no enteros se convierten a enteros. Los operandos enteros siguen las reglas de promoción de C para determinar el valor intermedio del resultado. Después, este valor intermedio se convierte al tipo que especifique para el resultado de la operación.

Nota

Las operaciones bit por bit no se admiten en gráficos que utilizan MATLAB como lenguaje de acción. En su lugar, utilice las funciones bitand, bitor, bitxor, bitnot o bitshift.

Operaciones bit por bit y desbordamientos de enteros

La conversión implícita utilizada para asignar el valor intermedio de una operación bit por bit puede producir un desbordamiento. Para conservar los bits situados más a la derecha del resultado y evitar comportamientos inesperados, deshabilite la propiedad de gráfico Saturate on Integer Overflows.

Por ejemplo, ambos gráficos de este modelo calculan la operación bit por bit y = ~u. Los gráficos calculan el valor intermedio de esta operación utilizando el tamaño de entero objetivo de 32 bits, por lo que los 24 bits situados más a la izquierda de este valor son solo unos. Cuando los gráficos asignan el valor intermedio a y, la conversión a uint8 produce un desbordamiento de enteros. La salida de cada gráfico depende de cómo el gráfico maneje los desbordamientos de enteros.

  • Si Saturate on Integer Overflow está habilitado, el gráfico satura el resultado de la operación bit por bit y genera un valor de cero como salida.

  • Si Saturate on Integer Overflow está deshabilitado, el gráfico ajusta el resultado de la operación bit por bit y genera sus ocho bits situados más a la derecha como salida.

Operaciones de puntero y dirección

Esta tabla resume la interpretación de las operaciones de puntero y dirección de los gráficos de Stateflow que utilizan C como lenguaje de acción.

Operación

Descripción

&a

Operación de dirección. Se utiliza con variables de código personalizado y de Stateflow.

*a

Operación de puntero. Se utiliza solo con variables de código personalizado.

Por ejemplo, el modelo sf_bus_demo contiene una función de C personalizada que admite punteros como argumentos. Cuando el gráfico llama a la función de código personalizado, utiliza la operación & para pasar los datos de Stateflow mediante dirección. Para obtener más información, consulte Integrar estructuras personalizadas en gráficos de Stateflow.

Las operaciones de puntero y dirección no se admiten en gráficos que utilizan MATLAB como lenguaje de acción. Los punteros a estructuras solo deben utilizarse en modo de solo lectura y únicamente son válidos durante la llamada en la que se pasan.

Consulte también

Temas