INÍCIO > Fórum > Programação IEC 61131 (LogicLab) > Gerencie um contador com um valor de retenção
- Este tópico tem 9 respostas, 2 participantes e foi atualizado pela última vez 5 anos, 7 meses atrás da Sergio Bertana.
-
autorPublique
-
Outubro 31, 2017 em 8: 56 am #36161Alessandro Campodonicoparticipante
Eu deveria gerenciar uma contagem colocando o valor em uma variável retentiva (RETAIN), para a contagem eu criei meu próprio FB que executa as várias verificações e aumenta um contador, então eu coloco a saída em uma variável retentiva (em DB100.2048). Mas quando eu desligo o sistema e ligo novamente, o valor da contagem é zerado, o que posso fazer.
Outubro 31, 2017 em 9: 04 am #40003Sergio BertanaAdministrador do fórumO seu problema é que quando o FB é ligado ele tem todas as variáveis internas zeradas, portanto também o valor de saída é zerado, já que você coloca o valor de saída na variável buffer, você também zera a variável.
Para usar variáveis alocadas na memória buffer (Backup ou Retain) dentro de funções ou blocos de funções, você deve usar ponteiros passando o endereço da variável. Desta forma, iremos operar sobre o valor real da variável, que, sendo armazenada em buffer, manterá o valor que tinha quando foi desligada ao ligar. No LogicLab os ponteiros são identificados com o símbolo @portanto, uma variável @UINT é realmente um ponteiro para uma variável UINT.
Percebi o projeto RetainCounter (Programa de impressão) que ilustra com três FBs diferentes nos idiomas LD, IL e ST como gerenciar as variáveis RETAIN de um FB (Download do projeto).
Julho 18, 2018 em 6: 08 am #45121Alessandro CampodonicoparticipanteBoa noite, ainda estou lutando com meu contador de FB, até hoje consegui, criando um pequeno programa no boot da tarefa que copiava o valor de uma variável retentiva para a entrada do meu FB então quando eu inicio o plc meu FB assume o valor da variável retentiva e, portanto, não me zera.
O problema é que este sistema "sobrecarrega" o programa tanto como espaço de código quanto como espaço de variável, então hoje me vejo tendo que modificar o FB para manter os valores retentivos corretamente e eliminar aquela parte desnecessária do código.
Fiz alguns testes usando o programa carregado por você, o primeiro problema que surge é isso, todo meu programa é escrito em linguagem IL e ainda não consegui encontrar o caminho para usar a função ADR nessa linguagem, como devo fazer? ?
Como eu mudo meu FB para adaptá-lo ao ponteiro? Eu só tenho que definir a variável com o @ e defini-lo como uma variável de entrada? a variável de suporte externo sempre tem que ser uma @ ou normal?
Julho 19, 2018 em 6: 36 am #45124Sergio BertanaAdministrador do fórumPara não ter que copiar a variável, a única maneira é passar seu endereço para a função ou bloco funcional, pois ele usa a linguagem IL.Aqui está como escrever o programa que usa o FB ILRetainCtr. Eu declarei a variável no programa Contador do tipo ILRetainCtr.
VAR
Contador: ILRetainCtr;
END_VARE aqui está uma lista simples de IL, como você pode ver, a entrada Di00CPU está conectada ao relógio do contador, e o endereço da variável Contadores [0] que é do tipo RETAIN é passado para Valor.
LD Di00CPU
ST Counter.Clk
Contadores ADR [0]
ST Counter.Value
Contador de CALEu incluo o projeto LogicLab para o download.
Julho 20, 2018 em 6: 26 am #45125Alessandro CampodonicoparticipanteEu tinha sido enganado pelo fato de que, ao escrever o comando ADR (em IL), a escrita não era azul, o que, por exemplo, acontece para (LD ST ADD SUB GT ECC ECC), então eu pensei que não funcionou. Então eu aproveito esta oportunidade para lhe perguntar mais uma coisa (desculpe se eu for OT)
Como você usa as "funções" na linguagem IL se tento mapear uma variável, ela não marca a caixa de funções, mas apenas os blocos de função, e se tento escrever CAL FUNCTIONNAME obviamente o compilador me diz que não é uma variável.
Julho 20, 2018 em 6: 47 am #45135Sergio BertanaAdministrador do fórumA resposta à sua pergunta está no manual do LogicLab, com o LogicLab existem dois manuais, um é o que explica o funcionamento do programa (F1 em qualquer janela do programa) e o outro é aquele com referências a todas as funções e FBs fornecidos com nossos produtos (F1 em um nome de função ou FB).
Mas chegando à sua dúvida para executar uma função do IL basta colocar seu nome como o primeiro operando de uma linha do programa. Lembre-se que o primeiro parâmetro da função é passado pelo acumulador, enquanto os demais são colocados de acordo com a definição. O resultado da função é devolvido ao acumulador. Ali está ele imagem de tela com um exemplo.
Julho 20, 2018 em 2: 01 pm #45136Alessandro CampodonicoparticipantePor exemplo, tentei usar a função ValueScale, mas o compilador me deu um erro:
G0001 Numero di operandi non valido.
E eu responderei escrevendo apenas
LD Temperatura
ValueScaleO que posso fazer para resolver?
Julho 20, 2018 em 2: 05 pm #45138Sergio BertanaAdministrador do fórumA resposta está errada, a função ValueScale tem vários operandos
Input (REAL) Valor de entrada a ser dimensionado.
ILow (REAL) Limite mínimo do valor de entrada a ser dimensionado.
IHigh (REAL) Limite máximo do valor de entrada a ser dimensionado.
OLow (REAL) Limite mínimo do valor de saída escalado.
OHigh (REAL) Limite máximo do valor de saída escalado.E você não os colocou. Por exemplo, se você quiser transformar uma entrada 4-20 mA em 10-50 PSI, é necessário escrever:
Sensor LD (* Entrada, valor de entrada a ser escalado *)
Escala de valor 4.0, 20.0, 10.0, 50.0
Pressão STSetembro 12, 2018 em 3: 17 pm #45361Alessandro CampodonicoparticipanteBom dia, eu voltei para lutar com a minha contagem operação FB horas e ponteiros. Eu estava tentando atualizar meu bloco, para evitar ter que copiar valores, mas encontrar um bloco PLC, eu vou explicar.
Então meu bloco conta a ativação de seu tempo de entrada, dividido por segundos, minutos e horas, e dentro ele executa todas as instruções sobre essas variáveis 3 (bloco de saída)
se eu não entendi errado atualizar corretamente o bloco com ponteiros, devo "mapeá-los" corretamente adicionando @ na lista dessas 3 variáveis, então sempre adicione @ na lista de instruções onde essas variáveis são usadas, finalmente atribua as 3 variáveis como entrada e não como saída, ao fazê-lo em teoria eu deveria ter atualizado corretamente (novamente se eu não entendi mal). Mas vou carregar o programa no plc tenho um bloco, o arquivo de log me dá esse texto
[E] SFR050 [05/09/2018 10:24:06] 1020, Except: IVECTOR At:0x00000000
[L] SFR050 [05/09/2018 10:24:06] 1000, System power on
[L] SFW184 [05/09/2018 10:24:06] 5005, Starting Op. System SFW184B080
[E] SFW184 [05/09/2018 10:24:06] 6030, LLab Cn, ApplID:0x364F53D4Setembro 12, 2018 em 3: 23 pm #45377Sergio BertanaAdministrador do fórumO uso de ponteiros fornece considerável poder no desenvolvimento de programas mas é MUITO PERIGOSO, se passar um endereço incorreto para o ponteiro você pode acessar toda a memória do sistema passando a operar mesmo em áreas do sistema operacional.
No seu caso, você provavelmente errou o direcionamento que trava o sistema com uma exceção. Seguindo o erro, o sistema reinicia, então se o LogicLab estiver conectado ele para em stop. Mas se o LogicLab não estiver conectado, o sistema tenta reiniciar algumas vezes até parar no modo de suspensão.
Então, no seu caso, você definitivamente tem um erro no valor passado ao ponteiro, olha para o projeto de amostra dos posts anteriores e clona o programa para o seu uso.
-
autorPublique
- Você deve estar logado para responder a este tópico.