2. Como a VCU executa uma função customizada
#O laço de 1 kHz
A VCU executa o grafo inteiro a cada 1 ms (1 kHz). Cada execução é um ciclo. O intervalo é nominal: o instante exato de cada ciclo depende da ocupação do processador. O tamanho do grafo é limitado pelas duas reservas de memória descritas adiante. Depois de gravar uma função, confirme no log que a VCU responde como antes.
O ciclo não entrega o intervalo de tempo aos blocos. Cada bloco usa a sua própria base:
| Base de tempo | Blocos |
|---|---|
| Por passo: 1 passo é 1 ciclo, cerca de 1 ms | Filtro EMA, Filtro médias, Contador, Sample and Hold (guarda um valor no instante de um disparo); o filtro interno da Derivada |
| Tempo real, em milissegundos ou pelo intervalo medido pela VCU | Atraso, Timer cíclico, Rampa, Filtro passa baixa, Integrador, Derivada, decaimento do Detector de Pico |
| Escala fixa do campo Tempo de loop (ms) | PID (controle proporcional, integral e derivativo): o campo não é o período; o bloco roda a cada ciclo |
#Um grafo só, em ordem de dependência
As funções habilitadas do mapa, até 10, viram um único grafo. A VCU executa os blocos na ordem de dependência: cada bloco roda depois de todos os que o alimentam e lê o valor do ciclo atual deles, nunca o do ciclo anterior.

Funções diferentes não têm cabos entre si. Para passar um valor de uma função para outra, grave-o com Valor para VCU num canal Medida customizada e leia o mesmo canal com Valor da VCU na outra. Confira no log em que momento o valor chega à outra função.
#Laço no desenho
O editor deixa você ligar blocos em círculo, de modo que o resultado de um bloco volte, por outros blocos, a uma entrada anterior. Ele só recusa o cabo de um bloco nele mesmo e um segundo cabo na mesma entrada. Não confunda esse laço no desenho com o laço de 1 kHz.
A VCU não executa o laço no desenho. Os blocos que fazem parte dele, e todos os que dependem deles, nunca entram na ordem de execução: a VCU não os executa e o medidor de memória continua contando esses blocos.

Na VCU, um bloco nunca lê a saída de um bloco que roda depois dele. Para o resultado anterior influenciar o próximo, há dois caminhos. O primeiro é usar um bloco que guarda estado de um ciclo para o outro, como Histerese, SR Latch (guarda um estado entre um comando Set e um comando Reset), Integrador ou Contador: o valor guardado volta a 0 quando o grafo é carregado. O segundo é passar o valor por um canal Medida customizada livre: Valor para VCU grava e Valor da VCU lê o mesmo canal. Uma medida que já vem de uma entrada física ou da rede CAN (a rede de comunicação entre os módulos do veículo) pode ter o valor sobrescrito. Confira no log o atraso entre gravar e ler antes de depender desse caminho.
#Números com casas decimais
Todo valor que passa por um cabo é um número com casas decimais, com cerca de 7 dígitos de precisão; o editor mostra 6 casas. O que isso implica:
- Um sinal lógico é o número 1,0 (verdadeiro) ou 0,0 (falso).
- Uma entrada sem cabo vale 0,0, não o último valor. Há poucas exceções, descritas nas fichas dos blocos.
- No bloco Lógica, uma entrada é verdadeira quando é maior que 0,0: 0,3 é verdadeiro; 0 e números negativos são falsos. Não existe limiar de 0,5. Quem liga uma grandeza analógica direto na Lógica percebe isso; quem usa só 0 e 1, não.
- Um botão chega ao grafo como 1,0 ou 0,0. A rotação e a marcha são inteiras na VCU e chegam ao grafo como números inteiros, sem escala.
- A VCU não verifica nem avisa resultado inválido (NaN, sigla em inglês de "não é um número", ou infinito) nem divisão por zero. O bloco Operação matemática devolve 0 numa divisão por zero.
#Memória: duas reservas para o mapa inteiro
A VCU reserva duas áreas de memória para as funções customizadas. Os limites valem para o mapa inteiro, não para cada função: o uso de todas as funções habilitadas é somado.
- Memória de trabalho, 512 bytes (barra RAM): guarda o estado de cada bloco, como a saída e os acumuladores.
- Configuração, 2048 bytes (barra Config): guarda o tipo de cada bloco, as ligações e os parâmetros.

O FuelTech Vision mostra o uso no canto inferior esquerdo do editor. O título Memória: N% traz o maior dos dois percentuais; os números "usado / total" mostram o valor real (as cores e o limite de 100 % da barra estão no capítulo A tela de Funções customizadas).
Habilitar e desabilitar. Só as funções habilitadas contam na memória e são executadas. Uma função desabilitada continua guardada no mapa, e os bytes dela voltam a ficar livres. Se todas as funções estiverem desabilitadas, a VCU não executa grafo. O capítulo A tela de Funções customizadas mostra como habilitar.
#O que consome mais
A maioria dos blocos usa de 4 a 16 bytes de memória de trabalho. Pesam mais os blocos abaixo:
| Bloco | Memória de trabalho (de 512 bytes) | Configuração (de 2048 bytes) |
|---|---|---|
| Ação na VCU | 32 | 16 |
| Filtro médias (1 a 32 pontos) | 16 a 140 | 5 |
| Tabela 12x12 | 4 | 682 |
| Tabela 8x8 | 4 | 330 |
| Tabela 4x4 | 4 | 106 |
| Vetor 1x16 | 4 | 136 |
| PID | 12 | 22 |
| Valor da VCU | 4 | 4 |
#Ao passar do limite
O Confirmar não é bloqueado pela memória. Ao gravar o mapa aberto na VCU, o FuelTech Vision confere a memória antes de enviar: se a configuração passar de 2048 bytes ou a memória de trabalho passar de 512 bytes, ele não grava e mostra a caixa Memória das Funções Customizadas excedida: "As Funções Customizadas deste mapa excedem a memória disponível. Reduza a quantidade de blocos/parâmetros e tente gravar novamente." Essa conferência acontece no botão Gravar da barra superior (dica "Gravar na VCU"), em qualquer uma das três opções de gravação. Tornar ativo, na lista de mapas guardados na VCU, não a refaz: ele só ativa um mapa que já está lá.
Se um mapa acima do limite for ativado na VCU sem ter passado por essa conferência, nenhuma função customizada roda: não existe carga parcial. Com a memória de trabalho acima de 512 bytes, a VCU avisa "Função customizada: memória de execução esgotada". Com a configuração acima de 2048 bytes, o grafo é descartado sem aviso.
#Ações na VCU: prioridade e convivência com as funções nativas
O bloco Ação na VCU tem 17 ações, além de Nenhuma, e nenhum campo de prioridade. Nos nomes das ações, ETC é a borboleta eletrônica, Flex Fuel é o uso de combustível com teor de etanol variável, sonda lambda é o sensor que mede a mistura no escapamento e EV é veículo elétrico. Cada tipo de ação convive de um jeito com as funções nativas:
| Tipo | Exemplos | Convivência com as funções nativas |
|---|---|---|
| Compensação | Compensação de ignição, Compensação de injeção, Compensação de ETC, Compensação de alvo de torque (EV) | Acrescenta ao que as funções nativas já calculam. Vários blocos da mesma compensação somam. |
| Substituição | Ponto de ignição, Abertura máxima de ETC, Override de etanol (Flex Fuel), Override de alvo de sonda lambda, Override de alvo de torque (EV) | Troca o valor nativo naquele ponto, com prioridade fixa. Vence a de maior prioridade. A Abertura máxima de ETC escala o alvo em vez de substituí-lo (ficha Ação na VCU). |
| Corte | Corte de ignição, Corte de combustível | Concorre com os cortes nativos: vence o maior nível. |
A função customizada entra com prioridade fixa, que você não pode mudar. Na ignição, ela perde para as funções nativas de largada (3-step, 2-step e burnout) e para a troca de marcha, e empata com o anti-lag, que segura a pressão do turbo com o acelerador fechado. Na abertura máxima de ETC, perde, entre outras, para o controle de boost por ETC. Funções nativas de prioridade menor perdem para ela. Com o hard cut, o limitador de rotação, a função ganha só no ponto de ignição fixo que o limitador pode aplicar: o corte do limitador continua agindo. O bloco Corte de ignição alta-res. não usa esta prioridade: disputa com o controle de tração, o 2-step, o 3-step e o burnout pelo maior percentual. No empate com o anti-lag não há ordem garantida: não conte com uma das duas e confira no log qual atua. Dois blocos que pedem a mesma ação de substituição: só um vale, e o outro não atua. As substituições ficam ativas o tempo todo em que a função roda, mesmo com a entrada em 0, inclusive o Override de alvo de torque (EV); só o Override de alvo de sonda lambda depende de entrada maior que 0.
#Inicialização
Ao ligar a VCU e a cada gravação de mapa, a VCU carrega o grafo:
- A memória de trabalho é zerada: todo estado interno recomeça em 0, como acumuladores e o estado de histereses e latches.
- Os blocos de saída e o bloco Ação na VCU entram desligados e passam a responder ao grafo a partir do primeiro ciclo.
- Enquanto a VCU recebe um mapa novo, o grafo não é executado. Ele volta depois do recarregamento.
- Ao descarregar o grafo (por exemplo, num mapa com todas as funções desabilitadas), as ações deixam de atuar, as saídas On/Off e PWM desligam, as saídas analógicas vão a 0 V e os canais escritos por Valor para VCU ficam com o último valor.
#Valores que aparecem nos blocos no editor
Os valores que o editor mostra nos blocos são calculados no computador, não lidos da VCU (seção Valores ao vivo nos blocos, no capítulo Montando o grafo). Use-os para conferir as ligações do desenho, não o comportamento no tempo: a simulação pode diferir da VCU, principalmente nos blocos que dependem do tempo ou guardam estado, como os filtros, o Contador, o Detector de Pico, Atraso, Timer cíclico, Rampa, Integrador e Derivada. Um Filtro EMA, por exemplo, responde no editor cerca de 100 vezes mais devagar que na VCU.
Para ver o que a VCU calculou de verdade, grave o valor com Valor para VCU num canal Medida customizada e acompanhe esse canal. Quase todos os exemplos deste guia fazem isso. Confira antes se o canal está na lista de canais do log.