В этом примере показано, как использовать блоки 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
выведите остается значение от предыдущего пакета, который получил блок.