
Principais pontos ou sobre o que é este artigo
O tema do artigo é programação visual de PLCs ShIoTiny para casas inteligentes, descritas aqui: .
Muito brevemente são abordados conceitos como nós, conexões, eventos, assim como as peculiaridades de carregamento e execução de um programa visual em ESP8266, que é a base do PLC ShIoTiny.
Introdução ou algumas questões organizacionais
No artigo anterior sobre meu desenvolvimento, fiz uma breve revisão das capacidades do controlador ShIoTiny.
Estranhamente, o público demonstrou um interesse considerável e me fez muitas perguntas. Alguns até logo sugeriram comprar o controlador. Não, eu não me oponho a ganhar um pouco, mas a consciência não me permite vender algo que ainda está muito cru em termos de programação.
Portanto, eu subi no GitHub os binários do firmware e o esquema do dispositivo: .
Agora cada um pode gravar no ESP-07 e experimentar o firmware. Se alguém realmente quiser uma placa como a da foto — eu tenho algumas. Escreva para o e-mail shiotiny@yandex.ru. Mas, como disse o inesquecível Ogurtsov: 'Eu não me responsabilizo por nada!'.
Então, vamos ao que interessa: o que é 'nó' (node) e 'evento'? Como o programa é executado?
Como de costume, começaremos pela ordem: com o carregamento do programa.
Como o programa é carregado
Comecemos pelo que acontece quando pressionamos o botão Upload no editor ElDraw e nosso esquema-programa, composto por quadrados bonitos, é enviado para o dispositivo.
Primeiro, com base no esquema que desenhamos, é construída uma descrição em formato de texto.
Em segundo lugar, verifica-se se todas as entradas dos nós estão conectadas às saídas. Não deve haver entradas 'flutuantes'. Se uma entrada desse tipo for detectada, o esquema não será carregado no ShIoTiny, e o editor emitirá um aviso correspondente.
Se tudo correr conforme o esperado, o editor envia para o ShIoTiny a descrição de texto do esquema, um nó de cada vez. Naturalmente, o esquema existente no ShIoTiny é removido previamente. A descrição de texto obtida é salva na memória FLASH.
A propósito, se você quiser remover o esquema do dispositivo, basta carregar nele um esquema vazio (que não contenha nenhum elemento-nó).
Assim que todo o esquema-programa é carregado no PLC ShIoTiny, ele começa a "executar-se". O que isso significa?
Vale ressaltar que os processos de carregamento do esquema da memória FLASH ao ligar a energia e ao receber o esquema do editor são idênticos.
Primeiro, são criados objetos-nodes com base em suas descrições.
Em seguida, são estabelecidas as conexões entre os nós. Ou seja, são geradas ligações das saídas para as entradas e das entradas para as saídas.
E somente após tudo isso, o ciclo principal do programa é iniciado.
Eu escrevi muito, mas todo o processo — desde o "carregamento" do esquema da memória FLASH até o início do ciclo principal — leva frações de segundo para um esquema de 60-80 nós.
Como funciona o ciclo principal? Muito simples. Primeiro, ele aguarda a ocorrência de eventos em algum nó, depois processa esse evento. E assim indefinidamente. Ou até que um novo esquema seja carregado no ShIoTiny.
Já mencionei algumas vezes coisas como eventos, nós e conexões. Mas o que são isso do ponto de vista do software? É sobre isso que vamos falar hoje.
Nós, conexões e eventos
Basta olhar para exemplos de esquemas-programas para ShIoTiny, para entender que o esquema consiste apenas em duas entidades — nós (ou elementos) e conexões entre eles.
Nó, nó ou elemento do esquema — é uma representação virtual de alguma ação sobre dados. Isso pode ser uma operação aritmética, uma operação lógica ou qualquer operação que nos venha à mente. O importante é que o nó tem uma entrada e uma saída.
Entrada — é o lugar onde o nó aceita dados. As representações das entradas são pontos que sempre estão à esquerda do nó.
Saída — é o lugar de onde o resultado do trabalho do nó é extraído. As representações das saídas são pontos que sempre estão à direita do nó.
Alguns nós não têm entradas. Esses nós geram resultado dentro de si mesmos. Por exemplo, um nó-constante ou um nó-sensor: eles não precisam de dados de outros nós para informar o resultado.
Outros nós, ao contrário, não têm saídas. Esses nós representam, por exemplo, dispositivos executores (relés ou quaisquer outros semelhantes). Eles recebem dados, mas não geram um resultado de cálculos disponível para outros nós.
Além disso, há também um nó-comentário único. Ele não faz nada, não possui entradas nem saídas. Sua finalidade é ser uma explicação no esquema.
O que é "evento»? Evento — é o surgimento de novos dados em algum nó. Por exemplo, os eventos incluem: mudança de estado de entrada (nó Input), recebendo dados de outro dispositivo (nós MQTT e UDP), expiração de um intervalo de tempo especificado (nós Timer e Atraso) e assim por diante.
Para que servem os eventos? É para determinar — em qual nó surgiram novos dados e quais estados dos nós precisam ser alterados devido à recepção de novos dados. O evento "passa" por uma cadeia de nós até percorrer todos os nós cujos estados precisam ser verificados e alterados.
Todos os nós podem ser divididos em duas categorias.
Nós que podem gerar eventos chamaremos de "nós ativos».
Nós que não podem gerar eventos chamaremos de "nós passivos».
Quando um nó gera um evento (ou seja, novos dados aparecem na saída), geralmente o estado de toda a cadeia de nós conectados à saída do nó gerador do evento é alterado.
Para ficar claro, vejamos um exemplo na imagem.

Os nós ativos aqui são — Input1, Input2 e Input3. Os outros nós são passivos. Vamos ver o que acontece quando um dos entradas é fechada. Os resultados são apresentados de forma resumida em uma tabela.

Como vemos, ao surgir um evento, é construída uma cadeia do nó-fonte do evento até o nó terminal. O estado dos nós que não estão na cadeia não é alterado.
Surge a pergunta legítima, o que acontece quando ocorrem dois ou mesmo vários eventos ao mesmo tempo?
Como amante da criatividade de Gleb Anfilov, sinto-me tentado a encaminhar o curioso questionador ao seu livro "Fuga das Surpresas". É uma "teoria da relatividade para os mais pequenos", na qual é bem explicado o que significa "simultaneamente" e como viver com isso.
Mas, na prática, é muito mais simples: ao ocorrer dois ou mais eventos, todas as cadeias de cada fonte de evento são construídas e processadas em sequência, sem nenhuma mágica.
A próxima pergunta legítima de um leitor curioso é: o que acontece se os nós forem conectados em um anel? Ou, como é comum entre os especialistas, introduzir feedback. Ou seja, conectar a saída de um nó à entrada do nó anterior de forma que o estado da saída desse nó influencie o estado de sua própria entrada. O editor não permitirá que você conecte diretamente a saída do nó à sua própria entrada. ElDrawMas indiretamente, como mostrado na figura abaixo, isso é possível.
Então, o que acontecerá nesse caso? A resposta será bastante "definida": dependendo de quais nós. Vamos considerar um exemplo na figura.

Quando os contatos da entrada Input1 estão abertos na entrada superior do nó A — 0. Na saída do nó A, também 0. Na saída do nó B — 1. E, finalmente, na entrada inferior do nó A — 1. Tudo claro. E para quem não entendeu, veja abaixo a descrição de como funcionam os nós "E" e "NÃO".
Agora vamos fechar os contatos da entrada Input1, ou seja, aplicar um nível alto (1) na entrada superior do nó A. Aqueles que estão familiarizados com eletrônica sabem que, na prática, obteremos um esquema clássico de gerador com elementos lógicos. E, em teoria, tal esquema deve continuamente produzir nas saídas dos elementos A e B sequências 1-0-1-0-1-0… e 0-1-0-1-0-1…. Afinal, o evento deve alterar constantemente o estado dos nós A e B, circulando de 2-3-2-3-…!
Mas, na verdade, isso não acontece. O circuito entrará em um estado aleatório — ou o relé permanecerá ligado ou desligado, ou poderá ficar ligeiramente oscilando, ligando e desligando várias vezes consecutivas. Tudo depende do clima no polo sul de Marte. E aqui está o porquê disso acontecer.
O evento no nó Input1 altera o estado do nó A, depois o do nó B e assim por diante, várias vezes. O programa detecta o "looping" do evento e interrompe forçosamente esse carnaval. Após isso, a modificação do estado dos nós A e B é bloqueada até que um novo evento ocorra. O momento em que o programa decide — "basta de girar em círculos!" — geralmente depende de muitos fatores e pode ser considerado aleatório.
Tenha cuidado ao conectar nós em anel — os efeitos nem sempre serão óbvios! Tenha uma boa noção do que está fazendo e por quê!
É possível construir um gerador com os nós disponíveis? Sim, é possível! Mas para isso, é necessário um nó que possa gerar eventos por conta própria. E esse nó existe — é a "linha de atraso". Vamos ver como funciona um gerador com um período de 6 segundos na imagem abaixo.

O elemento chave do gerador é o nó A — a linha de atraso. Se o estado da entrada da linha de atraso mudar de 0 para 1, o 1 na saída não aparecerá imediatamente, mas somente após um tempo determinado. No nosso caso, isso é 3 segundos. Da mesma forma, se o estado da entrada da linha de atraso mudar de 1 para 0, o 0 na saída aparecerá após os mesmos 3 segundos. O tempo de atraso é definido em décimos de segundo. Ou seja, o valor 30 significa — 3 segundos.
A característica da linha de atraso é que ela gera um evento após o término do tempo de atraso.
Suponha que inicialmente a saída da linha de atraso era 0. Após passar pelo nó B — o inversor — esse 0 se transforma em 1 e entra na linha de atraso. Imediatamente, nada acontece. Na saída da linha de atraso, continuará a ser 0, mas o contador do tempo de atraso começa a contar. Três segundos se passam. E então a linha de atraso gera um evento. A saída passa a ser 1. Esse 1, após passar pelo nó B — o inversor — se torna 0 e entra na linha de atraso. Mais 3 segundos se passam... e o processo se repete. Ou seja, a cada 3 segundos, o estado da saída da linha de atraso muda de 0 para 1 e depois de 1 para 0. O relé clicará. O gerador está funcionando. O período dos pulsos é de 6 segundos (3 segundos com saída zero e 3 segundos com um).
No entanto, em circuitos reais, geralmente não é necessário utilizar este exemplo. Existem nós temporizadores especiais que geram magnificamente e sem ajuda externa uma sequência de pulsos com um período definido. A duração do "zero" e do "um" nesses pulsos é igual à metade do período.
Para definir ações periódicas, utilize nós temporizadores.
Vale ressaltar que sinais digitais, onde a duração do "zero" e do "um" é igual, são chamados de "meandro".
Espero ter esclarecido um pouco a questão de como ocorre a propagação de eventos entre os nós e o que não deve ser feito.
Conclusão e referências
O artigo ficou curto, mas é uma resposta às perguntas surgidas sobre nós e eventos.
À medida que o firmware evolui e novos exemplos surgem, eu escreverei sobre como programar ShIoTiny artigos curtos, enquanto isso for interessante para as pessoas.
Como antes, o esquema, firmware, exemplos, descrição dos nós e tudo .
Perguntas, sugestões, críticas — envie aqui: shiotiny@yandex.ru
Fonte: habr.com
