Этот пример показывает синхронизацию Выполнения между целевыми компьютерами с помощью Протокола времени точности (PTP) с Необработанным Ethernet как транспортный протокол.
Чтобы запустить этот пример, вы должны:
Получите два целевых компьютера Speedgoat, оборудованные картой Intel® 82574 Ethernet от www.speedgoat.com.
Получите прозрачный переключатель часов PTP, такой как EDS-405A-PTP от www.moxa.com. (В следующем разделе смотрите альтернативную настройку в случае, если у вас нет переключателя PTP.)
Получите стандартный сетевой переключатель, который имеет по крайней мере 3 порта, такие как переключатель 5 портов LINKSYS® SD2005.
В этом примере эти два целевых компьютера называют TargetPC1 и TargetPC2.
Соедините сетевой порт компьютера разработчика к порту переключателя LYNKSYS® Ethernet.
Соедините сетевой порт каждого целевого компьютера, который выделен связи с компьютером разработчика к порту переключателя LINKSYS® Ethernet.
Соедините сетевой порт карты Intel® 82574 Ethernet в TargetPC1 и TargetPC2 к портам переключателя EDS-405A-PTP соответственно. Если вы не имеете переключателя PTP, или соединяете непосредственно порт карты Intel® 82574 Ethernet TargetPC1 к порту той же карты в TargetPC2 или соединяете эти два порта с портами переключателя LYNKSYS® Ethernet.
Сконфигурируйте переключатель EDS-405A-PTP как сквозные прозрачные часы.
Включите PTP для портов, соединенных с TargetPC1 и TargetPC2.
Нажмите на следующие ссылки, чтобы открыть эти две модели:
Модель главного узла: dPTPMasterEthernet.slx
.
Ведомая модель узла: dPTPSlaveEthernet.slx
.
Эти две модели сконфигурированы для загрузки на целевых компьютерах TargetPC1 и TargetPC2 соответственно. Если один из этих целевых компьютеров, например, TargetPC2, не существует в настройке среды Simulink® Real-Time™ на вашем компьютере разработчика, можно создать и сконфигурировать его при помощи Проводника Simulink® Real-Time™ или путем ввода следующей команды в командной строке MATLAB®:
tg2 = SimulinkRealTime.addTarget('TargetPC2');
Для каждой модели откройте маску для блока IEEE 1588 Ethernet и вставьте необходимые значения для номеров шины PCI и номеров слота, присвоенных карте Ethernet Intel 82574. Например, модель dPTPSlaveEthernet сконфигурирована, чтобы работать на целевом компьютере TargetPC2. Чтобы получить номера шины и номера слота, введите следующие команды в командной строке MATLAB® и ищите информацию для карты Intel® 82574 Ethernet:
tg2 = SimulinkRealTime.target('TargetPC2'); getPCIInfo(tg2, 'ethernet');
Модель dPTPMasterEthernet является Ведущим устройством PTP. Это отображает состояние, и ошибки синхронизации на целевом компьютере определяет объем и получает данные из модели dPTPSlaveEthernet.
openedMdl = find_system('type', 'block_diagram'); masterMdl = fullfile(matlabroot,'toolbox','rtw','targets','xpc','xpcdemos','dPTPMasterEthernet'); masterMdlOpen = 0;
Проверяйте, открыта ли модель уже. В противном случае откройте его.
if ~any(strcmp(masterMdl, openedMdl)) masterMdlOpen = 1; open_system(masterMdl); end
Модели dPTPSlaveEthernet сконфигурированы как Ведомый узел PTP. Это отображает состояние и ошибки синхронизации на целевых осциллографах и отправляет три сигнала смоделировать dPTPMasterEthernet:
Состояние Synchronization: Указывает, когда ведомые часы PTP синхронизируются с основными часами PTP в сконфигурированном пороге одной микросекунды.
Время PTP при прерывании по таймеру: Указывает на значение в секундах времени PTP, когда прерывание в реальном времени происходит.
Ошибка смещения: Указывает на ошибку синхронизации между временем PTP и часами ядра, которые генерируют прерывания в реальном времени.
Время PTP Чтения в возрастающей подсистеме ребра показывает, как можно регистрировать метки времени события с PTP. Блок IEEE 1588 Read Parameter в подсистеме является configuread, чтобы считать время PTP, когда выполнение блока запускается.
slaveMdl = fullfile(matlabroot,'toolbox','rtw','targets','xpc','xpcdemos','dPTPSlaveEthernet'); slaveMdlOpen = 0;
Проверяйте, открыта ли модель уже. В противном случае откройте его.
if ~any(strcmp(slaveMdl, openedMdl)) slaveMdlOpen = 1; open_system(slaveMdl); end
Сконфигурируйте для немногословной сборки.
Установите настройку Ethernet совпадать с настройками целевого компьютера.
Создайте и загрузите модели на целевые компьютеры.
set_param(masterMdl,'RTWVerbose','off'); set_param('masterMdl/IEEE 1588 Ethernet','PciBus','5','PciSlot','0'); rtwbuild(masterMdl); tg1 = slrt('TargetPC1'); load(tg1,'masterMdl');
set_param(slaveMdl,'RTWVerbose','off'); set_param('slaveMdl/IEEE 1588 Ethernet','PciBus','8','PciSlot','10'); rtwbuild(slaveMdl); tg2 = slrt('TargetPC1'); load(tg2,'slaveMdl');
Запустите эти две модели в течение 50 секунд
tg1.start; tg2.start; pause(50);
Остановите модели
tg1.stop; tg2.stop;
Просмотрите отображение целевого компьютера.
Для модели dPTPSlaveEthernet на TargetPC2, используйте команду:
tg2.viewTargetScreen;
Определите объем 1, показывает состояние протокола и состояние синхронизации. Значение состояния протокола 9 для Ведомого узла. Состояние синхронизации равняется 1, если Ведомые часы PTP синхронизируются с Основными часами PTP в заданном пороге 1 микросекунды. В противном случае это 0.
Определите объем 2 отображений время PTP, когда Чтение время PTP в возрастающей запускаемой фронтом подсистеме будет инициировано.
Определите объем 3, показывает перемещение текущего времени между Ведомыми часами PTP и Основными часами PTP в наносекундах.
Определите объем 4, показывает перемещение текущего времени между часами прерывания в реальном времени и часами PTP в секундах.
Для модели dPTPMasterEthernet на TargetPC1, используйте команду:
tg1.viewTargetScreen;
Определите объем 1, показывает состояние протокола. Значение состояния протокола 6 для Главного узла.
Определите объем 2 отображений текущее время PTP в формате даты.
Определите объем 3, показывает перемещение текущего времени между часами прерывания в реальном времени и часами PTP в секундах, для Главного узла и Ведомого узла (полученный от модели dPTPSlaveEthernet).
Определите объем 4, показывает различие между временем PTP, когда прерывание в реальном времени происходит на Главном узле и Ведомом узле соответственно.
Когда Ведомые часы PTP синхронизируются с Основными часами PTP, и и Ведомые и Основные часы прерывания в реальном времени синхронизируются со своими соответствующими часами PTP, сигнал на Осциллографе 4 указывает на точность, с которой синхронизируется выполнение этих двух моделей.
Следующий рисунок показывает значение, отображенное на Осциллографе 4 из модели dPTPMasterEthernet, когда эти два узла имеют свои часы PTP и синхронизируемые часы ядра.
Получите записанные данные для ведомого устройства nodesdPTPMa
logDataMaster = tg1.OutputLog; syncIndex = find(logDataMaster(:,1) ~= 0, 1, 'first'); clockDiff = logDataMaster(syncIndex +100:end,2);
Фигура графика существует?
Если не, создайте фигуру.
Если да, сделайте его текущей фигурой.
figh = findobj('Name', 'ptpexample'); if isempty(figh) figh = figure; set(figh, 'Name', 'ptpexample', 'NumberTitle', 'off'); else figure(figh); end
Постройте различие времени PTP в прерывании в реальном времени для этих двух моделей
plot(clockDiff, '.'); xlabel('Sample'); ylabel('Time difference (seconds)'); title('Execution synchronization precision');
drawnow;
Закройте модель, если мы открыли их.
if (masterMdlOpen) bdclose(masterMdl); end if (slaveMdlOpen) bdclose(slaveMdl); end