Этот пример показывает тактовую синхронизацию между целевыми компьютерами с помощью Протокола времени точности (PTP) с UDP как транспортный протокол
Чтобы запустить этот пример, вы должны:
Получите два целевых компьютера Speedgoat, оборудованные картой Intel® i210 Ethernet под эгидой www.speedgoat.com. Также можно использовать карту Ethernet Intel 82574L.
Получите стандартный сетевой переключатель, который имеет по крайней мере 4 порта, такие как переключатель сети 8 портов Cisco® SG110D-08.
addpath('H:\');
В этом примере эти два целевых компьютера называют 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 set_param([modelName2,'/IEEE 1588 Real-Time UDP'],'PciBus','5'); set_param([modelName2,'/IEEE 1588 Real-Time UDP'],'PciSlot','0');
Эти две модели сконфигурированы для загрузки на целевых компьютерах 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('dPTPUDPNode1','RTWVerbose','off'); set_param('dPTPUDPNode2','RTWVerbose','off');
Создайте и загрузите модели на целевые компьютеры.
rtwbuild('dPTPUDPNode1'); rtwbuild('dPTPUDPNode2');
### Starting Simulink Real-Time build procedure for model: dPTPUDPNode1 Warning: This model contains blocks that do not handle sample time changes at runtime. To avoid incorrect results, only change the sample time in the original model, then rebuild the model. ### Successful completion of build procedure for model: dPTPUDPNode1 ### Created MLDATX ..\dPTPUDPNode1.mldatx ### Looking for target: TargetPC1 ### Download model onto target: TargetPC1 ### Starting Simulink Real-Time build procedure for model: dPTPUDPNode2 ### Generated code for 'dPTPUDPNode2' is up to date because no structural, parameter or code replacement library changes were found. ### Successful completion of build procedure for model: dPTPUDPNode2 ### Created MLDATX ..\dPTPUDPNode2.mldatx ### Looking for target: TargetPC2 ### Download model onto target: TargetPC2
Запустите эти две модели в течение 50 секунд
tg1.start; tg2.start; pause(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