INTRODUÇÃO AO LDMICRO

26
INTRODUÇÃO ============ LDmicro gera código nativo com certeza Microchip PIC16 e AVR Atmel microcontroladores. Normalmente software para estes microcontroladores é escrito em uma linguagem de programação como assembler, C ou BASIC. Um programa numa dessas línguas compreende uma lista de declarações. Estas línguas são poderoso e bem adaptado para a arquitetura do processador, que executa internamente uma lista de instruções. CLPs, por outro lado, são frequentemente `lógica programada em escada. A simples programa pode ter esta aparência: | | | | | | XButton1 Tdon Rchatter Yred | | 1 | | -------] / [--------- [TON 1.000 s] - + -------] / [----------- --- () ------- | | | | | | | | | XButton2 Tdof | | | | | -------] / [--------- [TOF 2.000 s] - + | | | | | | | | | | | | | | | | Rchatter Ton Tnovo Rchatter | | 2 | | -------] / [--------- [TON 1.000 s] ---- [TOF 1.000 s] --------- () --- ---- | | | | | | | | | | | | | | | | ------ [END] --------------------------------------- ------------------ | | | | | | | | | | (TON é um turn-on delay; TOF é um atraso turn-off A -] [- declarações. são entradas, que se comportam mais ou menos como os contatos de um relé. O - () - As declarações são saídas, que se comportam como o tipo de bobina de um relé. Muitas boas referências para a lógica da escada estão disponíveis na Internet e em outro lugar; detalhes específicos para esta implementação são dadas abaixo). Um certo número de diferenças são evidentes:

Transcript of INTRODUÇÃO AO LDMICRO

INTRODUÇÃO============

LDmicro gera código nativo com certeza Microchip PIC16 e AVR Atmelmicrocontroladores. Normalmente software para estes microcontroladores é escritoem uma linguagem de programação como assembler, C ou BASIC. Um programa numadessas línguas compreende uma lista de declarações. Estas línguas sãopoderoso e bem adaptado para a arquitetura do processador, queexecuta internamente uma lista de instruções.

CLPs, por outro lado, são frequentemente `lógica programada em escada. A simplesprograma pode ter esta aparência:

| | | | | | XButton1 Tdon Rchatter Yred | | 1 | | -------] / [--------- [TON 1.000 s] - + -------] / [----------- --- () ------- | | | | | | | | | XButton2 Tdof | | | | | -------] / [--------- [TOF 2.000 s] - + | | | | | | | | | | | | | | | | Rchatter Ton Tnovo Rchatter | | 2 | | -------] / [--------- [TON 1.000 s] ---- [TOF 1.000 s] --------- () --- ---- | | | | | | | | | | | | | | | | ------ [END] --------------------------------------- ------------------ | | | | | | | | | |

(TON é um turn-on delay; TOF é um atraso turn-off A -] [- declarações.são entradas, que se comportam mais ou menos como os contatos de um relé. O- () - As declarações são saídas, que se comportam como o tipo de bobina de umrelé. Muitas boas referências para a lógica da escada estão disponíveis na Internete em outro lugar; detalhes específicos para esta implementação são dadas abaixo).

Um certo número de diferenças são evidentes:

* O programa é apresentado em formato gráfico, e não como uma lista textual de declarações. Muitas pessoas vão achar isso mais fácil, inicialmente, para entender.

* No nível mais básico, os programas parecem diagramas de circuitos, com contatos de relé (inputs) e bobinas (saídas). Isto é intuitivo programadores com conhecimento de teoria de circuitos elétricos.

* O compilador lógica ladder cuida o que é calculada onde. Você não tem que escrever código para determinar quando as saídas tem que se recalculada com base em uma mudança nas entradas ou um evento timer, e você não tem que especificar a ordem em que estes cálculos devem ter lugar, as ferramentas PLC fazer isso por você.

LDmicro compila lógica ladder para PIC16 ou código AVR. A seguirOs processadores são suportados: * PIC16F877 * PIC16F628 * PIC16F876 (não testado) * PIC16F88 (não testado) * PIC16F819 (não testado) * PIC16F887 (não testado) * PIC16F886 (não testado) * ATmega128 * ATMEGA64 * ATMEGA162 (não testado) * ATmega32 (não testado) * ATmega16 (não testado) * ATmega8 (não testado)

Seria fácil para suportar mais AVR ou chips PIC16, mas eu não tenhoalguma maneira de testá-los. Se você precisar de um em particular entre em contato comigo eVou ver o que posso fazer.

Usando LDmicro, você pode desenhar um diagrama de escada para o seu programa. Você podesimular a lógica em tempo real no seu PC. Então, quando você está convencidoque é correto, você pode atribuir pinos no microcontrolador para oentradas e saídas do programa. Depois de atribuir os pinos, você podecompilar código PIC ou AVR para o seu programa. A saída do compilador é um. Hexarquivo que você pode programar em seu microcontrolador usando qualquer PIC / AVRprogramador.

LDmicro é projetado para ser um pouco semelhante ao PLC mais comercialsistemas de programação. Há algumas exceções, e um monte de coisasnão são padrão na indústria de qualquer maneira. Leia atentamente a descriçãode cada instrução, mesmo que pareça familiar. Este documento assumeconhecimento básico da escada lógica e da estrutura de software do PLC(O ciclo de execução: ler entradas, calcular, escrever outputs).

Metas adicionais==================

É também possível gerar o código C ANSI. Você pode usar isso com qualquerprocessador para o qual você tem um compilador C, mas você é responsável porfornecendo o tempo de execução. Isso significa que LDmicro apenas gera fonte

para uma função PlcCycle (). Você é responsável por chamar PlcCyclecada tempo de ciclo, e você é responsável pela implementação de todos os I / O(Leitura / escrita de entrada digital, etc) funções que o PlcCycle () chamadas. Veros comentários no código-fonte gerado para mais detalhes.

Finalmente, LDmicro pode gerar bytecode processador independente para amáquina virtual projetada para executar código da lógica ladder. Eu tenho desde aimplementação de exemplo do intérprete / VM, escrito em bastante portátilC. Esta meta será trabalhar para praticamente qualquer plataforma, desde que vocêpode fornecer seu próprio VM. Isso pode ser útil para aplicações ondedeseja usar a lógica ladder como um `linguagem de script 'para personalizar a maiorprograma. Veja os comentários do intérprete amostra para mais detalhes.

OPÇÕES DE LINHA DE COMANDO====================

ldmicro.exe é normalmente executado sem opções de linha de comando. Isso significaque você pode apenas fazer um atalho para o programa, ou salvá-lo para o seuárea de trabalho e clique duas vezes no ícone quando você quer executá-lo, e então vocêpode fazer tudo de dentro da GUI.

Se LDmicro é transmitido um único arquivo na linha de comando(Por exemplo, `ldmicro.exe asd.ld '), então LDmicro tentará abrir` asd.ld'se ele existir. Um erro é produzido se `asd.ld 'não existe. Estesignifica que você pode associar com ldmicro.exe. ld arquivos, de modo que ele seja executadoautomaticamente quando você clicar duas vezes em um arquivo ld..

Se LDmicro é passado argumentos de linha de comando na forma`Ldmicro.exe / c src.ld dest.hex ', então ele tenta compilar` src.ld'e salvar a saída como `dest.hex. LDmicro sai depois de compilar,se a compilação foi bem sucedida ou não. Todas as mensagens são impressospara o console. Este modo é útil apenas quando executado LDmicro dolinha de comando.

BASICS======

Se você executar LDmicro sem argumentos, então ele começa com um vazioprograma. Se você executar LDmicro com o nome de um programa de escada (xxx.ld)na linha de comando, então ele vai tentar carregar o programa na inicialização.LDmicro usa seu próprio formato interno para o programa, mas não pode importarlógica de qualquer outra ferramenta.

Se você não carregar um programa já existente, em seguida, você será dado um programacom um degrau vazio. Você pode adicionar uma instrução para que, por exemplovocê pode adicionar um conjunto de contatos (Instrução -> Inserir contatos) chamado`Xnew '. 'X' significa que os contatos serão ligados a um pino de entrada nomicrocontrolador. Você pode atribuir um pino para mais tarde, depois de escolher ummicrocontrolador e renomeando os contatos. A primeira letra de um nomeindica o tipo de objeto que é. Por exemplo:

* Xname - amarrada a um pino de entrada do microcontrolador * Yname - ligada a um pino de saída do microcontrolador * Rname - `relay interno ': um pouco na memória * Tname - um temporizador; turn-on delay, turn-off atraso ou retenção * Cname - um contador, ou contar-up ou contar-down * Aname - ler um número inteiro a partir de um conversor A / D * Nome - uma variável de uso geral (inteiro)

Escolha o resto do nome para que ele descreve o que o objeto faz,e de modo que seja único dentro do programa. O mesmo nome sempre se referepara o mesmo objeto dentro do programa. Por exemplo, seria um erroter um turn-on delay (TON) chamado `Tdelay 'e um atraso turn-off (TOF)chamado `Tdelay" no mesmo programa, uma vez que cada contador precisa do seu própriomemória. Por outro lado, seria correcto ter um temporizador retentivo(RTO) chamado `Tdelay 'e uma instrução reset (RES) associados`Tdelay ', uma vez que nesse caso, você quer ambas as instruções para trabalhar como mesmo timer.

Os nomes das variáveis podem consistir de letras, números e sublinhados(_). Um nome de variável não deve começar com um número. Os nomes das variáveis sãomaiúsculas de minúsculas.

As instruções gerais variáveis (MOV, ADD, EQU, etc) podem trabalhar emvariáveis com qualquer nome. Isto significa que eles podem acessar e temporizadorcontador acumuladores. Isso às vezes pode ser útil, por exemplo, vocêpode verificar se a contagem do temporizador é em um determinado intervalo.

As variáveis são sempre números inteiros de 16 bits. Isto significa que eles podem ir-32.768-32.767. As variáveis são sempre tratados como assinado. Você podeespecificar literais como números decimais normais (0, 1.234, -56). Você também podeespecificar valores de caracteres ASCII ('A', 'z'), colocando o personagem emaspas simples. Você pode usar um código de caracteres ASCII na maioria dos lugares quevocê poderia usar um número decimal.

Na parte inferior da tela, você verá uma lista de todos os objetoso programa. Esta lista é gerada automaticamente pelo programa;não há necessidade de mantê-lo atualizado com as mãos. A maioria dos objetos nãoprecisa de nenhuma configuração. `Xname ',` Yname' e `objetos aname 'deve sercontudo atribuído a um pino no microcontrolador,. Primeiro, escolha o quemicrocontrolador você está usando (Settings -> microcontrolador). Em seguida, atribuapins seu I / O clicando duas vezes-los na lista.

Você pode modificar o programa através da inserção ou exclusão de instruções. Ocursor no programa pisca para indicar o selecionadoinstrução eo ponto de inserção atual. Se não estiver, então pestanejarpressione <Tab> ou clique em uma instrução. Agora você pode excluir o atualinstrução, ou você pode inserir uma nova instrução para a direita ou para a esquerda(Em conjunto com a), ou acima ou abaixo (em paralelo com) o selecionadoinstruções. Algumas operações não são permitidos. Por exemplo, há instruçõessão permitidas para a direita de uma bobina.

O programa começa com apenas um degrau. Você pode adicionar mais degraus, selecionandoInsira Rung Antes / Depois no menu Logic. Você pode obter o mesmo efeitocolocando muitas subcircuitos complicados em paralelo dentro de um degrau,mas é mais claro para usar vários degraus.

Depois de ter escrito um programa, você pode testá-lo na simulação, e, em seguida,você pode compilá-lo para um arquivo HEX para o microcontrolador alvo.

SIMULAÇÃO==========

Para entrar no modo de simulação, selecione Simular -> Modo de Simulação ou pressione<Ctrl+M>. O programa é mostrada de forma diferente no modo de simulação. Temnão mais de um cursor. As instruções que são energizados aparecer brilhantevermelho, as instruções que aparecem não são cinza. Pressione a barra de espaço paraexecutar o ciclo de PLC. Para ciclo continuamente em tempo real, escolhaSimulate -> iniciar a simulação em tempo real, ou pressione <Ctrl+R>. A exibição deo programa será atualizado em tempo real, como as mudanças de estado do programa.

Você pode definir o estado das entradas para o programa clicando duas vezes-los na lista, na parte inferior da tela, ou clicando duas vezes em um`Xname 'instrução contatos no programa. Se você alterar o estado de

um pino de entrada, em seguida, que a mudança não será refletida na forma como o programaé exibido até que os ciclos PLC, o que irá acontecer automaticamente sevocê estiver executando uma simulação em tempo real, ou quando você pressionar a barra de espaço.

Compilação para código nativo========================

Em última análise, o ponto é para gerar um arquivo. Hex que você pode programarem seu microcontrolador. Primeiro você deve selecionar o número de peça domicrocontrolador, nas Configurações -> menu de microcontrolador. Então vocêdeve atribuir um pino de I / O para cada `Xname 'ou Yname`' objeto. Para fazer isso,duplo clique no nome do objeto na lista na parte inferior da tela.Uma caixa de diálogo irá aparecer onde você pode escolher um pino não alocado a partir de uma lista.

Em seguida, você deve escolher o tempo de ciclo que você vai correr com, e você devedizer ao compilador que a velocidade do clock do micro estará funcionando em. Estessão definidos de acordo com as Configurações -> Parameters MCU ... menu. Em geral, vocênão precisa mudar o tempo de ciclo, 10 ms é um bom valor para a maioriaaplicações. Digite a frequência do cristal que você vai usarcom o microcontrolador (ou o ressonador cerâmico, etc) e clique ok.

Agora você pode gerar o código de seu programa. Escolha Compilar -> Compile,ou compilar -> Compilar como ... Se você já compilou este programae você quer especificar um nome de arquivo de saída diferente. Se não houver nenhumerros, em seguida LDmicro irá gerar um arquivo Intel IHEX pronto paraprogramação em seu chip.

Use o software de programação que quer e hardware que você tem que carregar o hexarquivo para o microcontrolador. Lembre-se de definir os bits de configuração(Fusíveis)! Para os processadores PIC16, os bits de configuração estão incluídas nohex, ea maioria dos softwares de programação vai olhar lá automaticamente.Para processadores AVR é necessário definir os bits de configuração à mão.

INSTRUÇÕES DE REFERÊNCIA======================

> CONTACT, NORMALMENTE ABERTO Xname rname Yname ----] [--------] [--------] [----

Se o sinal que vai para a instrução é falsa, então a saída

sinal é falso. Se o sinal que vai para a instrução é verdadeira, em seguida, o sinal de saída é verdadeiro se e só se o pino de entrada dado, pino de saída, interna ou relé é verdade, então ele é falso. Este instrução pode examinar o estado de um pino de entrada, um pino de saída, ou um relé interno.

> CONTACT, normalmente fechado Xname rname Yname ----] / [--------] / [--------] / [----

Se o sinal que vai para a instrução é falsa, então a saída sinal é falso. Se o sinal que vai para a instrução é verdadeira, em seguida, o sinal de saída é verdadeiro se e só se o pino de entrada dado, pino de saída, interna ou relé é falso, então ele é falso. Este instrução pode examinar o estado de um pino de entrada, um pino de saída, ou um relé interno. Isto é o oposto de um contacto normalmente aberto.

> COIL, NORMAL Yname rname ---- () -------- () ----

Se o sinal que vai para a instrução é falsa, então o dado relé interno ou pino de saída é eliminado falsa. Se o sinal que vai para esta instrução é verdadeira, então o dado relé interno ou saída pin está definido verdade. Não tem sentido atribuir uma variável de entrada para um bobina. Esta instrução deve ser a instrução mais à direita em seu degrau.

> COIL, negada Yname rname ---- (/) -------- (/) ----

Se o sinal que vai para a instrução é verdadeira, então o dado relé interno ou pino de saída é eliminado falsa. Se o sinal que vai para esta instrução é falsa, então o dado relé interno ou pino de saída é definido verdade. Não tem sentido atribuir uma entrada variável a uma bobina. Isto é o oposto de uma bobina normal. Este instrução deve ser a instrução mais à direita em seu degrau.

> COIL, SET-ONLY Yname rname ---- (S) -------- (S) ----

Se o sinal que vai para a instrução é verdadeira, então o dado relé interno ou pino de saída é definido verdade. Caso contrário, o interno relé ou saída de estado pin não é alterado. Esta instrução só pode alterar o estado de uma bobina de falso para verdadeiro, então é tipicamente utilizado em combinação com um rolo-só reposto. Esta instrução deve

ser a instrução mais à direita na sua degrau.

> COIL, REAJUSTE SOMENTE Yname rname ---- (R) -------- (R) ----

Se o sinal que vai para a instrução é verdadeira, então o dado relé interno ou pino de saída é eliminado falsa. Caso contrário, o relé interno ou saída de estado pin não é alterado. Esta instrução instrução só pode alterar o estado de uma bobina de verdadeiro para falso, por isso, é normalmente utilizado em combinação com um conjunto de bobina de somente. Este instrução deve ser a instrução mais à direita em seu degrau.

> TURN-ON DELAY Tdon - [TON 1,000 s] -

Quando o sinal que vai para a instrução passa de falso para verdadeiro, o sinal de saída permanece falsa por 1,000 s, antes de ir verdade. Quando o sinal que vai para a instrução vai de verdadeiro para falso, a saída sinal vai falsa imediatamente. O cronômetro é zerado cada vez que a entrada vai falsa, a entrada deve permanecer verdadeiro para 1000 milissegundos consecutivos antes a saída será verdade. O atraso é configurável.

O `tname" conta variáveis acima de zero em unidades de tempos de varredura. O Instrução TON saídas de verdade quando a variável do contador é maior que ou igual a um dado atraso. É possível manipular a variável de contador em outros lugares, por exemplo, com a instrução MOV.

> Retardo de desligamento Tdoff - [TOF 1,000 s] -

Quando o sinal que vai para a instrução vai de verdadeiro para falso, o sinal de saída permanece fiel para 1,000 s antes de ir falsa. Quando o sinal que vai para a instrução passa de falso para verdadeiro, o sinal de saída vai verdadeiro imediatamente. O cronômetro é zerado a cada vez que a entrada vai falsa, a entrada deve permanecer falsa para 1000 milissegundos consecutivos antes a saída será falsa. O atraso é configurável.

O `tname" conta variáveis acima de zero em unidades de tempos de varredura. O Instrução TON saídas de verdade quando a variável do contador é maior que ou igual a um dado atraso. É possível manipular a

variável de contador em outros lugares, por exemplo, com a instrução MOV.

> RETENTIVE TIMER Trto - [RTO 1,000 s] -

Esta instrução mantém o controle de quanto tempo o seu contributo tem sido verdade. Se seu contributo tem sido verdade para pelo menos 1,000 s, então a saída é verdade. Caso contrário, a saída é falsa. A entrada não precisa ter sido verdadeiro para 1000 milissegundos consecutivos; se a entrada vai verdadeiro para 0,6 s, em seguida, durante 2,0 s falsos e, em seguida verdadeiro para 0,4 s, em seguida, o saída irá verdade. Após a saída vai verdadeiro permanecerá verdadeiro mesmo após a entrada vai falsa, enquanto a entrada tem sido verdade por mais de 1,000 s. Este temporizador deve ser redefinido manualmente, com a instrução de reset.

O `tname" conta variáveis acima de zero em unidades de tempos de varredura. O Instrução TON saídas de verdade quando a variável do contador é maior que ou igual a um dado atraso. É possível manipular a variável de contador em outros lugares, por exemplo, com a instrução MOV.

> Redefinir TRTO cItems ---- {RES} -------- {RES} ----

Esta instrução zera um temporizador ou um contador. TON e TOF temporizadores são reinicia automaticamente quando o seu contributo vai falsa ou verdadeira, então RES é não é necessário para estes temporizadores. Timers RTO e CTU / CTD contadores são não reiniciar automaticamente, de modo que deve ser redefinido à mão usando um RES instruções. Quando a entrada for verdadeira, o contador ou temporizador é reposto; quando a entrada é falso, nenhuma ação será tomada. Esta instrução deve ser a instrução mais à direita na sua degrau.

> ONE-SHOT RISING _ - [OSR_ /] -

Esta instrução normalmente saídas falsas. Se a entrada da instrução É verdade durante este exame e foi falso durante a varredura anterior em seguida, a saída é verdadeira. É, por conseguinte, gera um impulso de uma analise

largura em cada flanco ascendente do seu sinal de entrada. Esta instrução é útil se você deseja acionar eventos fora da borda de subida de um sinal.

> ONE-SHOT QUEDA _ - [OSF \ _] -

Esta instrução normalmente saídas falsas. Se a entrada da instrução é falso durante este exame e foi verdade durante a verificação anterior em seguida, a saída é verdadeira. É, por conseguinte, gera um impulso de uma analise largura em cada aresta de queda do seu sinal de entrada. Esta instrução é útil se você deseja acionar eventos fora da borda de descida de um sinal.

> Curto-circuito, CIRCUITO ABERTO ---- + ---- + -------- + + ----

A condição de um curto-circuito de saída é sempre igual ao seu condição de entrada. A condição de um circuito aberto de saída é sempre falsa. Estes são principalmente úteis para a depuração.

> Controle Mestre RELAY - MESTRE RLY {} -

Por padrão, o degrau em condição de cada degrau é verdade. Se um mestre instrução relé de controle é executado com um degrau em condição de falsa, então o degrau em condição para todos os seguintes degraus torna-se falsa. Isso vai continuar até o próximo relé de controle mestre instrução for atingido (independentemente do degrau em condição de que instrução). Estas instruções devem ser usados em pares: uma para (talvez condicionalmente) começam a seção possivelmente desativado, e um para acabar com ela.

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

Quando a entrada para esta instrução é verdadeiro, ele define o dado variável de destino igual à variável de origem dado ou constante. Quando a entrada para esta instrução é falsa nada acontece. Você pode atribuir a qualquer variável com a instrução de movimento; isto inclui o temporizador e as variáveis do estado do contador, que pode ser distinguidos pelo líder `T 'ou' C '. Por exemplo, uma instrução

movendo 0 em `Tretentive 'é equivalente a uma instrução reset (RES) para esse temporizador. Esta instrução deve ser a instrução mais à direita no seu degrau.

> ARITHMETIC OPERAÇÃO {ADD kay: = {} SUB CCNT: =} - {'A' + 10} - {CCNT - 10} -

> {MUL dest: =} {DIV dv: =} - {Var * -990} - {dv / -10.000} -

Quando a entrada para esta instrução é verdadeiro, ele define o dado variável de destino igual a expressão dado. Os operandos tanto podem ser variáveis (incluindo o contador de temporizador e variáveis) ou constantes. Estas instruções de uso de 16 bits matemática assinado. Lembrar que o resultado é avaliado em cada ciclo, quando a condição de entrada verdade. Se você está incremento ou decremento de uma variável (ou seja, se a variável de destino é também um dos operandos), então você provavelmente não quer que, normalmente você usaria um one-shot para que é avaliada apenas na borda de subida ou de descida do input condição. Trunca dividem; 8/3 = 2. Esta instrução deve ser a instrução mais à direita na sua degrau.

> Comparar [var ==] [var>] [1> =] - [Var2] - [1] - [Ton] -

> [Var / =] [-4 <] [1 <=] - [Var2] - [vartwo] - [Copa] -

Se a entrada para esta instrução é falsa, então a saída é falsa. Se a entrada é verdadeiro, então a saída é verdadeiro se e só se o dado condição é verdadeira. Estas instruções podem ser utilizadas para comparar (corresponde a, é maior do que, é maior do que ou igual a, não é igual a, é inferior, é inferior ou igual a) uma variável para uma variável, ou para comparar uma variável para um de 16 bits assinado constante.

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

Um contador incrementos (CTU, conte para cima) ou decrementa (CTD, count para baixo) a contagem associada a cada borda de subida da entrada degrau condição (ou seja, que a condição de entrada degrau passa de falsa para true). A condição de saída do contador é verdadeira se o contador variável é maior ou igual a 5, e falso em contrário. O

condição de saída degrau pode ser verdadeiro mesmo se a condição de entrada é falsa, que só depende da variável contador. Você pode ter CTU e instruções CTD com o mesmo nome, a fim de incrementar e diminuir o mesmo contador. A instrução RES pode redefinir um contador, ou você pode executar operações de variáveis gerais sobre a variável de contagem.

> COUNTER CIRCULAR Cname - {} CTC 00:07 -

Uma circular contador funciona como um contador CTU normal, exceto que depois de atingir seu limite superior, ele redefine a sua variável de contador volta para 0. Por exemplo, o contador mostrado acima contaria 0, 1, 2, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7, 0, 2, .... Isso é útil em combinação com declarações condicionais na variável `Cname '; você pode usar isso como um sequenciador. CTC contadores relógio na subida borda da condição de condição de entrada degrau. Esta instrução deve ser a instrução mais à direita na sua degrau.

> SHIFT REGISTER {Shift REG} - {3} reg0 .. -

Um registo de deslocamento está associado a um conjunto de variáveis. Por exemplo, a este registador de deslocamento é associado com as variáveis reg0 `',` reg1' `Reg2 'e` reg3. A entrada para o registador de deslocamento é `reg0 '. Em cada borda de subida do degrau em condição, o registrador de deslocamento será Shift direita. Isso significa que ele atribui `reg3: = reg2 ',` reg2: = reg1. e `reg1: = reg0. `Reg0 'é deixado inalterado. A grande mudança registro pode facilmente consumir muita memória. Esta instrução deve ser a instrução mais à direita na sua degrau.

> Tabela look-up {dest: =} - {LUT [i]} -

A tabela look-up é um conjunto ordenado de n valores. Quando o degrau em condição é verdadeira, a variável inteira `dest 'é definido igual ao entrada na tabela de pesquisa que corresponde ao número inteiro variável `I '. O índice começa do zero, por isso `i 'deve estar entre 0 e (N-1). O comportamento desta instrução não está definido se o índice está fora desta faixa. Esta instrução deve ser o mais à direita

instrução em seu degrau.

> Linear por partes TABLE {yvar: =} - {PWL [xvar]} -

Esta é uma boa maneira de aproximar uma função complicada ou curva. Ele pode, por exemplo, ser útil se você está tentando aplicar uma curva de calibração para converter uma tensão de saída em bruto a partir de um sensor em unidades mais convenientes.

Suponha que você está tentando se aproximar de uma função que converte uma variável inteira de entrada, x, para uma variável de saída inteiro, y. Você conhecer a função em vários pontos, por exemplo, você pode saber que

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

Isto significa que os pontos

(X0, y0) = (0, 2) (X1, y1) = (5, 10) (X2, y2) = (10, 50) (X3, y3) = (100, 100)

mentir sobre a curva. Você pode inserir esses 4 pontos em uma tabela associado à instrução linear por partes. O linear por partes instrução vai olhar para o valor de xvar, e defina o valor de yvar. Ele irá definir yvar de tal forma que a curva linear seccionalmente vai passar por todos os pontos que lhe dão, por exemplo, se você definir xvar = 10, então a instrução irá definir yvar = 50.

Se você der a instrução de um valor de xvar que fica entre dois dos valores de x para os quais tenha dado aponta, então o instrução irá definir yvar para que (xvar, yvar) encontra-se na reta A linha ligando os dois pontos na tabela. Por exemplo, xvar = 55 proporciona uma saída de yvar = 75. (Os dois pontos do quadro são (10, 50) e (100, 100). 55 está a meio caminho entre 10 e 100, e 75 está a meio caminho entre os 50 e 100, de modo (55, 75) situa-se na linha que liga estes dois pontos.)

Os pontos devem ser especificados em ordem crescente de x coordenadas. Ele pode não ser possível a realização de operações matemáticas requeridas para certo olhar-up tabelas usando 16-bit matemática inteiro, se este é o

caso, então LDmicro irá avisá-lo. Por exemplo, este olhar para cima da tabela produzirá um erro:

(X0, y0) = (0, 0) (X1, y1) = (300, 300)

Você pode corrigir esses erros, tornando a distância entre os pontos em a mesa menor. Por exemplo, esta tabela é equivalente a uma dada acima, e que não produz um erro:

(X0, y0) = (0, 0) (X1, y1) = (150, 150) (X2, y2) = (300, 300)

Dificilmente deve ser sempre necessário utilizar mais do que cinco ou seis pontos. Adicionando mais pontos faz com que seu código maior e mais lento para executar. O comportamento se você passar um valor de `xvar 'maior do que os maiores coordenada x na tabela ou menos do que a menor x coordenar na tabela é indefinido. Esta instrução deve ser o instrução mais à direita em seu degrau.

> A / D CONVERTER LEIA Aname - {LEIA ADC} -

LDmicro pode gerar código para usar o A / D conversores embutidos no certos microcontroladores. Se a condição de entrada para esta instrução é verdadeira, então uma única amostra a partir do conversor A / D é adquirida e armazenado na variável `Aname '. Esta variável pode, posteriormente, ser manipulado com as operações de variáveis gerais (menos que, maior que, aritmética, e assim por diante). Atribuir um pino para o Axxx variável `'no mesma forma que você deve atribuir um pino para a entrada ou saída digital, clicando duas vezes na lista, na parte inferior da tela. Se a condição de entrada para este degrau é falso, então a variável `Aname ' é deixado inalterado.

Para todos os dispositivos suportados atualmente, 0 volts de entrada corresponde a uma leitura do ADC de 0, e uma entrada igual a VDD (tensão de alimentação) corresponde a uma leitura do ADC 1023. Se você estiver usando um AVR, em seguida, AREF ligar a VDD. Você pode usar as operações aritméticas para escalar o leitura para unidades mais convenientes depois, mas lembre-se que você estão usando matemática inteiro. Em geral, nem todos os pinos estarão disponíveis

para uso com o conversor A / D. O software não irá permitir que você atribuir pinos não-A / D para uma entrada analógica. Esta instrução deve ser a instrução mais à direita na sua degrau.

> SET PWM CICLO duty_cycle - {PWM 32,8 kHz} -

LDmicro pode gerar código para usar o PWM periférica construído para certos microcontroladores. Se a condição de entrada para esta instrução é verdade, então o ciclo de trabalho do PWM periférica está definido para o valor do duty_cycle variável. O ciclo deve ser um número entre 0 e 100, 0 corresponde sempre acessível, e 100 correspondem aos sempre alto. (Se você estiver familiarizado com a forma como funciona o PWM periféricos, em seguida, perceber que isso significa que LDmicro automaticamente dimensiona o variável ciclo de por cento, para os períodos de clock PWM).

Você pode especificar o destino PWM freqüência, em Hz. A freqüência com que você especificar pode não ser exatamente possível, dependendo de como ele divide-se em frequência de clock do microcontrolador. LDmicro vontade escolhe o mais próximo possível de frequência, se o erro é grande, então ele vai te avisar. Velocidades mais rápidas podem sacrificar a resolução.

Esta instrução deve ser a instrução mais à direita em seu degrau. O tempo de execução da lógica ladder consome um cronômetro para medir o ciclo tempo. Isso significa que PWM está disponível apenas em microcontroladores com pelo menos dois temporizadores adequados. PWM usa pin CCP2 (não CCP1) PIC16 em chips e OC2 (não OC1A) em AVR.

> FAÇA saved_var PERSISTENT - PERSIST {} -

Quando o degrau em condição desta instrução é verdadeiro, ele faz com que o variável inteira especificada para ser salvo automaticamente EEPROM. Que significa que seu valor vai persistir, mesmo quando o micro perde poder. Não há necessidade de poupar explicitamente a variável na EEPROM; o que vai acontecer automaticamente, sempre que as mudanças de variáveis. O variável é automaticamente carregado de EEPROM após power-on reset. Se

uma variável que muda frequentemente é feita persistente, em seguida, o EEPROM em seu micro pode desgastar muito rapidamente, porque é só bom para um (~ 100 000) número limitado de gravações. Quando o degrau em condição é falsa, nada acontece. Esta instrução deve ser o instrução mais à direita em seu degrau.

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

LDmicro pode gerar o código a usar o UART construídos para de algum microcontroladores. Em AVRs com várias UARTs só UART1 (não UART0) é suportado. Configure a taxa de transmissão usando Configurações -> MCU Parâmetros. Certas taxas de transmissão não pode ser obtida com certa freqüências de cristal; LDmicro irá avisá-lo se este for o caso.

Se a condição de entrada para esta instrução é falsa, então nada acontece. Se a condição de entrada for verdade, então esta instrução tenta para receber um único personagem do UART. Se nenhum caracter é lido então a condição de saída é falsa. Se um personagem é lido, em seguida, a sua ASCII valor é armazenado no `var, e da condição de saída é verdadeira para um único ciclo do PLC.

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

LDmicro pode gerar código para usar os UARTs construídos para determinado microcontroladores. Em AVRS com várias UARTs só UART1 (não UART0) é suportado. Configure a taxa de transmissão usando Configurações -> MCU Parâmetros. Certas taxas de transmissão não pode ser obtida com certa freqüências de cristal; LDmicro irá avisá-lo se este for o caso.

Se a condição de entrada para esta instrução é falsa, então nada acontece. Se a condição de entrada for verdade, então esta instrução escreve um único personagem para o UART. O valor ASCII do caractere para enviar devem ter sido previamente armazenados em `var '. A condição de saída do degrau é verdadeiro se a UART está ocupado (atualmente a transmissão de um personagem), e false caso contrário.

Lembre-se que os personagens levar algum tempo para transmitir. Verifique a saída condição de esta instrução para garantir que o primeiro personagem tem sido transmitida antes de tentar enviar um segundo personagem, ou usar

um temporizador para programar um atraso entre os caracteres. Você só deve trazer a condição de entrada verdadeira (tentar enviar uma personagem) quando a saída condição é falsa (UART não está ocupado).

Investigar a instrução string formatada (seguinte) antes de usar este instruções. A instrução string formatada é muito mais fácil de usar, e é quase certamente capaz de fazer o que quiser.

> String formatada SOBRE UART var - {"Pressão: \ 3 \ r \ n"} -

LDmicro pode gerar código para usar os UARTs construídos para determinado microcontroladores. Em AVRS com várias UARTs só UART1 (não UART0) é suportado. Configure a taxa de transmissão usando Configurações -> MCU Parâmetros. Certas taxas de transmissão não pode ser obtida com certa freqüências de cristal; LDmicro irá avisá-lo se este for o caso.

Quando o degrau em condição para esta instrução passa de falsa para verdade, ele começa a enviar uma string inteira através da porta serial. Se a string contém a seqüência especial '\ 3', em seguida, que a seqüência vai ser substituído pelo valor de var `', que é automaticamente convertido em uma string. A variável será formatado para levar exactamente três caracteres, por exemplo, se o `var 'é igual a 35, então a seqüência exata impresso será `Pressão: 35 \ r \ n '(observe o extra espaço). Se, em vez `var 'eram iguais a 1432, então o comportamento seria ser indefinido, porque 1432 tem mais de três dígitos. Nesse caso seria necessária a utilização de '\ 4', em vez.

Se a variável pode ser negativo, então use '\-3d' (ou '\-4d' etc) em vez disso. Isso fará com que LDmicro para imprimir um espaço à esquerda para números positivos, e um sinal de menos precedente para números negativos.

Se várias instruções string formatada são energizados ao mesmo tempo (Ou se for activado antes de outra termina), ou se estes instruções são misturados com as instruções UART TX, em seguida, o comportamento é indefinido.

Também é possível utilizar esta instrução para produzir uma corda fixa, sem interpolação valor de uma variável inteira no texto que é enviado através de série. Neste caso, simplesmente não incluem o especial seqüência de escape.

Utilize '\ \' para uma barra invertida literal. Além da sequência de escape para interpolação uma variável inteira, o seguinte controle caracteres estão disponíveis: * \ R - retorno de carro * \ N - nova linha * \ F - formfeed * \ B - backspace * \ XAB - personagem com 0xAB valor ASCII (hex)

A condição da saída da linha desta instrução é verdadeiro, embora seja transmissão de dados, mais falso. Esta instrução consome muito grande quantidade de memória de programa, por isso deve ser usado com moderação. O implementação atual não é eficiente, mas um melhor vontade exigir modificações para todos os back-ends.

UMA NOTA SOBRE A UTILIZAÇÃO DE MATEMÁTICA====================

Lembre-se que LDmicro realiza apenas matemática inteiro de 16-bit. Isso significaque o resultado final de qualquer cálculo que efectue deve ser uminteiro entre -32768 e 32767. Também significa que o intermediárioresultados de seu cálculo devem estar todos dentro desse intervalo.

Por exemplo, digamos que você queira calcular y = (1 / x) * 1200,onde x é entre 1 e 20. Em seguida, y vai entre 1200 e 60, o qualse encaixa em um número inteiro de 16 bits, de modo que é, pelo menos em teoria possívelexecutar o cálculo. Há duas maneiras que você pode codificar o seguinte:você pode realizar o inverso e, em seguida, multiplicar:

| | {DIV temperatura: =} | | | | --------- {1 / x} ---------- | | | | | | | | {Y MUL: =} | | | | ---------- {Temperatura * 1200} ---------- | | | | | |

Ou você poderia apenas fazer a divisão diretamente, em uma única etapa:

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

Matematicamente, estes dois são equivalentes, mas se você experimentá-los, então vocêvai achar que o primeiro dá um resultado incorreto de y = 0. Queé porque a variável underflows `temp '. Por exemplo, quando x = 3,(1 / x) = 0,333, mas que não é um inteiro, a operação de divisãoaproxima-se esta como temp = 0. Então y = temperatura * 1200 = 0. Na segundaCaso não haja resultado intermediário para underflow, por isso tudo funciona.

Se você está vendo problemas com sua matemática, então verifique intermediário

resultados para underflow (ou transbordamento, o que `envolve ', por exemplo,32767 + 1 = -32768). Sempre que possível, escolher as unidades que colocam os valores emuma gama de -100 a 100.

Quando você precisa de escala variável por algum fator, fazê-lo usando uma multiplicaçãoe uma divisão. Por exemplo, a escala y = 1,8 * x, calcular y = (9/5) * x(Que é a mesma, uma vez que 1,8 = 9/5), e como este código y = (9 * X) / 5,executar a multiplicação em primeiro lugar:

| | {Temperatura MUL: =} | | | | --------- {X} * 9 ---------- | | | | | | | | {DIV y: =} | | | | ----------- {Temp / 5} ----------- | |

Isso funciona para todo x <(32767/9), ou x <3640. Para valores maiores de x,a variável 'temp' faria transbordar. Não existe um limite inferior semelhante sobre x.

CÓDIGO DE ESTILO============

Eu permitir várias bobinas em paralelo em um único degrau. Isto significa quevocê pode fazer coisas como esta:

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

Em vez disto:

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

Isto significa que, em teoria, você pode escrever qualquer programa como um degrau gigante,e não há necessidade de usar múltiplos degraus de todo. Na prática, issoseria uma má idéia, porque, como degraus se tornam mais complexos tornam-semais difícil de editar sem apagar e redesenhar muita lógica.

Ainda assim, muitas vezes é uma boa idéia para a lógica relacionada grupo juntos como uma únicatocado. Isso gera código quase idêntico ao se você fez degraus separados,mas isso mostra que eles são relacionados quando você olha para eles na escadadiagrama.

***

Em geral, considera-se uma forma pobre para escrever o código de tal maneira quea sua produção depende da ordem dos degraus. Por exemplo, este códigonão é muito bom se ambos Xa e Xb pode sempre ser verdadeiro:

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

Eu vou quebrar esta regra, se ao fazê-lo eu posso fazer um pedaço de códigosignificativamente mais compacto, no entanto. Por exemplo, aqui está como eu fariaconverter uma quantidade binário de 4 bits em XB3: 0 em um número inteiro:

| | {V: =} | | 3 | | ----------------------------------- MOV {0} - | | | | | | | | Xb0 {ADD v: =} | | | | -------] [------------------ V + {1} ----------- | | | | | | | | XB1 {ADD v: =} | | | | -------] [------------------ V + {2} ----------- | | | | | | | | XB2 {ADD v: =} | | | | -------] [------------------ V + {4} ----------- | | | | | | | | XB3 {ADD v: =} | | | | -------] [------------------ {V + 8} ----------- | | | | | |

Se a instrução MOV foi transferida para o fundo do degrau, em vez de o

superior, então o valor de v quando ele é lido em outras partes do programa seriaser 0. A saída do referido código, por conseguinte, depende da ordem em queas instruções são avaliadas. Considerando o quão complicado seriacodificar isso de outra forma, eu aceito isso.

BUGS====

LDmicro não gerar código muito eficiente, ele é lento para executar edesperdício de flash e RAM. Apesar disso, a PIC médias ou AVR podefazer tudo o que um pequeno PLC pode, então isso não me incomoda muito.

O comprimento máximo de nomes de variáveis é muito limitado. Isto é de modo queeles se encaixam muito bem no diagrama de escada, então eu não vejo uma boa soluçãopara isso.

Se o seu programa é muito grande para a época, a memória de programa ou dados de memóriarestrições do dispositivo que você escolheu, então você provavelmente não vaiobterá um erro. Ela só vai estragar algum lugar.

Programação Careless no arquivo de carregar / salvar rotinas provavelmente tornapossível travar ou executar código arbitrário dado um corrupto ou mal-intencionadoArquivo ld..

Por favor reportar bugs adicionais ou pedidos de funcionalidades ao autor.

Agradecimentos: * Marcelo Solano, para relatar um bug UI em Win98 * Serge V. Polubarjev, não só para perceber que RA3: 0 no PIC16F628 não funcionou, mas também me dizer como corrigi-lo * Maxim Ibragimov, para relatar e diagnosticar os principais problemas com os até-então-não testados ATmega16 e ATMEGA162 alvos * Bill Kishonti, para relatar que o simulador caiu quando o programa de lógica ladder dividido por zero * Mohamed Tayae, para relatar que as variáveis persistentes foram quebrados no PIC16F628 * David Rothwell, para relatar vários bugs de interface de usuário e uma problema com o "Exportar como texto" função

COPIAR E AVISO LEGAL=======================

NÃO USE o código gerado pelo LDmicro em aplicações onde SOFTWAREFALHA PODE resultar perigo à vida humana e danos à propriedade. THEAUTOR NÃO ASSUME RESPONSABILIDADE POR DANOS resultantes da operaçãoDE LDmicro OR código gerado pelo LDmicro.

Este programa é software livre: você pode redistribuí-lo e / ou modificá-losob os termos da GNU General Public License como publicado pelaFree Software Foundation, tanto a versão 3 da Licença, ou (na suaopção) qualquer versão posterior.

Este programa é distribuído na esperança que será útil, masSEM QUALQUER GARANTIA, sem mesmo a garantia implícita de COMERCIALIZAÇÃOou ADEQUAÇÃO A UM DETERMINADO FIM. Veja a GNU General Public Licensepara mais detalhes.

Você deve ter recebido uma cópia da GNU General Public License juntamentecom este programa. Se não, veja <http://www.gnu.org/licenses/>.

Jonathan Westhues

Rijswijk - dezembro 2004Waterloo ON - junho, julho 2005Cambridge, MA - Sep, Dez 2005 Fevereiro, Mar 2006 Fev 2007Seattle WA - fevereiro 2009

Email: jwesthues usuário, pelo acolhimento cq.cx