▼
Scroll to page 2
of
118
Section p. 3 Page Manuel modes opératoires SDKC p.121 ___________________________________________________________________________ 1 FRANÇAIS SDKC Operating Modes Manual ENGLISH Contents Sommaire Page Manuel modes opératoires SDKC p.121 ___________________________________________________________________________ 119 FRANÇAIS FRANÇAIS Chapitre Sommaire Page FRANÇAIS Chapitre ___________________________________________________________________________ 120 Sommaire Page 1 Présentation 127 1.1 Introduction 127 1.2 Installation 1.2-1 La machine cible 1.2-2 Contenu du produit PL7 SDKC 1.2-3 La procédure d'installation 128 128 129 129 2 Méthodologie de création d'une EF et utilisation dans PL7 131 2.1 Création 2.1-1 La famille d'EF 2.1-2 La Classe d'EF 2.1-3 L'EF 133 133 133 134 2.2 Gestion automatique de versions 135 2.3 Génération de la famille en debug 135 2.4 Installation/Désinstallation en bibliothèque PL7 pour la mise au point 135 2.5 Création d'une application utilisant les EF créées 136 2.6 Test de chaque EF dans PL7 136 2.7 Génération de la famille en release 136 3 Mise en œuvre de l'EF avec PL7SDKC 3.1 137 Création 137 3.1-1 La famille d'EF 137 3.1-2 La Classe d'EF 139 3.1-3 L'EF 141 ___________________________________________________________________________ 121 FRANÇAIS Chapitre Sommaire Chapitre 3.2 Génération de la famille en debug 3.3 Génération de la famille en release 147 3.4 Installation/Désinstallation dans la bibliothèque PL7 148 4 Test de l'EF avec l'outil de mise au point FRANÇAIS Page 146 4.1 4.2 4.3 Accès à la mise au point des EF 4.1-1 Choix de la famille de l'EF à tester 4.1-2 Ouverture de l'écran de mise au point des EF Présentation de l'outil Mise au point des EF 4.3-1 Pose et dépose de points d'arrêt 4.3-2 Mixer code C et langage assembleur 4.3-3 Les registres 4.3-4 Les variables locales 5 Fonctionnalités complémentaires de SDKC 149 149 149 149 151 152 152 153 153 154 157 5.1 Paramétrage de l'outil 157 5.2 Modifier une famille 158 5.3 Importer/Exporter 5.3-1 Classe 5.3-2 Source C 159 159 160 5.4 Archiver/Restaurer une famille 5.4-1 Archiver 5.4-2 Restaurer 5.4-3 Restaurer à partir de 162 162 163 164 5.5 Imprimer 164 ___________________________________________________________________________ 122 Sommaire Page 6 Le code de l'EF 167 6.1 Règles de mise en œuvre des EF 6.1-1 Langage C 6.1-2 Gestion de versions de famille et d'EF 6.1-3 Gestion de la taille de la pile 6.1-4 Utilisation des nombres flottants 167 167 171 172 172 6.2 Liste des mots réservés 174 7 Fonctions système 177 value = rd_sysbit ( sysbit_range , status ) 180 status = wr_sysbit ( sysbit_range , value ) 181 value = rd_sysword ( sysword_range , status ) 182 status = wr_sysword ( sysword_range , value ) 183 value = rd_bit_attrib ( address ) 184 value = rd_bits ( address , number , status ) 186 status = wr_bits ( address , number , value , type ) 187 value = rd_16bits ( address ) 189 wr_16bits ( address , value ) 190 value = rd_1bit ( address ) 191 wr_1bit ( address , value ) 192 result = phy_ptr_init ( sel_off ) 193 ___________________________________________________________________________ 123 FRANÇAIS Chapitre Sommaire FRANÇAIS Chapitre status = date_and_time ( date_ptr ) Page 194 value = cnt_100ms ( void ) 196 value = cnt_10ms ( void ) 197 info = proc_type ( void ) 198 info = proc_indic ( void ) 199 Res = ADD ( a, b ) 200 Res = SUB ( a, b ) 201 Res = MUL ( a, b ) 202 Res = DIV ( a, b ) 203 Res = EQU ( a, b ) 204 Res = SUP ( a, b ) 205 Res = INF ( a, b ) 206 Res = ABS ( a ) 207 Res = CHS ( a ) 208 Res = SQRT ( a ) 209 Res = FTOL ( a ) 210 Res = LTOF ( a ) 211 Res = EXP ( a ) 212 ___________________________________________________________________________ 124 Sommaire Page 213 Res = SIN ( a ) 214 Res = COS ( a ) 215 Res = TAN ( a ) 216 Res = ASIN ( a ) 217 Res = ACOS ( a ) 218 Res = ATAN ( a ) 219 8 Fonctions utilitaires 221 value = GET_FLOATPL7 ( fvalPl7 ) 222 fvalPl7 = FLOAT_TOPL7 ( f ) 223 value = FLOAT_TO_DBG ( f ) 224 FLOAT_SETVALUE ( selecteur, offset, valeur ) 225 WORD_SETVALUE ( selecteur, offset, valeur ) 226 DWORD_SETVALUE ( selecteur, offset, valeur ) 227 ptr = GET_ADDR ( selecteur, offset ) 228 9 Annexes 9.1 229 Exemple 229 9.1-1 Définition de l'EF 229 9.1-2 Génération d'une disquette et installation de la famille 234 ___________________________________________________________________________ 125 FRANÇAIS Chapitre Res = LN ( a ) Sommaire Chapitre 9.2 Page 234 En cas de problème 235 FRANÇAIS 9.3 Equivalences clavier ___________________________________________________________________________ 126 Présentation Chapitre 1 1 Présentation 1.1 Introduction Une EF (Elementary Fonction) est une fonction, développée pour remplir une certaine tâche dans le programme utilisateur. Faisant partie, à terme, de la bibliothèque de PL7, au même titre que les fonctions constructeur, elle peut être utilisée d'une manière identique : • accessibilité dans tous les langages • visualisation par l'outil Bibliothèque de PL7 • classement en familles/fonctions • la gestion d’une famille d’EF (création, modification) • le développement de chaque EF en langage “ C ” • la mise au point individuelle d’une EF dans l’automate cible (TSX 37 ou TSX 57) • la génération d’une forme installable contenant la nouvelle famille d'EF à installer dans la bibliothèque de PL7, ainsi que sa procédure d’installation sur un poste utilisateur. La possibilité d'exécuter une EF sur un automate donné dépend de la version de l'automate cible choisi lors de la génération de cette EF (cf. § 2.1-3). Les EF créées et destinées à des automates en version ≥ 3.0 (avec ou sans coprocesseur), peuvent comporter du calcul flottant. L’utilisateur d’un tel produit est un développeur et à ce titre il doit obligatoirement connaître : • le langage “ C ” pour le développement, • PL7 (Micro, Junior, Pro) et ses langages pour la mise au point. Grâce à la clé d'accès (*) livrée avec le kit, il est possible de gérer 5 familles (jusqu'à 25500 fonctions par famille) sous la forme de 1 code différent par famille. Ces codes sont attribués par le constructeur et uniques, ce qui assure l'exclusivité des numéros des familles. ___________________________________________________________________________ 127 FRANÇAIS Le kit de développement en langage "C" (option de PL7) a pour objectif la mise en oeuvre de tout le cycle de développement d'une famille d'EF : Présentation Le présent manuel se décompose de la façon suivante : • Chapitre 1 "Présentation" • Chapitre 2 "Méthodologie de création d'une EF et utilisation dans PL7" • Chapitre 3 "Gestion de l'EF avec PL7SDKC" • Chapitre 4 "Test de l'EF avec DBGEF" • Chapitre 5 "Fonctionnalités complémentaires du SDK C" • Chapitre 6 "Le code de l'EF" • Chapitre 7 "Fonctions système" • Chapitre 8 "Fonctions utilitaires" FRANÇAIS • Chapitre 9 "Annexes" 1.2 Installation 1.2-1 La machine cible Le SDK C fonctionne sur : • micro-ordinateur IBM PC ou compatible La configuration minimale doit être la suivante : • microprocesseur 486 DX 33 • 32 Mo de mémoire RAM • 20 Mo de disponible sur disque • moniteur VGA • un port série COM disponible (COM1 à COM4) pour connexion à l’automate • système d’exploitation Win95, NT • PL7 Micro, Junior ou Pro V3.0 minimum La configuration de la machine type est la suivante : • microprocesseur Pentium 133 Mhz • 48 Mo de mémoire RAM ___________________________________________________________________________ 128 Présentation 1.2-2 Contenu du produit PL7 SDKC Le produit que vous venez de recevoir est constitué : • des disquettes d'installation (voir la procédure sur la page suivante) • de la présente documentation 1.2-3 La procédure d'installation Le produit PL7 SDKC est à installer sur un poste de développement, contenant déjà PL7 Micro, PL7 Junior ou PL7 Pro . La disquette étant insérée dans le lecteur, les étapes à réaliser pour procéder à l'installation sont les suivantes : • Ouvrir l'explorateur Windows, sélectionner le lecteur (A) puis double cliquer sur setup.exe ou dans Exécuter du Menu Démarrer, taper a:\setup puis cliquer sur OK. • Enregistrer votre nom et votre organisation • Choisir la langue d'installation • Entrer le n° (clé d'accès de votre produit) inscrit sur la boite de livraison (*). Cette clé permet d'accéder aux cinq codes famille qui sont attribués au produit. L'installation ne peut être poursuivie, tant que la saisie de cette clé d'accès n'est pas correcte. (*) Il est vivement conseillé de noter le n° de la clé d'accès à l'emplacement prévu à cet effet sur la page suivante. • Une fois l'installation terminée, pour accéder à PL7 SDKC, il suffit de double cliquer sur l'icône présente dans le dossier MODICON-TELEMECANIQUE. Attention : Suite à une mise à jour ou à une nouvelle installation de PL7 Micro, PL7 Junior ou PL7 Pro, il est obligatoire de procéder à une nouvelle installation de PL7 SDKC. ___________________________________________________________________________ 129 FRANÇAIS • du pack logiciel Visual C++ 5.0 Initiation (fourni pour des raisons de licence vis à vis de MICROSOFT). Ce logiciel n'est pas à installer sur le poste de développement. Il fournit les outils de génération et d'édition de liens utilisés pour compiler les EF. Ces outils sont déjà incorporés dans les disquettes d'installation du produit PL7 SDKC. Présentation FRANÇAIS Cadre réservé à l'inscription des numéros des clés d'accès de vos produits 1 ........................................................................ 2 ........................................................................ 3 ........................................................................ 4 ........................................................................ 5 ........................................................................ 6 ........................................................................ 7 ........................................................................ 8 ........................................................................ 9 ........................................................................ ___________________________________________________________________________ 130 Méthodologie de création d'une EF et utilisation dans PL7 Chapitre 2 2 Méthodologie de création d'une EF et utilisation dans PL7 Le croquis ci-dessous donne un aperçu du cycle de développement. erreur ▼ ▼ ▼ Développer la famille Installer la famille sur poste de développement ▼ ▼ ▼ pas d'erreur Pl7 Micro/Junior/Pro Mise au point d'une EF ▼ Pl7 Micro/Junior/Pro ▼ Poste utilisateur Famille d'EF + Setup.exe Bibliotèque d'EF Les sous-chapitres suivants ont pour but de présenter les différents écrans qui vont permettre de suivre ce cycle de développement. ___________________________________________________________________________ 131 FRANÇAIS Générer la famille en release erreur ▼ Poste de développement PL7 SDKC Générer la famille en Debug pas d'erreur Méthodologie de création d'une EF et utilisation dans PL7 FRANÇAIS Un clic sur l'icône PL7 SDKC permet d'ouvrir l'écran d'accueil suivant : La partie gauche de cet écran, vide lors de la première utilisation du kit, s'enrichira des noms des familles d'EF, au fur et à mesure de leur création (Courantes et/ou Archives). Une famille sera composée d'une ou plusieurs classes, ces classes étant elles mêmes composées d'une ou plusieurs EF comme le montre le schéma ci-dessous : Nom de famille Classe1 EF1 EF2 Classe2 EF1 EF2 EF3 Une famille est composée au maximum de 100 Classes et de 255 EF par classe. La classe est une entité qui ne sert que pendant le développement de la famille et qui ne sera pas vue dans l'outil Bibliothèque de PL7. La version, renseignée lors de la description de la famille, est celle qui sera vue dans l'outil bibliothèque de PL7. ___________________________________________________________________________ 132 Méthodologie de création d'une EF et utilisation dans PL7 2.1 Création 2.1-1 La famille d'EF En choisissant la fonction Créer du menu Famille, il est possible de créer une famille. Cinq familles peuvent être créées. Elles correspondent aux cinq codes délivrés par le produit. - L'onglet Fiche permet d'enregistrer des renseignements complémentaires sur la famille. 2.1-2 La Classe d'EF Une fois la famille validée, en choisissant la fonction Créer Classe du menu Services, il est possible de créer une des classes autorisées par famille (1 à 100). - L'onglet Description contient les caractéristiques de la classe. - L'onglet Class.h permet de définir des constantes, des types ou des structures communs à toutes les EF de la classe ___________________________________________________________________________ 133 FRANÇAIS - L'onglet Description contient les caractéristiques de la famille. Méthodologie de création d'une EF et utilisation dans PL7 2.1-3 L'EF FRANÇAIS En fin de création, le nom de la classe apparaît dans la partie gauche de l'écran, il est alors possible de créer une EF en sélectionnant la fonction Créer EF du menu Services. 255 EF peuvent être créées par classe (1 à 255). • L'onglet Description contient les caractéristiques de l'EF. La possibilité d'exécuter une EF sur un automate donné dépend de la version de l'automate cible choisi dans cet onglet (voir tableau ci-après ). Choix lors de la génération Cible Automate V< 3.0 Version < 3.0 V≥ 3.0 (sans coprocesseur) Oui V≥ 3.0 (avec coprocesseur) Non Non Automate V≥ 3.0 Oui (si pas appelé (sans coprocesseur) dans un DFB) Oui Non Automate V≥ 3.0 Oui (si pas appelé (avec coprocesseur) dans un DFB) Oui Oui (Optimisé) Les EF créées et destinées à des automates en version ≥ 3.0 (avec ou sans coprocesseur), peuvent comporter du calcul flottant. • L'onglet Interface permet de saisir les paramètres d'appel de l'EF. • L'onglet Source .C permet d'écrire le code C de l'EF. • L'onglet Source .H permet de définir des constantes, des types ou des structures spécifiques à l'EF. ___________________________________________________________________________ 134 Méthodologie de création d'une EF et utilisation dans PL7 2.2 Gestion automatique de versions L'option par défaut (recommandée) est l'incrémentation automatique. 2.3 Génération de la famille en debug La génération s'effectue sur la famille entière. Lorsque la famille est terminée en développement, il est préférable dans un premier temps, de la générer en sélectionnant la fonction Générer Debug du menu Famille. Ceci rendant possible par la suite le test d'une des EF de la famille. Générer signifie compiler puis faire l'édition de liens avec les options de debug de chaque EF de cette famille. En fin de génération, un fichier récapitulatif des erreurs et des warnings (resul.log) est édité (cf. §3.1-3) , il est nécessaire de revenir aux écrans de source .C ou .H de(s) EF qui posent éventuellement problème. 2.4 Installation/Désinstallation en bibliothèque PL7 pour la mise au point Une fois la famille générée sans erreur (de compilation ou d'édition de liens), il est possible de lancer la fonction Installer du menu Famille pour que celle-ci enrichisse la bibliothèque de PL7. ___________________________________________________________________________ 135 FRANÇAIS En choisissant la fonction Option de génération du menu Service, la boite ci-après s'ouvre permettant le choix dans le mode d'incrémentation des versions des familles et des classes. Méthodologie de création d'une EF et utilisation dans PL7 Il est possible de désinstaller, de la bibliothèque PL7, la famille en cours d'édition. Pour cela, lancer la fonction Desinstaller du menu Famille. Cette installation/désinstallation n'est possible que si PL7 (Micro, Junior ou Pro) n'est pas en service (actifs en mémoire). 2.5 Création d'une application utilisant les EF créées FRANÇAIS L'installation de la famille étant terminée, il faut lancer PL7 (Micro, Junior ou Pro). Afin de tester le(s) nouvelle(s) EF, il faut alors développer une application faisant appel à celle(s)-ci et transférer ensuite cette application dans l'automate. Il est conseillé, dans cette application ayant pour mission le test de comportement, de n'inclure qu'un exemplaire de chaque EF à tester. 2.6 Test de chaque EF dans PL7 Pour tester l'EF dans l'application, il faut choisir Mise au point EF du menu Outils de PL7 (Micro, Junior ou Pro). Il est alors possible de poser des points d'arrêt, de faire du pas à pas, de visualiser les variables locales ou les registres, ... SI les tests ne sont pas concluants, il faut revenir dans l'environnement de développement de(s) EF "pour revoir sa copie" et recommencer le cycle précédemment décrit. 2.7 Génération de la famille en release L'ensemble des tests de toutes les EF de la famille s'étant révélé concluant, il est donc possible de générer cette famille, pour exploitation, en choisissant la fonction Générer Release du menu Famille. Cette action va permettre de créer un support d'installation pour la famille choisie (disquette, répertoire de disque dur local ou en réseau, ...). Ce support pourra alors être distribué. ___________________________________________________________________________ 136 Mise en œuvre de l'EF avec PL7SDKC Chapitre 3 3 Mise en œuvre de l'EF avec PL7SDKC 3.1 Création 3.1-1 La famille d'EF Saisie du nom de la famille (24 caractères) Permet de gérer les évolutions de la famille par la saisie d'un nombre du type VV.RR (*) FRANÇAIS Créer ouvre en saisie l'espace Famille défini par l'onglet "Description" Un numéro de famille sera automatiquement attribué (libre parmi les 5 possibles) En mode visualisation famille, permet de faire apparaître, dans la liste, les familles créées et/ ou les familles archivées (cf. § 5.4) Nombre entier commençant à 1. Celui-ci permet de gérer les évolutions qui rendraient incompatibles les textes (fiche famille et commentaires) (*) La valeur de VV (version) ou de RR (release) doit être comprise entre 0 et 99 bornes incluses. ___________________________________________________________________________ 137 Mise en œuvre de l'EF avec PL7SDKC FRANÇAIS Un clic sur l'onglet "Fiche" ouvre l'espace suivant : La famille est validée par ce bouton, seulement si tous les champs de l'onglet "Description" sont correctement renseignés Cet espace ouvert à la saisie (facultative), sert à noter les informations principales liées à la famille. Cette fiche permet, par exemple, de saisir les informations concernant l'historique des versions de la famille . Cette fiche n'apparaît dans PL7, qu'en cas de conflit de versions entre une famille en bibliothèque et la même famille en application. Il est possible de supprimer une famille en utilisant la commande Supprimer du menu Services. En supprimant une famille on supprime aussi son contenu (classe(s) et EF(s)). ___________________________________________________________________________ 138 Mise en œuvre de l'EF avec PL7SDKC 3.1-2 La Classe d'EF Rappel des paramètres définis pour la famille (en lecture seulement) FRANÇAIS Créer Classe ouvre en saisie les champs Classe et enrichit l'espace défini par l'onglet "Description" Permet de saisir le nom de la classe en cours de création (16 caractères alphanumériques + le caractère underscore) Nombre compris entre 1 et 100 bornes incluses et servant à gérer l'unicité de la classe développée. Il est automatiquement renseigné Permet de gérer les évolutions de la classe par la saisie d'un nombre au format VV.RR (*) (*) La valeur de VV (version) ou de RR (release) doit être comprise entre 0 et 99, bornes incluses. Les classes appartenant à la même famille doivent avoir obligatoirement des noms et des codes différents. Il est possible de sortir de l'onglet de description que si tous les champs sont renseignés. Cette action valide les paramètres saisis. Il est possible de supprimer une classe en utilisant la commande Supprimer du menu Services. En supprimant une classe on supprime aussi le(s) EF(s) qui la composent). ___________________________________________________________________________ 139 Mise en œuvre de l'EF avec PL7SDKC Les fonctions "Importer classe" et "Exporter classe" du menu Services vont permettre d'importer une classe venant d'une autre famille, d'exporter une classe vers une autre famille (cf. § 5.3). Un clic sur l'onglet "Class.h" ouvre l'espace suivant : FRANÇAIS Bouton flip-flop (Taille normale/ Pleine fenêtre) réduit/agrandit la fenêtre de saisie Cet espace permet de saisir le code source du fichier interface ( .h) commun à toutes les EF de la classe. Ce fichier permet de créer par exemple des types spécifiques ou des constantes qui seront réutilisés dans les sources C de tous les EF de la classe. Ce fichier doit avoir une taille ≤ à 200 Koctets ___________________________________________________________________________ 140 Mise en œuvre de l'EF avec PL7SDKC 3.1-3 L'EF Nombre compris entre 1 et 255 bornes incluses et servant à gérer l'unicité de l'EF développée. Il est renseigné automatiquement Rappel des paramètres définis pour la famille et pour la classe (en lecture seulement) Le type d EF est une procédure ou une fonction La taille de l'EF générée Permet de saisir le nom de l'EF en cours de création (16 caractères alphanumériques + le caractère underscore) Permet de saisir un texte commentaire de l'EF contenant au maximum 80 caractères Permet de définir la taille de la pile. Elle vaut 512 octets par défaut et permet de stocker les paramètres de l'EF, les variables locales, les paramètres et variables des fonctions qu'elle appelle (cf. § 6.1-3) Permet de choisir la version de l'automate cible pour lequel cettte EF est développée Les EF développées et installées en bibliothèque doivent avoir obligatoirement des noms différents. Attention à ne pas utiliser comme noms les mots clés de PL7(cf. § 6.2). Il n'est possible de sortir de l'onglet de description que si tous les champs sont renseignés. Cette action valide les paramètres saisis. Il est possible de supprimer une EF en utilisant la commande Supprimer du menu Services. ___________________________________________________________________________ 141 FRANÇAIS Créer EF ouvre en saisie les champs EF et enrichit l'espace défini par l'onglet "Description" Mise en œuvre de l'EF avec PL7SDKC Un clic sur l'onglet "Interface" ouvre l'espace suivant, comportant trois zones qui permettent de saisir les paramètres formels de l'EF. Ces paramètres formels sont ceux d'entrées, de sorties, d'entrées/sorties, de retour de la fonction (dans le cas d'une fonction) . Ces paramètres d’appel de la fonction sont répartis dans trois champs : • le nom qui contient au maximum quatre caractères (sans espaces), • le type du paramètre : Entrées, Sorties et Entrée/Sortie. Le choix est à faire parmi : BOOL, EBOOL, WORD, DWORD, STRING, REAL, AR_D, AR_R, AR_W et AR_X (pour revoir la signification de tous ces types, se reporter au § 6.1 et à la documentation PL7). • le commentaire qui contient au maximum 80 caractères. FRANÇAIS Exemple : Rappelle le nom de la classe et le nom de l'EF concernées Boutons permettant de déplacer l'ordre des paramètres dans la grille sélectionnée Au niveau des paramètres formels, il y a au maximum 7 entrées, 7 sorties et 17 entrées/ sorties. Il est possible de détruire une ou plusieurs lignes de paramètres, pour cela il faut sélectionner la ligne en cliquant sur le numéro correspondant puis taper Ctrl+x au clavier (Ctrl+v recolle ce qui a été enlevé). Pour la correspondance entre les types PL7 définis dans cet onglet et les types C présents dans l'entête de la fonction, se reporter au tableau du § 6.1. ___________________________________________________________________________ 142 Mise en œuvre de l'EF avec PL7SDKC Un clic sur l'onglet "Source .C" ouvre l'espace suivant : Ces boutons permettent d'importer ou d'exporter un fichier C FRANÇAIS Bouton flip-flop (Taille normale/ Pleine fenêtre) réduit/ agrandit la fenêtre de saisie Cet onglet donne accès à l’édition de code C. L’utilisateur pourra utiliser son propre éditeur si il le désire ou si la taille du fichier C est supérieure à 200 K, via l'export et l'import. Comme le font les outils standards du marché, des commentaires qui contiennent des mots clés spécifiques sont générés. Quand PL7 SDKC crée l’en-tête de la fonction pour la première fois , les mots clés PL7SDK_BEGIN_FUNCTION_NAME et PL7SDK_END_FUNCTION_NAME sont placés automatiquement. Quand on sort de cet onglet, ou quand on modifie l'interface dans l'onglet précédent, PL7SDKC génère automatiquement cet en-tête, ce qui assure la cohérence entre l’interface déclarée et l’interface dans le code. Par le menu Edition, les fonctionnalités courantes sont offertes par l’EditText (couper, copier, coller, rechercher, remplacer). D'autres fonctionnalités sont disponibles comme : • Sélection sur double click • Affichage du numéro de ligne, dans la Status Bar, correspondant à la position actuelle du curseur. ___________________________________________________________________________ 143 Mise en œuvre de l'EF avec PL7SDKC FRANÇAIS Pour informer l’utilisateur des erreurs qui résultent de la compilation des sources C , la ligne du code source comportant l’erreur est signalée. Un fichier donnant le résultat de la compilation est généré. Il est accessible par la commande Voir résultats génération du menu Famille et renseigne sur les éventuelles erreurs. La définition de l’interface de l’EF génère automatiquement le prototype de cette dernière dans le FICHIER MAINxxyy.C où xx est le code classe et yy le code EF. L’utilisateur peut exporter le source si il le désire, le travailler, puis l’importer de nouveau . Il n’y a pas de contrôle à postériori sur les éventuelles modifications manuelles de l’interface de la fonction principale de l’EF. Si l’utilisateur modifie l’interface, ces modifications seront ignorées. L'interface est automatiquement régénérée à partir de l’onglet d'interface. Dans le cas ou le fichier est trop important pour être visualisé on le signalera. Néanmoins, la génération automatique du prototype de la fonction sera encore assurée. • l’utilisateur travaille dans l’éditeur fourni, et atteint la limite des 200K, pour l’EF courante. A ce moment là le message suivant est affiché : «Votre fichier est trop grand pour être édité avec PL7SDKC. Vous devez l’exporter , puis le réimporter». • l’utilisateur préfère utiliser son éditeur "favori". C’est possible et le travail est facilité par l’export d’un seul fichier à la fois. En procédant comme suit : créer son EF, créer son interface puis entrer dans l’onglet de code, exporter le fichier C, travailler dans son éditeur puis sauver, sans changer le nom, importer dans PL7SDKC. ___________________________________________________________________________ 144 Mise en œuvre de l'EF avec PL7SDKC Un clic sur l'onglet "Source .H" ouvre l'espace suivant : FRANÇAIS Bouton flipflop (Taille normale/ Pleine fenêtre) réduit/ agrandit la fenêtre de saisie Cet espace permet de définir des constantes, des types ou des structures spécifiques à l'EF. Ce fichier doit avoir une taille ≤ à 200 Koctets. ___________________________________________________________________________ 145 Mise en œuvre de l'EF avec PL7SDKC 3.2 Génération de la famille en debug FRANÇAIS La phase de création est achevée, il est désormais possible de procéder à la génération de la famille en debug. Pour cela on choisira Générer Debug du menu Famille comme le montre l'écran ci-dessous. Le rôle de cette génération est d'activer les différents outils logiciels permettant d'obtenir une nouvelle famille (toutes les classes) et de vérifier la cohérence des informations tout au long de la chaîne de génération. En cas de problème, un écran s'ouvre indiquant la nature de(s) erreur(s) à corriger, afin de pouvoir lancer une nouvelle génération. Il est possible de suivre le déroulement de la génération grâce à la ligne d'information positionnée au bas de l'écran. Lorsque la génération est terminée, l'indication "x error(s), y warning(s)" s'affiche et un beep sonore est émis. Un état "Générée en mode Debug" suivi d'une date de génération s'inscrivent dans la zone de description de la famille, il est alors possible d'installer cette famille dans la bibliothèque. Les informations sur la génération sont consultables en ouvrant le fichier résultat (Voir résultat génération du menu Famille). L'installation de cette famille ainsi générée, n'est possible que depuis le produit PL7SDKC. ___________________________________________________________________________ 146 Mise en œuvre de l'EF avec PL7SDKC 3.3 Génération de la famille en release FRANÇAIS La phase terminale consiste à procéder à la génération de la famille en release (taille de code minimisée). Pour cela on choisira Générer Release du menu Famille comme le montre l'écran ci-dessous. Le rôle de cette génération est d'activer les différents outils logiciels permettant d'obtenir une nouvelle famille (toutes les classes) et de créer les fichiers correspondants. Il est possible de suivre le déroulement de la génération grâce à la ligne d'information positionnée au bas de l'écran. Lorsque la génération est terminée, l'indication "x error(s), y warning(s)" s'affiche et un beep sonore est émis. Un état "Générée en mode Release" suivi d'une date de génération s'inscrivent dans la zone de description de la famille. Les informations sur la génération sont consultables en ouvrant le fichier résultat (Voir résultat génération du menu Famille). Une fois la génération achevée, les éléments nécessaires (fichiers) sont automatiquement copiés sur le support choisi pour la diffusion (disquette, disque réseau, ...). Cet espace fait partie des paramètres définis dans le menu de personnalisation de l'outil (cf. §5.1) ___________________________________________________________________________ 147 Mise en œuvre de l'EF avec PL7SDKC 3.4 Installation/Désinstallation dans la bibliothèque PL7 FRANÇAIS Il est possible d'installer une famille générée en debug ou générée en release sur le poste de développement, seules celles générées en debug pourront être mises au point dans PL7. Pour effectuer cette installation, on choisira Installer du menu Famille. Si le code de la famille à installer existe déjà en bibliothèque, une fenêtre de dialogue s'ouvre S'il s'agit d'une nouvelle famille devant remplacer l'ancienne, cliquer sur "Ecraser". En cas d'erreur, ou d'incertitude, il est possible d'annuler l'installation en bibliothèque en choisissant Quitter. Lorsqu' elle est terminée, le message "La famille a été installée en bibliothèque" apparaît et l'installation est alors effective. Il est possible de désinstaller une famille de la bibliothèque PL7. Il suffit de choisir la commande Désinstaller du menu Famille lorsqu'une famille est en cours d'édition. ___________________________________________________________________________ 148 Test de l'EF avec l'outil de Chapitre mise au point4 4 Test de l'EF avec l'outil de mise au point 4.1 Accès à la mise au point des EF 4.1-1 Choix de la famille de l'EF à tester Comme nous l'avons précisé au chapitre précédent, les EF des familles générées en debug vont pouvoir être mises au point, une par une, dans PL7 Micro, Junior ou Pro. Après avoir lancé PL7 puis chargé dans l'automate le programme contenant l'EF à tester, la commande Mise au point EF du menu Outils ouvre l'écran suivant permettant de sélectionner le répertoire de développement (dvt_ef, par défaut), puis la famille dans laquelle se trouve l'EF. Permet de rechercher le lecteur ainsi que le répertoire de développement rappel d'informations sur la famille La famille qui comporte l'EF à tester étant repérée, un clic sur OK ouvre l'environnement de mise au point des EF, présenté dans le prochain paragraphe. Il est fortement conseillé de ne faire appel qu'une fois à l'EF dans l'application, pour en effectuer la mise au point. 4.1-2 Ouverture de l'écran de mise au point des EF Cet écran est en fait composé de deux parties : • Une partie commande offrant sept boutons, • Une partie donnant des informations sur le test. ___________________________________________________________________________ 149 FRANÇAIS Le nom de la famille (générée en debug) et son numéro de code apparaîssent Test de l'EF avec l'outil de mise au point FRANÇAIS L'ouverture de l'écran ajoute un menu "Debug EF" à la barre de menu PL7. En choisissant la commande EF du menu Debug EF ou en cliquant sur le bouton (2ème bouton en partant de la gauche), l'écran qui va permettre de choisir l'EF à tester s'ouvre. Dans notre exemple, il n'y a qu'une EF dans la famille (l'EF "MAX_TABW" que l'on veut tester), le code de la classe à laquelle elle appartient, son code EF, son nom et son commentaire apparaîssent. Un clic sur OK ouvre un écran présentant le source C de l'EF (cf. § 4.3-1). En fonction de la complexité de l'EF, le temps d'accès à cet écran peut prendre quelques dizaines de secondes. ___________________________________________________________________________ 150 Test de l'EF avec l'outil de mise au point 4.2 Présentation de l'outil Les commandes de l'outil sont accessibles à partir d'un menu déroulant et/ou par les boutons. Toutes ces commandes sont décrites ci-après : (3ème bouton en partant de la gauche) : permet de poser/enlever un point d'arrêt. (4ème bouton en partant de la gauche) ou la commande Go du menu Debug EF permet de relancer l'automate à partir du point d'arrêt ou du pas courant. (5ème bouton en partant de la gauche) ou la commande Step Into (Ligne suivante) du menu Debug EF : permet de pénétrer à l'intérieur d'une fonction (si c'est une fonction présente dans le source C de l'EF. (6ème bouton en partant de la gauche) ou la commande Step Over (Ligne suivante meme fonction) du menu Debug EF : permet d'éviter une fonction (passer par dessus). (7ème bouton en partant de la gauche) ou la commande Step Out (Sort de la fonction) du menu Debug EF : permet de sortir d'une fonction C composant une EF. • la commande Registres du menu Debug EF permet d'afficher la liste de l'ensemble des registres utilisés par le microprocesseur de l'UC (cf. § 4.3-3). • la commande Variables locales du menu Debug EF permet d'afficher la liste des variables utilisées localement (cf. § 4.3-4). • la commande Mixer C/Asm du menu Debug EF permet de passer d'une présentation en langage C à une présentation en langage C et en langage assembleur. • la commande Points d'arrêt du menu Debug EF permet d'afficher un écran donnant des renseignements sur la localisation des points d'arrêt. • la commande Step to Cursor (Avance vers curseur) du menu Debug EF permet de relancer l'API, du pas sur lequel il est arrêté jusqu'au curseur. ___________________________________________________________________________ 151 FRANÇAIS (1er bouton en partant de la gauche) : permet de sortir de l'outil de mise au point des EF. Test de l'EF avec l'outil de mise au point 4.3 Mise au point des EF Suite à la procédure décrite précédemment (cf. § 4.2-1), le code source C de l'EF s'affiche à l'écran et la mise au point peut commencer. Il va être possible, à l'aide des commandes et des boutons de l'outil, d'effectuer toutes les opérations habituelles inhérentes au debug, à savoir : • Pose et dépose de points d'arrêt, • Faire du pas à pas, • Dérouler une portion de programme, • Rentrer dans une fonction, • Faire de l'analyse en s'appuyant sur les listes des registres et des variables locales, FRANÇAIS • Editer l'EF en code C et langage assembleur, pour les besoins d'une analyse plus fine d'une portion de programme qui pourrait poser problème. 4.3-1 Pose et dépose de points d'arrêt Après avoir choisi une ligne de code en y pointant le curseur, en appuyant sur le bouton , on va placer un point d'arrêt sur cette ligne. Le même bouton permet d'enlever un point d'arrêt. Il est possible de poser jusqu'à 7 points d'arrêt simultanément. Celui-ci est matérialisé sous la forme d'une ligne bleue. il est possible, de poser ou d'enlever ainsi, tous les points d'arrêt souhaités. Si l'automate est en RUN et si le programme passe sur un des points d'arrêt, la ligne en question passe alors en jaune. En utilisant les boutons, , , , il va être aisé de rentrer/sortir d'une fonction ou de sauter une fonction. Exemple de portion de code source C de l'EF avec deux points d'arrêt matérialisés (une ligne bleue, une ligne jaune) ___________________________________________________________________________ 152 Test de l'EF avec l'outil de mise au point 4.3-2 Mixer code C et langage assembleur FRANÇAIS La commande Mixer C/Asm du menu Debug EF permet de passer d'une présentation en langage C à une présentation en langage C et en langage assembleur. 4.3-3 Les registres La commande Registres du menu Debug EF permet d'afficher la liste de l'ensemble des registres utilisés par le microprocesseur de l'UC, ainsi que le contenu de la pile d'exécution qui contient les variables locales et les paramètres de la fonction dans laquelle est arrêté le programme. ___________________________________________________________________________ 153 Test de l'EF avec l'outil de mise au point 4.3-4 Les variables locales FRANÇAIS La commande Variables locales du menu Debug EF permet d'afficher la liste des variables locales et des paramètres de la fonction dans laquelle est arrêté le programme. Toutes les valeurs numériques qui sont visualisées dans cet écran sont exprimées en hexadécimal (sauf les variables FLOAT_TODBG). La syntaxe permettant de définir les types des variables locales et des paramètres est décrite ci-dessous : +: le signe "plus" signifie que l'on peut déployer l'objet situé sur la ligne. - : le signe "moins" signifie que l'on peut contracter l'objet situé sur la ligne. {...} : signifie que l'objet correspondant est une structure. [] : signifie que l'objet correspondant est un tableau. 0xabcd:0xabcd : signifie que l'objet correspondant est un pointeur. En le déployant, on voit apparaître le type de l'objet pointé. %xxxxxxxx : où x prend la valeur 0 ou 1, signifie que l'objet correspondant est un champ de bits. ___________________________________________________________________________ 154 Test de l'EF avec l'outil de mise au point En fin d'une session de mise au point d'une EF, pour sortir, on utilisera soit le bouton de l'outil, soit les commandes habituelles de sortie d'un écran Windows. FRANÇAIS En cas de problème en cours de test d'une EF, si l'outil de mise au point des EF n'a pu être fermé, Il est nécessaire de charger à nouveau l'application dans l'automate avant de relancer une session. ___________________________________________________________________________ 155 FRANÇAIS Test de l'EF avec l'outil de mise au point ___________________________________________________________________________ 156 Fonctionnalités complémentaires de SDKC Chapitre 5 5 Fonctionnalités complémentaires de SDKC 5.1 Paramétrage de l'outil La commande Personnaliser du menu Services ouvre la fenêtre suivante permettant de paramétrer un certain nombre de répertoires de travail utiles pour le fonctionnement de l'outil. Répertoire (par défaut) où seront placés les fichiers des familles d'EF Disque de travail (C:\) où le logiciel crée/détruit ses fichiers de travail temporaires Répertoire (par défaut) où seront placés les fichiers des classes importés/exportés Répertoire (par défaut) où seront placés les fichiers des sources en language C destinés à être importés/exportés Les flèches situées à droite de chaque champ, ouvrent une boite de dialogue permettant, pour chacun des champs, la sélection d'un autre disque/répertoire. ___________________________________________________________________________ 157 FRANÇAIS Répertoire (par défaut) où seront placés les fichiers permettant l'installation d'une famille d'EF Fonctionnalités complémentaires de SDKC 5.2 Modifier une famille FRANÇAIS Lorsqu'un nom de famille et un numéro de version ont été associés à un code famille, la seule possibilité de changer ce(s) paramètre(s) est de sélectionner cette famille (vidéo-inverse) et de lancer Modifier du menu Famille. Cette action a pour conséquence d'ouvrir les champs "Nom" et "Version" à la saisie. Par exemple, cette démarche s'avèrera utile pour changer le numéro de version d'une famille, suite à l'évolution de celle-ci. Un clic sur "Valider" prend en compte cette modification et ouvre la famille, afin de permettre une création/consultation de classe/EF (cf. § 3.1.2, § 3.1.3). ___________________________________________________________________________ 158 Fonctionnalités complémentaires de SDKC 5.3 Importer/Exporter 5.3-1 Classe Une famille étant ouverte, deux commandes du menu Services vont permettre l'import et/ou l'export de classe(s) dans cette famille. Exporter une classe consiste à copier celle-ci dans le répertoire approprié défini lors de la personnalisation de l'outil (cf. § 5.1). L'export de la classe "Class1" de cette famille a pour conséquence, de copier dans le répertoire un fichier " CLASSE01.EXP" contenant tous les éléments inhérents à cette classe. En fin d'export, le message : La classe "Class1" a été exportée avec succès vers "C:\SDKCWTMP\IMPCLASS\CLASSE01.EXP" indique que l'opération est terminée. Attention : Le fichier "CLASSE01.EXP" écrase l'éventuel "CLASSE01.EXP" déjà existant et il n'y a pas de message d'avertissement. Le groupe de deux chiffres terminant le nom du fichier "CLASSE01" indique le code de la classe en hexadécimal (classe de code 1, dans cet exemple). Le suffixe .EXP est la marque distinctive d'un fichier "d'Import-Export classe". Importer une classe consiste à venir ouvrir l'écran suivant, présentant le contenu du répertoire "d'Import-export classe" évoqué précédemment et de choisir le fichier correspondant à la classe que l'on désire importer dans une famille. ___________________________________________________________________________ 159 FRANÇAIS Exemple : Famille "Programme", classe "Class1" : (le répertoire "d'import-export classe" est celui par défaut : C:\SDKCWTMP\IMPCLASS) Fonctionnalités complémentaires de SDKC Exemple : Si l'on désire importer une classe1 dans la famille "Programme" Il faut sélectionner le fichier " CLASSE01.EXP" contenant tous les éléments inhérents à cette classe et cliquer sur OK. Deux cas sont possibles : • Il n'y avait pas de classe de code 1 dans cette famille, le clic sur OK déclenche la copie et on voit apparaître dans la partie gauche de l'écran la classe de code 1 et ses EF. FRANÇAIS • Une classe de code 1 existait déjà dans la famille "Programme", le clic sur OK fait apparaître le message suivant : Oui importera la nouvelle classe (tous les éléments inhérents à cette classe) et écrasera l'ancienne classe de même code (tous les éléments inhérents à cette classe). Non permet d'annuler l'import et de revenir à la situation initiale. 5.3-2 Source C A partir de l'onglet "Source C" d'une EF, deux boutons vont permettre d'importer et/ou d'exporter le code source C d'une autre EF. Exporter Source C d'une EF consiste à copier le code dans le répertoire approprié défini lors de la personnalisation de l'outil (cf. § 5.1). Exemple : Famille "Programme", classe "Class1", EF "MAX_TABW" : (le répertoire "d'import-export sources C" est celui par défaut : C:\SDKCWTMP\IMPSRC) l'export du contenu de l'onglet source C de l'EF "MAX_TABW" a pour conséquence, de copier ce code dans un fichier "MAIN0101.C" du répertoire. En fin d'export, le message : Le fichier source "MAIN0101.C" a été copié vers "C:\SDKCWTMP\IMPSRC\MAIN0101.C", indique que l'opération est terminée. Attention : Le fichier "MAIN0101.C" écrase l'éventuel "MAIN0101.C" déjà existant et il n'y a pas de message d'avertissement. ___________________________________________________________________________ 160 Fonctionnalités complémentaires de SDKC Les deux groupes de deux chiffres formant la fin du nom du fichier "MAIN0101" indiquent le code de la classe suivi du code de l'EF (classe de code 1, EF de code 1, dans cet exemple). Ces codes sont exprimés en hexadécimal. Le suffixe .C est la marque distinctive d'un fichier "d'Import-Export Source C". Ce type de fichier MAINxxxx.C, pourra être ouvert par un éditeur C du commerce (plus élaboré). Cette manipulation sera rendue obligatoire, lorsque le fichier C dépassera la limite de la zone d'édition de 64 Koctets. FRANÇAIS Importer Source C d'une EF consiste à venir ouvrir l'écran suivant, présentant le contenu du répertoire "d'Import-export sources C" évoqué précédemment et de choisir le fichier correspondant au code source C que l'on désire importer dans l'EF. Exemple : Si l'on désire importer le source C contenu dans le fichier "MAIN0102.C" Il faut sélectionner ce fichier et cliquer sur OK. Le clic sur OK fait apparaître le message suivant : OK importera le nouveau code source C et écrasera l'ancien. Annuler permet de revenir à la situation initiale. ___________________________________________________________________________ 161 Fonctionnalités complémentaires de SDKC 5.4 Archiver/Restaurer une famille 5.4-1 Archiver FRANÇAIS Lorsqu'une famille a été créée, que se(s) classe(s) et se(s) EF(s) ont été créées et paramétrées, il peut être intéressant de l'archiver. Cette opération est réalisable en actionnant la commande Archiver du menu Famille, comme l'indique l'écran suivant : Ces carrés en fonction de leur sélection, permettent l'affichage dans la partie gauche de l'écran des familles normales et/ou archivées Par défaut, cette archive est transférée dans le répertoire général des familles d'EF (DVT_EF) créé lors de l'installation. Il est possible, à l'aide du bouton "Choisir chemin", de placer cette archive dans un autre répertoire de sa convenance. L'archivage de la famille est terminé et si la visualisation des archives est effective, on voit apparaître l'archive dans la partie gauche de l'écran. En sélectionnant l'archive, un écran apparaît contenant les principales caractéristiques de la famille archivée. Une zone s'ouvre permettant de saisir des commentaires sur l'archive ; ces commentaires seront précieux lors d'une éventuelle restitution. Zone de saisie des commentaires (4 lignes maximum) ___________________________________________________________________________ 162 Fonctionnalités complémentaires de SDKC 5.4-2 Restaurer FRANÇAIS La fonction "Restaurer" a pour but de remplacer une famille donnée par un archivage antérieur en provenance du répertoire général des familles d'EF. Cette fonction est réalisable en actionnant la commande Restaurer du menu Famille, comme l'indique l'écran suivant : Comme cette restauration a pour conséquence d'écraser la famille actuelle, un message de confirmation apparaît : OK restaure la famille. Annuler permet de revenir à la situation initiale. Lors de l'exécution des fonctions Archiver/Restaurer, les fichiers créés ou manipulés se trouvent dans le répertoire défini dans l'écran de personnalisation (cf. § 5.1) sous l'item : Répertoire général des familles d'EF (C:\DVT_EF par défaut). Ces fichiers sont nommés respectivement : • CRD_xxxx.yyy : pour la fiche famille • CAT_xxxx.yyy : pour les informations sur la famille • FAM_xxxx.yyy : pour l'archive complète où xxxx correspond au code famille en hexadécimal et yyy au numéro de l'archive. ___________________________________________________________________________ 163 Fonctionnalités complémentaires de SDKC 5.4-3 Restaurer à partir de FRANÇAIS La commande Restaurer à partir de... du menu Famille, ouvre l'écran suivant permettant de définir le chemin où est localisée la famille recherchée (répertoire, réseau, disquette, ...) La famille souhaitée étant sélectionnée, un clic sur Ouvrir valide la restauration. Attention, une famille restaurée ecrase une éventuelle famille de même nom et de même version. Dans ce cas, un avertissement apparait et une confirmation est exigée. 5.5 Imprimer A l'intérieur d'une famille, la commande Imprimer du menu Famille permet de lancer l'impression. L'écran suivant permet de définir la nature de l'impression désirée. ___________________________________________________________________________ 164 Fonctionnalités complémentaires de SDKC Par défaut, sont imprimés les informations du niveau famille, En les sélectionnant, il est possible d'obtenir les informations sur les classes et les EF et/ou les programmes source contenus dans ces classes et dans ces EF. La rubrique "Imprimer uniquement le source de l'éditeur actif" apparaît en grisé. Cette commande devient active, lors de l'écriture d'un programme source, et que le curseur se trouve à l'intérieur de l'éditeur. FRANÇAIS Un bouton "Configuration" permet d'activer la boite de configuration de l'impression permettant d'en définir les paramètres . ___________________________________________________________________________ 165 FRANÇAIS Fonctionnalités complémentaires de SDKC ___________________________________________________________________________ 166 LeChapitre code de l'EF 6 6 Le code de l'EF 6.1 Règles de mise en œuvre des EF 6.1-1 Langage C Limitation : L'installation et l'utilisation de librairies de fonctions autres que celles incluses dans le produit PL7 SDKC ne sont pas supportées par Schneider Automation. N° 1 Il est interdit de définir des variables statiques dans une EF. N° 2 Il est interdit de définir des Unions dans une structure. Il faut les avoir définies, hors de la structure, au préalable. N° 3 L'utilisation d'un pointeur comme paramètre ou variable locale d'une fonction nécessite qu'il soit déclaré comme pointeur long. Il est interdit de définir un champ de bits de longueur 0. N° 5 L'instruction "switch" du langage C est interdite dans le code d'une EF. N° 6 Les types des paramètres formels d'une EF sont spécifiques aux langages PL7 (se reporter à la documentation PL7 Micro, Junior ou Pro), ceux-ci sont transformés automatiquement dans l'en-tête de la fonction C comme indiqué cidessous : Paramètre formel PL7 Paramètre d'entrée Paramètre de sortie Paramètre d'entrée/sortie BOOL short adrNFBIT adrNFBIT EBOOL adrFBIT adrFBIT adrFBIT WORD short adrSCAL adrSCAL DWORD long adrSCAL adrSCAL REAL unsigned long adrSCAL adrSCAL STRING adrTABLE adrTABLE adrTABLE AR_X adrTABLE adrTABLE adrTABLE AR_W adrTABLE adrTABLE adrTABLE AR_D adrTABLE adrTABLE adrTABLE AR_R adrTABLE adrTABLE adrTABLE N° 7 Les types et les constantes présentées page suivante appartiennent au fichier CSTSYST.H qui est inclus automatiquement en début de chaque source C décrivant une EF. ___________________________________________________________________________ 167 FRANÇAIS Exemple : int far* pVariableLocale N° 4 Le code de l'EF //Définition des constantes FRANÇAIS // Valeurs de status répertoriées #define STATUS_OK #define OUT_OF_BOUNDS #define NULL_RW_SIZE #define CLOCK_UNAVAILABLE #define CLOCK_NOT_SUPPORTED #define INVALID_LENGTH #define #define #define #define NIL NILL INVALID_ADDRESS NULL_FPTR // Types d’action possibles sur chaînes de bits forçables (wr_bits) #define DATA_WRITE // Ecriture du champ data #define RVALUE_WRITE // Ecriture du champ valeur de repli (TSX57 uniquement) #define RVALID_WRITE // Ecriture du champ validation de la valeur // de repli (TSX57 uniquement) #define DEFAULT_WRITE // Ecriture du défaut (TSX57 uniquement) #define UNFORCE_ALL // Déforçage global des bits #define GAMME_TSX37 4 #define REFCAT_TSX37_10 #define REFCAT_TSX37_21 #define REFCAT_TSX37_22 1 2 3 #define GAMME_TSX57 5 #define REFCAT_TSX57_10 #define REFCAT_TSX57_20 #define REFCAT_PMX57_20 #define REFCAT_TSX57_30 #define REFCAT_TSX57_10_V3 #define REFCAT_TSX57_20_V3 #define REFCAT_TSX57_25_V3 #define REFCAT_TSX57_30_V3 #define REFCAT_TSX57_35_V3 #define REFCAT_TSX57_40_V3 #define REFCAT_TSX57_45_V3 1 2 3 4 5 6 7 8 9 10 11 ___________________________________________________________________________ 168 Le code de l'EF //Définition des types #define BOOL short #define BYTE unsigned char #define WORD unsigned short #define DWORD unsigned long //Définition des structures typedef struct { void __near unsigned short }PTR_LOG; *off; sel; // Offset // Numéro de sélecteur typedef struct { unsigned short selecteur; unsigned short offset; unsigned short taille; } adrTABLE; FRANÇAIS typedef struct { unsigned short selecteur; unsigned short offset; } adrSCAL; // Taille du tableau ou de la chaîne typedef struct { unsigned short selecteur; unsigned short offset; } adrFBIT; typedef struct { unsigned short selecteur; unsigned short offset; unsigned short rang; } adrNFBIT; typedef struct { unsigned char gamme; unsigned char version; unsigned char codecat; // valeur discrète : 0..15 // Gamme du processeur // Version de l’OS présente dans le processeur // Code de référence catalogue du modèle d’UC unsigned char unused; } PROC_IDENT; ___________________________________________________________________________ 169 Le code de l'EF FRANÇAIS typedef struct { unsigned char reserved ; unsigned char Second ; unsigned char Minut ; unsigned char Hour ; unsigned char DayMonth ; unsigned char Month ; unsigned char Year ; unsigned char Century ; unsigned char DayWeek ; } DATE_TIME ; typedef struct { unsigned Run unsigned AppliExec unsigned unsigned unsigned unsigned unsigned unsigned CartMemDetect Reservation BrkptSet AppliFailure PartialRun CartFlashErase : 1; : 1; :1; : 1; : 1; : 1; : 1; : 1; unsigned UserMemProtect : 1; unsigned Reserved } PROC_INDIC ; : 7; /* 1 si run */ /* 1 si indice compatibilité entre appli et processeur ok */ /* 1 si détection cart. mèm. */ /* 1 si réservation en cours */ /* 1 si brkpt positionné */ /* 1 si appli «halted» */ /* 1 si run partiel */ /* 1 si la cart. mém. FEPROM */ /* est en cours d’effacement */ /* 1 si mémoire application */ /* protégée en écriture */ /* bits réservés */ #ifdef SDKCV3 typedef union { unsigned long ul; float fl; } FLOAT_DBG; #ifdef C_486 typedef #else typedef #endif float FLOAT; unsigned long FLOAT; #endif ___________________________________________________________________________ 170 Le code de l'EF 6.1-2 Gestion de versions de famille et d'EF N° 8 Pour une famille déjà installée en bibliothèque, toute modification à l'intérieur d'une classe doit imperativement entraîner une évolution de son numéro de version (de l'indice et/ou de l'indice release), ainsi que du numéro de version de la famille à laquelle elle appartient. Le respect de cette règle est obligatoire pour permettre la remise à niveau des applications PL7 existantes contenant des EF de la classe dans la version antérieure. Attention : le numéro de version d'une famille ne correspond pas nécessairement au maximum des numéros de versions des classes qui la composent. Exemple : soit une famille F de version 2.1, composée des classes C1, C2 et C3 de versions respectives 1.0, 2.1 et 1.0. Une évolution de la classe C1 de 1.0 vers 1.1, devra faire passer la version de la famille F de 2.1 vers 2.2 au minimum. N° 9 Une nouvelle version de famille d'EF doit rester totalement compatible avec la version précédente : • il ne doit pas y avoir de disparition d'EF de la famille, • une EF ne doit pas changer d'interface d'appel (il faut créer une nouvelle EF, avec un nom distinct si le prototypage doit changer, et conserver l'ancienne. N° 10 Il faut incrémenter "l'indice compatibilité info textuelles" d'une famille d'EF si (et seulement si) l'évolution subie par cette famille rend les informations d'aide existantes obsolètes. Remarque : pendant la phase de mise au point des EF, il est conseillé d'attribuer les numéros de versions aux classes et familles à partir 0.01, afin de permettre d'attribuer par la suite la version 1.0 au produit commercialisé. ___________________________________________________________________________ 171 FRANÇAIS Un numéro de version (format VV.RR) est attribué à une famille d'EF et à chaque classe de la famille. Un indice de compatibilité des informations textuelles est attribué à une famille d'EF. Cet indicateur permet, en cas d'incohérence de versions de la famille entre la bibliothèque et une application, de déterminer la validité des informations d'aide associées aux EF (commentaire général, nom et commentaire de ses paramètres) qui composent la famille. Le code de l'EF 6.1-3 Gestion de la taille de la pile La gestion de la taille réservée pour la pile d'exécution d'une EF est laissée à la charge de l'utilisateur. Il est important de pouvoir l'estimer au plus juste, car : • si la taille est trop faible, l'automate va se retrouver en défaut. • si la taille est trop grande, c'est autant de place en moins pour la mémoire de données de l'automate. Pour estimer cette taille en octets, il faut additionner les tailles : • des paramètres et des variables locales de l'EF (exemple : int = 2 octets, long = 4 octets, char = 1 octet, ...), FRANÇAIS • des paramètres et des variables locales des fonctions qu'elle appelle, en parcourant l'arbre d'appel le plus profond. 6.1-4 Utilisation des nombres flottants Il est possible de saisir des paramètres flottants en argument d’une EF. Dans le cas d’une EF fonction on peut aussi choisir de retourner un flottant ; Il faut pour cela sélectionner le type REAL lors du choix du type. Le calcul flottant n’est accessible que sur les automates de version ≥ à V3.0 (avec ou sans coprocesseur). Cela signifie que le code source d’une EF incluant des paramètres flottants ne sera pas regénérable pour un automate cible de version < 3 (erreurs de compilation). Déclaration et initialisation d’une variable de type flottant La déclaration se fait ainsi : FLOAT varf ; L’initialisation de la variable avec une valeur littérale se fait avec la macro FVALUE : varf = FVALUE(2.1e23) ; Visualisation en debug d’une variable flottante La visualisation d’une variable flottante dans Debug EF se fait en utilisant une variable du type FLOAT_DBG. On convertit grâce à la fonction FLOAT_TO_DBG une valeur de type FLOAT en une valeur de type FLOAT_DBG. Exemple FLOAT_DBG fv ; FLOAT FVAL ; FVAL = FVALUE(1.1) ; fv =FLOAT_TO_DBG (FVAL) ; ___________________________________________________________________________ 172 Le code de l'EF La visualisation de la variable fv en debug donnera ceci. ( on constate que c’est en réalité un union entre un flottant et un unsigned long. ) - fv = (union) fl = +1.1000000E+000 ul = 0x3F8CCCCD Conversion des variables flottantes PL7 en variables SDKC et vice-versa Le type flottant dans PL7 est un unsigned long. Il faut assurer une conversion en entrée de fonction ainsi que la conversion inverse en cas de retour. // retour déclaré en REAL unsigned long far pascal MONEF( unsigned long IN1 // déclaré en REAL dans SDKC ) { FLOAT FVAL ; FVAL = GET_FLOATPL7(INI) ; // conversion vers un flottant /// traitements return (FLOAT_TOPL7 (FVAL) ) ; // conversion inverse } ___________________________________________________________________________ 173 FRANÇAIS Exemple Le code de l'EF 6.2 Liste des mots réservés FRANÇAIS Les mots de la liste suivante (présentés en colonne et par ordre alphabétique) sont ou seront utilisés par PL7, ils ne doivent pas être employés comme nom d'EF : ABS ACCEPT ACOS ACTION ACTIVATE_PULSE ACTIVE_TIME ADD ADDRESS ADD_DT ADD_TOD ADR AND ANDF ANDN ANDR AND_ARX ANY ANY_BIT ANY_DATE ANY_INT ANY_NUM ANY_REAL ARRAY AR_D AR_DINT AR_F AR_INT AR_R AR_W AR_X ASIN ASK ASK_MSG ASK_VALUE ASSIGN_KEYS AT ATAN AUX BCD_TO_INT BIT_D BIT_W BLK BLOCK BODY BOOL BOTTOM BTI BTR BY BYTE C CAL CALC CALCN CALL CALL_COIL CANCEL CASE CD CHART CH_M CLK CLOSE CLOSED_CONTACT COIL COMMAND COMMENTS COMP4 COMPCH CONCAT CONCATW CONF CONFIGURATION CONSTANT CONTROL_LEDS COPY_BIT COS CTD CTU CTUD CU D DATA_EXCH DATE DATE_AND_TIME DAT_FMT DAY_OF_WEEK DA_TYPE DEACTIVATE_PULSE DEC DELETE DELTA_D DELTA_DT DELTA_TOD DINT DINT_TO_REAL DINT_TO_STRING DISPLAY_ALRM DISPLAY_GRP DISPLAY_MSG DIV DMOVE DO DOWN DR DRUM DS DSHL_RBIT DSHRZ_C DSHR_RBIT DSORT_ARD DSORT_ARW DT DTS DWORD D_BIT E EBOOL ELSE ELSIF EMPTY EMPTY_LINE END ENDC ENDCN END_ACTION END_BLK END_BLOCK END_CASE END_COMMENTS END_CONFIGURATION END_EXPRESSION END_FOR END_FUNCTION END_FUNCTION_BLOCK END_IF END_MACRO_STEP END_PAGE END_PHRASE END_PROG END_PROGRAM END_REPEAT END_RESOURCE END_RUNG END_STEP END_STRUCT END_TRANSITION END_TYPE END_VAR END_WHILE EQ EQUAL EQUAL_ARR ERR EVT EXCHG EXCH_DATA EXIT EXP EXPRESSION EXPT F FALSE FAST FBD FE FIFO FIND FIND_EQ FIND_EQD FIND_EQDP FIND_EQR FIND_EQW FIND_EQWP FIND_GTD FIND_GTR FIND_GTW FIND_LTD FIND_LTR FIND_LTW FOR FPULSOR FROM FTOF FTON FTP FUNC FUNCTION ___________________________________________________________________________ 174 FUNCTION_BLOCK F_B F_EDGE F_TRIG GE GET GET_MSG GET_VALUE GLOBAL_COMMENT GR7 GRAY_TO_INT GT GTI H HALT HALT_COIL HASH_COIL HW H_COMPARE H_LINK I IF IL IN INC INCJUMP INDEX_CH INFO INITIAL_STEP INIT_BUTTONS INPUT INPUT_CHAR INSERT INT INTERVAL INT_TO_BCD INT_TO_REAL INT_TO_STRING ITB ITS JMP JMPC JMPCN JUMP JUMP_COIL L LAD LANGAGE LANGUAGE LD LDF LDN LDR LE LEFT LEN LENGTH_ARD LENGTH_ARR LENGTH_ARW LENGTH_ARX LIFO LIMIT LINT LIST LIT LN LOCATION LOG LREAL LT LW LWORD M MACRO_STEP MAIN MASKEVT MAST MAX MAX_ARD MAX_ARR MAX_ARW MAX_PAGES MAX_STEP MCR MCR_COIL MCS MCS_COIL MID MIN MIN_ARD MIN_ARR MIN_ARW MN MOD MONO MOVE MPP MPS MRD MS MUL MUX M_CH M_MACRO_STEP N N1 NAME NB_ACTIVE_STEPS NB_ACTIVE_TIME NB_BLOCKS NB_COMMON_WORDS NB_CONSTANT_WORDS NB_CPT NB_DRUM NB_INTERNAL_BITS NB_INTERNAL_WORDS NB_MACRO_STEPS NB_MONO NB_PAGES NB_REG NB_TIMER NB_TM NB_TRANSITIONS NE NIL NO NON_STORED NOP NOT NOT_ARX NOT_COIL NOT_READABLE NO_GR7 NO_PERIOD N_CONTACT O OCCUR OCCUR_ARD OCCUR_ARR OCCUR_ARW OF ON OPEN OPEN_CONTACT OPERATE OR ORF ORN ORR OR_ARX OTHERS OUT OUTIN_CHAR OUTPUT OUT_BLK OUT_IN_CHAR P P0 P1 PAGE PAGE_COMMENT PANEL_CMD PERIOD PHRASE PHRASE_COMMENT PID PID_MMI PLC POST PRESET PRINT PRINT_CHAR PRIO0 PRIO1 PRIORITY PRL PROG PROGRAM PROG_LANGAGE PROG_LANGUAGE PT PTC PUT PV PWM P_CONTACT Q QUERY R R1 RCV_TLG RE READ READ_EVT_UTW READ_ONLY READ_PARAM READ_STS READ_VAR READ_WRITE REAL REAL_TO_DINT REAL_TO_INT REAL_TO_STRING REG REM REPEAT REPLACE REQ ___________________________________________________________________________ 175 FRANÇAIS Le code de l'EF FRANÇAIS Le code de l'EF RESET RESET_COIL RESOURCE RESTORE_PARAM RET RETAIN RETC RETCN RETURN RET_COIL RIGHT ROL ROLD ROLW ROL_ARD ROL_ARR ROL_ARW ROL_DWORD ROL_WORD ROR ROR1_ARB RORD RORW ROR_ARD ROR_ARR ROR_ARW ROR_DWORD ROR_WORD RRTC RS RTB RTC RTS RUNG R_EDGE R_TRIG S S1 SAVE SAVE_PARAM SCHEDULE SCOUNT SD SEARCH SECTION SEL SEMA SEND SENDER SEND_ALARM SEND_MBX_ALARM SEND_MBX_MSG SEND_MSG SEND_REQ SEND_TLG SERVO SET SET_COIL SFC SHIFT SHL SHOW_ALARM SHOW_MSG SHOW_PAGE SHR SHRZ SIN SINGLE SINT SL SLCWORD SMOVE SOFT_CONFIGURATION SORT SORT_ARD SORT_ARR SORT_ARW SQRT SR ST STANDARD START STD STEP STI STN STOP STR STRING STRING_TO_DINT STRING_TO_INT STRING_TO_REAL STRUCT SUB SUB_DT SUB_TOD SUM SU_TYPE SWAP S_T_AND_LINK S_T_OR_LINK T TAN TASK TASKS THEN TIME TIMER TIME_OF_DAY TM TMAX TMOVE TO TOD TOF TOFF TON TOP TP TRANSITION TRANS_TIME TRUE TRUNC TYPE TYPES T_S_AND_LINK T_S_OR_LINK U UDINT UINT ULINT UNMASKEVT UNTIL UP USINT USORT_ARD USORT_ARW UTIN_CHAR VAR VAR_ACCESS VAR_EXTERNAL VAR_GLOBAL VAR_INPUT VAR_IN_OUT VAR_OUTPUT VAR_PUBLIC VERSION V_COMPARE V_LINK W WHILE WITH WORD WRITE WRITE_CMD WRITE_PARAM WRITE_VAR WRTC WSHL_RBIT WSHRZ_C WSHR_RBIT W_BIT XM XM_MONO XM_MULTI XOR XORF XORN XORR XOR_ARX YES ___________________________________________________________________________ 176 Fonctions système Chapitre 7 7 Fonctions système Il est possible de faire appel, dans le corps d'une EF, à des fonctions système présentes dans l'UC de l'automate. En voici la liste : • rd_sysbit : lecture d'un bit système %Si • wr_sysbit : écriture d'un bit système %Si • rd_sysword : lecture d'un mot système %SWi • wr_sysword : écriture d'un mot système %SWi • rd_bit_attrib : lecture d'un bit de la mémoire forçable • rd_bits : lecture de plusieurs bits consécutifs en mémoire forçable • wr_bits : écriture de plusieurs bits consécutifs en mémoire forçable • rd_16bits : lecture de la valeur de 16 bits consécutifs en mémoire forçable • wr_16bits : écriture de la valeur de 16 bits consécutifs en mémoire forçable • rd_1bit : lecture de la valeur d'un bit en mémoire forçable • wr_1bit : écriture de la valeur d'un bit en mémoire forçable • phy_ptr_init : transformation d'une adresse logique en une adresse physique • date_and_time : lecture de la date et de l'heure courante de l'automate • cnt_100ms : lecture de la valeur d'un compteur interne cadencé à 100 ms • cnt_10ms : lecture de la valeur d'un compteur interne cadencé à 10 ms • proc_type : lecture du type de processeur • proc_indic : lecture d'informations sur la configuration mémoire • ADD : somme de deux nombres flottants • SUB : soustraction de deux nombres flottants • MUL : multiplication de deux nombres flottants • DIV : division de deux nombres flottants • EQU : test si égalité entre deux nombres flottants • SUP : test si un flottant est supérieur à un autre flottant • INF : test si un flottant est inférieur à un autre flottant • ABS : calcul de la valeur absolue d'un nombre flottant • CHS : changement de signe d'un nombre flottant • SQRT : calcul de la racine carrée d'un nombre flottant • FTOL : conversion d'un double mot en nombre flottant • LTOF : conversion d'un nombre flottant en double mot • of_passw_check :accès à la signature d'une carte PCMCIA pour protection d'application (voir Aide en ligne) ___________________________________________________________________________ 177 FRANÇAIS Fonctions de base Fonctions système Fonctions trigonométriques et exponentielles FRANÇAIS • EXP : exponentielle d'un nombre flottant • LN : calcul du logarithme d'un nombre flottant • SIN : calcul du sinus d'un nombre flottant • COS : calcul du cosinus d'un nombre flottant • TAN : calcul de la tangente d'un nombre flottant • ASIN : calcul de l'arcsinus d'un nombre flottant • ACOS : calcul de l'arccosinus d'un nombre flottant • ATAN : calcul de l'arctangente d'un nombre flottant Exceptions et cas d’erreur Les fonctions mathématiques proposées ne retournent pas de compte-rendu d’exécution. Néanmoins, il est possible d’obtenir ce compte-rendu grace à la Macro GET_STATUS(status) qui doit être utilisée juste après l’appel d’une fonction. Le résultat contenu dans status indique le résultat d’ exécution de cette fonction . La signification des différentes valeur retournées, sont décrites dans le tableau ci dessous : #define valeur signification STATUS_OK 0 opération correctement effectuée flag_InvalideOp 1 opérande invalide flag_Denorm 2 opérande dénormalisé ZeroDivide 4 division par zéro flag_Overflow 8 overflow flag_Underflow 16 underflow Exemple d’utilisation de la Macro GET_STATUS FLOAT fa, fb ; unsigned short status ; fa = ADD( fa, fb); GET_STATUS (status) ; if (status!= STATUS_OK) { // traitement d’erreur } ___________________________________________________________________________ 178 Fonctions système Conventions de représentations des valeurs exceptionnelles (Norme IEEE 754) -1.#NAN : représente un nombre dénormalisé représente + l’ infini (valeur Hexadécimale 7F800000) représente - l’infini (valeur Hexadécimale FF800000) représente un résultat indéfini ( Not A Number ) positif. (valeur Hexadécimale 7FC00000) représente un résultat indéfini ( Not A Number )négatif. (valeur Hexadécimale FFC00000) Remarque : Comme il est possible, en utilisant ces fonctions, d'aller écrire dans la mémoire de l'automate, des précautions d'accès sont à prendre en compte par l'utilisateur. Exemple : Lorsqu'un tableau est passé en paramètre d'une EF, attention à ne pas accéder à des mots en dehors de ce tableau. La vérification peut s'effectuer en testant sa longueur. Les pages suivantes décrivent ces fonctions, leurs paramètres, les types utilisés en s'appuyant sur des exemples. ___________________________________________________________________________ 179 FRANÇAIS 0.#DN : 1.#INF : -1.#INF : 1.#NAN : Fonctions système value = rd_sysbit ( sysbit_range , status ) unsigned short unsigned short unsigned short value sysbit_range far * status Description Lecture du bit système %Si identifié par son numéro. La cohérence du numéro de bit est contrôlée. FRANÇAIS Paramètres d'entrée sysbit_range : status : Adresse logique du bit à lire. Pointeur far sur le mot de status système. Retour Lorsque status vaut STATUS_OK, la valeur du bit est renseignée dans le bit de poids faible de valeur ; Les bits de rang 1..15 sont positionnés à zéro. Un numéro de bit hors bornes produit la valeur de status OUT_OF_BOUNDS. Exemples //Lecture du bit système %S4 unsigned short Value; unsigned short Status; Value = rd_sysbit (4,(unsigned short far *) & Status); ___________________________________________________________________________ 180 Fonctions système status = wr_sysbit ( sysbit_range , value ) unsigned short unsigned short unsigned short status sysbit_range value Description Paramètres d'entrée sysbit_range : value : Adresse logique du bit à écrire. Valeur à écrire ; seul le bit de poids faible est pris en compte. Retour Le compte-rendu d’écriture du bit. Celui-ci vaut STATUS_OK lorsque l’écriture est acceptée par le système. Un numéro de bit hors bornes est signalé par la valeur de status OUT_OF_BOUNDS. Exemples //Ecriture de la valeur 0 dans le bit système %S10 unsigned short Status; Status = wr_sysbit (10,0); ___________________________________________________________________________ 181 FRANÇAIS Ecriture du bit système %Si identifié par son numéro. La cohérence du numéro de bit est contrôlée. Fonctions système value = rd_sysword ( sysword_range , status ) unsigned short unsigned short unsigned short value sysword_range far * status Description FRANÇAIS Lecture du mot système %SWi identifié par son numéro. La cohérence du numéro de mot est contrôlée. Paramètres d'entrée sysword_range : status : Adresse logique du mot à lire. Pointeur far sur le mot de status système. Retour Lorsque status vaut STATUS_OK, la valeur du mot est renseignée dans la valeur de retour de la fonction. Un numéro de mot hors bornes produit la valeur de status OUT_OF_BOUNDS. Exemples //Lecture du mot système %SW48 (nombre d'événement) unsigned short Value; unsigned short Status; Value = rd_sysword (48,(unsigned short far *) & Status); ___________________________________________________________________________ 182 Fonctions système status = wr_sysword ( sysword_range , value ) unsigned short unsigned short unsigned short status sysword_range value Description Paramètres d'entrée sysword_range : value : Adresse logique du mot à écrire. Valeur à écrire. Retour STATUS_OK lorsque l’écriture se passe bien. Un numéro de mot hors bornes produit la valeur de status OUT_OF_BOUNDS. Exemples //Ecriture de la valeur 10 dans le mot système %SW48 unsigned short Status; unsigned short Value; Status = wr_sysword (48,10); ___________________________________________________________________________ 183 FRANÇAIS Ecriture du mot système %SWi identifié par son numéro. La cohérence du numéro de mot est contrôlée. Fonctions système value = rd_bit_attrib ( address ) unsigned char adrFBIT value address Description Lecture d’un bit de la mémoire forçable identifié par son adresse. Les bits de la mémoire forçable sont : %Si, %Mi, %Xi, %Ii.j et %Qi.j. FRANÇAIS Paramètres d'entrée address : Adresse du bit à lire, de type adrFBIT (cf. § 6.1-1). Retour Les attributs du bit référencé, conformément à la structure de la mémoire des bits forçables. Bit forçable TSX37 : 3 bits significatifs bit2 F V H F bit1 H bit0 V : Valeur : Historique : Forçage Bit forçable TSX57 : 8 bits significatifs bit7 Def. bit6 VR bit5 ER bit4 R V H F r.F. R. ER VR Def. : Valeur : Historique : Forçage (local) : Forçage distant : Valeur de repli : Etat de repli : Validation du repli : Défaut bit3 r.F. bit2 F bit1 H bit0 V significatif uniquement pour les bits d'entrée/sortie (Ii,j ; Qi,j) ___________________________________________________________________________ 184 Fonctions système Exemples FRANÇAIS //Lecture des attributs du bit correspondant à l'entrée 1 de l'emplacement 2 void far pascal FONCTION(adrFBIT AdresseBit) { unsigned char Valeur; : : Valeur = rd_bit_attrib(AdresseBit); : : } ___________________________________________________________________________ 185 Fonctions système value = rd_bits ( address , number , status ) unsigned long adrFBIT unsigned short unsigned short far * value address number status Description FRANÇAIS Lecture de plusieurs bits consécutifs en mémoire forçable. Paramètres d'entrée address : number : status : Adresse du premier bit à lire, de type adrFBIT (cf. § 6.1-1). Nombre de bits à lire, cette longueur ne peut excéder 32 bits. Pointeur far sur le mot de status système. Retour La valeur de la chaîne de bits référencée. La fonction n’effectue aucun traitement lorsque le nombre de bits demandés dépasse 32 . status vaut alors INVALID_LENGTH. Exemples //Lecture de 17 bits consécutifs à partir de %M1 passé en paramètre void far pascal FONCTION(adrFBIT PremierBit) { unsigned short status; unsigned long Valeur; : : Valeur = rd_bits(PremierBit,17,(unsigned short far *) & Status); : : } ___________________________________________________________________________ 186 Fonctions système status = wr_bits ( address , number , value , type ) unsigned adrFBIT unsigned unsigned unsigned short short long short status address number value type Description Paramètres d'entrée address : number : value : type : Adresse du premier bit forçable à écrire, de type adrFBIT (cf. § 6.1-1). Nombre de bits à écrire ; cette valeur ne peut excéder 32. Valeurs à écrire sur un double mot. Type d’écriture à effectuer : 00h : DATA_WRITE : mise à jour des valeurs 04h : RVALUE_WRITE : écriture de la valeur de repli 06h : RVALID_WRITE : écriture du champ de validation du repli 07h : DEFAULT_WRITE : écriture du défaut aux valeurs spécifiées 08h : déforçage global des bits (UNFORCE_ALL) : le paramètre «value» est alors non significatif Retour Le compte-rendu d’écriture : STATUS_OK lorsque tout se passe bien. La fonction n’effectue aucun traitement lorsque le nombre de bits à écrire dépasse 32. La fonction retourne alors INVALID_LENGTH. Le système retourne UNAVAILABLE_SERVICE lorsqu’il ne reconnaît pas le type d’action à effectuer. ___________________________________________________________________________ 187 FRANÇAIS Ecriture de bits consécutifs de la mémoire forçable ; la fonction permet d’écrire jusqu’à 32 bits localisés à l’adresse fournie en entrée. Fonctions système Exemples FRANÇAIS void far pascal FONCTION(adrFBIT AdresseBit) { unsigned short Status; : : Status = wr_bits (AdresseBit,17,0x194AC,DATA_WRITE); : : } ___________________________________________________________________________ 188 Fonctions système value = rd_16bits ( address ) unsigned short adrFBIT value address Lecture de la valeur (bit de donnée) de 16 bits consécutifs de la mémoire des bits forçables. L’EF qui utilise ce service doit garantir la validité de l’adresse passée en paramètre ; le système ne contrôle pas que l’adresse fait référence à l’espace des bits forçables de l’automate, ni que les 16 bits se trouvent tous dans cet espace. Paramètres d'entrée address : Adresse du premier bit à lire, de type adrFBIT (cf. § 6.1-1). Retour La valeur de la chaîne de bits référencée. Exemples void far pascal FONCTION(adrFBIT AdresseBit) { unsigned short Valeur; : : Valeur = rd_16bits (AdresseBit); : : } ___________________________________________________________________________ 189 FRANÇAIS Description Fonctions système wr_16bits ( address , value ) adrFBIT unsigned short address value Description FRANÇAIS Ecriture de la valeur de 16 bits consécutifs de la mémoire forçable. Dans la mesure où aucun contrôle n’est effectué par le système, l’EF qui utilise ce service doit garantir la validité de l’adresse des 16 bits qui est passée en paramètre. Paramètres d'entrée address : value : Adresse du premier bit forçable à écrire, de type adrFBIT (cf. § 6.1-1). Valeurs à écrire sur un mot. Retour Néant Exemples void far pascal FONCTION(adrFBIT AdresseBit) { : : wr_16bits (AdresseBit,0xAFC1); : : } ___________________________________________________________________________ 190 Fonctions système value = rd_1bit ( address ) unsigned short adrFBIT value address Description Paramètres d'entrée address : Adresse du bit à lire, de type adrFBIT (cf. § 6.1-1). Retour La valeur du bit référencé (0 ou 1). Exemples void far pascal FONCTION(adrFBIT AdresseBit) { unsigned short Valeur; : : Valeur = rd_1bit (AdresseBit); : : } ___________________________________________________________________________ 191 FRANÇAIS Lecture de la valeur (bit de donnée) d'un bit forçable. L’EF qui utilise ce service doit garantir la validité de l’adresse passée en paramètre ; le système ne vérifiant pas que celle-ci est comprise dans l’espace des bits forçables de l’automate. Fonctions système wr_1bit ( address , value ) adrFBIT unsigned short address value Description FRANÇAIS Ecriture de la valeur d'un bit forçable. Dans la mesure où aucun contrôle n’est effectué par le système, l’EF qui utilise ce service doit garantir la validité de l’adresse du bit qui est passée en paramètre. Paramètres d'entrée address : value : Adresse du bit forçable à écrire, de type adrFBIT (cf. § 6.1-1). Valeurs à écrire sur un mot : celle-ci vaut 0 ou 1. Retour Néant Exemples void far pascal FONCTION(adrFBIT AdresseBit) { : : wr_1bit (AdresseBit,0); : : } ___________________________________________________________________________ 192 Fonctions système result = phy_ptr_init ( sel_off ) void far* PTR_LOG result sel_off Description La fonction détermine une adresse physique à partir d’une référence logique au format sélecteur : offset . address : Adresse logique de type PTR_LOG à convertir en pointeur physique 32 bits (cf. § 6.1-1). Retour Le pointeur far correspondant à l’adresse logique fournie en entrée. En cas d’échec (adresse logique non valide pour cette configuration), la fonction retourne INVALID_ADDRESS. Exemples //Conversion d'une adresse logique de type adrTABLE en une adresse physique void far* CalculAdrPhy(adrTABLE far* pwTable) { PTR_LOG SLog; SLog.sel = pwTable->selecteur; SLog.off = (unsigned short near *)pwTable->offset; return(phy_ptr_init(SLog)); } //Exemple d'EF d'addition de 2 mots void far pascal ADDITION(short A, short B, adrSCAL Resultat) { PTR_LOG SLog; void far* pSomme; SLog.sel = Resultat.selecteur; SLog.off = (unsigned short near *)Resultat.offset; pSomme = phy_ptr_init(SLog); *pSomme = A+B; } ___________________________________________________________________________ 193 FRANÇAIS Paramètres d'entrée Fonctions système status = date_and_time ( date_ptr ) unsigned short DATE_TIME status far * date_ptr Description FRANÇAIS Lecture de la date et de l’heure courante de l’automate. L’information est codée en BCD sur 9 octets utiles (soit 18 digits) , suivant le format cidessous. Les années bissextiles sont gérées. J. / sem. Année Mois Jour Heure [ 01..07 ] [ 0000...9999 ] [ 01...12 ] [ 01...31 ] x x x octet 8 x x octet 7&6 x x Mot 3 Légende : x x ............ x Minute [ 00...23 ] x x x ............ octet 2 Mot 2 Seconde [ 00...59 ] x x x octet 1 Mot 1 x est un digit = [ 0..9 ] J./sem. est le jour de la semaine = 01 02 03 04 05 06 07 reservé [ 00...59 ] 00 x x octet 0 Mot 0 : Lundi : Mardi : Mercredi : Jeudi : Vendredi : Samedi : Dimanche Paramètres d'entrée date_ptr : Un pointeur far sur la zone de recopie de la date et de l’heure courante (9 octets). Le type DATA_TIME est décrit au § 6.1-1 Retour La fonction retourne CLOCK_UNAVAILABLE si elle n’a pas pu mettre à jour la zone de résultat (cas de contension sur les accès à l’horodateur). Si l’opération s’est bien passée (les champs de date et d’heure sont correctement renseignés) , le status vaut STATUS_OK. L’automate répond CLOCK_NOT_SUPPORTED s’il ne dispose pas d’horodateur. ___________________________________________________________________________ 194 Fonctions système Exemples FRANÇAIS DATE_TIME Buffer; Status = date_and_time(&Buffer); ___________________________________________________________________________ 195 Fonctions système value = cnt_100ms ( void ) unsigned long value Description Le système lit la valeur d’un compteur interne qui a pour base de temps 100ms. Paramètres d'entrée FRANÇAIS Néant Retour La valeur du compteur , qui possède les caractéristiques suivantes : • valeur non signée , de 0 à 4 294 967 295 • remis à zéro sur reprise à froid et sur mise à un du bit système %S0 • non incrémenté pendant les coupures secteur ___________________________________________________________________________ 196 Fonctions système value = cnt_10ms ( void ) unsigned long value Description Compteur système qui a pour base de temps 10ms. Paramètres d'entrée Retour La valeur du compteur , qui possède les caractéristiques suivantes : • valeur non signée , de 0 à 4 294 967 295 • remis à zéro sur reprise à froid uniquement • non incrémenté pendant les coupures secteur ___________________________________________________________________________ 197 FRANÇAIS Néant Fonctions système info = proc_type ( void ) PROC_IDENT info Description Identification du type de processeur qui exécute l'application. Paramètres d'entrée FRANÇAIS Néant Retour Une structure de type PROC_IDENT (cf. § 6.1-1) contenant plusieurs informations d’identification : • la gamme du processeur sur un octet : 04h : TSX37 05h : TSX57 • la version logicielle SMART présente dans le processeur, sur un octet : - en quartet de poids fort , le numéro de version - en quartet de poids faible , le numéro de révision (release) • le code de référence catalogue du modèle d’UC sur un mot : 01h 02h 03h 01h 02h 03h 04h 05h 06h 07h 08h 09h 10h 11h : : : : : : : : : : : : : : REFCAT_TSX37_10 REFCAT_TSX37_21 REFCAT_TSX37_22 REFCAT_TSX57_10 REFCAT_TSX57_20 REFCAT_PMX57_20 REFCAT_TSX57_30 REFCAT_TSX57_10_V3 REFCAT_TSX57_20_V3 REFCAT_TSX57_25_V3 REFCAT_TSX57_30_V3 REFCAT_TSX57_35_V3 REFCAT_TSX57_40_V3 REFCAT_TSX57_45_V3 Exemples PROC_IDENT Info; Info = proc_type( ); ___________________________________________________________________________ 198 Fonctions système info = proc_indic ( void ) PROC_INDIC info Description Information sur la configuration de la mémoire application dans l’automate. Paramètres d'entrée Retour Une structure de type PROC_INDIC (cf. § 6.1-1) contenant des informations sur : • l’état de l’automate : - en Run, réservé, en arrêt Breakpoint, en Halt, en Run partiel. • la validité de l’application • la présence éventuelle d’une cartouche mémoire • le type de mémoire application : non modifiable / modifiable Exemples PROC_INDIC Info; Info = proc_indic( ); ___________________________________________________________________________ 199 FRANÇAIS Néant Fonctions système Res = ADD ( a, b ) FLOAT FLOAT FLOAT Res a b Description Res = a + b Somme de deux nombres réels (au format IEEE simple précision) Paramètres d'entrée FRANÇAIS FLOAT a FLOAT b Retour FLOAT Res Exemples // Exemple d'EF d'addition de 2 nombres réels unsigned long far pascal ADDF ( unsigned long F1, // valeur d'un %MF unsigned long F2 // valeur d'un %MF ) { FLOAT f1, f2, f; f 1= GET_FLOATPL7 (F1); // conversion vers un flottant f 2= GET_FLOATPL7 (F2); // conversion vers un flottant f = ADD (f1, f2); return (FLOAT_TOPL7(f)); // conversion inverse } Cas particuliers et exceptions Arguments a et b résultat res valeur du status signification du status a ou b = +-1.#NAN +/- 1.#NAN 1 : flag_InvalideOp opération invalide un des opérandes est dénormalisé (0#DN) résultat obtenu en assimilant l’opérande à +/- 0 2 : flag_Denorm opérande dénormalisé (- ∞) + (+ ∞) - 1. #NAN 1 : flag_InvalideOp opération invalide (+ ∞) + (- ∞) - 1. #NAN 1 : flag_InvalideOp opération invalide ___________________________________________________________________________ 200 Fonctions système Res = SUB ( a, b ) FLOAT FLOAT FLOAT Res a b Description Res = a - b Soustraction de deux nombres réels (au format IEEE simple précision) Paramètres d'entrée FRANÇAIS FLOAT a FLOAT b Retour FLOAT Res Exemples // Exemple d'EF de soustraction de 2 nombres réels unsigned long far pascal SUBF ( unsigned long F1, // valeur d'un %MF unsigned long F2 // valeur d'un %MF ) { FLOAT f1, f2, f; f 1= GET_FLOATPL7 (F1); // conversion vers un flottant f 2= GET_FLOATPL7 (F2); // conversion vers un flottant f = SUB (f1, f2); return (FLOAT_TOPL7(f)); // conversion inverse } Cas particuliers et exceptions Arguments a et b résultat res valeur du status signification du status a ou b = +-1.#NAN +/- 1.#NAN 1 : flag_InvalideOp opération invalide un des opérandes est dénormalisé (0#DN) résultat obtenu en assimilant l’opérande à +/- 0 2 : flag_Denorm opérande dénormalisé (+ ∞) - (+ ∞) - 1. #NAN 1 : flag_InvalideOp opération invalide (- ∞) - (- ∞) - 1. #NAN 1 : flag_InvalideOp opération invalide ___________________________________________________________________________ 201 Fonctions système Res = MUL ( a, b ) FLOAT FLOAT FLOAT Res a b Description Res = a x b Produit de deux nombres réels (au format IEEE simple précision) Paramètres d'entrée FRANÇAIS FLOAT a FLOAT b Retour FLOAT Res Exemples // Exemple d'EF de produit de 2 nombres réels unsigned long far pascal MULF ( unsigned long F1, // valeur d'un %MF unsigned long F2 // valeur d'un %MF ) { FLOAT f1, f2, f; f 1= GET_FLOATPL7 (F1); // conversion vers un flottant f 2= GET_FLOATPL7 (F2); // conversion vers un flottant f = MUL (f1, f2); return (FLOAT_TOPL7(f)); // conversion inverse } Cas particuliers et exceptions Arguments a et b résultat res valeur du status signification du status a ou b = +-1.#NAN +/- 1.#NAN 1 : flag_InvalideOp opération invalide un des opérandes est dénormalisé (0#DN) résultat obtenu en assimilant l’opérande à +/- 0 2 : flag_Denorm opérande dénormalisé 0 *∞ +/- 1. #NAN 1 : flag_InvalideOp opération invalide ___________________________________________________________________________ 202 Fonctions système Res = DIV ( a, b ) FLOAT FLOAT FLOAT Res a b Description Res = a / b Division de deux nombres réels (au format IEEE simple précision) Paramètres d'entrée FRANÇAIS FLOAT a FLOAT b Retour FLOAT Res Exemples // Exemple d'EF de division de 2 nombres réels unsigned long far pascal DIVF ( unsigned long F1, // valeur d'un %MF unsigned long F2 // valeur d'un %MF ) { FLOAT f1, f2, f; f 1= GET_FLOATPL7 (F1); // conversion vers un flottant f 2= GET_FLOATPL7 (F2); // conversion vers un flottant f = DIV (f1, f2); return (FLOAT_TOPL7(f)); // conversion inverse } Cas particuliers et exceptions Arguments a et b résultat res valeur du status signification du status 0 / 0 et ∞ / ∞ 1. #NAN 1 : flag_InvalideOp opération invalide a ou b = +-1.#NAN +/- 1.#NAN 1 : flag_InvalideOp opération invalide un des opérandes est dénormalisé (0#DN) résultat obtenu en assimilant l’opérande à +/- 0 2 : flag_Denorm opérande dénormalisé a quelconque b=0 +/-∞ 4 : flag_ZeroDivide division par zéro ___________________________________________________________________________ 203 Fonctions système Res = EQU ( a, b ) unsigned short FLOAT FLOAT Res a b Description si a = b alors Res = 1 sinon Res = 0 Teste l'égalité de deux nombres réels (au format IEEE simple précision) FRANÇAIS Paramètres d'entrée FLOAT a FLOAT b Retour unsigned short Res Exemples // Exemple d'EF de test d'égalité de 2 nombres réels short far pascal EQUF ( unsigned long F1, // valeur d'un %MF unsigned long F2 // valeur d'un %MF ) { unsigned short nEqual; FLOAT f1, f2; f 1= GET_FLOATPL7 (F1); // conversion vers un flottant f 2= GET_FLOATPL7 (F2); // conversion vers un flottant nEqual = EQU (f1, f2); return (nEqual); } Cas particuliers et exceptions Arguments a et b résultat res valeur du status signification du status a ou b = +-1.#NAN 1.#NAN 1 : flag_InvalideOp opération invalide un des opérandes est dénormalisé (0#DN) résultat obtenu en assimilant l’opérande à +/- 0 2 : flag_Denorm opérande dénormalisé a ou b = #NAN la comparaison se fait bien 0 : Status_Ok Ok ___________________________________________________________________________ 204 Fonctions système Res = SUP ( a, b ) unsigned short FLOAT FLOAT Res a b Description si a > b alors Res = 1 sinon Res = 0 Teste la supériorité d'un nombre réel par rapport à un autre nombre réel (au format IEEE simple précision) Paramètres d'entrée FRANÇAIS FLOAT a FLOAT b Retour unsigned short Res Exemples // Exemple d'EF de test de supériorité d'un nombre réel par rapport à un autre nombre réel short far pascal SUPF ( unsigned long F1, // valeur d'un %MF unsigned long F2 // valeur d'un %MF ) { unsigned short nSup; FLOAT f1, f2; f 1= GET_FLOATPL7 (F1); // conversion vers un flottant f 2= GET_FLOATPL7 (F2); // conversion vers un flottant nSup = SUP (f1, f2); return (nSup); } Cas particuliers et exceptions Arguments a et b résultat res valeur du status signification du status a ou b = +-1.#NAN résultat toujours FAUX 1 : flag_InvalideOp opération invalide un des opérandes est dénormalisé (0#DN) résultat obtenu en assimilant l’opérande à +/- 0 2 : flag_Denorm opérande dénormalisé ___________________________________________________________________________ 205 Fonctions système Res = INF ( a, b ) unsigned short FLOAT FLOAT Res a b Description si a < b alors Res = 1 sinon Res = 0 Teste l'infériorité d'un nombre réel par rapport à un autre nombre réel (au format IEEE simple précision) FRANÇAIS Paramètres d'entrée FLOAT a FLOAT b Retour unsigned short Res Exemples // Exemple d'EF de test de l'infériorité d'un nombre réel par rapport à un autre nombre réel short far pascal INFF ( unsigned long F1, // valeur d'un %MF unsigned long F2 // valeur d'un %MF ) { unsigned short nInf; FLOAT f1, f2; f 1= GET_FLOATPL7 (F1); // conversion vers un flottant f 2= GET_FLOATPL7 (F2); // conversion vers un flottant nInf = INF (f1, f2); return (nInf); } Cas particuliers et exceptions Arguments a et b résultat res valeur du status signification du status a ou b = +-1.#NAN résultat toujours FAUX 1 : flag_InvalideOp opération invalide un des opérandes est dénormalisé (0#DN) résultat obtenu en assimilant l’opérande à +/- 0 2 : flag_Denorm opérande dénormalisé ___________________________________________________________________________ 206 Fonctions système Res = ABS ( a ) FLOAT FLOAT Res a Description Res = | a | Détermine la valeur absolue d'un nombre réel (au format IEEE simple précision) Paramètres d'entrée FLOAT a FRANÇAIS Retour FLOAT Res Exemples // Exemple d'EF de calcul de la valeur absolue d'un nombre réel unsigned long far pascal ABSF ( unsigned long F // valeur d'un %MF ) { FLOAT f; f= GET_FLOATPL7 (F); // conversion vers un flottant f = ABS (f); return (FLOAT_TOPL7(f)); // conversion inverse } Cas particuliers et exceptions Argument a résultat res valeur du status signification du status a = +-1.#NAN 1.#NAN de même signe que a 1 : flag_InvalideOp opération invalide un des opérandes est dénormalisé (0#DN) résultat obtenu en assimilant l’opérande à +/- 0 2 : flag_Denorm opérande dénormalisé ___________________________________________________________________________ 207 Fonctions système Res = CHS ( a ) FLOAT FLOAT Res a Description Res = - a Change le signe d'un nombre réel (au format IEEE simple précision) Paramètres d'entrée FLOAT a FRANÇAIS Retour FLOAT Res Exemples // Exemple d'EF de changement de signe d'un nombre réel unsigned long far pascal CHSF ( unsigned long F // valeur d'un %MF ) { FLOAT f; f= GET_FLOATPL7 (F); // conversion vers un flottant f = CHS (f); return (FLOAT_TOPL7(f)); // conversion inverse } Cas particuliers et exceptions Argument a résultat res valeur du status signification du status a = +-1.#NAN 1.#NAN avec signe opposé de a 1 : flag_InvalideOp opération invalide un des opérandes est dénormalisé (0#DN) résultat obtenu en assimilant l’opérande à +/- 0 2 : flag_Denorm opérande dénormalisé ___________________________________________________________________________ 208 Fonctions système Res = SQRT ( a ) FLOAT FLOAT Res a Description Res = √ a Calcule la racine carrée d'un nombre réel positif (au format IEEE simple précision) Paramètres d'entrée FLOAT a FRANÇAIS Retour FLOAT Res Exemples // Exemple d'EF de calcul de la racine carrée d'un nombre réel unsigned long far pascal SQRTF ( unsigned long F // valeur d'un %MF ) { FLOAT f; f= GET_FLOATPL7 (F); // conversion vers un flottant f = SQRT (f); return (FLOAT_TOPL7(f)); // conversion inverse } Cas particuliers et exceptions Argument a résultat res valeur du status signification du status a<0 1.#NAN 1 : flag_InvalideOp opération invalide a = +-1.#NAN +- 1.#NAN 1 : flag_InvalideOp opération invalide un des opérandes est dénormalisé (0#DN) résultat obtenu en assimilant l’opérande à +/- 0 2 : flag_Denorm opérande dénormalisé -0 -0 0 : Status_Ok Ok ___________________________________________________________________________ 209 Fonctions système Res = FTOL ( a ) long FLOAT Res a Description Convertit un nombre réel en un entier long (au format IEEE simple précision) Paramètres d'entrée FLOAT a FRANÇAIS Retour long Res Exemples // Exemple d'EF de conversion d'un nombre réel en un entier long long far pascal FTOLF ( unsigned long F // valeur d'un %MF ) { long ul; FLOAT f; f= GET_FLOATPL7 (F); // conversion vers un flottant ul = FTOL (f); return (ul); } Cas particuliers et exceptions Argument a résultat res valeur du status signification du status un des opérandes est dénormalisé (0#DN) résultat obtenu en assimilant l’opérande à +/- 0 2 : flag_Denorm opérande dénormalisé | a | trop grand pour la conversion 8000000H 1 : flag_InvalideOp opération invalide a = +-1.#NAN 1.#NAN 1 : flag_InvalideOp opération invalide + ∞ ou - ∞ 8000000H 1 : flag_InvalideOp opération invalide ___________________________________________________________________________ 210 Fonctions système Res = LTOF ( a ) FLOAT long Res a Description Convertit un double mot en un nombre réel (au format IEEE simple précision) Paramètres d'entrée Retour FLOAT Res Exemples // Exemple d'EF de conversion d'un double mot en un nombre réel unsigned long far pascal LTOFF ( long UL // valeur d'un %MD ) { FLOAT f; f = LTOF (UL); return (FLOAT_TOPL7(f)); // conversion inverse } Cas particuliers et exceptions Aucun cas particulier ou exception. ___________________________________________________________________________ 211 FRANÇAIS long a Fonctions système Res = EXP ( a ) FLOAT FLOAT Res a Description Res = e a Calcule la valeur exponentielle d'un nombre réel (au format IEEE simple précision) Paramètres d'entrée FLOAT a FRANÇAIS Retour FLOAT Res Exemples // Exemple d'EF de calcul de la valeur exponentielle d'un nombre réel unsigned long far pascal EXPF ( unsigned long F // valeur d'un %MF ) { FLOAT f; f= GET_FLOATPL7 (F); // conversion vers un flottant f = EXP (f); return (FLOAT_TOPL7(f)); // conversion inverse } Cas particuliers et exceptions Argument a résultat res valeur du status signification du status 0. #DN 1.0 2 : flag_Denorm opérande non standard - 0. #DN 1.0 2 : flag_Denorm opérande non standard 1. #INF 1. #INF 0 : Status_Ok Ok - 1. #INF 0.0 0 : Status_Ok Ok 1. #NAN 1. #NAN 0 : Status_Ok Ok - 1. #NAN - 1. #NAN 0 : Status_Ok Ok > 88.72283 1. #INF 8 : flag_Overflow overflow < 87.33654 0.0 8 : flag_Underflow underflow ___________________________________________________________________________ 212 Fonctions système Res = LN ( a ) FLOAT FLOAT Res a Description Calcule le logarithme népérien d'un nombre réel positif (au format IEEE simple précision) Paramètres d'entrée FLOAT a Retour FRANÇAIS FLOAT Res Exemples // Exemple d'EF de calcul du logarithme d'un nombre réel unsigned long far pascal LNF ( unsigned long F // valeur d'un %MF ) { FLOAT f; f= GET_FLOATPL7 (F); // conversion vers un flottant f = LN (f); return (FLOAT_TOPL7(f)); // conversion inverse } Cas particuliers et exceptions Argument a résultat res valeur du status signification du status 0. #DN 1. #INF 2 : flag_Denorm opérande non standard - 0. #DN - 1. #NAN 1 : flag_InvalideOp opération invalide (a≤ 0.0) 1. #INF 1. #INF 0 : Status_Ok Ok - 1. #INF - 1. #NAN 1 : flag_InvalideOp opération invalide (a≤ 0.0) 1. #NAN 1. #NAN 0 : Status_Ok Ok - 1. #NAN - 1. #NAN 1 : flag_InvalideOp opération invalide (a≤ 0.0) < 0.0 - 1. #NAN 1 : flag_InvalideOp opération invalide (a≤ 0.0) 0.0 1. #INF 0 : Status_Ok Ok - 0.0 - 1. #NAN 1 : flag_InvalideOp opération invalide (a≤ 0.0) ___________________________________________________________________________ 213 Fonctions système Res = SIN ( a ) FLOAT FLOAT Res a Description Res = sin (a) Calcule le sinus d'un nombre réel (au format IEEE simple précision) Paramètres d'entrée FLOAT a FRANÇAIS Retour FLOAT Res Exemples // Exemple d'EF de calcul du sinus d'un nombre réel unsigned long far pascal SINF ( unsigned long F // valeur d'un %MF ) { FLOAT f; f= GET_FLOATPL7 (F); // conversion vers un flottant f = SIN (f); return (FLOAT_TOPL7(f)); // conversion inverse } Cas particuliers et exceptions Argument a résultat res valeur du status signification du status 0. #DN 0.0 2 : flag_Denorm opérande non standard - 0. #DN 0.0 2 : flag_Denorm opérande non standard 1. #INF 1. #INF 1 : flag_InvalideOp opération invalide (ou imprécision) - 1. #INF - 1. #NAN 1 : flag_InvalideOp opération invalide (ou imprécision) 1. #NAN 1. #NAN 0 : Status_Ok Ok - 1. #NAN - 1. #NAN 0 : Status_Ok Ok < 4096 π - 1. #NAN 1 : flag_InvalideOp opération invalide < - 4096 π - 1. #NAN 1 : flag_InvalideOp opération invalide ___________________________________________________________________________ 214 Fonctions système Res = COS ( a ) FLOAT FLOAT Res a Description Res = cos (a) Calcule le cosinus d'un nombre réel (au format IEEE simple précision) Paramètres d'entrée FLOAT a FLOAT Res Exemples // Exemple d'EF de calcul du cosinus d'un nombre réel unsigned long far pascal COSF ( unsigned long F // valeur d'un %MF ) { FLOAT f; f= GET_FLOATPL7 (F); // conversion vers un flottant f = COS (f); return (FLOAT_TOPL7(f)); // conversion inverse } Cas particuliers et exceptions Argument a résultat res valeur du status signification du status 0. #DN 1.0 2 : flag_Denorm opérande non standard - 0. #DN 1.0 2 : flag_Denorm opérande non standard 1. #INF 1. #INF 1 : flag_InvalideOp opération invalide (ou imprécision) - 1. #INF - 1. #NAN 1 : flag_InvalideOp opération invalide (ou imprécision) 1. #NAN 1. #NAN 0 : Status_Ok Ok - 1. #NAN - 1. #NAN 0 : Status_Ok Ok > 4096 π - 1. #NAN 1 : flag_InvalideOp opération invalide > - 4096 π - 1. #NAN 1 : flag_InvalideOp opération invalide ___________________________________________________________________________ 215 FRANÇAIS Retour Fonctions système Res = TAN ( a ) FLOAT FLOAT Res a Description Res = tan (a) Calcule la tangente d'un nombre réel (au format IEEE simple précision) Paramètres d'entrée FLOAT a Retour FRANÇAIS FLOAT Res Exemples // Exemple d'EF de calcul de la tangente d'un nombre réel unsigned long far pascal TANF ( unsigned long F // valeur d'un %MF ) { FLOAT f; f= GET_FLOATPL7 (F); // conversion vers un flottant f = TAN (f); return (FLOAT_TOPL7(f)); // conversion inverse } Cas particuliers et exceptions Argument a résultat res valeur du status signification du status 0. #DN 0.0 2 : flag_Denorm opérande non standard - 0. #DN 0.0 2 : flag_Denorm opérande non standard 1. #INF 1. #NAN 1 : flag_InvalideOp opération invalide (ou imprécision) - 1. #INF - 1. #NAN 1 : flag_InvalideOp opération invalide (ou imprécision) 1. #NAN 1. #NAN 0 : Status_Ok Ok - 1. #NAN - 1. #NAN 0 : Status_Ok Ok > 4096 π - 1. #NAN 1 : flag_InvalideOp opération invalide < - 4096 π - 1. #NAN 1 : flag_InvalideOp opération invalide π / 2 + kπ , k ≥ 0 1. #INF 8 : flag_Overflow overflow π / 2 + kπ , k < 0 - 1. #INF 8 : flag_Overflow overflow ___________________________________________________________________________ 216 Fonctions système Res = ASIN ( a ) FLOAT FLOAT Res a Description Res = asin (a) Calcule l'arcsinus d'un nombre réel (au format IEEE simple précision) Paramètres d'entrée FLOAT a Retour Exemples // Exemple d'EF de calcul de l'arcsinus d'un nombre réel unsigned long far pascal ASINF ( unsigned long F // valeur d'un %MF ) { FLOAT f; f= GET_FLOATPL7 (F); // conversion vers un flottant f = ASIN (f); return (FLOAT_TOPL7(f)); // conversion inverse } Cas particuliers et exceptions Argument a résultat res valeur du status signification du status 0. #DN 0.0 2 : flag_Denorm opérande non standard - 0. #DN 0.0 2 : flag_Denorm opérande non standard 1. #INF 1. #NAN 1 : flag_InvalideOp opération invalide - 1. #INF - 1. #NAN 1 : flag_InvalideOp opération invalide 1. #NAN 1. #NAN 0 : Status_Ok Ok - 1. #NAN - 1. #NAN 0 : Status_Ok Ok > 1.0 - 1. #NAN 1 : flag_InvalideOp opération invalide < 1.0 - 1. #NAN 1 : flag_InvalideOp opération invalide ___________________________________________________________________________ 217 FRANÇAIS FLOAT Res Fonctions système Res = ACOS ( a ) FLOAT FLOAT Res a Description Res = acos (a) Calcule l'arccosinus d'un nombre réel (au format IEEE simple précision) Paramètres d'entrée FLOAT a FRANÇAIS Retour FLOAT Res Exemples // Exemple d'EF de calcul de l'arccosinus d'un nombre réel unsigned long far pascal ACOSF ( unsigned long F // valeur d'un %MF ) { FLOAT f; f= GET_FLOATPL7 (F); // conversion vers un flottant f = ACOS (f); return (FLOAT_TOPL7(f)); // conversion inverse } Cas particuliers et exceptions Argument a résultat res valeur du status signification du status 0. #DN 1.570796 2 : flag_Denorm opérande non standard - 0. #DN 1.570796 2 : flag_Denorm opérande non standard 1. #INF 1. #NAN 1 : flag_InvalideOp opération invalide - 1. #INF - 1. #NAN 1 : flag_InvalideOp opération invalide 1. #NAN 1. #NAN 0 : Status_Ok Ok - 1. #NAN - 1. #NAN 0 : Status_Ok Ok > 1.0 - 1. #NAN 1 : flag_InvalideOp opération invalide < 1.0 - 1. #NAN 1 : flag_InvalideOp opération invalide ___________________________________________________________________________ 218 Fonctions système Res = ATAN ( a ) FLOAT FLOAT Res a Description Res = atan (a) Calcule l'arctangente d'un nombre réel (au format IEEE simple précision) Paramètres d'entrée Retour FLOAT Res Exemples // Exemple d'EF de calcul de l'arctangente d'un nombre réel unsigned long far pascal ATANF ( unsigned long F // valeur d'un %MF ) { FLOAT f; f= GET_FLOATPL7 (F); // conversion vers un flottant f = ATAN (f); return (FLOAT_TOPL7(f)); // conversion inverse } Cas particuliers et exceptions Argument a résultat res valeur du status signification du status 0. #DN 0.0 2 : flag_Denorm opérande non standard - 0. #DN 0.0 2 : flag_Denorm opérande non standard 1. #INF 1.570796 0 : Status_Ok Ok - 1. #INF - 1.570796 0 : Status_Ok Ok 1. #NAN 1. #NAN 0 : Status_Ok Ok - 1. #NAN - 1. #NAN 0 : Status_Ok Ok ___________________________________________________________________________ 219 FRANÇAIS FLOAT a FRANÇAIS Fonctions système ___________________________________________________________________________ 220 Fonctions utilitaires Chapitre 8 8 Fonctions utilitaires Il est possible de faire appel, dans le corps d'une EF, à des fonctions utilitaires. En voici la liste : Fonctions utilitaires de conversion • GET_FLOATPL7 : conversion d'un réel Pl7 vers un FLOAT • FLOAT_TOPL7: conversion d'un FLOAT vers un réel Pl7 • FLOAT_TO_DBG: conversion d'un FLOAT vers un FLOAT_DBG pour visualisation en debug • FLOAT_SETVALUE : affecte une valeur flottante dans une adresse Pl7 • WORD_SETVALUE : affecte une valeur de type mot dans une adresse Pl7 • DWORD_SETVALUE : affecte une valeur de type double mot dans une adresse Pl7 • GET_ADDR : donne l' adresse réelle d'une variable (sous forme de pointeur) à partir d'une adresse Pl7 Remarque : Comme il est possible, en utilisant ces fonctions, d'aller écrire dans la mémoire de l'automate, des précautions d'accès sont à prendre en compte par l'utilisateur. Exemple : Lorsqu'un tableau est passé en paramètre d'une EF, attention à ne pas accéder à des mots en dehors de ce tableau. La vérification peut s'effectuer en testant sa longueur. Les pages suivantes décrivent ces fonctions, leurs paramètres, les types utilisés en s'appuyant sur des exemples. ___________________________________________________________________________ 221 FRANÇAIS Fonctions utilitaires d'accès aux variables automate Fonctions utilitaires value = GET_FLOATPL7 ( fvalPl7 ) unsigned long unsigned long value fvalPl7 Description Convertit un flottant venant de Pl7 en un nombre de type FLOAT permettant d'utiliser les fonctions flottantes. Paramètres d'entrée FRANÇAIS unsigned long fvalPl7 Retour FLOAT value Exemples // Exemple d'EF de conversion // Retour déclaré en real unsigned long far pascal monef ( unsigned long IN1, // déclaré en REAL dans SDKC ) { FLOAT fval; fval = GET_FLOATPL7 (IN1); // conversion vers un FLOAT } ___________________________________________________________________________ 222 Fonctions utilitaires fvalPl7 = FLOAT_TOPL7 ( f ) unsigned long FLOAT fvalPl7 f Description C'est la fonction réciproque de GET_FLOATPL7, elle convertit un nombre de type FLOAT en flottant du langage Pl7. Cette fonction doit être appelée avant de retourner un flottant dans le cas d'une EF fonction. FLOAT f Retour unsigned long fvalPl7 Exemples // Exemple d'EF fonction qui retourne la valeur 2.1 // Retour déclaré en REAL dans SDKC unsigned long far pascal monef ( ) { FLOAT fval; fval = FVALUE (2.1); return (FLOAT_TOPL7 (fval)); } ___________________________________________________________________________ 223 FRANÇAIS Paramètres d'entrée Fonctions utilitaires value = FLOAT_TO_DBG( f ) FLOAT_DBG FLOAT value f Description Cette fonction a un intérêt uniquement pour débugger l'EF. Elle permet de visualiser une variable FLOAT. Elle convertit une variable FLOAT en une variable FLOAT_DBG car seules les variables FLOAT_DBG sont visualisables au format flottant par debugEF. FRANÇAIS Paramètres d'entrée FLOAT Retour FLOAT_DBG Exemples Extrait du code de l'EF FLOAT_DBG fv; FLOAT fval; fval = fvalue (1.1); fv = FLOAT_TO_DBG (fval); // fv est visualisable dans l'outil debugEF de Pl7 Visualisation de fv dans debugEF de Pl7 fv = (union) fl = +1.1000000E+000 ul = 0x3F8CCCCD ___________________________________________________________________________ 224 Fonctions utilitaires FLOAT_SETVALUE ( selecteur, offset, valeur ) unsigned short unsigned short unsigned short selecteur offset valeur Description Paramètres d'entrée unsigned short selecteur : adresse de la variable Pl7 (sélecteur) unsigned short offset : adresse de la variable Pl7 (offset) FLOAT valeur : valeur que l'on désire mettre dans la variable Pl7 Retour Aucun Exemples // void far pascal AFFECT ( adrSCAL OUT1, // adresse d'un %MF adrSCAL OUT2, // adresse d'un %MF ) { // On met dans OUT1 la valeur dircte 1.0E2 et dans OUT2 la valeur 2.1 FLOAT_SETVALUE (OUT1.selecteur, OUT1.offset, FVALUE (1.0E2)); FLOAT_SETVALUE (OUT2.selecteur, OUT2.offset, FVALUE (2.1)); } ___________________________________________________________________________ 225 FRANÇAIS Affecte directement une valeur de type FLOAT à une adresse Pl7 (sélecteur offset). Cette fonction simplifie l'utilisation de la fonction phy_ptr_init (cf. Chap. 7). Les valeurs sélecteur offset proviennent directement d'une variable Pl7 de type adrSCAL. Fonctions utilitaires WORD_SETVALUE ( selecteur, offset, valeur ) unsigned short unsigned short unsigned short selecteur offset valeur Description FRANÇAIS Affecte directement une valeur de type mot à une adresse Pl7 (sélecteur offset). Cette fonction simplifie l'utilisation de la fonction phy_ptr_init (cf. Chap. 7). Les valeurs sélecteur offset proviennent directement d'une variable Pl7 de type adrSCAL. Paramètres d'entrée unsigned short selecteur : adresse de la variable Pl7 (sélecteur) unsigned short offset : adresse de la variable Pl7 (offset) short valeur : valeur que l'on désire mettre dans la variable Pl7 Retour Aucun Exemples // void far pascal AFFECT ( short value, // valeur adrSCAL OUTW // adresse d'un %MW ) { // On met dans OUTW la valeur directe value WORD_SETVALUE (OUTW.selecteur, OUTW.offset, value); } ___________________________________________________________________________ 226 Fonctions utilitaires DWORD_SETVALUE ( selecteur, offset, valeur ) unsigned short unsigned short unsigned short selecteur offset valeur Description Paramètres d'entrée unsigned long selecteur : unsigned long offset : long valeur : adresse de la variable Pl7 (sélecteur) adresse de la variable Pl7 (offset) valeur que l'on désire mettre dans la variable Pl7 Retour Aucun Exemples // void far pascal AFFECT ( adrSCAL OUTD // adresse d'un %MD ) { // On met dans OUTW la valeur dircte 122003 DWORD_SETVALUE (OUTD.selecteur, OUTD.offset, 122003); } ___________________________________________________________________________ 227 FRANÇAIS Affecte directement une valeur de type mot double à une adresse Pl7 (sélecteur offset). Cette fonction simplifie l'utilisation de la fonction phy_ptr_init (cf. Chap. 7). Les valeurs sélecteur offset proviennent directement d'une variable Pl7 de type adrSCAL. Fonctions utilitaires ptr = GET_ADDR ( selecteur, offset ) void far* unsigned short unsigned short ptr selecteur offset Description Renvoie l' adresse réelle d'une variable Pl7 (sous forme d'un pointeur C) à partir d'une adresse PL7. Les valeurs sélecteur offset proviennent directement d'une variable Pl7 de type adrSCAL. FRANÇAIS Paramètres d'entrée unsigned short selecteur : adresse de la variable Pl7 (sélecteur) unsigned short offset : adresse de la variable Pl7 (offset) Retour void far* ptr : pointeur Exemples // Exemple d'EF qui affecte 123 dans un tableau mots %MW et 122223 dans un tableau // de mots doubles %MD void far pascal GESTTAB ( adrTABLE TAB1, // adresse d'un tableau de %MW adrTABLE TAB2 // adresse d'un tableau de %MD ) { // Déclarations short far* adr1; long far* adr2; int i, j; adr1 = GET_ADDR (TAB1.selecteur, TAB1.offset); adr2 = GET_ADDR (TAB2.selecteur, TAB2.offset); for (i = 0; i < TAB1.taille; i++) * adr1++ = 123; // on affecte 123 à l'adresse pointée par adr1 et on incrémente l'adresse for (j = 0; j < TAB2.taille; j++) * adr2++ = 122223; // on affecte 122223 à l'adresse pointée par adr2 et on incrémente l'adresse } ___________________________________________________________________________ 228 Annexes9 Chapitre 9 Annexes 9.1 Exemple 9.1-1 Définition de l'EF L'exemple suivant donne la marche à suivre pour créer une EF permettant d'extraire la valeur maximale d'un tableau de mots. FRANÇAIS Ecran de définition de la famille "Programme" (cf. § 3.1-1) Ecran de définition de la classe "Class1" (cf. § 3.1-2) ___________________________________________________________________________ 229 Annexes FRANÇAIS Ecran de définition de l'EF "MAX_TABW" (cf. § 3.1-3) Ecran de l'onglet Interface de lEF "MAX_TABW" (cf. § 3.1-3) ___________________________________________________________________________ 230 Annexes La partie située au dessus du trait pointillé est la partie commune du code source C, elle est insérée automatiquement par l'outil. La partie située au dessous du trait pointillé représente le corps du code source C, saisi ou importé par l'utilisateur (n'est visible sur cet écran que le début, l'ensemble de ce code fait l'objet des deux pages suivantes. Ecran de l'onglet Source .H de l'EF "MAX_TABW" (cf. § 3.1-3) ___________________________________________________________________________ 231 FRANÇAIS Ecran de l'onglet Source .C de l'EF "MAX_TABW" (cf. § 3.1-3) Annexes Code source C de l'EF FRANÇAIS En-tête //PL7SDK_BEGIN_FUNCTION_NAME // do not modify the generated function prototype please // The main EF Function must be the first in this file #include <Cstsyst.h> #include <Fctsyst.h> #include <C:\ASAWTEMP\SDKC\CLASSE01.H> #include <C:\ASAWTEMP\SDKC\MAIN0101.H> void far pascal MAX_TABW( adrTABLE TAB, adrSCAL MAX) //PL7SDK_END_FUNCTION_NAME { adrTABLE far *pwTable=&TAB; /* pointeur structure adresse logique table*/ short far *pcPhyTable; /* pointeur adresse physique table de mot*/ short Resultat= TABLEVIDEMAX_ARW; /* init résultat fonction */ short TailleTab; short I; short far* pResultat; PTR_LOG SLog; SLog.sel = MAX.selecteur; SLog.off = (unsigned short near *)MAX.offset; pResultat = phy_ptr_init(SLog); /* calculer l’adresse physique du tableau d’entrée et la taille de la table*/ pcPhyTable = CalculAdrPhy(pwTable); TailleTab = LimTableOk(pwTable); /* si adresse incorrecte ou si la longueur du tableau est nulle ou si la longueur de la table est supérieure à LGMAXTBWORD) monter S20 et positionner résultat ‡ TABLEVIDE (fait a l’init)*/ if (((DWORD)pcPhyTable == NILL)||(TailleTab == 0)) { SetS20(); } /* si non */ else { /* faire la recherche */ Resultat=*pcPhyTable; for (I=PREMELEMENT;I<TailleTab;I++) ___________________________________________________________________________ 232 Annexes { //contrôle les bornes d’une table de 32 Ko short LimTableOk(adrTABLE far *pwTable) { short Resultat = FALSE; if ((pwTable->taille < LGMAXTBWORD)&&(pwTable->taille>0)) { Resultat = pwTable->taille; } return(Resultat); } void far * CalculAdrPhy(adrTABLE far * pwTable) { PTR_LOG SLog; // récupération des paramètres d’identification des paramètres SLog.sel= pwTable->selecteur; SLog.off= (unsigned short near *)pwTable->offset; // calculer les adresses physiques des paramètres return( phy_ptr_init (SLog)); } // Positionnement du bit système %S20 sur défaut de pointeurs de paramètre void SetS20 ( ) { WORD Sysbit,Value,Status; Sysbit =20; Value = 1; Status = wr_sysbit (Sysbit, Value); // appel smart } ___________________________________________________________________________ 233 FRANÇAIS if (*pcPhyTable>Resultat) { Resultat=*pcPhyTable; } pcPhyTable++; } } /* fsi*/ *pResultat= Resultat; } Annexes 9.1-2 Génération d'une disquette et installation de la famille Pour générer la disquette d'installation, il faut d'abord choisir Personnaliser du menu Services, pour paramétrer le chemin de destination. FRANÇAIS Espace de saisie du lecteur où seront placés les fichiers permettant l'installation d'une famille d'EF Générer Release va copier sur la disquette insérée dans le lecteur A:, les fichiers nécessaires à l'installation de la famille dans la bibliothèque de PL7. Sur le poste client, il faut insérer la disquette dans le lecteur, lancer le fichier SETUP.EXE et suivre la procédure d'installation. 9.2 Equivalences clavier Voici la liste des équivalences clavier : • CTRL + S : Sauver • F7 : Générer la famille en debug • CTRL + F7 : Générer la famille en release ___________________________________________________________________________ 234 Annexes 9.3 En cas de problème • Installation de famille en bibliothèque impossible : - Cause possible : PL7 n'est pas installé - Solution : Installer PL7 micro, Junior ou Pro • Le menu Outils / Mise au point n'apparait pas dans PL7 : - Cause possible : PL7 a été desinstallé, puis réinstallé - Solution : Faire une nouvelle installation de PL7SDKC • Erreur fatale dans PL7, lors de la mise à jour à l'aide du bouton "Mise à jour famille", d'une famille développée avec PL7SDKC : - Solution : Conserver dans la famille l'ancienne version de l'EF, ou supprimer les appels à cette EF • Les fichiers include ne sont pas trouvés à la génération - Solution : Ajouter la ligne suivante dans le fichier CONFIG.SYS SHELL=C:\Command.com C:\ /E:1024 /P ___________________________________________________________________________ 235 FRANÇAIS - Cause possible : Une EF de la famille a été supprimée ou l'interface d'une EF a été modifiée