Протокол IEEE® 1588™ Precision Time - тактовая синхронизация

Этот пример показывает тактовую синхронизацию между целевыми компьютерами с помощью Протокола времени точности (PTP) с UDP как транспортный протокол

Требования

Чтобы запустить этот пример, вы должны:

  1. Получите два целевых компьютера Speedgoat, оборудованные картой Intel® i210 Ethernet от www.speedgoat.com. В качестве альтернативы можно использовать карту Ethernet Intel 82574L.

  2. Получите стандартный сетевой переключатель, который имеет по крайней мере 4 порта, такие как переключатель сети 8 портов Cisco® SG110D-08.

Соедините и сконфигурируйте устройства в сети

В этом примере эти два целевых компьютера называют TargetPC1 и TargetPC2. TargetPC1 имеет одну сетевую плату Intel® i210, которая используется в целевой хостом связи и синхронизации PTP. TargetPC2 имеет специализированную карту Intel® i210 для синхронизации PTP.

  1. Соедините сетевой порт компьютера разработчика к порту переключателя Cisco® Ethernet.

  2. Соедините сетевой порт каждого целевого компьютера, который выделен связи с компьютером разработчика к порту переключателя Cisco® SG110D-08 Ethernet.

  3. Соедините сетевой порт карты Intel® i210 Ethernet в TargetPC2 к порту переключатель Cisco® Ethernet.

Примечание: Для лучше точности синхронизации PTP, рассмотрите использование сетевого переключателя, которые поддерживают PTP вместо переключателя Cisco® SG110D-08. Примером способной сети PTP swicth является EDS-405A-PTP от www.moxa.com.

Откройте модели

Нажмите на следующие ссылки, чтобы открыть эти две модели:

Откройте dPTPUDPNode1 модель:

openedMdl = find_system('type', 'block_diagram');
model1 = fullfile(matlabroot,'toolbox','rtw','targets','xpc','xpcdemos','dPTPUDPNode1');
model1Open = 0;
modelName1 = 'dPTPUDPNode1';

Проверяйте, открыта ли модель уже. В противном случае откройте его.

if ~any(strcmp(model1, openedMdl))
    model1Open = 1;
    open_system(model1);
end

Откройте dPTPUDPNode2 модель:

model2 = fullfile(matlabroot,'toolbox','rtw','targets','xpc','xpcdemos','dPTPUDPNode2');
model2Open = 0;
modelName2 = 'dPTPUDPNode2';

Проверяйте, открыта ли модель уже. В противном случае откройте его.

if ~any(strcmp(model2, openedMdl))
    model2Open = 1;
    open_system(model2);
end

Сконфигурируйте модели

Эти две модели сконфигурированы для загрузки на целевых компьютерах TargetPC1 и TargetPC2 соответственно. Если один из этих целевых компьютеров установка, не существует в настройке среды Simulink® Real-Time™ на вашем компьютере разработчика, можно создать и сконфигурировать его при помощи Проводника Simulink® Real-Time™ или командной строки MATLAB®. Например, чтобы добавить TargetPC2 к вашей среде введите следующую команду в командной строке MATLAB®:

tg2 = SimulinkRealTime.addTarget('TargetPC2');

dPTPUDPNode1 модели сконфигурирован, чтобы использовать целевую хостом связь в PTP. Сконфигурируйте TargetPC1 загружать использование карты Intel® i210 для целевой хостом коммуникации. Если вы используете сетевую начальную загрузку, можно сконфигурировать целевые настройки с помощью Проводника Simulink® Real-Time™ или путем ввода следующих команд в командной строке MATLAB®:

env = SimulinkRealTime.getTargetSettings('TargetPC1');
env.TargetBoot = 'NetworkBoot';
env.TcpIpTargetDriver = 'I210';
SimulinkRealTime.createBootImage(env);

Для модели dPTPUDPNode2, откройте маску для IEEE 1588 UDP блокируйте и вставьте необходимые значения для шины PCI, паза и функциональных номеров, присвоенных карте Intel® i210, выделенной синхронизации PTP. Чтобы получить шину, паз и функциональные числа, вводят следующие команды в командной строке MATLAB® и ищут информацию для карты Intel® i210 Ethernet (или карта Intel 82574L, если это - карта, вы используете в PTP):

tg2 = SimulinkRealTime.target('TargetPC2');
getPCIInfo(tg2, 'ethernet');

Каждая модель отображается на осциллографах целевого компьютера:

  • Состояние протокола PTP.

  • Состояние тактовой синхронизации PTP (важный только для Ведомого тактового генератора).

  • Время PTP в формате даты.

  • Смещение от Ведущего устройства (важный только для Ведомого тактового генератора).

  • Сигнал получен от другой модели.

Аппаратные часы PTP, работающие на карте Intel® i210 Ethernet, инициализируются со временем целевого компьютера. Прежде чем вы запустите пример, можно проверять время целевого компьютера путем ввода следующей команды в командной строке MATLAB®:

tg1 = SimulinkRealTime.target('TargetPC1');
d = SimulinkRealTime.utils.getTargetSystemTime(tg1)

Если время целевого компьютера является неправильным, можно установить его на требуемое значение. Например, чтобы установить время целевого компьютера совпадать с системным временем компьютера разработчика в часовом поясе UTC, введите следующую команду в командной строке MATLAB®:

SimulinkRealTime.utils.setTargetSystemTime(tg1);

Создайте и загрузите модели на целевой компьютер

  • Сконфигурируйте для немногословной сборки.

  • Создайте и загрузите модели на целевые компьютеры.

set_param(modelName1,'RTWVerbose','off');
rtwbuild(modelName1);
tg1 = slrt('TargetPC1');
load(tg1,modelName1);
set_param(modelName2,'RTWVerbose','off');
set_param([modelName2,'/IEEE 1588 Real-Time UDP'],'PciBus','8','PciSlot','10');
rtwbuild(modelName2);
tg2 = slrt('TargetPC1');
load(tg2,modelName2);

Запустите приложение

Запустите эти две модели в течение 50 секунд tg1.start; tg2.start; сделайте паузу (50);

Одна из моделей будет Основным тактовым генератором PTP и другим Ведомый тактовый генератор. Поскольку параметры часов PTP для этих двух моделей идентичны, это решение состояния будет принято на основе Мак адреса карт Ethernet. В нашей настройке, dPTPUDPNode1 выбран как Ведомый тактовый генератор.

Остановите приложение

tg1.stop;
tg2.stop;

Отобразите осциллографы целевого компьютера

Просмотрите отображение целевого компьютера.

  • Определите объем 1, показывает состояние протокола и состояние синхронизации. Значение состояния протокола равно 9 для Ведомого тактового генератора и равно 6 для Основного тактового генератора. Состояние синхронизации всегда равно 1 для Основного тактового генератора после переключателя состояния к 6. Для Ведомого тактового генератора sysnchronization состояние первоначально равно 0, и затем переключитесь на 1, когда сервомотор часов блокирует к Основному тактовому генератору в пороге, заданном в параметрах блоков. Обратите внимание на то, что, когда модель запускается, и состояние протокола переключается на Ведомый тактовый генератор, несколько секунд протекают перед блокировками сервомотора часов к основному тактовому генератору.

  • Смещение от основного значения, отображенного на Осциллографе 3, важно только для Ведомого тактового генератора. Для Основного тактового генератора это всегда равно 0.

Для модели dPTPUDPNode1 на TargetPC1 используйте команду:

tg1.viewTargetScreen;

Для модели dPTPUDPNode2 на TargetPC2 используйте команду:

tg2.viewTargetScreen;

Получите и постройте смещение от Ведущего устройства.

Следующий рисунок показывает значение, отображенное на Осциллографе 3 для Ведомого тактового генератора когда блокировка сервомотора часов к Основному тактовому генератору.

Точность тактовой синхронизации зависит от сетевого переключателя, который вы используете, чтобы соединиться с целевыми компьютерами, потому что переключатель может ввести задержку пакетной передачи. Чтобы достигнуть более точной тактовой синхронизации, получите прозрачный переключатель часов PTP, такой как EDS-405A-PTP от www.moxa.com.

figh = findobj('Name', 'PTPExampleUDP');
if isempty(figh)
    figh = figure;
    set(figh, 'Name', 'PTPExampleUDP', 'NumberTitle', 'off');
else
    figure(figh);
end
data = tg1.OutputLog;
if ~any(data(:, 1))
    data = tg2.OutputLog;
end
Find index when clock enter Slave state and servo locked
offsetIndex = find(data(:,1) ~= 0, 1, 'first');
syncIndex = offsetIndex + find(data(offsetIndex:end,2) ~= 0, 1, 'first');
offset = data(syncIndex:end, 1);
plot(offset, '.');
xlabel('Sample');
ylabel('Offset from Master clock (nanoseconds)');
title('PTP clock synchronization accuracy');
drawnow limitrate;%

Закройте модели

Закройте модель, если мы открыли их.

if (model1Open)
  bdclose(model1);
end
if (model2Open)
  bdclose(model2);
end