Contenu principal

Opérations pour données Stateflow

Les diagrammes Stateflow® des modèles Simulink® possèdent une propriété de langage d'action qui définit les opérations que vous pouvez utiliser dans les actions d'état et de transition. Les propriétés de langage sont les suivantes :

  • MATLAB® comme langage d’action.

  • C comme langage d’action.

Pour plus d’informations, veuillez consulter Differences Between MATLAB and C as Action Language Syntax.

Opérations binaires

Ce tableau récapitule l'interprétation de toutes les opérations binaires dans les diagrammes Stateflow en fonction de leur ordre de priorité (0 = le plus élevé, 10 = le plus faible). Les opérations binaires sont associatives à gauche. De ce fait, dans toute expression, les opérateurs présentant la même priorité sont évalués de gauche à droite. L'ordre d'évaluation des autres opérations n'est pas spécifié. Par exemple, dans cette affectation

A = f() > g();
l'ordre d'évaluation des opérations f() et g() n'est pas spécifié. Pour obtenir des résultats plus prévisibles, il est judicieux de diviser les expressions qui dépendent de l'ordre d'évaluation en plusieurs instructions.

Opération

Priorité

MATLAB comme langage d’action

C comme langage d’action.

a ^ b

0

Puissance.

Puissance. Cette opération équivaut à la fonction de bibliothèque C pow. Dans un premier temps, les opérandes sont convertis en nombres à virgule flottante. Pour plus d’informations, veuillez consulter Call C Library Functions.

Activez cette opération en désactivant la propriété de diagramme Enable C-bit operations. Pour plus d’informations, veuillez consulter Enable C-bit operations.

a * b

1

Multiplication.

Multiplication.

a / b

1

Division.

Division.

a %% b

1

Non pris en charge. Utilisez la fonction rem ou mod.

Rappel. Dans un premier temps, les opérandes non entiers sont convertis en nombres entiers.

a + b

2

Addition.

Addition.

a - b

2

Soustraction.

Soustraction.

a >> b

3

Non pris en charge. Utilisez la fonction bitshift.

Décalez a vers la droite de b bits. Pour plus d’informations, veuillez consulter Opérations bit à bit.

a << b

3

Non pris en charge. Utilisez la fonction bitshift.

Décalez a vers la gauche de b bits. Pour plus d’informations, veuillez consulter Opérations bit à bit.

a > b

4

Comparaison, supérieur à.

Comparaison, supérieur à.

a < b

4

Comparaison, inférieur à.

Comparaison, inférieur à.

a >= b

4

Comparaison, supérieur ou égal à.

Comparaison, supérieur ou égal à.

a <= b

4

Comparaison, inférieur ou égal à.

Comparaison, inférieur ou égal à.

a == b

5

Comparaison, égal à.

Comparaison, égal à.

a ~= b

5

Comparaison, différent de.

Comparaison, différent de.

a != b

5

Non pris en charge. Utilisez l’opération a ~= b.

Comparaison, différent de.

a <> b

5

Non pris en charge. Utilisez l’opération a ~= b.

Comparaison, différent de.

a & b

6

Opérateur logique AND. Pour l’opérateur binaire AND, utilisez la fonction bitand.

  • Opérateur binaire AND (par défaut). Activez cette opération en sélectionnant la propriété de diagramme Enable C-bit operations.

  • Opérateur logique AND. Activez cette opération en désactivant la propriété de diagramme Enable C-bit operations.

Pour plus d’informations, veuillez consulter Opérations bit à bit et Enable C-bit operations.

a ^ b

7

Non pris en charge. Pour l’opérateur binaire XOR, utilisez la fonction bitxor.

Opérateur binaire XOR (par défaut). Activez cette opération en sélectionnant la propriété de diagramme Enable C-bit operations. Pour plus d’informations, veuillez consulter Opérations bit à bit et Enable C-bit operations.

a | b

8

Opérateur logique OR. Pour l’opérateur binaire OR, utilisez la fonction bitor.

  • Opérateur binaire OR (par défaut). Activez cette opération en sélectionnant la propriété de diagramme Enable C-bit operations.

  • Opérateur logique OR. Activez cette opération en désactivant la propriété de diagramme Enable C-bit operations.

Pour plus d’informations, veuillez consulter Opérations bit à bit et Enable C-bit operations.

a && b

9

Opérateur logique AND.

Opérateur logique AND.

a || b

10

Opérateur logique OR.

Opérateur logique OR.

Opérations et actions unitaires

Ce tableau récapitule l’interprétation de l’ensemble des opérations et actions unitaires des diagrammes Stateflow. Opérations unitaires :

  • Sont prioritaires par rapport aux opérateurs binaires.

  • Sont associatives à droite. De ce fait, dans toute expression, elles sont évaluées de droite à gauche.

Opération

MATLAB comme langage d’action

C comme langage d’action.

~a

Opérateur logique NOT. Pour l’opérateur binaire NOT, utilisez la fonction bitcmp.

  • Opérateur binaire NOT (par défaut). Activez cette opération en sélectionnant la propriété de diagramme Enable C-bit operations.

  • Opérateur logique NOT. Activez cette opération en désactivant la propriété de diagramme Enable C-bit operations.

Pour plus d’informations, veuillez consulter Opérations bit à bit et Enable C-bit operations.

!a

Non pris en charge. Utilisez l’opération ~a.

Opérateur logique NOT.

-a

Négatif.

Négatif.

a++

Non pris en charge. Utilisez l’expression a = a+1.

Incrémenter. Équivaut à a = a+1.

a--

Non pris en charge. Utilisez l’expression a = a-1.

Décrémenter. Équivaut à a = a-1.

Opérations d’affectation

Ce tableau récapitule l’interprétation des opérations d'affectation dans les diagrammes Stateflow.

Opération

MATLAB comme langage d’action

C comme langage d’action.

a = b

Affectation simple.

Affectation simple.

a := b

Non pris en charge. Utilisez les opérations de conversion de type pour ignorer les règles de promotion en virgule fixe. Pour plus d’informations, veuillez consulter Opérations de conversion de type.

Affectation de nombres à virgule fixe. Pour plus d’informations, veuillez consulter Override Fixed-Point Promotion in C Charts.

a += b

Non pris en charge. Utilisez l’expression a = a+b.

Équivaut à a = a+b.

a -= b

Non pris en charge. Utilisez l’expression a = a-b.

Équivaut à a = a-b.

a *= b

Non pris en charge. Utilisez l’expression a = a*b.

Équivaut à a = a*b.

a /= b

Non pris en charge. Utilisez l’expression a = a/b.

Équivaut à a = a/b.

a %%= b

Non pris en charge. Utilisez l’expression a = mod(a,b) ou a = rem(a,b).

Équivaut à a = a%%b.

a &= b

Non pris en charge. Utilisez l’expression a = bitand(a,b).

Équivaut à a = a&b (opérateur binaire AND). Activez cette opération en sélectionnant la propriété de diagramme Enable C-bit operations. Pour plus d’informations, veuillez consulter Opérations bit à bit et Enable C-bit operations.

a ^= b

Non pris en charge. Utilisez l’expression a = bitxor(a,b).

Équivaut à a = a^b (opérateur binaire XOR). Activez cette opération en sélectionnant la propriété de diagramme Enable C-bit operations. Pour plus d’informations, veuillez consulter Opérations bit à bit et Enable C-bit operations.

a |= b

Non pris en charge. Utilisez l’expression a = bitor(a,b).

Équivaut à a = a|b (opérateur binaire OR). Activez cette opération en sélectionnant la propriété de diagramme Enable C-bit operations. Pour plus d’informations, veuillez consulter Opérations bit à bit et Enable C-bit operations.

Opérations de conversion de type

Pour convertir une valeur d'un type à un autre, utilisez des opérations de conversion de type. Vous pouvez convertir des données en un type explicite ou dans le type d’une autre variable.

Conversion en un type de données explicite

Pour convertir une expression numérique en un type de données explicite, utilisez l'une des fonctions de conversion de type suivantes : double, single, int8, int16, int32, int64, uint8, uint16, uint32, uint64 et boolean. Par exemple, cette instruction convertit l’expression x+3 en entier non signé 16 bits et affecte cette valeur à la donnée y :

y = uint16(x+3);

Sinon, dans les diagrammes qui utilisent MATLAB comme langage d'action, vous pouvez utiliser la fonction cast et spécifier "double", "single", "int8", "int16", "int32", "int64", "uint8", "uint16", "uint32", "uint64" ou "logical" en tant qu'argument d'entrée. Par exemple, cette instruction convertit l’expression x+3 en entier non signé 16 bits et affecte cette valeur à y :

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

Pour convertir une expression en un type à virgule fixe, les diagrammes qui utilisent MATLAB comme langage d'action prennent en charge l'appel de la fonction fi (Fixed-Point Designer). Par exemple, cette instruction convertit l'expression x+3 en une valeur signée à virgule fixe présentant une longueur de mot de 8 bits et une longueur de fraction de 3 bits :

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

Dans les diagrammes qui utilisent le langage C comme langage d'action, appelez la fonction cast au moyen d’une expression fixdt (Simulink) en tant qu’argument. Par exemple, cette instruction convertit l'expression x+3 en une valeur signée à virgule fixe présentant une longueur de mot de 8 bits et une longueur de fraction de 3 bits :

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

Conversion de type sur la base d’autres données

Pour faciliter la conversion de type, vous pouvez convertir le type d'une expression numérique en un type identique à celui d'une autre donnée Stateflow.

Dans les diagrammes utilisant MATLAB comme langage d’action, appelez la fonction cast avec le mot-clé "like". Par exemple, cette instruction convertit la valeur de x+3 en un type identique à celui des données z et attribue la valeur à y :

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

Dans les diagrammes utilisant le C comme langage d’action, l’opérateur type renvoie le type d’une donnée Stateflow existante. Utilisez cette valeur de retour à la place d'un type explicite dans une opération cast. Par exemple, cette instruction convertit la valeur de x+3 en un type identique à celui des données z et attribue la valeur à y :

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

Opérations bit à bit

Ce tableau récapitule l’interprétation de toutes les opérations binaires dans les diagrammes Stateflow qui utilisent le C comme langage d’action.

Opération

Description
a & bOpérateur binaire AND.
a | bOpérateur binaire OR.
a ^ bOpérateur binaire XOR.
~aOpérateur binaire NOT.

a >> b

Décalez a vers la droite de b bits.

a << b

Décalez a vers la gauche de b bits.

À l'exception des opérations de décalage de bits a >> b et a << b, vous devez activer toutes les opérations binaires en sélectionnant la propriété de diagramme Enable C-bit operations. Pour plus d’informations, veuillez consulter Enable C-bit operations.

Les opérations binaires s’appliquent aux nombres entiers au niveau binaire. Dans un premier temps, les opérandes non entiers sont convertis en nombres entiers. Les opérandes entiers suivent les règles de promotion du langage C pour déterminer la valeur intermédiaire du résultat. Cette valeur intermédiaire est ensuite convertie dans le type que vous spécifiez pour le résultat de l'opération.

Remarque

Les opérations binaires ne sont pas prises en charge dans les diagrammes qui utilisent MATLAB comme langage d'action. Utilisez à la place les fonctions bitand, bitor, bitxor, bitnot ou bitshift.

Opérations binaires et dépassements d’entier

La conversion implicite utilisée pour attribuer la valeur intermédiaire d'une opération binaire peut entraîner un dépassement. Pour préserver les bits les plus à droite du résultat et éviter un comportement inattendu, désactivez la propriété de diagramme Saturate on Integer Overflows.

Par exemple, les deux diagrammes de ce modèle calculent l’opération binaire y = ~u. Les diagrammes calculent la valeur intermédiaire pour cette opération en utilisant la taille de l'entier cible de 32 bits. Ainsi, les 24 bits les plus à gauche de cette valeur sont tous des uns. Lorsque les diagrammes attribuent la valeur intermédiaire à y, la conversion en uint8 entraîne un dépassement d’entier. La sortie de chaque diagramme dépend de la manière dont le diagramme traite les dépassements d'entier.

  • Si la propriété Saturate on Integer Overflow est activée, le diagramme sature le résultat de l'opération binaire et émet une valeur nulle.

  • Si la propriété Saturate on Integer Overflow est désactivée, le diagramme récapitule le résultat de l'opération binaire et émet ses huit bits les plus à droite.

Opérations de pointeur et d'adresse

Ce tableau récapitule l’interprétation de toutes les opérations de pointeur et d’adresse dans les diagrammes Stateflow qui utilisent le C comme langage d’action.

Opération

Description

&a

Opération d’adresse. Utilisez-la avec des variables de code personnalisé et Stateflow.

*a

Opération de pointeur. Utilisez-la uniquement avec des variables de code personnalisé.

Par exemple, le modèle sf_bus_demo contient une fonction C personnalisée qui utilise des pointeurs en tant qu’arguments. Lorsque le diagramme appelle la fonction de code personnalisé, il utilise l'opération & pour transmettre les données Stateflow par adresse. Pour plus d’informations, veuillez consulter Integrate Custom Structures in Stateflow Charts.

Les opérations de pointeur et d’adresse ne sont pas prises en charge dans les diagrammes qui utilisent MATLAB comme langage d'action. Les pointeurs vers des structures ne doivent être utilisés qu'en mode lecture seule et ne sont valides que pendant l'appel au cours duquel ils sont transmis.

Remplacement des opérations par des implémentations d'applications

Si vous possédez Embedded Coder® ou Simulink Coder™, vous pouvez configurer le générateur de code afin qu'il applique une bibliothèque de remplacement de code (CRL) pendant la génération du code. Le générateur de code modifie le code qu'il génère pour les opérations afin de répondre aux exigences de l'application. Avec Embedded Coder, vous pouvez développer et appliquer des bibliothèques de remplacement de code personnalisées.

Les entrées d'opération de la bibliothèque de remplacement de code peuvent spécifier des modèles d'intégrale ou d’opérandes et de résultats à virgule fixe. Vous pouvez utiliser des entrées d’opération pour ces opérations :

  • Addition +

  • Soustraction -

  • Multiplication *

  • Division /

Par exemple, dans cette expression, vous pouvez remplacer l'opérateur d'addition + par une implémentation propre à la cible si u1, u2 et y présentent des types correspondant à une entrée d'addition dans la bibliothèque de remplacement de code :

y = u1 + u2

La sémantique des diagrammes C limite la correspondance des entrées des opérateurs. En effet, le diagramme utilise la taille de l'entier cible comme type intermédiaire dans les expressions arithmétiques. Par exemple, cette expression arithmétique calcule l'addition intermédiaire dans un entier cible :

y = (u1 + u2) % 3
Si la taille de l'entier cible est de 32 bits, vous ne pouvez pas remplacer cette expression par un opérateur d'addition issu de la bibliothèque de remplacement de code et produire un résultat signé 16 bits sans perte de précision.

Pour plus d’informations sur l’utilisation des bibliothèques de remplacement de code fournies par MathWorks®, consultez What Is Code Replacement? (Simulink Coder) et Code Replacement Libraries (Simulink Coder). Pour plus d’informations sur le développement de bibliothèques de remplacement de code personnalisé, consultez What Is Code Replacement Customization? (Embedded Coder) et Code You Can Replace From Simulink Models (Embedded Coder).

Voir aussi

Rubriques