
INTRODUCCION
============

LDmicro genera cdigo nativo para ciertos Microchip PIC16 y Microcontroladores Atmel AVR Por lo general, el software para estos microcontroladores est escrito en lenguaje de programacin como ensamblador, C o BASIC. Un programa en uno de estos lenguajes  comprende una lista de enunciados. Estos lenguajes son potente y bien  adaptados a la arquitectura del procesador, que ejecuta internamente una lista de instrucciones.

    Los PLCs, por otro lado, se programan a menudo en `lenguaje de contactos '. Un simple programa podra verse as:

   ||                                                                    ||
   ||    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 es un retardo de encendido, TOF es un retardo de apagado, las sentencias -] [- son entradas, que se comportan como los contactos de un rel. Los - () - son salidas, que se comportan algo as como la bobina de un rel. Existen buenas referencias para la lgica de contactos que estn disponibles en Internet  y en otros lugares. Los detalles especficos de esta implementacin se dan a continuacin.)

Son evidentes las siguientes diferencias:

* El programa se presenta en formato grfico, no como una lista textual de instrucciones. Muchas personas encontrarn inicialmente esto ms fcil de entender.

* En el nivel ms bsico, los programas parecen diagramas de circuito, con contactos de rel (entradas) y bobinas (salidas). Esto es intuitivo para los programadores con   conocimiento de la teora de circuitos elctricos.

* El compilador lgico del lenguaje de contactos se encarga de lo que se calcula dnde. No es necesario escribir cdigo para determinar cundo las salidas recalcularse   sobre la base de un cambio en los insumos o un temporizador, y no es necesario especificar el orden en el que,   estos clculos deben tener lugar; Las herramientas del   PLC hacen eso por usted.

LDmicro compila lgica de contactos a PIC16 o cdigo AVR. Los siguientes procesadores son compatibles:

    * PIC16F877
    * PIC16F628
    * PIC16F876 (no testeado)
    * PIC16F88 (no testeado)
    * PIC16F819 (no testeado)
    * PIC16F887 (no testeado)
    * PIC16F886 (no testeado)
    * ATmega128
    * ATmega64
    * ATmega162 (no testeado)
    * ATmega32 (no testeado)
    * ATmega16 (no testeado)
    * ATmega8 (no testeado)

Sera fcil soportar ms chips AVR o PIC16, pero no tengo forma de probarlos. Si necesita una en particular, pngase en contacto conmigo y ver que puedo hacer.

Usando LDmicro, puede dibujar un diagrama de contactos para su programa. Usted puede Simular la lgica en tiempo real en su PC. Entonces, cuando est convencido que es correcto que puede asignar pines en el microcontrolador a la entradas y salidas del programa. Una vez que haya asignado los pines, puede compilar el cdigo PIC o AVR para su programa. La salida del compilador es un fichero hexadecimal ** .hex  archivo que puede programar en su microcontrolador utilizando cualquier programador PIC / AVR.

LDmicro est diseado para ser como la mayora de los Sisyemas PLC Comerciales de programacin. Hay algunas excepciones, y muchas cosas no son estndar en la industria de todos modos. Lea atentamente la descripcin de cada instruccin, aunque parezca familiar. Este documento presupone conocimiento bsico de la lgica de contactos y de la estructura del software del PLC (El ciclo de ejecucin: entradas de lectura, clculo, salidas de escritura).


OBJETIVOS ADICIONALES
==================

Tambin es posible generar cdigo ANSI C. Usted podra usar esto con cualquier procesador para el que tiene un compilador C, pero usted es responsable de suministrando el tiempo de ejecucin. Eso significa que LDmicro slo genera fuentes para una funcin PlcCycle (). Usted es responsable de llamar a PlcCycle cada ciclo, y usted es responsable de implementar todas las E / S (Entrada digital de lectura / escritura, etc.) que el PlcCycle () llama. Ver los comentarios en la fuente generada para obtener ms detalles.

Por ltimo, LDmicro puede generar bytecode independiente del procesador para un mquina virtual diseada para ejecutar cdigo de lgica de contactos. He proporcionado un ejemplo de implementacin del intrprete / VM, escrito en C estandard. Esta meta funcionar para casi cualquier plataforma, siempre y cuando puede suministrar su propia VM. Esto podra ser til para aplicaciones en las que desea usar la lgica ladder como un `lenguaje de scripting 'para personalizar un programa. Vea los comentarios en el intrprete de muestra para ms detalles.

Se ha aadido un nuevo objetivo "Controllino Maxi / Ext bytecode". Genera  .xint interpretable por el software del PLC de LDuino. Hasta ahora solo controlador Maxi PLC es compatible. Sin embargo, como el bytecode es genrico, la adaptacin a cualquier otro PLC o tarjeta de la CPU se podra hacer. Vea el cdigo fuente de LDuino para eso.

OPCIONES LINEA DE COMANDO
====================

Ldmicro.exe normalmente se ejecuta sin opciones de lnea de comandos. Eso significa que basta que haga un acceso directo al programa, o guardarlo en su escritorio y haga doble clic en el icono cuando desee ejecutarlo y, a continuacin, puede hacer todo desde dentro del ENTORNO.

Si se pasa LDmicro un nombre de archivo nico en la lnea de comandos  (Por ejemplo, `ldmicro.exe asd.ld '), entonces LDmicro intentar abrir` asd.ld', si existe. Se produce un error si `asd.ld 'no existe. Esto significa que puede asociar ldmicro.exe con archivos .ld, para que se ejecute automticamente al hacer doble clic en un archivo .ld.

Si LDmicro se pasa argumentos de lnea de comandos en el formulario `Ldmicro.exe / c src.ld dest.hex ', entonces intenta compilar` src.ld', Y guarde la salida como `dest.hex '. LDmicro sale despus de compilar, Si la compilacin fue exitosa o no. Los mensajes se imprimen en la consola. Este modo slo es til cuando se ejecuta LDmicro lnea de comando.


LO ESENCIAL
===========

Si ejecuta LDmicro sin argumentos, entonces comienza con un archivo vaco programa. Si  ejecuta LDmicro con el nombre de un programa de lenguaje de contactos (xxx.ld) en la lnea de comandos, entonces se intentar cargar ese programa en el inicio.

LDmicro utiliza su propio formato interno para el programa; no puede importar Lgica de cualquier otra herramienta.

Si no carg un programa ya existente, se le dar un programa con un diagrama de contactos vaco. Usted podra agregarle una instruccin; por ejemplo puede agregar un conjunto de contactos (Instruccin -> Insertar contactos) denominados `Xnew '. `X 'significa que los contactos estarn unidos a un pin de entrada en el Microcontrolador Puede asignarle un pin ms adelante, despus con la seleccin del Microcontrolador podr cambiar el nombre de los contactos. La primera letra de un nombre indica qu tipo de objeto es. Por ejemplo:

    * Xname - indica un pin de entrada en el microcontrolador
    * Yname - indica un pin de salida en el microcontrolador
    * Rname - `relay interno ': un bit en la memoria
    * Tname - un temporizador; Retardo de encendido, retardo de apagado o retencin
    * Cname - un contador, ya sea cuenta adelante o cuenta atrs
    * Aname - un entero ledo de un convertidor A/D
    * Pname - vinculado a un pin de salida PWM en el microcontrolador
    * Mname - vinculado a una salida de bobina MODBUS
    * Iname - ligado a una entrada discreta MODBUS
    * Hname - vinculado a un registro de MODBUS Holding
    * Nombre - una variable de uso general (entero)

Nombre de variable que comienza con el smbolo '#' como  #PORTA, #PORTB, #PORTC, ... tratado como puerto de hardware de salida.  Nombre de variable que comienza con el smbolo '#' como #PINA, #PINB, #PINC, ... tratados como puerto de hardware de entrada.
Nombre de variable que comienza con el smbolo '#' como #TRISA, #TRISB, #TRISC, ...  tratados como registro de direccin de datos de puertos correspondientes #PORTA, #PORTB, #PORTC, ...

    Nota: Direccin PORTn y PINn son iguales a PIC's.

El nombre de la variable que comienza con un carcter '#' y un nmero posterior   (Comnmente un hexadecimal) tratado como direccin inmediata del registro de hardware.
Tenga cuidado al escribir en los registros de hardware mediante el acceso inmediato a direcciones.

Elija el resto del nombre para que describa lo que hace el objeto, y para que sea nico dentro del programa. El mismo nombre siempre se refiere al mismo objeto dentro del programa. Por ejemplo, sera un error para tener un retardo de encendido (TON) llamado `Tdelay 'y un retardo de apagado (TOF) llamado "Tdelay" en el mismo programa, ya que cada contador necesita su propio memoria. Por otro lado, sera correcto tener un temporizador retentivo (RTO) llamado `Tdelay 'y una instruccin de restablecimiento (RES) asociada con `Tdelay ', ya que en ese caso desea que ambas instrucciones funcionen con el mismo temporizador.

Los nombres de las variables pueden consistir en letras, nmeros y subrayados '_'. El nombre de una variable no debe comenzar con un nmero. Los nombres de variable son distingue maysculas y minsculas.

Las instrucciones variables generales (MOV, ADD, EQU, etc.) pueden trabajar variables con cualquier nombre. Esto significa que pueden acceder al temporizador y contra acumuladores. Esto a veces puede ser til; Por ejemplo, usted podra comprobar si el conteo de un temporizador est en un rango determinado.

Las variables son siempre enteros de 16 bits. Esto significa que pueden ir de -32768 a 32767. Las variables siempre se tratan como firmadas. Usted puede especifique literales como nmeros decimales normales (10, 1234, -56). T tambin puedes especifique valores de carcter ASCII ('A', 'z') colocando el carcter en comillas simples. Puede utilizar un cdigo de caracteres ASCII en la mayora de los lugares que puede utilizar un nmero decimal.

Puede utilizar nmeros hexadecimales (0xA, 0x04D2, 0xffc8), Octal (0o12, 0o2322, 0o177710), nmeros binarios (0b1010, 0b10011010010, 0b1111111111001000)
En la mayora de los lugares que podra utilizar un nmero decimal. LDmicro utiliza los prefijos C:

    0x__ o 0X__ para nmeros hexadecimales con dgitos 1234567890ABCDEF
    0o__ o 0O__ o 0__ nmeros octales con 01234567 dgitos
    0b__ o 0B__ para nmeros binarios con 01 dgitos.

Hexadecimales, la notacin binaria es ms cmoda para las operaciones bit a bit.

En la parte inferior de la pantalla ver una lista de todos los objetos el programa. Esta lista se genera automticamente desde el programa; no hay necesidad de mantenerlo actualizado a mano. La mayora de los objetos no necesita cualquier configuracin. Los objetos `Xname ',` Yname' y `Aname 'deben ser asignado a un pin en el microcontrolador, sin embargo. Primero elige cul Microcontrolador que est utilizando (Configuracin -> Microcontrolador). A continuacin, asigne los pines de E / S haciendo doble clic en ellos en la lista.

Puede modificar el programa insertando o eliminando instrucciones. El cursor en la pantalla del programa parpadea para indicar lal instruccin y el punto de insercin actual. Si no est parpadeando entonces pulse <Tab> o haga clic en una instruccin. Ahora puede borrar o puede insertar una nueva instruccin a la derecha o a la izquierda (en serie con) o por encima o por debajo (en paralelo con) la instruccin. Algunas operaciones no estn permitidas. Por ejemplo, no hay instrucciones se dejan a la derecha de una bobina.

El programa comienza con un solo linea. Puede agregar ms niveles seleccionando inserte Rung Before / After en el men Logic. Podras obtener el mismo efecto colocando muchos subcircuitos complicados en paralelo en un linea, pero es ms claro utilizar mltiples escalones.

Una vez que hayas escrito un programa, puedes probarlo en simulacin y luego puede compilarlo en un archivo HEX para el microcontrolador de destino.


SIMULACION
==========

Para entrar en el modo de simulacin, seleccione Simular -> Modo de simulacin o pulse  <Ctrl + M>. El programa se muestra de forma diferente en el modo de simulacin. Ahi esta ya no es un cursor. Las instrucciones que estn energizadas aparecen brillantes rojo; Las instrucciones que no aparecen en gris. Presione la barra espaciadora para ejecutar el PLC un ciclo. Para realizar un ciclo continuo en tiempo real, seleccione Simular -> Iniciar Simulacin en tiempo real, o presionar <Ctrl + R>. La visualizacin del programa se actualizar en tiempo real a medida que cambie el estado del programa.

Puede configurar el estado de las entradas al programa haciendo doble clic en la lista en la parte inferior de la pantalla, o haciendo doble clic en `Xname 'entra en contacto con la instruccin en el programa. Si cambia el estado de un pin de entrada entonces ese cambio no se reflejar en cmo el programa se visualiza hasta que el PLC cicla; Esto suceder automticamente si est ejecutando una simulacin en tiempo real, o cuando presiona la barra espaciadora.


COMPILANDO A CDIGO NATIVO
==========================

En ltima instancia, el punto es generar un archivo .hex que puede programar en su microcontrolador. Primero debe seleccionar el nmero de pieza del microcontrolador, en el men  Configuracin -> Microcontrolador. Entonces t debed asignar un pin de E / S a cada objeto `Xname 'o` Yname'. Hacer esto por haz doble clic en el nombre del objeto en la lista en la parte inferior de la pantalla. Aparecer un cuadro de dilogo donde podr elegir un pin no asignado de una lista.

Luego debe elegir el tiempo de ciclo con el que va a ejecutar, y debe especificar al compilador en qu velocidad de reloj se ejecutar el micro. Esta se ajusta en el men Ajustes -> Parmetros MCU .... En general, usted no debe necesitar cambiar el tiempo del ciclo; 10 ms es un buen valor para la mayora aplicaciones. Escriba la frecuencia del cristal que va a usar con el microcontrolador (o el resonador cermico, etc.) y haga clic en OK.

Ahora puede generar cdigo desde su programa. Elija Compilar -> Compilar, o Compilar -> Compilar Como ... si ha compilado previamente este programa y desea especificar un nombre de archivo de salida diferente. Si no hay errores, entonces LDmicro generar un archivo Intel IHEX listo para programacin en su chip.

Utilice cualquier software de programacin y hardware que tenga para cargar el archivo hexadecimal en el microcontrolador. Recuerde configurar los bits de configuracin (Fusibles)! Para los procesadores PIC16, los bits de configuracin estn incluios en el fichero Hex, y la mayora del software de programacin buscar all automticamente.

Para procesadores AVR debe configurar los bits de configuracin manualmente.

REFERENCIA DE INSTRUCCIONES
===========================

Terminologa:

* "Nivel sensible" = salida (elemento) controlada por el nivel de la entrada.
* Edge triggered" = cambios de salida slo en el punto de disparo cuando la entrada cambia de valor a la otra. Puede ser positivo activado por el flanco (0 a 1) o activado por el flanco negativo (1 a 0).
* La mayora de los elementos de LDmicro son "nivel sensible", algunos elementos son     "Activado por flanco positivo".


> CONTACTO, NORMALMENTE ABIERTO     Xname           Rname          Yname
                                 ----] [----     ----] [----    ----] [----

Si la seal que adquiere es cero, entonces la salida la seal es cero. Si la seal que entra es uno, entonces la seal de salida es uno si y slo si el contacto es de salida  o de rel interno es uno la salida ser uno, de lo contrario es falso. Esta instruccin puede examinar el estado de un pin de entrada, un pin de salida, o un rel interno.


> CONTACTO, NORMALMENTE CERRADO      Xname           Rname          Yname
                                  ---]/[----     ----]/[----    ----]/[----

Si la seal que adquiere la instruccin es uno, entonces la salida la seal es falsa. Si la seal que entra en la instruccin es cero, entonces la seal de salida es uno, si y slo si el pin de entrada dado, el pin de salida o el rel interno es cero la salida es uno, de lo contrario es cero. Esta instruccin puede examinar el estado de un pin de entrada, un pin de salida, o un rel interno.
Esta instruccin es lo contrario de un contacto normalmente abierto.


> BOBINA, NORMAL                   Rname           Yname
                                ----( )----     ----( )----

Si la seal que entra en la instruccin es cero, entonces el rel interno o el pin de salida se cero. Si la seal en esta instruccin es uno, entonces el rel o salida interno o el PIN de salida es uno. No es significativo asignar una variable de entrada a un bobina. Esta instruccin debe estar siempre en la parte derecha de la lnea.
Sensible a Nivel.


> BOBINA, NEGADA                Rname           Yname
                              ---(/)----     ----(/)----

Si la seal que entra en la instruccin es uno, entonces el rel interno o el pin de salida se desactivan cero. Si la seal en esta instruccin es falsa, entonces el rel interno dado o el pin de salida es true. No es significativo asignar una entrada variable a una bobina. Esto es lo  contrario de una bobina normal. Esta instruccin debe estar siempre en la parte derecha de la lnea.
Nivel sensible.


> SET BOBINA           Rname           Yname
                    ----(S)----     ----(S)----

Si la seal que entra en la instruccin es uno, entonces el estado del rel interno o el pin de salida pasa a ser uno. De lo contrario, el rel o el estado del pin de salida no se cambia. Esta instruccin solo puede cambiar el estado de una bobina de cero a uno, por lo que es tpicamente utilizado en combinacin con una bobina de reset. Esta instruccin debe estar siempre en la parte derecha de la lnea.

Simplemente puede presentarse como un disparador con la entrada sensible al nivel SET.


> RESET BOBINA                 Rname           Yname
                            ----(R)----     ----(R)----

Si la seal que entra en la instruccin es verdadera, entonces el dado el rel interno o el pin de salida se pone a cero. De lo contrario, el rel interno o el estado del pin de salida no se cambia.

Esta instruccin slo puede cambiar el estado de una bobina de verdadero a falso, por lo que se utiliza normalmente en combinacin con una bobina de slo set. Esta instruccin debe estar siempre en la parte derecha de la lnea.

Simplemente puede presentarse como un disparador con la entrada sensible al nivel RESET.


> BOBINA, T-TRIGGER              Rname           Yname
                              ----(T)----     ----(T)----

Un disparador T de una bobina es un flip-flop gobernado por flancos (conmutacin, on, off). Un flip-flop de bobina cada flanco ascendente de la condicin de entrada (es decir, lo que la condicin de entrada pasa de falso a verdadero).

Si se detecta el flanco ascendente, entonces si el estado de la bobina es falso, se establece true.

Si se detecta el siguiente flanco de subida, entonces si el estado de la bobina es verdadero, se establece en falso.

Esta instruccin debe estar siempre en la parte derecha de la lnea.

Simplemente puede presentarse como un T-trigger con el positivo entrada accionada por flanco.

Nota: Las varias bobinas con el mismo 'YName' o 'RName' pueden ser mentalmente representado como un microchip con entradas mltiples y una salida.
La entrada normal e invertida transfiere directamente el estado de entrda (normal o invertida) a la salida. Las entradas R, S, T bloquean (bloquean) el estado de salida.
La entrada T es activada por el flanco positivo. Las entradas R, S son sensibles al nivel. Si antes de R, S insertar el "OSR: ONE-SHOT RISING" o "OSF: ONE-SHOT FALLING" se obtiene un elemento "activado por el borde positivo".

Si se usan slo las entradas R y S se obtiene clsico disparador RS. Si se agrega la entrada T, se obtiene el "ms reciente" disparador RST. Pueden ser varias entradas R..R, o varias entradas S..S. Puede utilizar cualquier combinacin de entradas para un 'YName' o  la bobina 'RName'.


> RETARDO AL ACTIVAR                Tdon
                               -[TON 1.000 s]-

Cuando la seal que entra en la instruccin va de falso a verdadero, la seal de salida permanece falsa durante 1.000 s antes de pasar a true. Cuando  la seal que entra en la instruccin va de verdadero a falso, la salida la seal se convierte en falsa inmediatamente. El temporizador se restablece cada vez que la entrada se vuelve falso; La entrada debe permanecer verdadera durante 1000 milisegundos consecutivos antes de que la salida sea verdadera. El retardo es configurable.

La variable `Tname 'cuenta desde cero en unidades de tiempos de escaneado. La instruccin TON produce valores verdaderos cuando la variable del contador es mayor igual o igual al retardo dado. Es posible manipular el contador en otro lugar, por ejemplo con una instruccin MOV.


> RETARDO AL DESACTIVAR              Tdoff
                                 -[TOF 1.000 s]-

Cuando la seal que entra en la instruccin va de verdadero a falso, la seal de salida permanece verdadera durante 1.000 s antes de pasar a falso. Cuando la seal que entra en la instruccin va de falso a verdadero, la seal de salida se vuelve verdad inmediatamente. El temporizador se restablece cada tiempo en que la entrada es falsa; La entrada debe permanecer falsa para 1000 milisegundos consecutivos antes de que la salida sea falsa. El retraso es configurable.

La variable `Tname 'cuenta desde cero en unidades de tiempos de escaneado. La instruccin TON produce valores verdaderos cuando la variable del contador es mayor igual o igual al retardo dado. Es posible manipular el contador en otro lugar, por ejemplo con una instruccin MOV.


> TEMPORIZADOR RETROACTIVADO               Trto
                                      -[RTO 1.000 s]-

Esta instruccin hace un seguimiento de cunto tiempo su entrada ha sido verdadera. Si su entrada ha sido verdadera para por lo menos 1.000 s, entonces la salida es cierto. De lo contrario, la salida es falsa. La entrada no debe haber sido True durante 1000 milisegundos consecutivos; Si la entrada es verdadera para 0,6 s, luego falso para 2,0 s, y luego verdadero para 0,4 s, entonces el la salida ser verdadera. Despus de que la salida sea verdadera permanecer verdadera incluso despus de que la entrada sea falsa, siempre y cuando la entrada haya sido verdadera por ms de 1.000 s. Este temporizador debe ser restablecido manualmente, utilizando la instruccin de reinicio.

La variable `Tname 'cuenta desde cero en unidades de tiempos de escaneado. La instruccin TON produce valores verdaderos cuando la variable del contador es mayor igual o igual al retardo dado. Es posible manipular el contador en otro lugar, por ejemplo con una instruccin MOV.


> TEMPORIZADOR CICLICO                Tmeander
                                   -[TCY 500 ms]-

Si la seal de entrada es verdadera, esta instruccin produce un meandro con perodo 1 s y frecuencia 1 Hz. Si la seal entra en la instruccin es falsa, entonces la seal de salida es falsa.
Si el valor Tmeander = tiempo de ciclo del PLC, el TCY es igual a OSC.


> RESET                        Trto             Citems
                          ----{RES}----     ----{RES}----

Esta instruccin restablece un temporizador o un contador. Los temporizadores TON y TOF son automticamente cuando la entrada es falsa o verdadera, por lo que RES no es necesario para estos temporizadores. Los temporizadores RTO y CTU / CTD no son reseteados automticamente, por lo que deben restablecerse a mano utilizando una instruccin RES. Cuando la entrada es verdadera, el contador o temporizador se restablece; cuando la entrada es falsa, no se toma ninguna accin. Esta instruccin debe ser la instruccin ms a la derecha en su linea.
Nota! RES restablece slo el contador numrico dentro de RTO, CTU / CTD, no sus salidas!


> RESET                         PWM
                           ----{RES}----

Esta instruccin inhabilita la salida de PWM y la fija en el nivel bajo.
Tambin puede establecer otra frecuencia de base PWM mediante SET PWM DUTY CYCLE  despus de accionar el RESET PWM.

Vea SET PWM DUTY CYCLE a continuacin.


> DETECTOR FLANCO SUBIDA               _    _
                                  --[_/ OSR/ \_]--

Normalmente, esta instruccin produce un false. Si la entrada de la instruccin es cierto durante esta exploracin y fue falso durante la exploracin anterior entonces la salida es verdadera. Por lo tanto, genera un pulso una exploracin de ancho en cada flanco ascendente de su seal de entrada. Esta instruccin es til si desea activar eventos fuera del flanco ascendente de una seal.


> DETECTOR FLANCO BAJADA           _      _
                                 -[ \_OSF/ \_]--

Normalmente, esta instruccin produce un false. Si la entrada de la instruccin es falso durante esta exploracin y fue cierto durante la exploracin anterior entonces la salida es verdadera. Por lo tanto, genera un pulso una exploracin de ancho en cada borde descendente de su seal de entrada. Esta instruccin es til si desea activar eventos fuera del borde descendente de una seal.

                               Esta es una seal de entrada
                                   v
                              _     _
                           --[_/ OSR_/ \_]--

                                     ^
                                     this is  output signal
                                     v
                              _       _
                           --[ \_OSF_/ \_]--

                               ^
                               this is  input signal



                     logic level
                          ^  The duration of the input pulse is five cycles
                  OSR, OSF|     _________
                  input   | ___/         \_______
                          |
                  OSR     |     _
                  output  | ___/ \_______________
                          |
                  OSF     |               _
                  output  | _____________/ \_____
                        --+---------------------------> time
                          |
       PLC cycle time beat N+ 0 1 2 3 4 5 6 7 8


                     logic
                     level
                          ^      Single-cycle input pulse
                  OSR, OSF|     _
                  input   | ___/ \_______
                          |
                  OSR     |     _
                  output  | ___/ \_______
                          |
                  OSF     |       _
                  output  | _____/ \_____
                        --+------------------> time
                          |
       PLC cycle time beat N+ 0 1 2 3 4 5 6


> OSCILADOR                      _   _
                             OSC/ \_/ \_]--

                             F=1/(2*Tcycle)
                                    _   _   _   _   _
                    _______/ \_/ \_/ \_/ \_/ \_______

Si la seal de entrada es verdadera, esta instruccin produce un meandro con  (Tiempo de ciclo de 2 * PLC). Si la seal entra en la instruccin es falsa, entonces la seal de salida es falsa.


> CORTO CIRCUITO, CIRCUITO ABIERTO

                           ----+----+----      ----+     +----

La condicin de salida de un cortocircuito es siempre igual a su condicin de entrada. La condicin de salida de un circuito abierto es siempre  falso. stos son sobre todo tiles para la depuracin, cortocircuito temporal  Circuito o conocer y probar un circuito elctrico.


> RELE MAESTRO DE CONTROL
                                     -{MASTER RLY}-

De forma predeterminada, la condicin de inicio de cada rengln es verdadera. Si un maestro la instruccin de rel de control se ejecuta con una condicin de False, entonces la condicin rung-in para todos los siguientes falso. Esto continuar hasta que el siguiente rel de control maestro se alcanza la instruccin (independientemente de la condicin de instruccin). Por lo tanto, estas instrucciones deben utilizarse por parejas: Uno para (quizs condicionalmente) iniciar la seccin posiblemente discapacitados, y uno para terminarlo.


> MOVER                     {destvar :=  }      {Tret :=     }
                           -{ 123     MOV}-    -{ srcvar  MOV}-


Cuando la entrada a esta instruccin es verdadera, variable de destino igual a la variable fuente o constante. Cuando la entrada a esta instruccin es falsa nada sucede. Se puede asignar a cualquier variable con la instruccin move; esto incluye temporizador y contador de variables de estado, que pueden ser distinguido por el lder 'T' o 'C'. Por ejemplo, una instruccin mover 0 a `Tretentive 'es equivalente a una instruccin reset (RES) para ese temporizador. Esta instruccin debe ser la instruccin ms a la derecha en su linea.


> OPERACIONES ARITMTICAS       {ADD  kay  :=}       {SUB  Ccnt :=}
                               -{ 'a' + 10   }-     -{ Ccnt - 10  }-

                               {MUL  dest :=}       {DIV    dv :=}
                               -{ var * -990 }-     -{ dv / -10000}-


Cuando la entrada a esta instruccin es verdadera, Variable de destino igual a la expresin dada. Los operandos Pueden ser variables (incluyendo variables de contador y contador) o constantes. Estas instrucciones utilizan matemticas firmadas de 16 bits. Recuerda que el resultado se evala cada ciclo cuando la condicin de entrada cierto. Si est incrementando o decrementando una variable (es decir, si la variable de destino es tambin uno de los operandos), entonces usted probablemente no quieren eso; Tpicamente usara un one-shot para que se evala slo en el borde ascendente o descendente de la entrada condicin. Divide truncates; 7/3 = 2. Esta instruccin debe ser la instruccin ms a la derecha en su linea.


  MODULO                   {MOD     dest:=}
                          -{src     %    2}-


    Ejemplo de divison 7 % 3 = 1
    https://en.wikipedia.org/wiki/Modulo_operation

  NEGATIVE                 {NEG     dest:=}
                          -{         - src}-

    Negative -{NEG a:= -a}- es el equivalente optimizado de -{SUB a:= 0 - a}-


> OPERACIONES EN MODO BIT    {AND  var1 :=}       {OR   Ccnt :=}
                            -{var2 & var3 }-     -{ Ccnt | 0o07}-

                             {XOR  dest :=}       {NOT  dv :=  }
                            -{ var ^ 0xAA }-     -{ ~0b11001100}-

Cuando la entrada a esta instruccin es verdadera, variable de destino igual a la expresin dada. Los operandos pueden ser variables (incluyendo variables de contador y contador) o constantes. Recuerde que el resultado se evala cada ciclo cuando la condicin de entrada es verdadera.  Por favor, lea

http://en.wikipedia.org/wiki/Bitwise_operation

> DESPLAZAMIENTO ARITMETICO: SHL, SHR.
    https://en.wikipedia.org/wiki/Arithmetic_shift

> DESPLAZAMIENTO LOGICO A LA DERECHA SR0.
    https://en.wikipedia.org/wiki/Logical_shift

El cambio lgico a la izquierda es equivalente a SHL cambio aritmtico a la izquierda.


> DESPLAZAMIENTO CIRCULAR: ROL, ROR.
    https://en.wikipedia.org/wiki/Circular_shift

                              {SHL  var1 :=}       {SHR   cnt :=}
                             -{var2 << 2   }-     -{  cnt >>  1 }-

                  {SR0  dest :=}       {ROL  dest :=}       {ROR    dv :=}
                 -{var  sr0  3 }-     -{ var rol 4  }-     -{var ror 4   }-

Cuando la entrada a esta instruccin es verdadera, variable de destino igual a la expresin dada. Los operandos pueden ser variables (incluyendo variables de contador y contador) o constantes. Recuerde que el resultado se evala cada ciclo cuando la condicin de entrada es verdadera.


> OPERACIONES CON UN BIT      {           var}       {           var}
                             -{SetBit     bit}-     -{ClrBit     bit}-

    -{SetBit var, bit}- In variable 'var' set bit number 'bit'.
    -{ClrBit var, bit}- In variable 'var' clear bit number 'bit'.

'Bit' significa nmero de bit, no mscara de bit. Por ejemplo, para establecer el bit nmero 4 en la variable 'var'

                      v
     Bit numbers:  76543210
     'var'      :  xxx1xxxx
                      ^
    you must write    ^
         {          var}               {             var}
        -{SetBit      4}-        not  -{SetBit      0x10}-

    and it is equivalent to
         {OR     var :=}
        -{   var | 0x10}-



> COMPARACION               [var ==]        [var >]        [1 >=]
                       -[ var2 ]-      -[ 1   ]-      -[ Ton]-

                        [var !=]       [-4 <   ]       [1 <=]
                       -[ var2 ]-     -[ vartwo]-     -[ Cup]-


Si la entrada a esta instruccin es falsa entonces la salida es falsa. Si la entrada es verdadera entonces la salida es verdadera si y solamente si el dado condicin es verdadera. Esta  instruccin se puede utilizar para comparar (iguales, es mayor que, es mayor que o igual a, no es igual, es menor que, es menor o igual que) una variable a una variable, o comparar una variable con una constante firmada de 16 bits.


> TESTEAR EL ESTADO DE UN BIT      [           var]          [           var]
                                  -[IfBitSet   bit]-        -[IfBitClr   bit]-


Si la entrada a esta instruccin es falsa entonces la salida es falsa. Si la entrada es verdadera entonces la salida es verdadera si y solamente si el dado condicin es verdadera. Esta instruccin se puede usar para verificar el estado solamente un bit de la variable.

'Bit' significa nmero de bit, no mscara de bit.

Operacin - {IfBitSet var, 0} - es la condicin equivalente 'If var is odd'.
Operacin - {IfBitClr var, 0} - es la condicin equivalente 'If var is an even'.


> CONTADOR                      Cname          Cname
                           --[CTU >= 5]--  --[CTD > -5]--

Un incremento en el contador (CTU, cuenta hacia arriba) o decrementos (CTD, count abajo) el conteo asociado en cada flanco ascendente de la entrada de linea condicin (es decir, cul es la condicin de entrada del rengln  cierto). La condicin de salida del contador es verdadera si el contador  Variable CTU> = 5 (CTD> -5), y false en caso contrario. La condicin de salida del rengln puede ser verdadera incluso si la condicin de entrada es falso; slo depende de la variable contador. Usted puede tener CTU y las instrucciones CTD con el mismo nombre, con el fin de incrementar y decrementar el mismo contador. La instruccin RES puede reiniciar un contador, o puede realizar operaciones de variables generales en la variable count.


> CONTADOR CIRCULAR           Cname
                           --[CTC 0:7]--

Un contador circular funciona como un contador normal de CTU, excepto que despus de alcanzar su lmite superior, restablece su contador variable de nuevo a 0. Por ejemplo, el contador mostrado anteriormente contara 0, 1, 2, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 2, .... Esto es til en combinacin con declaraciones condicionales en la variable `Cname '; usted puede utilizar esto como un secuenciador. CTC contadores reloj en el aumento borde de la condicin de condicin de entrada de lnea. Esta instruccin debe ser la instruccin ms a la derecha en su linea.


> REGISTRO DESPLAZAMIENTO               {SHIFT REG   }
                                       -{ reg0..3    }-

Un registro de desplazamiento est asociado con un conjunto de variables. Por ejemplo, este registro de desplazamiento se asocia con las variables reg0, reg1, `reg2 'y` reg3'. La entrada al registro de desplazamiento es `reg0 '. En cada borde ascendente de la condicin de escalonamiento, el registro de desplazamiento  cambia a la derecha Esto significa que asigna `reg3: = reg2 ',` reg2: = reg1 '. y  `reg1: = reg0 '. `reg0 'se mantiene inalterado. Un gran cambio registro puede consumir fcilmente una gran cantidad de memoria. Esta instruccin debe ser la instruccin ms a la derecha en su linea.


> BUSCAR EN UNA TABLA           {dest :=     }
                               -{ LUT[i]     }-

Una tabla de consulta es un conjunto ordenado de n valores. Cuando el escaln condicin es verdadera, la variable entera `dest 'se establece igual a la entrada en la tabla de bsqueda correspondiente a la variable entera i. El ndice comienza desde cero, as que 'i' debe estar entre 0 y (n - 1). El comportamiento de esta instruccin no se define si el ndice est fuera de este rango. Esta instruccin debe ser la ms instruccin en su linea.

> TABLA LINEAL POR TRAMOS                  {yvar :=     }
                                          -{ PWL[xvar]  }-

Esta es una buena manera de aproximar una funcin complicada o curva. Podra, por ejemplo, ser til si est intentando aplicar una curva de calibracin para convertir una tensin bruta de salida de un sensor en unidades ms convenientes.
Suponga que est intentando aproximar una funcin que convierte una variable de entrada entera, x, a una variable de salida entera, y. T conocer la funcin en varios puntos; Por ejemplo, usted puede saber que

        f(0)   = 2
        f(5)   = 10
        f(10)  = 50
        f(100) = 100

Esto significa que los puntos

        (x0, y0)   = (  0,   2)
        (x1, y1)   = (  5,  10)
        (x2, y2)   = ( 10,  50)
        (x3, y3)   = (100, 100)

Es una curva. Puede introducir esos 4 puntos en una tabla asociado con la instruccin lineal por partes. El sistema lineal por piezas instruccin ver el valor de xvar y establecer el valor de yvar Se establecer yvar de tal manera que la curva lineal por piezas pasar por todos los puntos que le das; por ejemplo, si establece xvar = 10, entonces la instruccin establecer yvar = 50. Si le das a la instruccin un valor de xvar que est entre dos de los valores de x para los cuales le has dado puntos, entonces la instruccin establecer yvar de modo que (xvar, yvar) se encuentre en la recta lnea que conecta esos dos puntos en la tabla. Por ejemplo, xvar =55 da una salida de yvar = 75. (Los dos puntos de la tabla son (10, 50) y (100, 100). 55 est a medio camino entre 10 y 100 y 75 est a medio camino entre 50 y 100, por lo que (55, 75) se encuentra en la lnea que conecta esos dos puntos.)

Los puntos deben ser especificados en orden ascendente por coordenadas x. Eso puede no ser posible realizar operaciones matemticas necesarias para ciertas tablas de consulta usando matemticas enteras de 16 bits; Si este es el caso, entonces LDmicro le advertir. Por ejemplo, esta tabla de bsqueda producir un error:

        (x0, y0)    = (  0,   0)
        (x1, y1)    = (300, 300)

Puede corregir estos errores haciendo la distancia entre puntos en la mesa ms pequea. Por ejemplo, esta tabla es equivalente a la dado arriba, y no produce un error:

        (x0, y0)    = (  0,   0)
        (x1, y1)    = (150, 150)
        (x2, y2)    = (300, 300)

Casi nunca ser necesario utilizar ms de cinco o seis puntos. Aadir ms puntos hace que su cdigo sea ms grande y ms lento ejecutar. El comportamiento si pasa un valor de `xvar 'mayor que la mayor coordenada x en la tabla o menor que la menor x la coordenada de la tabla es indefinida. Esta instruccin debe ser la la instruccin ms a la derecha en su linea.


> LEER CONVERTIDOR A/D         Aname
                           --{READ ADC}--

LDmicro puede generar cdigo para usar los convertidores A / D incorporados en ciertos microcontroladores. Si la condicin de entrada a esta instruccin es verdadera, entonces se adquiere una sola muestra del convertidor A / D y almacenado en la variable `Aname '. Esta variable puede ser manipulado con operaciones variables generales (menor que, mayor  que,Aritmtica, y as sucesivamente). Asigne un pin a la variable `Axxx 'en el de la misma manera que asignar un pin a una entrada o salida digital, haciendo doble clic en ella en la lista en la parte inferior de la pantalla. Si la condicin de entrada a este rengln es falsa, entonces la variable `Aname ' se deja sin cambios.

Para todos los dispositivos actualmente soportados, la entrada de 0 voltios corresponde a una lectura ADC de 0, y una entrada igual a Vdd (la tensin de alimentacin) corresponde a una lectura ADC de 1023. Si est utilizando un AVR, entonces conecte AREF a Vdd. Puede utilizar operaciones aritmticas para leer a unidades ms convenientes despus, pero recuerde que usted estn usando matemticas enteras. En general no todos los pines estarn disponibles para uso con el convertidor A / D. El software no le permitir asignar pines no A / D a una entrada analgica. Esta instruccin debe ser la instruccin ms a la derecha en su linea.


> CONFIGURA EN PWM CICLO TRABAJO          duty_cycle
                                        -{PWM 32.8 kHz}-

LDmicro puede generar cdigo para usar el perifrico PWM incorporado en ciertos microcontroladores. Si la condicin de entrada a esta instruccin es true, entonces el ciclo de trabajo del perifrico PWM se ajusta a la valor de la variable duty_cycle. El ciclo de trabajo debe ser un nmero entre 0 y 100; 0 corresponde a siempre bajo y 100 corresponde a siempre alto. (Si est familiarizado con el funcionamiento del perifrico PWM, entonces note que eso significa que LDmicro escala automticamente la variable del ciclo de trabajo desde el porcentaje a los perodos de reloj PWM.)

Puede especificar la frecuencia PWM de destino, en Hz. La frecuencia que especifique puede no ser exactamente posible, dependiendo de cmo se divide en la frecuencia de reloj del microcontrolador. LDmicro lo har elegir la frecuencia ms cercana posible; Si el error es grande entonces se lo advertir. Velocidades ms rpidas pueden sacrificar la resolucin.

Esta instruccin debe ser la instruccin ms a la derecha en su linea. El tiempo de ejecucin de la lgica ladder consume un temporizador para medir el ciclo hora. Esto significa que PWM slo est disponible en microcontroladores con al menos dos temporizadores adecuados. PWM utiliza pin CCP2 (no CCP1) en chips PIC16 y OC1B (no OC1A) en AVR.

LDmicro V4.x.x allow all hardware PWM. See
https://github.com/LDmicro/LDmicro/wiki/LDmicro-PWM

    See RESET PWM upper.


> HACER PERSISTENTE          saved_var
                           --{PERSIST}--

Cuando la condicin de entrada de esta instruccin es verdadera, especificada para ser automticamente guardada en EEPROM. Ese significa que su valor se mantendr, incluso cuando el micro pierde poder. No hay necesidad de guardar explcitamente la variable en EEPROM; que suceder automticamente, siempre que cambie la variable. La variable se carga automticamente desde la EEPROM despus de reiniciar el encendido. Si una variable que cambia con frecuencia se hace persistente, entonces la EEPROM en su micro puede  desgastarse muy rpidamente, porque es slo bueno para un nmero limitado (~ 100 000) de escrituras. Cuando el escaln condicin es falsa, no pasa nada. Esta instruccin debe ser la instruccin ms a la derecha en su lnea.


> UART (SERIAL) RECIVIR                 var
                                   --{UART RECV}--

LDmicro puede generar cdigo para usar el UART incorporado a ciertos microcontroladores. En AVRs con UARTs mltiples solamente UART1 (no UART0). Configure la velocidad en baudios utilizando Ajustes -> MCU parmetros. Ciertas velocidades de transmisin en baudios pueden no ser frecuencias cristalinas; LDmicro le avisar si este es el caso.

Si la condicin de entrada a esta instruccin es falsa, entonces nada sucede. Si la condicin de entrada es verdadera, esta instruccin intenta para recibir un solo carcter de la UART. Si no se lee ningn carcter entonces la condicin de salida es falsa. Si se lee un carcter, entonces su  valor ASCII se almacena en `var 'y la condicin de salida es verdadera para un solo ciclo de PLC.


> UART (SERIAL) ENVIAR                  var
                                   --{UART SEND}--

LDmicro puede generar cdigo para usar los UART incorporados a ciertas  microcontroladores. En AVRS con UARTs mltiples slo UART1 (no UART0). Configure la velocidad en baudios utilizando Ajustes -> MCU parmetros. Ciertas velocidades de transmisin en baudios pueden no ser frecuencias cristalinas; LDmicro le avisar si este es el caso.

Si la condicin de entrada a esta instruccin es falsa, entonces nada sucede. Si la condicin de entrada es verdadera, entonces esta instruccin escribe un solo carcter a la UART. El valor ASCII del carcter debe ser enviado previamente almacenado en `var '. La condicin de salida del rengln es verdadero si el UART est ocupado (transmitiendo actualmente un Carcter), y false en caso contrario.

Recuerde que los caracteres tardan algn tiempo en transmitir. Compruebe la salida condicin de esta instruccin para asegurar que el primer carcter se ha transmitido antes de intentar enviar un segundo carcter, o un temporizador para insertar un retardo entre caracteres. Solo debes traer la condicin de entrada es true (intenta enviar un carcter) cuando la salida condicin es falsa (UART no est ocupado).

Investigue la instruccin de cadena formateada (siguiente) antes de usar esta instruccin. La instruccin de la cadena formateada es mucho ms fcil de usar, y es casi con toda seguridad capaz de hacer lo que quieras.


> UART (SERIAL) ENVIAn                 var
                                --{UART SENDn}--


Si la condicin de entrada a esta instruccin es falsa, entonces nada sucede. Si la condicin de entrada es verdadera, entonces esta instruccin escribe una variable a la UART en formato binario en bruto. Un byte enva por ciclo de PLC, como el elemento 'FORMATTED STR OVER UART'. La condicin de salida del rengln es verdadero si el UART est ocupado (transmitiendo actualmente un variable), y false en caso contrario.


> UART SEND: Est Dispuesto?          Is ready?
                                    --[UART SEND]--

No se tiene en cuenta la condicin de entrada.
La salida es 1 cuando el buffer de transmisin est vaco y listo para cargar nuevos datos.


> UART RECV: Es vlido?       Is avail?
                           --[UART RECV]--

No se tiene en cuenta la condicin de entrada.
La salida es 1 cuando hay datos no ledos en el bfer de recepcin.


> FORMATEA STRING OVER UART                var
                                   -{"Pressure: \3\r\n"}-

LDmicro puede generar cdigo para usar los UART incorporados a ciertas microcontroladores. En AVRS con UARTs mltiples slo UART1 (no UART0). Configure la velocidad en baudios utilizando Ajustes -> MCU parmetros. Ciertas velocidades de transmisin en baudios pueden no ser frecuencias cristalinas; LDmicro le avisar si este es el caso.

Cuando la condicin de entrada para esta instruccin va de falsa a true, empieza a enviar una cadena entera a travs del puerto serie. Si la cadena contiene la secuencia especial `\ 3 ', entonces esa secuencia ser sustituido por el valor de `var ', que es automticamente convertido en una cadena. La variable se formatear para tomar exactamente 3 caracteres; Por ejemplo, si `var 'es igual a 35, entonces la cadena exacta impresa ser `Pressure: 35 \ r \ n '(tenga en cuenta el extra espacio). Si en cambio `var 'fuera igual a 1432, entonces el comportamiento sera ser indefinido, porque 1432 tiene ms de tres dgitos. En ese caso sera necesario utilizar `\ 4 'en su lugar.

Si la variable puede ser negativa, utilice `\ -3d '(o` \ -4d' Etc) en su lugar. Esto har que LDmicro imprima un espacio nmeros positivos, y un signo menos de signos negativos.

Si se activan a la vez mltiples instrucciones de cadenas formateadas (O si uno est energizado antes de que otro termine), o si estos instrucciones de UART TX, entonces las instrucciones comportamiento no est definido.

Tambin es posible usar esta instruccin para dar salida a una cadena fija, sin interpolar el valor de una variable entera en el texto que  se enva en serie. En ese caso, simplemente no se incluye la secuencia de escape.

Utilice `\\ 'para una barra invertida literal. Adems de la secuencia de escape para interpolar una variable entera, el siguiente control caracteres disponibles:

        * \r   -- CR carriage return
        * \n   -- NL new line
        * \f   -- FF form feed
        * \b   -- BS backspace
        * \t   -- TAB horizontal tab
        * \v   -- VTAB vertical tab
        * \a   -- alert
        * \xAB -- character with ASCII value 0xAB (hex)

La condicin rung-out de esta instruccin es verdadera mientras que es transmitir datos, sino falsos. Esta instruccin consume gran cantidad de memoria del programa, por lo que debe utilizarse con moderacin. La implementacin actual no es eficiente, pero para una mejor seran necesarias modificaciones a todos los back-ends.


> FORMATEAR STRING                          dest
                                      -{"string", var}-

Para objetivos como Netzer con implementaciones de printf ya existentes esta instruccin puede ser usada.

Cuando la condicin de entrada para esta instruccin va de falsa a true, comienza a procesar la cadena con printf y escribe el resultado al registro de destino dado.

Completamente incorpora la cadena dada en la imagen resultante.
La variable dada puede ser cualquier registro del programa. Es utilizado como marcador de posicin para printf. La funcin printf accede  el registro si se encuentra un marcador de posicin de estilo printf (es decir,% d).

Dest es un registro donde se escribe el resultado. Esto debera ser la entrada superior de un buffer fifo o circular.

La condicin rung-out de esta instruccin es siempre verdadera.

> CPRINTF FORMATTED STRING    _        ->Enanle{ CHAR dest:=}Error->        ______
                            _/       ----{"string",       varsList}----  __/      \___
                             ^                                              ^
                             start condition                                busy(working)


Cuando la condicin de entrada para esta instruccin va de falsa a True, comienza a procesar la cadena como sprintf y escribe el resultado char a la variable de destino char evry si sygnal  enable es true.

La variable dada puede ser cualquier registro del programa. Es utilizado como marcador de posicin para sprintf. La funcin cprintf accede el registro si se encuentra un marcador de posicin de estilo printf (es decir,% d).

La condicin rung-out de esta instruccin es verdadera mientras que es formatear datos, sino false.

 VarsList = "var1, var_2! Var3; _var_4_"

Los nombres de las variables pueden consistir en letras, nmeros y subrayados '_'.
El nombre de una variable no debe comenzar con un nmero. Los nombres de variable son  distingue maysculas y minsculas. Los dems caracteres son delimitadores de nombres de variables.

> LCD basado en HD44780, KS0066

http://www.dinceraydin.com/djlcdsim/djlcdsim.html


> CLRWDT
                                --{CLRWDT}--

Cuando la condicin de entrada de esta instruccin es verdadera,  temporizador WDT claro. LDmicro ejecuta el comando CLRWDT cada ciclo de PLC automticamente (al comienzo del ciclo), por lo que necesita un CLRWDT adicional si el perodo del ciclo del PLC es ms que el perodo WDT si WDT est habilitado.
Esta instruccin debe ser la instruccin ms a la derecha en su lnea.

> LOCK
                                   --{LOCK}--

Cuando la condicin de entrada de esta instruccin es verdadera, comando LOCK. Esto es una situacin artificial a la provocacin el restablecimiento WDT (si WDT habilitado). Comando LOCK diseado como bucle infinito. Es bloqueo, manera de congelar, bloquear el programa.
El comando LOCK ejecuta goto a la direccin actual, es decir, labelN: goto labelN (label02e7: rjmp label02e7), es decir, bucle infinito.
El comando LOCK ejecuta el bucle infinito, pero WDT puede restablecer el MCU.
Slo WDT o reset externo pueden descongelar el programa despus del comando LOCK.


> DETENER
                                  --{SLEEP}--

Cuando la condicin rung-in de esta instruccin es verdadera, el modo SLEEP (apagado) est ajustado. Se utiliza para ahorrar energa en el suministro de la batera.
PIC: Despertarse del modo de suspensin debido a una interrupcin externa en el flanco ascendente del pin RB0 / INT.

PIC10xxxx: Wake-up de dormir en cambio de pines GP0, GP1, GP3.
AVR: Despertarse del modo de suspensin debido a una interrupcin externa en el flanco ascendente de los pines PD2 / INT0, PD3 / INT1.
La operacin SLEEP no afecta a las clavijas MCU IO ya otras operaciones LDmicro.
Nota: SLEEP alarga el tiempo de ciclo del PLC y los temporizadores TON, TOF, RTO, CTY.
Esto puede frustrar los planes, romper el flujo de trabajo.
Esta instruccin debe ser la instruccin ms a la derecha en su linea.


> ALEATORIO                   Rand
                           -{ RAND }--

El generador de nmeros pseudo-aleatorios devuelve el nmero en el rango completo de la variable 'Rand'. Cuando la entrada a esta instruccin es verdadera, variable de destino "Rand" con el siguiente nmero pseudo-aleatorio calculado por un generador congruencial lineal (LCG). Cuando la entrada a este la instruccin es falsa no pasa nada.

Ver https://en.m.wikipedia.org/wiki/Linear_congruential_generator  El generador se define por la relacin de recurrencia:
    X[n+1] = (a * X[n] + c) mod m
Constantes usadas desde el VMS MTH $ RANDOM, versiones antiguas de glibc
    a = 69069 ( 0x10DCD )
    c = 1
    m = 2^32
    X = (X * 0x10DCD + 1) % 0x100000000
RAND devuelve los bytes ms significativos de X.
X almacenado como $ seed_Rand 32 bits variable.


> SALEATORIO                {SRAND     Rand}
                          --{$seed:=newSeed}--

El generador de nmeros pseudo-aleatorios se inicializa utilizando el argumento pasado como newSeed. $ Seed_Rand: = nuevoSeed cuando la entrada a esta instruccin es verdadera,  variable de destino $ seed_Rand igual a la variable de origen o constante. Cuando la entrada a esta instruccin es falsa nada sucede.
Dos inicializaciones diferentes con la misma semilla generarn el mismo sucesin de resultados en llamadas posteriores a RAND.
Si la semilla se pone a 1, el generador 'Rand' se reinicializa a su inicial y produce los mismos valores que antes de cualquier llamada a RAND o SRAND.
Las fuentes de entropa pueden ser ADC, temporizadores, RAND anterior guardados en EEPROM, etc.

En este ejemplo tenemos dos SEPARATE los generadores de nmeros pseudo-aleatorios LCG  pero si el newSed1 iguala el newSeed2 entonces RAnd1 y Rand2 son iguales secuencias de nmeros.

   ||     _    _      {SRAND     Rand1}                       ||
 1 ||--[_/ OSR/ \_]---{$seed:=newSeed1}-                      ||
   ||                                                         ||
   ||      Rand1                                              ||
 2 ||-----{RAND}------                                        ||
   ||                                                         ||
   ||                                                         ||
   ||     _    _      {SRAND     Rand2}                       ||
 3 ||--[_/ OSR/ \_]---{$seed:=newSeed2}-                      ||
   ||                                                         ||
   ||      Rand2                                              ||
 4 ||-----{RAND}------                                        ||
   ||                                                         ||


UNA NOTA PARA EL USO DE FUNCIONES MATEMATICAS
=============================================

Recuerde que LDmicro realiza slo matemticas enteras de 16 bits. Eso significa que el resultado final de cualquier clculo que realices debe ser un entero entre -32768 y 32767. Tambin significa que el intermedio los resultados de su clculo deben estar dentro de ese rango.

Por ejemplo, digamos que usted quera calcular y = (1 / x) * 1200, donde x est entre 1 y 20. Entonces y va entre 1200 y 60, que se ajusta a un entero de 16 bits, por lo que al menos en teora es posible realizar el clculo. Hay dos formas de codificar esto: Puede realizar el recproco, y luego multiplicar:

   ||         {DIV  temp  :=}          ||
   ||---------{ 1 / x       }----------||
   ||                                  ||
   ||          {MUL  y  :=  }          ||
   ||----------{ temp * 1200}----------||
   ||                                  ||

O simplemente podra hacer la divisin directamente, en un solo paso:

   ||           {DIV  y  :=}           ||
   ||-----------{ 1200 / x }-----------||

Matemticamente, estos dos son equivalentes; Pero si usted los intenta, entonces usted encontrar que el primero da un resultado incorrecto de y = 0. Eso es debido a que la variable `temp 'subfondos. Por ejemplo, cuando x = 3, (1 / x) = 0,333, pero que no es un entero; La operacin de divisin aproxima esto como temp = 0. Entonces y = temp * 1200 = 0. En el segundo caso no hay ningn resultado intermedio a underflow, as que todo funciona.

Si usted est viendo problemas con sus matemticas, entonces compruebe intermedio Los resultados para underflow (o desbordamiento, que `envuelve alrededor ', por ejemplo,
32767 + 1 = -32768). Cuando sea posible, elija las unidades que un intervalo de -100 a 100C.

Cuando necesita escalar una variable por algn factor, hgalo usando una multiplicacin y una divisin. Por ejemplo, para escalar y = 1.8 * x, calcule y = (9/5) * x (Que es el mismo, ya que 1,8 = 9/5), y el cdigo de este como y = (9 * x) / 5, realizando primero la multiplicacin:

   ||         {MUL  temp  :=}          ||
   ||---------{ x * 9       }----------||
   ||                                  ||
   ||           {DIV  y  :=}           ||
   ||-----------{ temp / 5 }-----------||

Esto funciona para todos x <(32767/9), o x <3640. Para valores mayores de x, la variable `temp 'se desbordara. Hay un lmite inferior similar en x.


ESTILO DE CODIFICACIN
======================

Permite mltiples bobinas en paralelo en un solo linea. Esto significa que usted puede hacer cosas como esto:

   ||       Xa               Ya        ||
 1 ||-------] [--------------( )-------||
   ||                                  ||
   ||       Xb               Yb        ||
   ||-------] [------+-------( )-------||
   ||                |                 ||
   ||                |       Yc        ||
   ||                +-------( )-------||
   ||                                  ||

Que equivale a esto:

   ||       Xa               Ya        ||
 1 ||-------] [--------------( )-------||
   ||                                  ||
   ||                                  ||
   ||                                  ||
   ||                                  ||
   ||       Xb               Yb        ||
 2 ||-------] [--------------( )-------||
   ||                                  ||
   ||                                  ||
   ||                                  ||
   ||                                  ||
   ||       Xb               Yc        ||
 3 ||-------] [--------------( )-------||
   ||                                  ||

Esto significa que en teora se podra escribir cualquier programa como un linea gigante, y no hay necesidad de utilizar mltiples lneas en absoluto. En la prctica que sera una mala idea, porque como los lneas se vuelven ms complejos se convierten en ms difcil de editar sin borrar y redibujar una gran cantidad de lgica.

An as, a menudo es una buena idea agrupar la lgica relacionada como un solo lnea. Esto genera un cdigo casi idntico a si se hicieron lineas separados, pero muestra que estn relacionados cuando los miras en el diagrama de contactos.

                  *                 *                  *

En general, se considera mala forma escribir cdigo de tal manera que su salida depende del orden de los lneas. Por ejemplo, este cdigo no es muy bueno si tanto Xa como Xb pueden ser verdaderos:

   ||       Xa         {v  :=       }  ||
 1 ||-------] [--------{ 12      MOV}--||
   ||                                  ||
   ||       Xb         {v  :=       }  ||
   ||-------] [--------{ 23      MOV}--||
   ||                                  ||
   ||                                  ||
   ||                                  ||
   ||                                  ||
   ||      [v >]             Yc        ||
 2 ||------[ 15]-------------( )-------||
   ||                                  ||

Voy a romper esta regla si al hacerlo puedo hacer un pedazo de cdigo significativamente ms compacto, sin embargo. Por ejemplo, he aqu cmo lo hara convierta una cantidad binaria de 4 bits en Xb3: 0 en un entero:

   ||                                   {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 la instruccin MOV se movi a la parte inferior del rengln en lugar de arriba, entonces el valor de v cuando se lee en otra parte del programa ser 0. La salida de este cdigo depende por tanto del orden en que se evalan las instrucciones. Teniendo en cuenta lo engorroso que sera para codificar esto de otra manera, lo acepto.


ABREVIATURAS
=============

PLC - controlador lgico programable.
PWM - modulacin de ancho de pulso.
ADC - convertidor analgico a digital.
PCB - placa de circuito impreso

ERRORES
=======

LDmicro no genera cdigo muy eficiente; Es lento de ejecutar, y desperdicio de flash y RAM. A pesar de esto, un PIC de tamao mediano o AVR puede hacer todo lo que un pequeo PLC puede, por lo que esto no me molesta mucho.

La longitud mxima de los nombres de las variables es muy limitada. Esto es para que encajan muy bien en el diagrama de la escalera, as que no veo una buena solucin a ese.

Si su programa es demasiado grande para el tiempo, la memoria del programa o la memoria de datos restricciones del dispositivo que ha elegido, probablemente no lo har obtener un error. Se acaba de atornillar en algn lugar.

La programacin descuidada en las rutinas de carga / almacenamiento de archivos probablemente hace que posible bloquear o ejecutar cdigo arbitrario dado un archivo corrupto o malintencionado .ld archivo.

Por favor, informe de errores adicionales o solicitudes de caractersticas al autor.

Gracias a:
    * Marcelo Solano, por reportar un error de interfaz de usuario bajo Win98
    * Serge V. Polubarjev, por no solo notar que RA3: 0 en la
      PIC16F628 no funcion pero tambin me dijo cmo solucionarlo
    * Maxim Ibragimov, por reportar y diagnosticar problemas mayores
      Con los objetivos ATmega16 y ATmega162 hasta entonces no probados
    * Bill Kishonti, por informar que el simulador se estrell cuando el
      Programa de lgica de escalera dividido por cero
    * Mohamed Tayae, por reportar que las variables persistentes fueron rotas
      En el PIC16F628
    * David Rothwell, por reportar varios errores de interfaz de usuario y un
      Problema con la funcin "Exportar como texto"


COPIA Y EXENCIN DE RESPONSABILIDAD
===================================
NO USAR CDIGO GENERADO POR LDMICRO EN APLICACIONES DONDE EL SOFTWARE FALLA PODRA RESULTAR EN PELIGRO A LA VIDA HUMANA O DAO A LA PROPIEDAD. EL EL AUTOR ASUME NINGUNA RESPONSABILIDAD POR LOS DAOS RESULTANTES DE LA OPERACIN  DE LDMICRO O CDIGO GENERADO POR LDMICRO.
Este programa es software libre: puedes redistribuirlo y / o modificarlo bajo las condiciones de la Licencia Pblica General GNU publicada por la Free Software Foundation, ya sea la versin 3 de la Licencia, o (en su opcin) cualquier versin posterior.
Este programa se distribuye con la esperanza de que sea til, pero SIN NINGUNA GARANTA; Sin la garanta implcita de COMERCIABILIDAD O APTITUD PARA UN PROPSITO PARTICULAR. Vea la Licencia Pblica General de GNU para ms detalles.
Debera haber recibido una copia de la Licencia Pblica General de GNU
Con este programa. Si no, vea <http://www.gnu.org/licenses/>.

Jonathan Westhues

Rijswijk      -- Dec 2004
Waterloo ON   -- Jun, Jul 2005
Cambridge MA  -- Sep, Dec 2005
                 Feb, Mar 2006
                 Feb 2007
Seattle WA    -- Feb 2009

Email: user jwesthues, at host cq.cx

Unofficial support:
    LDmicro Forum:  http://cq.cx/ladder-forum.pl
    Latest release: https://github.com/LDmicro/LDmicro/releases
    Repository:     https://github.com/LDmicro/LDmicro
    Email:          LDmicro.GitHub@gmail.com
