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.

Les diagrammes Stateflow supportent les opérations de programmation standard comme l’addition, la comparaison et l’affectation. Les opérations spécifiques disponibles dépendent du langage d’action de votre diagramme.

  • Les deux langages d’action supportent l’arithmétique de base (+, -, *) et la comparaison (>, <, ==)

  • Le langage d’action C supporte des opérations supplémentaires comme les opérateurs bit à bit (&, |)

  • Le langage d’action MATLAB utilise des fonctions pour certaines opérations que le C effectue avec des opérateurs.

Toutes les opérations sont compatibles avec les types de données Stateflow, notamment les entiers, les nombres à virgule flottante et les valeurs booléennes. Pour plus d’informations, veuillez consulter Differences Between MATLAB and C as Action Language Syntax.

Opérations arithmétiques

Utilisez des opérations arithmétiques pour effectuer des calculs avec des valeurs de capteur, des signaux de contrôle et des paramètres de système.

OpérationPrioritéDescriptionExemple

^

0

Puissance

voltage_squared = voltage ^ 2

*

1

Multiplication

power = voltage * current

/

1

Divisionefficiency = output_power / input_power

+

2

Additiontotal_force = applied_force + friction_force

-

2

Soustractionerror = setpoint - measured_value

Opérations de comparaison

Utilisez des opérations de comparaison pour évaluer les conditions et les seuils de la logique de contrôle.

OpérationPrioritéDescriptionExemple

>

4

Supérieur à

if (temperature > max_temp)

<

4

Inférieur à

if (pressure < min_pressure)

>=

4

Supérieur ou égal à

if (speed >= target_speed)

<=

4

Inférieur ou égal à

if (voltage <= safety_limit)

==

5

Égal àif (mode == CALIBRATION)

~=

5

Différent de (MATLAB)if (status ~= READY)

!=

5

Différent de (C)if (status != READY)

Opérations logiques

Utilisez des opérations logiques pour associer plusieurs conditions.

OpérationPrioritéLangage d’action MATLABLangage d’action en C
&&

9

Opérateur logique AND.

Opérateur logique AND.

||

10

Opérateur logique OR.

Opérateur logique OR.

~a

5

Opérateur logique NOTOpérateur logique NOT

!a

5

Non supportéeOpérateur logique NOT

Opérations d’affectation

Affectez des valeurs aux variables avec l’opérateur = :

sensor_reading = adc_value;
control_output = pid_result;

Dans les diagrammes qui utilisent le C comme langage d’action, vous pouvez utiliser les opérateurs d’affectation composés suivants.

OpérationÉquivalentExemple

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

Incrémentation et décrémentation

Dans les diagrammes qui utilisent le C comme langage d’action, vous pouvez utiliser ++ ou –- pour incrémenter ou décrémenter les valeurs des données. Par exemple :

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

Opérations de conversion de type

Vous pouvez utiliser les fonctions de type MATLAB dans tout diagramme Stateflow.

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

L’utilisation de la fonction cast varie selon le langage d’action.

Dans les diagrammes utilisant MATLAB comme langage d’action, utilisez :

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

Dans les diagrammes utilisant le C comme langage d’action, utilisez :

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

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

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.

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.

Voir aussi

Rubriques