Цель, чтобы Разместить Передачу с помощью UDP

В этом примере показано, как использовать блоки UDP, чтобы отправить данные от целевого компьютера до компьютера разработчика. Данные сигнала отправляются работой модели передачи целевого компьютера, TargetToHostUDPTx, к модели получателя, запускающейся в Simulink® на компьютере разработчика, TargetToHostUDPRx.

Примечание: При рассмотрении UDP как протокол для того, чтобы передать данные к или средой Simulink Real-Time™ важно знать о следующем:

  • Модель Simulink на компьютере разработчика запускается с такой скоростью, как это может и поэтому не синхронизироваться с часами реального времени.

  • UDP является протоколом без установления соединения, который не проверяет, чтобы подтвердить, что пакеты были переданы. Пакеты данных могут быть потеряны или пропущены.

  • На целевом компьютере блоки UDP запускаются в фоновой задаче, которая выполняет каждый временной шаг после того, как задача в реальном времени завершается. Если блок не может запустить или завершить фоновую задачу, прежде чем следующий временной шаг, данные не смогут быть переданы.

  • Пакеты данных о UDP передаются по подключению Ethernet между разработкой и целевыми компьютерами и должны поэтому совместно использовать пропускную способность с подключением Ethernet.

  • Для получения дополнительной информации об использовании UDP с Simulink Real-Time см. документацию относительно поддержки ввода-вывода UDP.

Щелкните здесь, чтобы открыть этот пример: TargetToHostUDP.

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

Щелкните здесь, чтобы открыть модель Tx: TargetToHostUDPTx. Эта модель управляет передаточной функцией первого порядка с сигналом прямоугольной волны и отправляет сигналы ввода и вывода передаточной функции в компьютер разработчика с помощью UDP.

Откройте модель.

mdlOpened = 0;
systems = find_system('type', 'block_diagram');
if ~any(strcmp('TargetToHostUDPTx', systems))
  mdlOpened = 1;
  open_system(fullfile(matlabroot,'toolbox','rtw','targets','xpc','xpcdemos','TargetToHostUDPTx'));
end

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

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

  • Сконфигурируйте блок UDP Send для адреса компьютера разработчика.

  • Отметьте Signal Generator и Transfer Function выход для регистрации данных.

  • Сборка и приложение загрузки.

  • Откройте инспектора данных моделирования.

Этот код показывает, как отметить сигналы программно для регистрации данных. Можно также отметить сигналы для регистрации данных в Редакторе Simulink. Можно просмотреть записанные данные в в Инспекторе Данных моделирования.

set_param('TargetToHostUDPTx','RTWVerbose','off');
set_param('TargetToHostUDPTx/Send','toAddress','10.10.10.128');
hSigGen = get_param('TargetToHostUDPTx/Signal Generator','PortHandles');
SigGen = hSigGen.Outport(1);
Simulink.sdi.markSignalForStreaming(SigGen,'on');
hTranFun = get_param('TargetToHostUDPTx/Transfer Function','PortHandles');
TranFun = hTranFun.Outport(1);
Simulink.sdi.markSignalForStreaming(TranFun,'on');
rtwbuild('TargetToHostUDPTx');
tg = slrt('TargetPC1');
load(tg,'TargetToHostUDPTx');
Simulink.sdi.view;
### Starting Simulink Real-Time build procedure for model: TargetToHostUDPTx
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: TargetToHostUDPTx
### Created MLDATX ..\TargetToHostUDPTx.mldatx
### Looking for target: TargetPC1
### Download model onto target: TargetPC1

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

if (mdlOpened)
  bdclose('TargetToHostUDPTx');
end

Откройте Модель компьютера разработчика

Щелкните здесь, чтобы открыть модель Rx: TargetToHostUDPRx. Эта модель получает данные, отправленные TargetToHostUDPTx.

mdlOpened = 0;
systems = find_system('type', 'block_diagram');
if ~any(strcmp('TargetToHostUDPRx', systems))
  mdlOpened = 1;
  open_system(fullfile(matlabroot,'toolbox','rtw','targets','xpc','xpcdemos','TargetToHostUDPRx'));
end

Прежде, чем запустить эту модель:

  • Сконфигурируйте блок UDP Send для адреса целевого компьютера.

  • Отметьте Data и Length блока Receive выходные параметры для регистрации данных.

set_param('TargetToHostUDPRx/Receive','fmAddress','10.10.10.15');
hUdpReceiveData = get_param('TargetToHostUDPRx/Receive','PortHandles');
UdpReceiveData = hUdpReceiveData.Outport(1);
Simulink.sdi.markSignalForStreaming(UdpReceiveData,'on');
hUdpReceiveLength = get_param('TargetToHostUDPRx/Receive','PortHandles');
UdpReceiveLength = hUdpReceiveLength.Outport(2);
Simulink.sdi.markSignalForStreaming(UdpReceiveLength,'on');

Запустите обе модели

Запустите модель на целевом компьютере, сопровождаемом моделью на компьютере разработчика.

  • Запустите модель Tx целевого компьютера.

  • Ожидайте в течение 1 секунды.

  • Запустите модель Rx компьютера разработчика.

  • Ожидайте в течение 5 секунд.

  • Ожидайте еще 1 секунда.

  • Откройте инспектора данных моделирования

start(tg);
pause(1);
set_param(bdroot,'SimulationCommand','start');
pause(5);
while ~strcmpi(get_param(bdroot,'SimulationStatus'),'stopped')
    pause(1);
end
Simulink.sdi.view;
stop(tg);

Сравните сигналы в инспекторе данных моделирования

Сигнал, что компьютер разработчика получает Receive:2 точно не походит на сигнал, что целевой компьютер отправил Transfer Function:1. На компьютере разработчика модель не запускается в режиме реального времени. Модель на компьютере разработчика на самом деле запускается быстрее, чем в реальном времени. Кроме того, это не запускается в постоянных интервалах, и количество шагов, обработанных в секунду, варьируется в зависимости от компьютерной загрузки. Поэтому Data выходные значения иногда сохранены от предыдущего пакета что блок, полученный моделью компьютера разработчика. Можно использовать второй выход Receive:2 из блока UDP Receive Binary, чтобы обнаружить присутствие нового пакета. График компьютера разработчика показывает это каждый раз, когда существует новый пакет, второй выход Receive:2 переходит к ненулевому значению, указывающему на количество полученных байтов. Когда это 0, Data выведите остается значение от предыдущего пакета, который получил блок.