Ações

O editor de ação: identidade e localização, o bloco de script, o que um script pode ler e escrever, todas as mensagens de validação, o verbo Executar e o diário dele, Habilitar e Desabilitar, Copiar e Excluir, e os limites de execução.

Ver como Markdown

Uma ação é um bloco de instruções JavaScript que lê o espaço de endereços e escreve variáveis de memória e tags. As ações são o caminho de escrita da Logic: elas rodam sob demanda (Executar), por um gatilho, ou a partir de um Botão de dashboard ligado a elas. Selecione uma ação sob a seção Ações da coluna da Logic (ou crie uma com Novo… > Nova ação) para abrir o editor dela; ler exige Ver a lógica, editar exige Configurar a lógica, executar exige Operar a lógica.

O cabeçalho mostra a marca de ação, o nome, a frase "Um script que você executa sob demanda, ou que um gatilho executa por você, escrevendo variáveis e tags." e uma pílula Desabilitada enquanto a ação está desligada. A coluna do formulário contém IDENTIDADE e SCRIPT; o trilho contém ÚLTIMA EXECUÇÃO.

Identidade

Campo O que é Valores / padrão Efeito
Nome O nome de exibição e o rótulo sob o qual uma execução é registrada no diário. Texto livre; uma ação nova é ActionN; um nome em branco salva como Action. Salva sozinho a cada tecla. Ações são referenciadas por identidade, então renomear não reescreve nada e não quebra nada.
Linha de localização Onde a ação está arquivada, em palavras: Actions / Startup / Walk setpoint. Somente leitura. Uma ação não tem endereço; a linha é um lugar, nunca algo a digitar numa expressão. Mude-a com o Mover para da árvore.
Descrição (opcional) Texto livre. Vazia por padrão. Nenhum.

Script

O cartão SCRIPT é o editor de script com a dica "Instruções JavaScript (let, if, for, funções). Escreva variáveis de memória por atribuição (Variables.Setpoint = 21.5;) e tags com Connector.Driver.Device.Tag.Write(value). As leituras não passam pela porteira da qualidade: confira o .State() e proteja lacunas com ?? antes de fazer contas." O script salva sozinho a cada tecla e é validado a cada meio segundo; a mensagem aparece abaixo da dica. A validação nunca executa o script.

Um script é JavaScript comum em modo estrito (variáveis locais, if, laços, funções, Math, Date, JSON) sobre o mesmo espaço de endereços e a mesma superfície de leitura das expressões, com duas diferenças. As leituras não passam pela porteira da qualidade: uma lacuna lê como null, então confira o .State() e proteja as contas com ??; lidar com uma leitura ruim é para isso que as ações servem. E um script pode ler variáveis de expressão (o valor publicado delas); só uma expressão é que não pode referenciá-las.

O que uma ação pode escrever

Exatamente duas construções alteram a planta, e as duas passam pelo funil de escrita registrado no diário:

Escrita Forma Alvo
Atribuição de memória Variables.Setpoint = 21.5; ou Variables.Forno.Setpoint = 21.5; Uma variável de memória, níveis de pasta incluídos. O valor é convertido para o tipo de saída da variável e marcado para retenção quando a variável é retentiva.
Escrita de tag Connector.Simulated.Pump.Cmd.Write(true); Uma tag ao vivo. O valor é um valor de engenharia: ele viaja de trás para a frente pela cadeia de conversão da tag até o valor bruto que o dispositivo recebe.

Uma escrita é aplicada na hora: o que foi aplicado antes de uma falha continua aplicado, e o diário mostra cada escrita como valor antigo para valor novo, sob a origem Ação. Uma escrita que falha lança um erro, abortando aquela execução com o motivo no resultado dela:

  • "A escrita em 'X' foi rejeitada: o valor não é finito." (NaN ou infinito)
  • "'Tag' não está materializada no connector." (um dispositivo desabilitado, ou uma tag que o servidor embutido não carrega)
  • "Não foi possível converter 'value' para 'Tag'."
  • "'X' está protegida contra escrita por '<holder>'." (uma execução de receita ou um intertravamento segura a origem)
  • "A escrita em 'Tag' falhou. O servidor está rodando?"
  • "A variável 'X' não foi encontrada." e "'Variables.X' é uma variável de expressão: ela é calculada, nunca escrita."

O que a validação recusa

Mensagem Causa
Um script é obrigatório. O editor está vazio.
Erro de script: … O texto não é interpretável.
Os endereços precisam ser estáticos: 'Root' é acessada com um segmento calculado. Variables[name] ou qualquer segmento que não seja literal.
Endereço incompleto '…'. Uma referência curta demais para nomear um ponto.
'X' não foi encontrado. Uma leitura, ou um alvo de atribuição, que não resolve para nada.
Atribua à própria variável: Variables.Name = value. O lado esquerdo do = nomeia um membro, ou vai mais fundo do que o endereço de uma variável permite.
'X' é uma variável de expressão: ela é calculada, nunca escrita. Atribuir a uma variável de expressão.
Os pontos de 'Connector' são somente leitura. Escreva tags com Connector.Driver.Device.Tag.Write(value). Atribuir a qualquer raiz que não seja Variables (o Process tem a mensagem própria dele).
Os pontos do Process são somente leitura nas Ações; comandos de execução e escritas de preparação não são suportados por scripts. Atribuir a um ponto do Process, ou chamar Write nele.
Comandos de execução do Process não podem ser chamados das Ações; os pontos de comando expõem valores de prontidão somente leitura. Chamar Process.<Model>.<Unit>.Commands.Start() ou qualquer outro ponto de comando; um ponto de Commands só lê se o comando poderia executar agora.
Os operadores ++ e -- não são suportados em pontos. Use Variables.Name = Variables.Name.ValueToReal() + 1. Variables.N++.
Write(value) é a escrita de tag: Connector.Driver.Device.Tag.Write(value). Write chamado em algo que não é um endereço de tag.

Variáveis locais do JavaScript (let x = 1; x = x + 1;) não são tocadas por essas regras.

Executar

Executar é o verbo inicial da barra sobre uma ação aberta; ele é desenhado só para um papel com Operar a lógica e fica esmaecido com "Runtime parado" enquanto a estação está em somente leitura (a trava de engenharia não o esmaece: executar é operar, não configurar). Quando o papel também tem Configurar a lógica, o rascunho do editor é salvo primeiro e a execução roda a definição salva; sem ele, a execução roda a definição durável (os campos são somente leitura, então as duas nunca diferem).

Toda execução roda na fila de lógica única com um motor de script novo, então nenhum estado vaza entre execuções e uma execução nunca se intercala com uma varredura, com outra ação ou com uma escrita do operador. Uma execução é abortada além de 500 ms ("O script foi abortado: ele passou do limite de 500 ms (laço infinito?)."), 100.000 instruções ou 4 MB de memória, cada caso com uma mensagem que nomeia o limite. Uma ação desabilitada falha sem rodar ("A ação está desabilitada."); um runtime parado responde "O runtime da lógica não está rodando." O feed relata "Execução OK em 12 ms." ou "A execução falhou: <motivo>". Só a falha chega ao console de Eventos, sob o nome da ação junto com o que a invocou: Manual pelo verbo, o nome do gatilho numa execução agendada. Ela é registrada no diário como aviso na primeira vez, resumida enquanto segue falhando pela mesma causa, e anotada mais uma vez quando se recupera, e essa linha de recuperação é a única entrada que uma execução bem-sucedida escreve ali. Uma execução que simplesmente dá certo, e todo valor que ela escreve, é escrita só na captura detalhada: um script que escreve a cada varredura produz valores aos milhares, e um console cheio deles é um console em que ninguém consegue ler as notícias da estação.

O trilho ÚLTIMA EXECUÇÃO mostra quando a ação rodou pela última vez (ou "Nunca executada."), "Duração: N ms", o último erro numa nota de atenção, e o lembrete "As execuções rodam na fila de lógica única. Só uma execução que falha chega ao console de Eventos; uma execução que dá certo, e todo valor que ela escreve, fica na captura detalhada. Gatilhos invocam ações na agenda." O trilho pertence à ação ao vivo: um salvamento automático nunca o esvazia; um reinício do runtime esvazia.

Comandos

Comando O que faz Esmaecido quando Não aparece quando
Executar Salva o rascunho (com Configurar a lógica) e enfileira uma execução. O runtime está parado. O papel não tem Operar a lógica.
Habilitar / Desabilitar Vira o Habilitado; uma ação desabilitada recusa o Executar e deixa ocioso todo gatilho ligado a ela. A estação está travada ou em somente leitura. O papel não tem Configurar a lógica.
Copiar Duplica a ação na raiz Ações, com um nome livre, e abre a cópia, que não tem execução registrada nem gatilho ligado a ela. A estação está travada ou em somente leitura. O papel não tem Configurar a lógica.
Excluir ação Pergunta "Excluir 'X'? Isso remove a ação. Isso não pode ser desfeito." Um gatilho ligado a ela fica sem ligação, e não é excluído. A estação está travada ou em somente leitura. O papel não tem Configurar a lógica.

O painel da raiz Ações lista toda ação com o estado dela na coluna Valor: "Habilitada · última execução <quando>", com "· erro" quando a última execução falhou, ou "Desabilitada".

O que as ações não fazem

Elas não despacham comandos de execução do Process, não preparam um procedimento nem acrescentam um comentário de execução (esses pontos são valores de prontidão e de preparação, somente leitura); elas não reconhecem alarmes; elas não rodam em paralelo; elas não guardam estado entre execuções e não compartilham funções; e elas não são disparadas por mudança de valor nem por condição, apenas pelo Executar, pelo intervalo de um gatilho ou por um botão de dashboard.