Этот пример показывает тактовую синхронизацию между целевыми компьютерами с помощью Протокола времени точности (PTP) с UDP как транспортный протокол
Чтобы запустить этот пример, вы должны:
Получите два целевых компьютера Speedgoat, оборудованные картой Intel® i210 Ethernet от www.speedgoat.com. В качестве альтернативы можно использовать карту Ethernet Intel 82574L.
Получите стандартный сетевой переключатель, который имеет по крайней мере 4 порта, такие как переключатель сети 8 портов Cisco® SG110D-08.
В этом примере эти два целевых компьютера называют TargetPC1
и TargetPC2
. TargetPC1
имеет одну сетевую плату Intel® i210, которая используется в целевой хостом связи и синхронизации PTP. TargetPC2
имеет специализированную карту Intel® i210 для синхронизации PTP.
Соедините сетевой порт компьютера разработчика к порту переключателя Cisco® Ethernet.
Соедините сетевой порт каждого целевого компьютера, который выделен связи с компьютером разработчика к порту переключателя Cisco® SG110D-08 Ethernet.
Соедините сетевой порт карты Intel® i210 Ethernet в TargetPC2
к порту переключатель Cisco® Ethernet.
Примечание: Для лучше точности синхронизации PTP, рассмотрите использование сетевого переключателя, которые поддерживают PTP вместо переключателя Cisco® SG110D-08. Примером способной сети PTP swicth является EDS-405A-PTP от www.moxa.com.
Нажмите на следующие ссылки, чтобы открыть эти две модели:
Узел 1 модель: dPTPUDPNode1.slx
.
Узел 2 модели: dPTPUDPNode2.slx
.
Откройте 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