Tradução automática, não revista por um falante nativo. O inglês é a referência.

TemporizaçãoEditar no GitHubFonte: docs/TIMING-HIL.md

Hardware-in-the-loop de temporização: desligar a antena, pontuar o holdover

Os operadores de telecomunicações e de energia testam um sistema de temporização retirando-lhe o GNSS e observando o que o relógio faz. O Kshana não faz isso por eles, e não toca no equipamento deles. Lê o registo de erro de tempo produzido pelos instrumentos do próprio operador, divide-o nos dois instantes que o operador indica e mede cada passo face às máscaras públicas da ITU-T. O tipo de cenário é holdover-test; os cenários de exemplo são scenarios/holdover-test-example.toml e scenarios/holdover-test-ptp4l.toml.

Esta é a fase 1 da segurança de hardware: passiva, apenas de receção, sem RF do Kshana (HARDWARE-SAFETY.md). Software de caráter consultivo, não um equipamento homologado. Ninguém classificou, aprovou ou reviu este procedimento, e ele não diz nada sobre se um sistema satisfaz uma Recomendação.

Um teste de holdover avaliado a partir de um registo de erro de tempo, a partir de uma execução real do motor v0.40.0 sobre scenarios/holdover-test-example.toml (601 amostras a cada 5 s). O GNSS é removido pelo operador aos 600 s e restaurado aos 2400 s; o erro de tempo deriva até 299 ns no fim do holdover, ultrapassando o orçamento de 100 ns após 675 s, e regressa para dentro da banda de 100 ns 70 s após o restauro. Veredictos: máscaras de linha de base PASS, máscaras de holdover FAIL, envolvente de holdover FAIL, recuperação RECOVERED. Medido face à máscara, não uma aprovação. Os tempos são a declaração do operador, não verificados pelo Kshana. Consultivo: saída de análise de uma ferramenta de investigação e engenharia, não um equipamento de navegação homologado e não um serviço de salvaguarda da vida humana.Um teste de holdover avaliado a partir de um registo de erro de tempo, a partir de uma execução real do motor v0.40.0 sobre scenarios/holdover-test-example.toml (601 amostras a cada 5 s). O GNSS é removido pelo operador aos 600 s e restaurado aos 2400 s; o erro de tempo deriva até 299 ns no fim do holdover, ultrapassando o orçamento de 100 ns após 675 s, e regressa para dentro da banda de 100 ns 70 s após o restauro. Veredictos: máscaras de linha de base PASS, máscaras de holdover FAIL, envolvente de holdover FAIL, recuperação RECOVERED. Medido face à máscara, não uma aprovação. Os tempos são a declaração do operador, não verificados pelo Kshana. Consultivo: saída de análise de uma ferramenta de investigação e engenharia, não um equipamento de navegação homologado e não um serviço de salvaguarda da vida humana.

O procedimento#

O operador executa quatro passos. O Kshana não executa nenhum deles.

Passo O que o operador faz O que o registo mostra
1. Linha de base Deixa o sistema a funcionar em bloqueio ao GNSS durante o tempo que o ensaio exigir (e anota há quantos dias estava em bloqueio). O erro de tempo enquanto disciplinado.
2. GNSS removido Retira o GNSS ao sistema em ensaio, por exemplo o cabo da antena no recetor, ou a saída do simulador do próprio laboratório, e anota a hora. Consulte primeiro o manual do fabricante do recetor: alguns recetores alimentam a antena, e alguns precisam de um terminador na porta aberta. O momento em que o erro de tempo começa a divagar.
3. Holdover Deixa o sistema no seu próprio oscilador durante o tempo planeado. O holdover do sistema.
4. Recuperação Restabelece o GNSS e anota a hora. O erro de tempo a regressar (ou não).

Duas coisas que o operador tem de fazer, porque o Kshana não pode:

  • Indicar os dois instantes. gnss_removed_s e gnss_restored_s são declaração do operador. O Kshana não deteta a remoção a partir do registo e não verifica os instantes. Um instante errado desloca as fronteiras dos passos e, portanto, o resultado.
  • Utilize o mesmo relógio para o registo e para os instantes. Num registo de relógio, o eixo do tempo começa na primeira leitura, pelo que os dois instantes são segundos desde a primeira linha do registo.

O que registar#

Qualquer um destes, através dos leitores clock_log existentes (CLOCK-LOG-FORMATS.md):

Instrumento Formato Como o registo é produzido
linuxptp ptp4l (o servo do relógio escravo ou de fronteira) ptp4l execute com -m e conserve as linhas ptp4l[time]: master offset N sK freq ...
linuxptp phc2sys phc2sys as linhas phc2sys[time]: CLOCK_REALTIME phc offset N sK ...
linuxptp ts2phc ts2phc as linhas ts2phc[time]: /dev/ptpN offset N sK ...
chrony tracking.log chrony-tracking log tracking em chrony.conf
chrony statistics.log chrony-statistics log statistics em chrony.conf
um contador TAPR TICC ticc modo de marca temporal face à referência
uma exportação ASCII do TimeLab timelab fase numa unidade indicada
um ficheiro de relógio RINEX rinex-clk um relógio
qualquer outra coisa samples ou csv_path pares time_s,time_error_ns, amostrados uniformemente

O que o registo mede é importante. Um registo de servo (linuxptp, chrony) regista o desvio que o daemon mediu e está a corrigir: é o erro de tempo que subsiste sob controlo do servo, não uma medição independente do relógio face ao UTC. Durante o passo de holdover de um ensaio que realmente remove a referência, um registo de servo continua a mostrar o que o daemon julgava, o que pode diferir do erro verdadeiro. Um TICC ou outro contador face a uma referência independente é o registo mais forte; indique qual utilizou ao comunicar o resultado.

O cenário#

kind = "holdover-test"
masks = ["prtc-a", "eprtc-a-holdover"]      # see docs/TELECOM-TIMING.md for the ids

[test]
gnss_removed_s = 600.0                      # the operator's statement
gnss_restored_s = 2400.0                    # omit if GNSS was not restored within the record
locked_duration_days = 5.0                  # how long it was locked before step 2 (sets the ePRTC-A period)
recovery_band_ns = 100.0                    # |TE| inside this counts as recovered
recovery_dwell_s = 60.0                     # ... and must stay inside this long

[series.clock_log]                          # or [series] samples = [[t, ns], ...] or csv_path = "..."
format = "ptp4l"
path = "holdover-2026-11-02.log"            # or text = "..." inline
kshana holdover-test.toml

Chaves opcionais: budgets (nome, max_abs_te_ns, fonte; por predefinição os de temporização de telecomunicações quando ausente) e clock = "..." dentro de [series.clock_log] para escolher uma fonte de um registo que contém várias.

O que o relatório contém#

  • steps: para a linha de base, o holdover e a recuperação, o início e o fim, o número de amostras e os valores médio, rms, máximo e final do erro de tempo.
  • masks: cada máscara indicada, medida no passo que a sua condição designa. Uma máscara escrita para um relógio em bloqueio é medida na linha de base; uma escrita para holdover ou para um relógio autónomo, no holdover. Cada verificação tem o seu limite, o valor medido, a margem e a tabela de onde foi transcrita. Uma máscara que exige um registo mais longo do que o passo forneceu é INCOMPLETE, nunca extrapolada; uma que o motor não consegue avaliar para o intervalo de amostragem do registo é NOT-EVALUATED com o motivo.
  • holdover: o desvio fracionário de frequência que o sistema manteve (o declive de uma reta de mínimos quadrados através do erro de tempo do holdover, em ns/s, o que equivale a partes por mil milhões), o resíduo em torno dessa reta, o maior erro de tempo absoluto e quando ocorreu, e o salto no momento da remoção.
  • holdover_envelope: o envelope de holdover ePRTC-A da ITU-T G.8272.1 Tabela 3, a partir de locked_duration_days, com o instante em que é excedido pela primeira vez.
  • budgets: o tempo após a remoção em que cada orçamento de erro de tempo é excedido pela primeira vez.
  • recovery: se |TE| entrou na banda e nela permaneceu durante o tempo de permanência, quanto tempo depois do regresso do GNSS isso começou, o pico após o restabelecimento e o maior salto entre amostras consecutivas durante a recuperação.
  • curves: MTIE e TDEV dos passos de linha de base e de holdover.
  • verdicts: um resumo de uma palavra por passo.

Cada número traz a sua unidade e a sua origem no bloco units do relatório.

As palavras e os limites#

  • O resultado é medido face à máscara. As máscaras são transcritas de Recomendações da ITU-T de descarga gratuita (as mesmas tabelas do tipo de cenário telecom-timing, listadas em TELECOM-TIMING.md), e todas as entradas que as Recomendações deixam "a estudar futuramente" estão ausentes, não preenchidas. O Kshana não afirma que um relógio ou um sistema satisfaz ou foi aprovado face a uma Recomendação, e o relatório também não.
  • MODELLED. A lógica dos passos, o ajuste da reta e a regra de recuperação são verificados em registos construídos a partir de fórmulas cujas respostas são conhecidas antes da execução; nenhum holdover de laboratório foi pontuado face a uma referência independente externa, e nenhum parceiro ou laboratório concordou com o que quer que seja. Seria necessário um laboratório de temporização antes de qualquer valor por classe de relógio poder ser promovido.
  • O que não é coberto, declarado em todos os relatórios: se o GNSS foi realmente removido e restabelecido nos instantes indicados; qualquer passo que o operador não tenha registado; máscaras definidas através de um filtro de 0,1 Hz para um registo amostrado mais lentamente do que uma vez por segundo; a incerteza de medição do próprio instrumento; e qualquer procedimento das Recomendações para além de um registo de erro de tempo (perfis de temperatura, carga da rede de pacotes).
  • A banda de recuperação é uma escolha do próprio ensaio. O valor predefinido de 100 ns é o erro de tempo absoluto máximo de um PRTC-A (ITU-T G.8272); é uma linha conveniente, não um requisito de nenhuma Recomendação para a recuperação.
  • Sem via de transmissão. O Kshana lê ficheiros. Não gera um sinal, e a remoção do GNSS num laboratório é feita com o equipamento do próprio laboratório e sob a sua própria autorização.

Superfícies#

holdover-test é um tipo de cenário, pelo que é executado em todo o lado onde se executam tipos de cenário: kshana <scenario.toml>, a API Rust (kshana::api::run_toml), a ligação Python (kshana.run), a compilação WebAssembly e npm (samples ou clock_log.text inline; as chaves de ficheiro não estão aí disponíveis), o servidor MCP (run_scenario, apenas conteúdo inline) e o executor de cenários do Kshana Studio. Os dois ficheiros de cenário estão incluídos (kshana example holdover-test-example).