Main Content

La traducción de esta página aún no se ha actualizado a la versión más reciente. Haga clic aquí para ver la última versión en inglés.

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.

Para obtener más información, consulte Diferencias entre C y MATLAB como sintaxis de lenguaje de acción.

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 varias instrucciones.

Operación

Precedencia

MATLAB como lenguaje de acción

C como lenguaje de acción

a ^ b

0

Potencia.

Potencia. Esta operación es equivalente a la función de biblioteca de C pow. Primero, los operandos se convierten a números de punto flotante. Para obtener más información, consulte Call C Library Functions.

Habilite esta operación eliminando la propiedad de gráfico Enable C-bit operations (Habilitar operaciones de bit C). Para obtener más información, consulte Habilitar las operaciones de bits en C.

a * b

1

Multiplicación.

Multiplicación.

a / b

1

División.

División.

a %% b

1

No se admite. Utilice la función rem o mod.

Resto. Primero, los operandos no enteros se convierten a enteros.

a + b

2

Suma.

Suma.

a - b

2

Resta.

Resta.

a >> b

3

No se admite. Utilice la función bitshift.

Desplace a a la derecha b bits. Para obtener más información, consulte Operaciones bit a bit.

a << b

3

No se admite. Utilice la función bitshift.

Desplace a a la izquierda b bits. Para obtener más información, consulte Operaciones bit a bit.

a > b

4

Comparación, mayor que.

Comparación, mayor que.

a < b

4

Comparación, menor que.

Comparación, menor que.

a >= b

4

Comparación, mayor que o igual a.

Comparación, mayor que o igual a.

a <= b

4

Comparación, menor que o igual a.

Comparación, menor que o igual a.

a == b

5

Comparación, igual a.

Comparación, igual a.

a ~= b

5

Comparación, no igual que.

Comparación, no igual que.

a != b

5

No se admite. Utilice la operación a ~= b.

Comparación, no igual que.

a <> b

5

No se admite. Utilice la operación a ~= b.

Comparación, no igual que.

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 (Habilitar operaciones de bit C).

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

Para obtener más información, consulte Operaciones bit a bit y Habilitar las operaciones de bits en C.

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 (Habilitar operaciones de bit C). Para obtener más información, consulte Operaciones bit a bit y Habilitar las operaciones de bits en C.

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 (Habilitar operaciones de bit C).

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

Para obtener más información, consulte Operaciones bit a bit y Habilitar las operaciones de bits en C.

a && b

9

AND lógico.

AND lógico.

a || b

10

OR lógico.

OR lógico.

Acciones y operaciones unarias

Esta tabla resume la interpretación de todas las acciones y operaciones unarias de gráficos de Stateflow. Operaciones unarias:

  • Tienen mayor precedencia que los operadores binarios.

  • Son asociativas por la derecha, por lo que, en cualquier expresión, se evalúan de derecha a izquierda.

Operación

MATLAB como lenguaje de acción

C como lenguaje de acción

~a

NOT lógico. Para el NOT bit por bit, utilice la función bitcmp.

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

  • NOT lógico. Habilite esta operación eliminando la propiedad de gráfico Enable C-bit operations (Habilitar operaciones de bit C).

Para obtener más información, consulte Operaciones bit a bit y Habilitar las operaciones de bits en C.

!a

No se admite. Utilice la operación ~a.

NOT lógico.

-a

Negativo.

Negativo.

a++

No se admite. Utilice la expresión a = a+1.

Aumento. Equivale a a = a+1.

a--

No se admite. Utilice la expresión a = a-1.

Disminución. Equivale a a = a-1.

Operaciones de asignación

Esta tabla resume la interpretación de las operaciones de asignación en gráficos de Stateflow.

Operación

MATLAB como lenguaje de acción

C como lenguaje de acción

a = b

Asignación sencilla.

Asignación sencilla.

a := b

No se admite. Utilice operaciones de conversión de tipos para anular las reglas de promoción de punto fijo. Consulte Operaciones de conversión de tipos.

Asignación de números de punto fijo. Consulte Override Fixed-Point Promotion in C Charts.

a += b

No se admite. Utilice la expresión a = a+b.

Equivale a a = a+b.

a -= b

No se admite. Utilice la expresión a = a-b.

Equivale a a = a-b.

a *= b

No se admite. Utilice la expresión a = a*b.

Equivale a a = a*b.

a /= b

No se admite. Utilice la expresión a = a/b.

Equivale a a = a/b.

a %%= b

No se admite. Utilice la expresión a = mod(a,b) o a = rem(a,b).

Equivale a a = a%%b.

a &= b

No se admite. Utilice la expresión a = bitand(a,b).

Equivale a a = a&b (AND bit por bit). Habilite esta operación seleccionando la propiedad de gráfico Enable C-bit operations (Habilitar operaciones de bit C). Para obtener más información, consulte Operaciones bit a bit y Habilitar las operaciones de bits en C.

a ^= b

No se admite. Utilice la expresión a = bitxor(a,b).

Equivale a a = a^b (XOR bit por bit). Habilite esta operación seleccionando la propiedad de gráfico Enable C-bit operations (Habilitar operaciones de bit C). Para obtener más información, consulte Operaciones bit a bit y Habilitar las operaciones de bits en C.

a |= b

No se admite. Utilice la expresión a = bitor(a,b).

Equivale a a = a|b (OR bit por bit). Habilite esta operación seleccionando la propiedad de gráfico Enable C-bit operations (Habilitar operaciones de bit C). Para obtener más información, consulte Operaciones bit a bit y Habilitar las operaciones de bits en C.

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 bit a bit

Esta tabla resume la interpretación de todas las operaciones bit a 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 a bit seleccionando la propiedad de gráfico Enable C-bit operations. Consulte Habilitar las operaciones de bits en C.

Las operaciones bit a 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 a 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 a 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 (Saturar en el desbordamiento de enteros).

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 todos uno. 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.

Para obtener más información, consulte Saturar en el desbordamiento de enteros.

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 Integrate Custom Structures in Stateflow Charts.

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.

Reemplazar operaciones con implementaciones de aplicación

Si tiene Embedded Coder® o Simulink Coder™, puede configurar el generador de código para aplicar una biblioteca de sustitución de código (CRL) durante la generación de código. El generador de código cambia el código que genera para que las operaciones cumplan los requisitos de la aplicación. Con Embedded Coder, puede desarrollar y aplicar bibliotecas de sustitución de código personalizado.

Las entradas de operación de la biblioteca de sustitución de código pueden especificar operandos enteros o de punto fijo y patrones de resultado. Puede utilizar entradas de operación para estas operaciones:

  • Suma +

  • Resta -

  • Multiplicación *

  • División /

Por ejemplo, en esta expresión, puede reemplazar el operador de suma + por una implementación específica objetivo si u1, u2 e y tienen tipos que permiten una coincidencia con una entrada de suma en la biblioteca de sustitución de código:

y = u1 + u2

La semántica del gráfico de C limita la coincidencia de entrada de operador porque el gráfico utiliza el tamaño de entero objetivo como su tipo intermedio en expresiones aritméticas. Por ejemplo, esta expresión aritmética calcula la suma intermedia en un entero objetivo:

y = (u1 + u2) % 3
Si el tamaño de entero objetivo es 32 bits, no puede reemplazar esta expresión por un operador de suma de la biblioteca de sustitución de código y producir un resultado de 16 bits con signo sin perder precisión.

Para obtener más información sobre cómo usar las bibliotecas de sustitución de código que ofrece MathWorks®, consulte What Is Code Replacement? (Simulink Coder) y Code Replacement Libraries (Simulink Coder). Para obtener información sobre cómo desarrollar bibliotecas de sustitución de código personalizado, consulte What Is Code Replacement Customization? (Embedded Coder) y Code You Can Replace From Simulink Models (Embedded Coder).

Temas relacionados