summaryrefslogtreecommitdiff
path: root/ldmicro/manual-fr.txt
diff options
context:
space:
mode:
Diffstat (limited to 'ldmicro/manual-fr.txt')
-rw-r--r--ldmicro/manual-fr.txt1017
1 files changed, 1017 insertions, 0 deletions
diff --git a/ldmicro/manual-fr.txt b/ldmicro/manual-fr.txt
new file mode 100644
index 0000000..a14f839
--- /dev/null
+++ b/ldmicro/manual-fr.txt
@@ -0,0 +1,1017 @@
+INTRODUCTION
+============
+
+LDmicro génére du code natif pour certains microcontroleurs Microchip
+PIC16F et Atmel AVR. Usuellement les programmes de developpement pour ces
+microcontrolleurs sont écrits dans des langages comme l'assembleur , le
+C ou le Basic. Un programme qui utilise un de ces langages est une suite
+de commandes. Ces programmes sont puissants et adaptés à l'architecture
+des processeurs, qui de façon interne exécutent une liste d'instructions.
+
+Les API (Automates Programmables Industriels, PLC en anglais, SPS en
+allemand) utilisent une autre voie et sont programmés en Langage à
+Contacts (ou LADDER). Un programme simple est représenté comme ceci :
+
+
+ || ||
+ || Xbutton1 Tdon Rchatter Yred ||
+ 1 ||-------]/[---------[TON 1.000 s]-+-------]/[--------------( )-------||
+ || | ||
+ || Xbutton2 Tdof | ||
+ ||-------]/[---------[TOF 2.000 s]-+ ||
+ || ||
+ || ||
+ || ||
+ || Rchatter Ton Tnew Rchatter ||
+ 2 ||-------]/[---------[TON 1.000 s]----[TOF 1.000 s]---------( )-------||
+ || ||
+ || ||
+ || ||
+ ||------[END]---------------------------------------------------------||
+ || ||
+ || ||
+
+(TON est une tempo travail; TOF est une tempo repos. les commandes --] [--
+représentent des Entrées, qui peuvent être des contacts de relais. Les
+commandes --( )-- sont des Sorties, qui peuvent représenter des bobines de
+relais. Beaucoup de références de programmes de langage à contacts (LADDER)
+existent sur Internet et sont à quelques détails près, identiques à
+l'implémentation représentée ci-dessus.
+
+Un certain nombre de différences apparaissent entre les programmes en
+langage évolués ( C, Basic, Etc..) et les programmes pour API:
+
+ * Le programme est représenté dans un format graphique, et non
+ comme une liste de commandes en format texte. Beaucoup de personnes
+ trouve cela plus facile à comprendre.
+
+ * Au niveau de base, le programme apparait comme un diagramme
+ de circuit avec des contacts de relais (Entrées) et des bobines
+ (Sorties). Ceci est intuitif pour les programmeurs qui connaissent
+ la théorie des circuits électriques.
+
+ * Le compilateur de langage à contacts vérifie tout ceci lors
+ de la compilation. Vous n'avez pas à écrire de code quand une
+ Sortie est remplacée et est remise en Entrée ou si une temporisation
+ est modifiée, vous n'avez pas non plus à spécifier l'ordre où les
+ calculs doivent être effectués. L'outil API (PLC) s'occupe de cela
+ pour vous.
+
+
+LDmicro compile le langage à contact (ladder) en code pour PIC16F ou
+AVR. Les processeurs suivants sont supportés:
+
+ * PIC16F877
+ * PIC16F628
+ * PIC16F876 (non testé)
+ * PIC16F88 (non testé)
+ * PIC16F819 (non testé)
+ * PIC16F887 (non testé)
+ * PIC16F886 (non testé)
+ * ATmega128
+ * ATmega64
+ * ATmega162 (non testé)
+ * ATmega32 (non testé)
+ * ATmega16 (non testé)
+ * ATmega8 (non testé)
+
+Il doit être facile de supporter d'autres PIC ou AVR, mais je n'est
+aucun moyen pour les tester. Si vous en voulez un en particulier faites
+moi parvenir votre demande et je verrai ce que je peux faire.
+
+En utilisant LDmicro, vous dessinez un diagramme à contacts pour votre
+programme. Vous pouvez simuler le fonctionnement logique en temps réel sur
+votre PC. Quand vous êtes convaincu que le fonctionnement est correct,
+vous pouvez affecter les broches du microcontroleur pour les Entrées et
+Sorties, ensuite vous compilez votre programmeen code AVR ou PIC. Le
+fichier de sortie du compilateur est un fichier .HEX que vous devrez
+mettre dans le microcontroleur en utilisant un programmateur pour PIC
+ou AVR.
+
+
+LDmicro est conçu pour être similaire à la majorité des API commerciaux.
+Il y a quelques exceptions, et une partie des possibilités n'est
+pas standard avec le matériel industriel. Lire attentivement la
+description de chaque instruction même si elle parait familière. Ce
+document considère que vous avez une connaisance de base du langage à
+contact et de la structure des logiciels pour automates programmables.
+Cycle d'exécution : Lecture des Entrées -> Calculs -> Ecriture des Sorties
+
+
+CIBLES ADDITIONNELLES
+=====================
+
+Il est aussi possible de générer du code ANSI C . Vous pouvez utiliser
+ceci pour n'importe quel processeur dont vous avez un compilateur C,
+mais le runtime est de votre responsabilité. LDmicro gérére uniquement
+le source pour le cycle de l'API. Vous êtes responsable de l'appel de
+chaque séquence du cycle et de l'implémentation de toutes les Entrées
+/ Sorties (Lecture/Ecriture des Entrées digitales, etc ...). Voir les
+commentaires dans le code source pour plus de détails.
+
+Finalement, LDmicro peut générer un code byte indépendant du processeur
+pour une machine virtuelle prévue pour faire fonctionner ce type de code.
+J'ai prévu un exemple simple d'implémentation d'un interpréteur /VM
+écrit en code C le plus portable possible. La cible fonctionne juste sur
+quelques plateformes ou vous pouvez prévoir votre VM. Ceci peut être utile
+pour des applications ou vous pouvez utiliser le languages à contacts
+comme du langage script pour customiser un programme important. Voir
+les commentaires dans l'exemple pour les détails.
+
+
+OPTIONS LIGNE DE COMMANDE
+=========================
+
+LDmicro.exe fonctionne normallement sans options de ligne de commande.
+Vous pouvez faire un raccourci vers le programme et le sauvegarder sur
+l'écran , il suffit alors de faire un double clic pour le faire démarrer
+et vous vous retrouvez ainsi dans l'interface utilisateur.
+
+Si un nom de fichier est passé en ligne de de commande de LDmicro, (ex:
+`ldmicro.exe asd.ld'), alors LDmicro va essayer d'ouvrir `asd.ld', si
+il existe. Une erreur se produira si `asd.ld' n'existe pas. Vous avez
+la possibilité d'associer LDmicro avec les fichiers d'extention .ld.
+Ceci permet à LDmicro de démarrer automatiquement lors d'un double clic
+sur un fichier xxx.ld.
+
+Si les arguments de la ligne de commande sont passés sous la forme:
+`ldmicro.exe /c src.ld dest.hex', LDmicro compilera le programme`src.ld',
+et sauvegardera le fichier compilé sous`dest.hex'. Après compilation
+LDmicro se termine, que la compilation soit correcte ou pas. Aucun
+message n'est affiché sur la console. Ce mode est pratique uniquement
+lorsque vous exécutez LDmicro en ligne de commande.
+
+
+BASES
+=====
+
+Si vous exécutez LDmicro sans arguments de ligne de commande, il démarre
+avec un programme vide. Si vous démarrer avec le nom d'un programme
+langage à contacts (xxx.ld) en ligne de commande, il va essayer de
+charger le programme au démarrage. LDmicro utilise son format interne
+pour le programme , il ne peut pas importer de programmes édités par
+d'autres outils.
+
+Si vous ne chargez pas un programme existant, LDmicro démarre en insérant
+une ligne vide. Vous pouvez ajouter les instructions pour votre programme:
+par exemple ajouter un jeu de contacts (Instruction -> Insérer Contact)
+qui sera nommé `Xnew'. `X' désigne un contact qui peut être lié à une
+broche d'entrée du microcontroleur, vous pouvez affecter la broche pour
+ce contact plus tard après avoir choisi le microcontroleur et renommé
+les contacts. La première lettre indique de quel type de composants il
+s'agit par exemple :
+
+ * Xnom -- Relié à une broche d'entrée du microcontroleur
+ * Ynom -- Relié à une broche de sortie du microcontroleur
+ * Rnom -- `Relais interne': un bit en mémoire
+ * Tnom -- Temporisation; Tempo travail, tempo repos, ou totalisatrice
+ * Cnom -- Compteur, Compteur ou décompteur
+ * Anom -- Un entier lu sur un comvertisseur A/D
+ * nom -- Variable générique (Entier : Integer)
+
+Choisir le reste du nom pour décrire l'utilisation de ce que fait cet
+objet et qui doit être unique dans tout le programme. Un même nom doit
+toujours se référer au même objet dans le programme en entier.Par
+exemple , vous aurez une erreur si vous utilisez une tempo travail
+(TON) appellée TDelai et une tempo repos (TOF) appellée aussi TDelai
+dans le même programme, le comptage effectué par ces tempo utilisera le
+même emplacement en mémoire, mais il est acceptable d'avoir une tempo
+sauvegardée (RTO) Tdelai même nom avec une instruction de RES, dans ce
+cas l'instruction fonctionne avec le même timer.
+
+Les noms de variables peuvent être des lettres, chiffres ou le
+caractère _. Un nom de variable ne doit pas commencer par un chiffre.
+Les noms de variables sont sensibles à la casse (majuscule/minuscules).
+
+Les instructions de manipulation de variables (MOV, ADD, EQU,
+etc.) peuvent travailler avec des variables de n'importe quel nom. Elles
+peuvent avoir accès aux accumulateurs des temporisations ou des
+compteurs. Cela peut quelquefois être très utile, par exemple si vous
+voulez contrôler la valeur d'un compteur ou d'une temporisation dans
+une ligne particulière.
+
+Les variables sont toujours des entiers 16 bits. Leur valeur peut
+donc être comprise entre -32768 et 32767 inclus. Les variables sont
+toujours signées. Vous pouvez les spécifier de façon littérale comme
+des nombres décimaux normaux (0, 1234, -56), vous pouvez aussi les
+spécifier en caractères ASCII ('A', 'z') en mettant le caractère entre
+des guillemets simples. Vous pouvez utiliser un caractère ASCII dans la
+majorité des endroits où vous pouvez utiliser les nombres décimaux.
+
+En bas de l'écran, vous pouvez voir la liste de tous les objets
+utilisés dans votre programme. La liste est automatiquement générée
+à partir du programme. La majorité des objets ne necessitent aucune
+configuration. Seuls : les objets `Xnom', `Ynom', and `Anom' doivent être
+affectés à une broche du micro La première chose à faire est de choisir
+la microcontroleur utilisé : Paramères -> Microcontroleur ensuite vous
+affectez les broches en faisant un double clic dans la liste.
+
+Vous pouvez modifier le programme en insérant ou supprimant des
+instructions. Le curseur clignote dans la programme pour indiquer
+l'instruction courante sélectionnée et le point d'insertion. S'il ne
+clignote pas pressez <Tab> ou cliquer sur une instruction, ou vous
+pouvez insérer une nouvelle instruction à la droite ou à la gauche
+(en série avec), ou au dessous ou au dessus (en parallèle avec) de
+l'instruction sélectionnée. Quelques opérations ne sont pas permises ,
+par exemple aucune instruction permise à droite de la bobine.
+
+Le programme démarre avec uniquement une ligne. Vous pouvez ajouter
+plusieurs lignes en sélectionnant Insertion -> Ligne avant ou après
+dans le menu. Vous pouvez faire un circuit complexe en plaçant plusieurs
+branches en parallèle ou en série avec une ligne, mais il est plus clair
+de faire plusieurs lignes.
+
+Une fois votre programme écrit, vous pouvez le tester par simulation,
+et le compiler dans un fichier HEX pour le microcontroleur de destination.
+
+SIMULATION
+==========
+
+Pour entrer dans la mode simulation choisir Simulation -> Simuler
+ou presser <Ctrl+M> le programme est affiché différemment en mode
+simulation. Les instructions activées sont affichées en rouge vif, les
+instructions qui ne le sont pas sont affichées en grisé. Appuyer sur la
+barre d'espace pour démarrer l'API pour 1 cycle. Pour faire fonctionner
+continuellement en temps réel choisir Simulation ->Démarrer la simulation
+en temps réel ou presser <Ctrl+R> L'affichage du programme est mise à
+jour en temps réel en fonction des changements d'état des entrées.
+
+Vous pouvez valider l'état des entrées du programme en faisant un
+double clic sur l'entrée dans la liste au bas de l'écran, ou sur le
+contact `Xnom' de l'instruction dans le programme, pour avoir le reflet
+automatiquement de la validation d'une entrée dans le programme, il
+faut que le programme soit en cycle.(le démarrer par <Ctrl+R> ou barre
+d'espace pour un seul cycle).
+
+COMPILER EN CODE NATIF
+======================
+
+Le point final est de générer un fichier .HEX qui sera programmé dans le
+microcontroleur que vous avez choisi par Paramètres -> Microcontroleur
+Vous devez affecter les broches d'entrées sorties pour chaque 'Xnom'
+et 'Ynom'. Vous pouvez faire cela en faisant un double clic sur la nom
+de l'objet dans la liste au bas de l'écran. Une boite de dialogue vous
+demande de choisir une des broches non affectées dans la liste.
+
+Vous devez aussi choisir la temps de cycle que voulez utiliser pour
+votre application, vous devez aussi choisir la fréquence d'horloge du
+processeur. Faire Paramètres -> Paramètres MCU dans le menu. En général,
+le temps de cycle peut être laissé à la valeur par défaut (10 ms) qui est
+une bonne valeur pour la majorité des applications. Indiquer la fréquence
+du quartz utilisé (ou du résonateur céramique ou autres..) et cliquer OK.
+
+Maintenant vous pouvez créer le fichier pour intégrer dans le
+microcontroleur. Choisir Compilation -> Compiler, ou compiler sous...
+Si vous avez précédemment compilé votre programme, vous pouvez spécifier
+un nom différent de fichier de sortie. Si votre programme ne comporte
+pas d'erreur (lié à la structure du programme), LDmicro génére un fichier
+IHEX prêt à être programmé dans le chip.
+
+Utilisez votre logiciel et matériel de programmation habituel pour
+charger le fichier HEX dans la microcontroleur. Vérifiez et validez
+les bits de configuration (fuses), pour les processeurs PIC16Fxxx ces
+bits sont inclus dans le fichier HEX, et la majorité des logiciels de
+programmation les valident automatiquement, pour les processeurs AVR ,
+vous devez le faire manuellement.
+
+REFERENCE DES INSTRUCTIONS
+==========================
+
+> CONTACT, NORMALLEMENT OUVERT Xnom Rnom Ynom
+ ----] [---- ----] [---- ----] [----
+
+ Si le signal arrivant à cette instruction est FAUX (0) le signal
+ de sortie est aussi faux (0), s'il est vrai , il sera aussi vrai
+ en sortie si et uniquement si la broche d'Entrée ou de Sortie
+ ou de Relais interne est vraie, sinon l'instruction sera fausse.
+ Cette instruction peut vérifier l'état d'une broche d'entrée, d'une
+ broche de sortie ou d'un relais interne
+
+
+> CONTACT, NORMALLEMENT FERME Xnom Rnom Ynom
+ ----]/[---- ----]/[---- ----]/[----
+
+ Si le signal arrivant à cette instruction est FAUX (0) le signal
+ de sortie est vrai (1), s'il est vrai , il sera faux en sortie .
+ Cette instruction peut vérifier l'état d'une broche d'entrée, d'une
+ broche de sortie ou d'un relais interne. Fonctionne en opposition
+ par rapport au contact normallement ouvert.
+
+
+> BOBINE, NORMALE Rnom Ynom
+ ----( )---- ----( )----
+
+ Si le signal arrivant à cette instruction est faux, alors le relais
+ interne ou la broche de sortie est faux (mise à zéro). Si le signal
+ arrivant à cette instruction est vrai(1), alors le relais interne ou
+ la broche de sortie est validée (mise à 1). Il n'est pas important
+ d'affecter une variable à une bobine.
+ Cette instruction est placée le plus à droite dans une séquence.
+
+
+> BOBINE, INVERSE Rnom Ynom
+ ----(/)---- ----(/)----
+
+ Si le signal arrivant à cette instruction est vrai, alors le relais
+ interne ou la broche de sortie est faux (mise à zéro). Si le signal
+ arrivant à cette instruction est faux(0), alors le relais interne ou
+ la broche de sortie est validée (mise à 1). Il n'est pas important
+ d'affecter une variable à une bobine.
+ Cette instruction est placée le plus à droite dans une séquence.
+
+
+> BOBINE, ACCROCHAGE Rnom Ynom
+ ----(S)---- ----(S)----
+
+ Si le signal arrivant à cette instruction est vrai, alors le
+ relais interne ou la broche de sortie est validée (mise à 1). Cette
+ instruction permet de changer l'état d'un relais ou d'une sortie :
+ uniquement passe à vrai, ou reste vrai si elle était déjà à 1,
+ elle est typiquement utilisée en combinaison avec une Bobine REMISE
+ A ZERO.
+ Cette instruction est placée le plus à droite dans une séquence.
+
+
+> BOBINE, REMISE A ZERO Rnom Ynom
+ ----(R)---- ----(R)----
+
+ Si le signal arrivant à cette instruction est vrai, alors le relais
+ interne ou la sortie est mise à zéro (0), si elle était déjà à 0,
+ il n'y a aucun changement, cette instruction change l'état d'une
+ sortie uniquement si elle était à 1, cette instruction fonctionne en
+ combinaison avec l'instruction ci-dessus Bobine à ACCROCHAGE.
+ Cette instruction est placée le plus à droite dans une séquence.
+
+
+> TEMPORISATION TRAVAIL Tdon
+ -[TON 1.000 s]-
+
+ Quand la signal arrivant à cette instruction passe de faux à vrai
+ (0 à 1), le signal de sortie attend 1.000 seconde avant de passer
+ à 1. Quand le signal de commande de cette instruction passe ZERO,
+ le signal de sortie passe immédiatement à zéro. La tempo est remise
+ à zéro à chaque fois que l'entrée repasse à zéro. L'entrée doit être
+ maintenue vraie à 1 pendant au moins 1000 millisecondes consécutives
+ avant que la sortie ne devienne vraie. le délai est configurable.
+
+ La variable `Tnom' compte depuis zéro en unités de temps de scan.
+ L'instruction Ton devient vraie en sortie quand la variable du
+ compteur est plus grande ou égale au delai fixé. Il est possible
+ de manipuler la variable du compteur en dehors, par exemple par une
+ instruction MOVE.
+
+
+> TEMPORISATION REPOS Tdoff
+ -[TOF 1.000 s]-
+
+ Quand le signal qui arrive à l'instruction passe de l'état vrai
+ (1) à l'état faux (0), la sortie attend 1.000 s avant de dévenir
+ faux (0) Quand le signal arrivant à l'instruction passe de l'état
+ faux à l'état vrai, le signal passe à vrai immédiatement. La
+ temporisation est remise à zéro à chaque fois que l'entrée devient
+ fausse. L'entrée doit être maintenue à l'état faux pendant au moins
+ 1000 ms consécutives avant que la sortie ne passe à l'état faux. La
+ temporisation est configurable.
+
+ La variable `Tname' compte depuis zéro en unités de temps de scan.
+ L'instruction Ton devient vraie en sortie quand la variable du
+ compteur est plus grande ou égale au delai fixé. Il est possible
+ de manipuler la variable du compteur en dehors, par exemple par une
+ instruction MOVE.
+
+
+> TEMPORISATION TOTALISATRICE Trto
+ -[RTO 1.000 s]-
+
+ Cette instruction prend en compte le temps que l'entrée a été à l'état
+ vrai (1). Si l'entrée a été vraie pendant au moins 1.000s la sortie
+ devient vraie (1).L'entrée n'a pas besoin d'être vraie pendant 1000 ms
+ consécutives. Si l'entrée est vraie pendant 0.6 seconde puis fausse
+ pendant 2.0 secondes et ensuite vraie pendant 0.4 seconde, la sortie
+ va devenir vraie. Après être passé à l'état vrai, la sortie reste
+ vraie quelque soit la commande de l'instruction. La temporisation
+ doit être remise à zéro par une instruction de RES (reset).
+
+ La variable `Tnom' compte depuis zéro en unités de temps de scan.
+ L'instruction Ton devient vraie en sortie quand la variable du
+ compteur est plus grande ou égale au delai fixé. Il est possible
+ de manipuler la variable du compteur en dehors, par exemple par une
+ instruction MOVE.
+
+
+> RES Remise à Zéro Trto Citems
+ ----{RES}---- ----{RES}----
+
+ Cette instruction fait un remise à zéro d'une temporisation ou d'un
+ compteur. Les tempos TON et TOF sont automatiquement remisent à zéro
+ lorsque leurs entrées deviennent respectivement fausses ou vraies,
+ RES n'est pas donc pas nécessaire pour ces tempos. Les tempos RTO
+ et les compteurs décompteurs CTU / CTD ne sont pas remis à zéro
+ automatiquement, il faut donc utiliser cette instruction. Lorsque
+ l'entrée est vraie , le compteur ou la temporisation est remis à
+ zéro. Si l'entrée reste à zéro, aucune action n'est prise.
+ Cette instruction est placée le plus à droite dans une séquence.
+
+
+> FRONT MONTANT _
+ --[OSR_/ ]--
+
+ La sortie de cette instruction est normallement fausse. Si
+ l'instruction d'entrée est vraie pendant ce scan et qu'elle était
+ fausse pendant le scan précédent alors la sortie devient vraie. Elle
+ génére une impulsion à chaque front montant du signal d'entrée. Cette
+ instruction est utile si vous voulez intercepter le front montant
+ du signal.
+
+
+> FRONT DESCENDANT _
+ --[OSF \_]--
+
+ La sortie de cette instruction est normallement fausse. Si
+ l'instruction d'entrée est fausse (0) pendant ce scan et qu'elle
+ était vraie (1) pendant le scan précédent alors la sortie devient
+ vraie. Elle génére une impulsion à chaque front descendant du signal
+ d'entrée. Cette instruction est utile si vous voulez intercepter le
+ front descendant d'un signal.
+
+
+> COURT CIRCUIT (SHUNT), CIRCUIT OUVERT
+ ----+----+---- ----+ +----
+
+ Une instruction shunt donne en sortie une condition qui est toujours
+ égale à la condition d'entrée. Une instruction Circuit Ouvert donne
+ toujours une valeur fausse en sortie.
+ Ces instructions sont en général utilisées en phase de test.
+
+
+> RELAIS DE CONTROLE MAITRE
+ -{MASTER RLY}-
+
+ Par défaut, la condition d'entrée d'une ligne est toujours vraie. Si
+ une instruction Relais de contrôle maitre est exécutée avec une
+ valeur d'entrée fausse, alors toutes les lignes suivantes deviendront
+ fausses. Ceci va continuer jusqu'à la rencontre de la prochaine
+ instruction relais de contrôle maitre qui annule l'instruction de
+ départ. Ces instructions doivent toujours être utilisées par paires:
+ une pour commencer (qui peut être sous condition) qui commence la
+ partie déactivée et une pour la terminer.
+
+
+> MOUVOIR {destvar := } {Tret := }
+ -{ 123 MOV}- -{ srcvar MOV}-
+
+ Lorsque l'entrée de cette instruction est vraie, elle va mettre la
+ variable de destination à une valeur égale à la variable source ou à
+ la constante source. Quand l'entrée de cette instruction est fausse
+ rien ne se passe. Vous pouvez affecter n'importe quelle variable
+ à une instruction de déplacement, ceci inclu l'état de variables
+ compteurs ou temporisateurs qui se distinguent par l'entête T ou
+ C. Par exemple mettre 0 dans Tsauvegardé équivaut à faire une RES
+ de la temporisation. Cette instruction doit être complétement à
+ droite dans une séquence.
+
+
+> OPERATIONS ARITHMETIQUES {ADD kay :=} {SUB Ccnt :=}
+ -{ 'a' + 10 }- -{ Ccnt - 10 }-
+
+> {MUL dest :=} {DIV dv := }
+ -{ var * -990 }- -{ dv / -10000}-
+
+ Quand l'entrée de cette instruction est vraie, elle place en
+ destination la variable égale à l'expression calculée. Les opérandes
+ peuvent être des variables (en incluant les variables compteurs et
+ tempos) ou des constantes. Ces instructions utilisent des valeurs 16
+ bits signées. Il faut se souvenir que le résultat est évalué à chaque
+ cycle tant que la condition d'entrée est vraie. Si vous incrémentez
+ ou décrémentez une variable (si la variable de destination est
+ aussi une des opérandes), le résultat ne sera pas celui escompté,
+ il faut utiliser typiquement un front montant ou descendant de la
+ condition d'entrée qui ne sera évalué qu'une seule fois. La valeur
+ est tronquée à la valeur entière. Cette instruction doit être
+ complétement à droite dans une séquence.
+
+
+> COMPARER [var ==] [var >] [1 >=]
+ -[ var2 ]- -[ 1 ]- -[ Ton]-
+
+> [var /=] [-4 < ] [1 <=]
+ -[ var2 ]- -[ vartwo]- -[ Cup]-
+
+ Si l'entrée de cette instruction est fausse alors la sortie est
+ fausse. Si l'entrée est vraie, alors la sortie sera vraie si et
+ uniquement si la condition de sortie est vraie. Cette instruction
+ est utilisée pour comparer (Egalité, plus grand que,plus grand ou
+ égal à, inégal, plus petit que, plus petit ou égal à) une variable à
+ une autre variable, ou pour comparer une variable avec une constante
+ 16 bits signée.
+
+
+> COMPTEUR DECOMPTEUR Cnom Cnom
+ --[CTU >=5]-- --[CTD >=5]--
+
+ Un compteur incrémente ( Compteur CTU, count up) ou décrémente
+ (Décompteur CTD, count down) une variable à chaque front montant de
+ la ligne en condition d'entrée (CAD quand la signal passe de l'état
+ 0 à l'état 1. La condition de sortie du compteur est vraie si la
+ variable du compteur est égale ou plus grande que 5 (dans l'exemple),
+ et faux sinon. La condition de sortie de la ligne peut être vraie,
+ même si la condition d'entrée est fausse, cela dépend uniquement de la
+ valeur de la variable du compteur. Vous pouvez avoir un compteur ou
+ un décompteur avec le même nom, qui vont incréménter ou decrémenter
+ une variable. L'instruction Remise à Zéro permet de resetter un
+ compteur (remettre à zéro), il est possible de modifier par des
+ opérations les variables des compteurs décompteurs.
+
+
+> COMPTEUR CYCLIQUE Cnom
+ --{CTC 0:7}--
+
+ Un compteur cyclique fonctionne comme un compteur normal
+ CTU, exception faite, lorsque le compteur arrive à sa
+ limite supérieure, la variable du compteur revient à 0. dans
+ l'exemple la valeur du compteur évolue de la façon suivante :
+ 0,1,2,4,5,6,7,0,1,2,3,4,5,6,7,0,1,3,4,5,etc. Ceci est très pratique
+ en conbinaison avec des intructions conditionnelles sur la variable
+ Cnom. On peut utiliser ceci comme un séquenceur, l'horloge du compteur
+ CTC est validée par la condition d'entrée associée à une instruction
+ de front montant.
+ Cette instruction doit être complétement à droite dans une séquence.
+
+
+> REGISTRE A DECALAGE {SHIFT REG }
+ -{ reg0..3 }-
+
+ Un registre à décalage est associé avec un jeu de variables. Le
+ registre à décalage de l'exemple donné est associé avec les
+ variables`reg0', `reg1', `reg2', and `reg3'. L'entrée du registre à
+ décalage est `reg0'. A chaque front montant de la condition d'entrée
+ de la ligne, le registre à décalage va décaler d'une position à
+ droite. Ce qui donne `reg3 := reg2', `reg2 := reg1'. et `reg1 :=
+ reg0'.`reg0' est à gauche sans changement. Un registre à décalage
+ de plusieurs éléments peut consommer beaucoup de place en mémoire.
+ Cette instruction doit être complétement à droite dans une séquence.
+
+
+> TABLEAU INDEXE {dest := }
+ -{ LUT[i] }-
+
+ Un tableau indexé et un groupe ordonné de n valeurs Quand la condition
+ d'entrée est vraie, la variable entière `dest' est mise à la valeur
+ correspondand à l'index i du tableau. L'index est compris entre 0 et
+ (n-1). Le comportement de cette instruction est indéfini si l'index
+ est en dehors du tableau
+ Cette instruction doit être complétement à droite dans une séquence.
+
+
+> TABLEAU ELEMENTS LINEAIRES {yvar := }
+ -{ PWL[xvar] }-
+
+ C'est une bonne méthode pour évaluer de façon approximative une
+ fonction compliquée ou une courbe. Très pratique par exemple pour
+ appliquer une courbe de calibration pour linéariser tension de sortie
+ d'un capteur dans une unité convenable.
+
+ Supposez que vous essayez de faire une fonction pour convertir une
+ variable d'entrée entière, x, en une variable de sortie entière, y,
+ vous connaissez la fonction en différents points, par exemple vous
+ connaissez :
+
+ f(0) = 2
+ f(5) = 10
+ f(10) = 50
+ f(100) = 100
+
+ Ceci donne les points
+
+ (x0, y0) = ( 0, 2)
+ (x1, y1) = ( 5, 10)
+ (x2, y2) = ( 10, 50)
+ (x3, y3) = (100, 100)
+
+ liés à cette courbe. Vous pouvez entrer ces 4 points dans un
+ tableau associé à l'instruction tableau d'éléments linéaires. Cette
+ instruction regarde la valeur de xvar et fixe la valeur de yvar
+ correspondante. Par exemple si vous mettez xvar = 10 , l'instruction
+ validera yvar = 50.
+
+ Si vous mettez une instruction avec une valeur xvar entre deux valeurs
+ de x du tableau (et par conséquence aussi de yvar). Une moyenne
+ proportionnelle entre les deux valeurs , précédente et suivante de
+ xvar et de la valeur liée yvar, est effectuée. Par exemple xvar =
+ 55 donne en sortie yvar = 75 Les deux points xvar (10.50) et yvar
+ (50,75) , 55 est la moyenne entre 10 et 100 et 75 est la moyenne
+ entre 50 et 100, donc (55,75) sont liés ensemble par une ligne de
+ connection qui connecte ces deux points.
+
+ Ces points doivent être spécifiés dans l'ordre ascendant des
+ coordonnées x. Il peut être impossible de faire certaines opérations
+ mathématiques nécessaires pour certains tableaux, utilisant des
+ entiers 16 bits. Dans ce LDmicro va provoquer une alarme. Ce tableau
+ va provoquer une erreur :
+
+ (x0, y0) = ( 0, 0)
+ (x1, y1) = (300, 300)
+
+ Vous pouvez supprimer ces erreurs en diminuant l'écart entre les
+ points du tableau, par exemple ce tableau est équivalent à celui ci
+ dessus , mais ne provoque pas d'erreur:
+
+ (x0, y0) = ( 0, 0)
+ (x1, y1) = (150, 150)
+ (x2, y2) = (300, 300)
+
+ Il n'est pratiquement jamais nécessaire d'utiliser plus de 5 ou
+ 6 points. Ajouter des points augmente la taille du code et diminue
+ sa vitesse d'exécution. Le comportement, si vous passez une valeur
+ à xvar plus grande que la plus grande valeur du tableau , ou plus
+ petit que la plus petite valeur, est indéfini.
+ Cette instruction doit être complétement à droite dans une séquence.
+
+
+> LECTURE CONVERTISSEUR A/D Anom
+ --{READ ADC}--
+
+ LDmicro peut générer du code pour utiliser les convertisseurs A/D
+ contenus dans certains microcontroleurs. Si la condition d'entrée
+ de l'instruction est vraie, alors une acquisition du convertisseur
+ A/D est éffectuée et stockée dans la variable Anom. Cette variable
+ peut être par la suite traitée comme les autres variables par les
+ différentes opérations arithmétiques ou autres. Vous devez affecter
+ une broche du micro à la variable Anom de la même façon que pour
+ les entrées et sorties digitales par un double clic dans la list
+ affichée au bas de l'écran. Si la condition d'entrée de la séquence
+ est fausse la variable Anom reste inchangée.
+
+ Pour tous les circuits supportés actuellement, 0 volt en entrée
+ correspond à une lecture ADC de 0, et une valeur égale à VDD (la
+ tension d'alimentation ) correspond à une lecture ADC de 1023. Si
+ vous utilisez un circuit AVR, vous devez connecter Aref à VDD.
+
+ Vous pouvez utiliser les opérations arithmétiques pour mettre à
+ l'échelle les lectures effectuées dans l'unité qui vous est la plus
+ appropriée. Mais souvenez vous que tous les calculs sont faits en
+ utilisant les entiers.
+
+ En général, toutes les broches ne sont pas utilisables pour les
+ lecture de convertisseur A/D. Le logiciel ne vous permet pas
+ d'affecter une broche non A/D pour une entrée convertisseur.
+ Cette instruction doit être complétement à droite dans une séquence.
+
+
+> FIXER RAPPORT CYCLE PWM duty_cycle
+ -{PWM 32.8 kHz}-
+
+ LDmicro peut générer du code pour utiliser les périphériques PWM
+ contenus dans certains microcontroleurs. Si la condition d'entrée
+ de cette instruction est vraie, le rapport de cycle du périphérique
+ PWM va être fixé à la valeur de la variable Rapport de cycle PWM.
+ Le rapport de cycle est un nombre compris entre 0 (toujours au
+ niveau bas) et 100 (toujours au niveau haut). Si vous connaissez la
+ manière dont les périphériques fonctionnent vous noterez que LDmicro
+ met automatiquement à l'échelle la variable du rapport de cycle en
+ pourcentage de la période d'horloge PWM.
+
+ Vous pouvez spécifier la fréquence de sortie PWM, en Hertz. Le
+ fréquence que vous spécifiez peut ne pas être exactement accomplie, en
+ fonction des divisions de la fréquence d'horloge du microcontroleur,
+ LDmicro va choisir une fréquence approchée. Si l'erreur est trop
+ importante, il vous avertit.Les vitesses rapides sont au détriment
+ de la résolution. Cette instruction doit être complétement à droite
+ dans une séquence.
+
+ Le runtime du language à contacts consomme un timers (du micro) pour
+ le temps de cycle, ce qui fait que le PWM est uniquement possible
+ avec des microcontroleurs ayant au moins deux timers utilisables.
+ PWM utilise CCP2 (pas CCP1) sur les PIC16F et OC2(pas OC1) sur les
+ Atmel AVR.
+
+> METTRE PERSISTANT saved_var
+ --{PERSIST}--
+
+ Quand la condition d'entrée de cette instruction est vraie, la
+ variable entière spécifiée va être automatiquement sauvegardée en
+ EEPROM, ce qui fait que cette valeur persiste même après une coupure
+ de l'alimentation du micro. Il n'y a pas à spécifier ou elle doit
+ être sauvegardée en EEPROM, ceci est fait automatiquement, jusqu'a
+ ce quelle change à nouveau. La variable est automatiquement chargée
+ à partir de l'EEPROM suite à un reset à la mise sous tension.
+
+ Si une variables, mise persistante, change fréquemment, l'EEPROM de
+ votre micro peut être détruite très rapidement, Le nombre de cycles
+ d'écriture dans l'EEPROM est limité à environ 100 000 cycles Quand
+ la condition est fausse, rien n'apparait. Cette instruction doit
+ être complétement à droite dans une séquence.
+
+
+> RECEPTION UART (SERIE) var
+ --{UART RECV}--
+
+ LDmicro peut générer du code pour utiliser l'UART, existant dans
+ certains microcontroleurs. Sur les AVR, avec de multiples UART,
+ uniquement l'UART1 est utilisable (pas l'UART0). Configurer la
+ vitesse en utilisant -> Paramètres -> Paramètres MCU. Toutes les
+ vitesses de liaison ne sont pas utilisables avec tous les quartz de
+ toutyes les fréquences. Ldmicro vous avertit dans ce cas.
+
+ Si la condition d'entrée de cette instruction est fausse, rien ne se
+ passe. Si la condition d'entrée est vraie, elle essaie de recevoir
+ un caractère en provenance de l'UART. Si aucun caractère n'est lu
+ alors la condition de sortie devient fausse. Si un caractère est
+ lu la valeur ASCII est stockée dans 'var' et la condition de sortie
+ est vraie pour un seul cycle API.
+
+
+> EMMISION UART (SERIE) var
+ --{UART SEND}--
+
+ LDmicro peut générer du code pour utiliser l'UART, existant dans
+ certains microcontroleurs. Sur les AVR, avec de multiples UART,
+ uniquement l'UART1 est utilisable (pas l'UART0). Configurer la
+ vitesse en utilisant -> Paramètres -> Paramètres MCU. Toutes les
+ vitesses de liaison ne sont pas utilisables avec tous les quartz
+ de toutyes les fréquences. Ldmicro vous avertit dans ce cas.
+
+ Si la condition d'entrée de cette instruction est fausse, rien ne
+ se passe. Si la condition d'entrée est vraie alors cette instruction
+ écrit un seul caractère vers l'UART. La valeur ASCII du caractère à
+ transmettre doit avoir été stocké dans 'var' par avance. La condition
+ de sortie de la séquence est vraie, si l'UART est occupée (en cours
+ de transmission d'un caractère), et fausse sinon.
+
+ Rappelez vous que les caractères mettent un certain temps pour être
+ transmis. Vérifiez la condition de sortie de cette instruction pour
+ vous assurer que le premier caractère à bien été transmis, avant
+ d'essayer d'envoyer un second caractère, ou utiliser une temporisation
+ pour insérer un délai entre caractères; Vous devez uniquement vérifier
+ que la condition d'entrée est vraie (essayez de transmettre un
+ caractère) quand la condition de sortie est fausse(UART non occuppée).
+
+ Regardez l'instruction Chaine formattée(juste après) avant d'utiliser
+ cette instruction, elle est plus simple à utiliser, et dans la
+ majorité des cas, est capable de faire ce dont on a besoin.
+
+
+> CHAINE FORMATTEE SUR UART var
+ -{"Pression: \3\r\n"}-
+
+ LDmicro peut générer du code pour utiliser l'UART, existant dans
+ certains microcontroleurs. Sur les AVR, avec de multiples UART,
+ uniquement l'UART1 est utilisable (pas l'UART0). Configurer la
+ vitesse en utilisant -> Paramètres -> Paramètres MCU. Toutes les
+ vitesses de liaison ne sont pas utilisables avec tous les quartz
+ de toutyes les fréquences. Ldmicro vous avertit dans ce cas.
+
+ Quand la condition d'entrée de cette instruction passe de faux à vrai,
+ elle commence à envoyer une chaine compléte vers le port série. Si
+ la chaine comporte la séquence spéciale '3', alors cette séquence
+ va être remplacée par la valeur de 'var', qui est automatiquement
+ converti en une chaine. La variable va être formattée pour prendre
+ exactement trois caractères; par exemple si var = 35, la chaine
+ exacte qui va être "imprimée" sera 'Pression: 35\r\n' (notez les
+ espaces supplémentaires). Si au lieu de cela var = 1432 , la sortie
+ est indéfinie parceque 1432 comporte plus de 3 digits. Dans ce cas
+ vous devez nécessairement utiliser '\4' à la place.
+
+ Si la variable peut être négative, alors utilisez '\-3d' (ou `\-4d'
+ etc.) à la place. Ceci oblige LDmicro à imprimer un espace d'entête
+ pour les nombres positifs et un signe moins d'entête pour les chiffres
+ négatifs.
+
+ Si de multiples instructions de chaines formattées sont activées au
+ même moment (ou si une est activée avant de finir la précédente)
+ ou si ces instructions sont imbriquées avec des instructions TX
+ (transmission), le comportement est indéfini.
+
+ Il est aussi possible d'utiliser cette instruction pour sortie une
+ chaine fixe, sans l'intervention d'une variable en valeur entière
+ dans le texte qui est envoyée sur la ligne série. Dans ce cas,
+ simplement ne pas inclure de séquence spéciale Escape.
+
+ Utiliser `\\' pour l'anti-slash. en addition à une séquence escape
+ pour intervenir sue une variables entière, les caractères de
+ contrôles suivants sont utilisables :
+
+ * \r -- retour en début de ligne
+ * \n -- nouvelle ligne
+ * \f -- saut de page
+ * \b -- retour arrière
+ * \xAB -- caractère avec valeur ASCII 0xAB (hex)
+
+ La condition de sortie de cette instruction est vraie quand elle
+ transmet des données, sinon elle est fausse. Cette instruction
+ consomme une grande quantité de mémoire, elle doit être utilisée
+ avec modération. L'implémentation présente n'est pas efficace, mais
+ une meilleure implémentation demanderait une modification de tout
+ le reste.
+
+NOTE CONCERNANT LES MATHS
+=========================
+
+Souvenez vous que LDmicro travaille uniquement en mathématiques entiers
+16 bits. Ce qui fait que le résultat final de même que tous les calculs
+mêmes intermédiaires seront compris entre -32768 et 32767.
+
+Par exemple, si vous voulez calculer y = (1/x)*1200,ou x est compris
+entre 1 et 20, ce qui donne un résultat entre 1200 et 60,le résultat est
+bien à l'intérieur d'un entier 16 bits, il doit donc être théoriquement
+possible de faire le calcul. Nous pouvons faire le calcul de deux façons
+d'abord faire 1/x et ensuite la multiplication:
+
+ || {DIV temp :=} ||
+ ||---------{ 1 / x }----------||
+ || ||
+ || {MUL y := } ||
+ ||----------{ temp * 1200}----------||
+ || ||
+
+Ou uniquement faire simplement la division en une seule ligne :
+
+ || {DIV y :=} ||
+ ||-----------{ 1200 / x }-----------||
+
+Mathématiquement c'est identique, la première donne y = 0 , c'est à dire
+une mauvais résultat, si nous prenons par exemple x = 3 , 1/x = 0.333 mais
+comme il s'agit d'un entier, la valeur pour Temp est de 0 et 0*1200 = 0
+donc résultat faux.Dans le deuxième cas, il n'y a pas de résultat
+intermédiaire et le résultat est correct dans tous les cas.
+
+Si vous trouvez un problème avec vos calculs mathématiques, vérifiez les
+résultats intermédiaires, si il n'y a pas de dépassement de capacités par
+rapports aux valeurs entières. (par exemple 32767 + 1 = -32768). Quand
+cela est possible essayer de choisir des valeurs entre -100 et 100.
+
+Vous pouvez utiliser un certain facteur de multiplication ou division pour
+mettre à l'echelle les variables lors de calculs par exemple : pour mettre
+mettre à l'echelle y = 1.8*x , il est possible de faire y =(9/5)*x
+(9/5 = 1.8) et coder ainsi y = (9*x)/5 en faisant d'abord la multiplication
+
+ || {MUL temp :=} ||
+ ||---------{ x * 9 }----------||
+ || ||
+ || {DIV y :=} ||
+ ||-----------{ temp / 5 }-----------||
+
+Ceci fonctionne tant que x < (32767 / 9), or x < 3640. Pour les grandes
+valeurs de x,la variable `temp' va se mettre en dépassement. Ceci est
+similaire vers la limite basse de x.
+
+
+STYLE DE CODIFICATION
+=====================
+
+Il est permis d'avoir plusieurs bobines en parallèle, contrôlées par
+une simple ligne comme ci-dessous :
+
+ || Xa Ya ||
+ 1 ||-------] [--------------( )-------||
+ || ||
+ || Xb Yb ||
+ ||-------] [------+-------( )-------||
+ || | ||
+ || | Yc ||
+ || +-------( )-------||
+ || ||
+
+à la place de ceci :
+
+ || Xa Ya ||
+ 1 ||-------] [--------------( )-------||
+ || ||
+ || ||
+ || ||
+ || ||
+ || Xb Yb ||
+ 2 ||-------] [--------------( )-------||
+ || ||
+ || ||
+ || ||
+ || ||
+ || Xb Yc ||
+ 3 ||-------] [--------------( )-------||
+ || ||
+
+Il est permis théoriquement d'écrire un programme avec une séquence très
+importante et de ne pas utiliser plusieurs lignes pour la faire. En
+pratique c'est une mauvaise idée, à cause de la compléxité que cela
+peut engendrer et plus difficile à éditer sans effacer et redessiner un
+certain nombre d'éléments de logique.
+
+Néanmoins, c'est une bonne idée de regrouper différents éléments d'un bloc
+logique dans une seule séquence. Le code généré est identique dans les
+deux cas, et vous pouvez voir ce que fait la séquence dans le diagramme
+à contacts.
+
+ * * *
+
+En général, il est considéré comme mauvais d'écrire du code dont la
+sortie dépend de l'ordre d'exécution. Exemple : ce code n'est pas très
+bon lorsque xa et xb sont vrai en même temps :
+
+ || Xa {v := } ||
+ 1 ||-------] [--------{ 12 MOV}--||
+ || ||
+ || Xb {v := } ||
+ ||-------] [--------{ 23 MOV}--||
+ || ||
+ || ||
+ || ||
+ || ||
+ || [v >] Yc ||
+ 2 ||------[ 15]-------------( )-------||
+ || ||
+
+Ci-dessous un exemple pour convertir 4 bits Xb3:0 en un entier :
+
+ || {v := } ||
+ 3 ||-----------------------------------{ 0 MOV}--||
+ || ||
+ || Xb0 {ADD v :=} ||
+ ||-------] [------------------{ v + 1 }-----------||
+ || ||
+ || Xb1 {ADD v :=} ||
+ ||-------] [------------------{ v + 2 }-----------||
+ || ||
+ || Xb2 {ADD v :=} ||
+ ||-------] [------------------{ v + 4 }-----------||
+ || ||
+ || Xb3 {ADD v :=} ||
+ ||-------] [------------------{ v + 8 }-----------||
+ || ||
+
+Si l'instruction MOV est déplacée en dessous des instructions ADD, la
+valeur de la variable v, quand elle est lue autrepart dans le programme,
+serait toujours 0. La sortie du code dépend alors de l'ordre d'évaluations
+des instructions. Ce serait possible de modifier ce code pour éviter cela,
+mais le code deviendrait très encombrant.
+
+DEFAUTS
+=======
+
+LDmicro ne génére pas un code très efficace; il est lent à exécuter et
+il est gourmand en Flash et RAM. Un PIC milieu de gamme ou un AVR peut
+tout de même faire ce qu'un petit automate peut faire.
+
+La longueur maximum des noms de variables est très limitée, ceci pour
+être intégrée correctement dans le diagramme logique, je ne vois pas de
+solution satisfaisante pour solutionner ce problème.
+
+Si votre programme est trop important, vitesse exécution, mémoire
+programme ou contraintes de mémoire de données pour le processeur que vous
+avez choisi, il n'indiquera probablement pas d'erreur. Il se blocquera
+simplement quelque part.
+
+Si vous êtes programmeur négligent dans les sauvegardes et les
+chargements, il est possible qu'un crash se produise ou exécute un code
+arbitraire corrompu ou un mauvais fichier .ld .
+
+SVP, faire un rapport sur les bogues et les demandes de modifications.
+
+Thanks to:
+ * Marcelo Solano, for reporting a UI bug under Win98
+ * Serge V. Polubarjev, for not only noticing that RA3:0 on the
+ PIC16F628 didn't work but also telling me how to fix it
+ * Maxim Ibragimov, for reporting and diagnosing major problems
+ with the till-then-untested ATmega16 and ATmega162 targets
+ * Bill Kishonti, for reporting that the simulator crashed when the
+ ladder logic program divided by zero
+ * Mohamed Tayae, for reporting that persistent variables were broken
+ on the PIC16F628
+ * David Rothwell, for reporting several user interface bugs and a
+ problem with the "Export as Text" function
+
+Particular thanks to Marcel Vaufleury, for this translation (of both
+the manual and the program's user interface) into French.
+
+
+COPYING, AND DISCLAIMER
+=======================
+
+DO NOT USE CODE GENERATED BY LDMICRO IN APPLICATIONS WHERE SOFTWARE
+FAILURE COULD RESULT IN DANGER TO HUMAN LIFE OR DAMAGE TO PROPERTY. THE
+AUTHOR ASSUMES NO LIABILITY FOR ANY DAMAGES RESULTING FROM THE OPERATION
+OF LDMICRO OR CODE GENERATED BY LDMICRO.
+
+This program is free software: you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation, either version 3 of the License, or (at your
+option) any later version.
+
+This program is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License along
+with this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+Jonathan Westhues
+
+Rijswijk -- Dec 2004
+Waterloo ON -- Jun, Jul 2005
+Cambridge MA -- Sep, Dec 2005
+ Feb, Mar 2006
+
+Email: user jwesthues, at host cq.cx
+
+