8. Do problema ao grafo
Uma função customizada boa começa no papel, não no editor. Este capítulo é o roteiro de 11 passos que os exemplos do capítulo seguinte seguem. O desenho completo da função, com todos os blocos e cabos, é o grafo.

#Passo 1: escreva o objetivo em uma frase
Escreva o que a função faz e quando age, por exemplo: "liga a ventoinha acima de 95 °C e desliga abaixo de 90 °C". Cada bloco gasta memória do mapa inteiro: são 512 bytes de memória de trabalho e 2048 bytes de configuração para as 10 funções somadas, e só as funções habilitadas contam. Um objetivo curto evita bloco que não serve a nada.
#Passo 2: liste as entradas
- Cada entrada é um bloco Valor da VCU. Ele lê o canal que você escolhe na lista, no valor que a VCU guarda, sem converter para a unidade que a tela mostra. Confira a unidade lendo o canal no log.
- O bloco não olha se o canal é válido: com o sensor desconectado ele entrega o que estiver guardado no canal. Entrada sem cabo vale 0.
- Alguns canais da lista sempre valem 0, entre eles Temperatura do Processador, Odômetro, Horímetro e a data e a hora da VCU. A lista completa está no capítulo Blocos de entrada, matemática e lógica.
- O editor mostra um alerta no bloco quando o canal vem de uma entrada que não está configurada no mapa. Veja o capítulo Blocos de entrada, matemática e lógica.
#Passo 3: condicione o sinal
Condicionar é deixar o sinal pronto para decidir: filtrar, limitar e escalar. Filtre antes de derivar.
- A Derivada divide a diferença entre duas execuções seguidas pelo tempo real entre elas e entrega unidades por segundo, sem janela. Um degrau na entrada vira um pico. Filtre a entrada antes com Filtro EMA ou Filtro passa baixa.
- No Filtro EMA, Alpha é o peso da amostra nova a cada execução da função (cerca de 1 ms, conforme a ocupação do processador): Alpha pequeno filtra mais. A constante de tempo é −1 ms ÷ ln(1 − Alpha): Alpha 0,005 dá cerca de 200 ms e 0,15 dá cerca de 6 ms.
- O Limitador vem com mínimo 0 e máximo 100: um Limitador esquecido no padrão corta grandezas negativas ou acima de 100. A Zona Morta entrega 0 dentro da faixa e, fora dela, a entrada menos o limite. Veja os capítulos Blocos de entrada, matemática e lógica e Blocos de tempo, filtro, controle e tabela.
#Passo 4: decida
| Você precisa de | Use | Cuidado |
|---|---|---|
| Comparar um valor com um limite | Chave | A comparação é estrita: no valor exato do limite a condição é falsa. Ao trocar o modo, mova o cabo do limite para o soquete certo. |
| Não oscilar em torno do limite | Histerese | Liga em valor maior ou igual ao limite superior e desliga em menor ou igual ao inferior. Começa desligada. |
| Lembrar um evento até um reset | SR Latch | Set e Reset valem acima do limiar (0,5 no padrão). Com os dois ativos, o campo Prioridade decide. |
| Exigir que a condição dure um tempo | Atraso (On-Delay) | Trata a entrada como liga/desliga (maior que 0). O tempo é em segundos. Não atrasa um sinal analógico. |
| Manter ligado depois que a condição cai | Atraso (Off-Delay) | Mesmas regras do On-Delay. |
| Combinar condições | Lógica | É verdadeiro qualquer valor maior que 0: 0,3 já é verdadeiro. |
#Passo 5: aja
- A Ação na VCU soma ou substitui um valor dentro da VCU (17 ações). As compensações somam com as correções nativas. As ações de substituição não têm prioridade ajustável e perdem para funções nativas como as de largada (2-step, 3-step e burnout), a troca de marcha e o controle de boost por ETC. O bloco limita o valor entre Mínimo e Máximo, e um bloco novo vem com os dois em 0: ajuste o Mínimo e o Máximo. Dois casos à parte: o Ponto de ignição ganha do hard cut, o limitador de rotação, mas só no ponto de ignição fixo, e o corte do limitador continua agindo; e o bloco Corte de ignição alta-res. disputa com o controle de tração, o 2-step, o 3-step e o burnout pelo maior percentual.
- Saída On/Off, Saída PWM e Saída analógica 0-5V escolhem uma função de saída, por exemplo Saída custom function 1, e não um pino. Atribua essa função a um pino na tela Saídas (a saída analógica, na tela Saídas Analógicas): sem isso o bloco fica mudo e nada avisa. Veja o capítulo Blocos de saída.

#Passo 6: registre
- Use um bloco Valor para VCU para cada grandeza intermediária que você vai querer ver no log. As Medida customizada #01 a #36 são de uso livre e não gastam memória de trabalho (só 6 bytes de configuração).
- Não grave em canal que tenha dono, como uma entrada física ou um canal de CAN: o dono pode sobrescrever o valor.
- Habilite cada canal no datalogger (o gravador de log da VCU, tela Configurações do datalogger) e confirme que ele aparece no log. Veja o capítulo Blocos de saída, ficha Valor para VCU.

#Passo 7: nomeie todos os blocos
- O nome do bloco é o único comentário que o grafo aceita. Abra Configurar bloco (a engrenagem do bloco) e preencha Nome do bloco. Texto vazio é ignorado: não dá para voltar ao nome padrão apagando.
- Todo campo que vai para a tela do usuário precisa de Nome personalizado. Sem ele o campo aparece com o nome padrão, e dois Valor Fixo ficam iguais para o cliente. Veja os capítulos Montando o grafo e Tela do usuário.
#Passo 8: confira a memória antes de gravar na VCU
- O medidor do editor mostra Memória: N%, o maior entre RAM (trabalho, limite de 512 bytes) e Config (limite de 2048 bytes), somando as funções habilitadas. O texto fica âmbar acima de 75 % e vermelho acima de 90 %, e a barra para em 100 % mesmo que o uso real seja maior.
- Confirmar não bloqueia nada. Na gravação, o FuelTech Vision confere os limites e recusa o envio com a caixa Memória das Funções Customizadas excedida, que não diz qual função nem quanto passou. Use o medidor antes.
As tabelas e o Filtro médias são os blocos que mais pesam: uma Tabela 8x8 usa 330 bytes de configuração (16,1 %) e o Filtro médias com 32 pontos usa 140 bytes de trabalho (27,3 %). Use o medidor para o total.
#Passo 9: teste com o motor parado
- A função roda sempre que a VCU está ligada e o grafo está carregado, mesmo com o motor parado. Cortes de ignição e de combustível só atuam com RPM acima de 0, mas as saídas, as ações de ETC e as de torque (EV) agem.
- Mova o pedal e a borboleta (TPS, o sensor de posição da borboleta) e leia cada canal de registro. Os valores que o editor mostra nos blocos são calculados pelo PC, não lidos da VCU, e os blocos com tempo (Atraso, Timer cíclico, Rampa, Integrador, Derivada, Filtro passa baixa) usam o relógio do PC: não valide por eles.
- Se um pino estiver em teste manual na tela Saídas, a função não comanda esse pino.
#Passo 10: valide no log
- Registre a entrada, as grandezas intermediárias e o resultado na mesma gravação. Compare cada Medida customizada com o que o desenho prevê e confira a unidade de cada entrada.
- O editor não avisa quando o desenho tem laço, isto é, um cabo que volta a um bloco anterior: os blocos do laço e os que dependem deles ficam fora do que a VCU executa. Se um bloco não age, procure um laço.
- Saída sem pino atribuído fica muda e Valor para VCU em canal que não aceita escrita não grava. Nenhum dos dois avisa. Veja o capítulo Diagnóstico e erros comuns.
#Passo 11: versione o arquivo
- Exportar grava um arquivo `.ftcf` com o nome da função (o nome padrão é custom_function, e o nome da função tem até 32 caracteres). Importar apaga o grafo da função que está aberta e carrega o arquivo no lugar, sem pedir confirmação e sem mensagem de sucesso ou de erro. O editor também não tem Desfazer.
- Por isso, exporte antes de importar e grave cada alteração como arquivo novo, com a versão no nome (por exemplo ventoinha_v2.ftcf), em vez de sobrescrever. Veja o capítulo Entregar ao cliente.