Реализуйте канал связи для процессора в цикле (PIL) симуляция.
Канал связи включает обмен данными между различными процессами. Канал связи поддерживает возможности, которые требуют обмена данными между программной средой Simulink®, которая работает на вашем компьютере разработчика (хост) и развернутый код, который работает на целевом компьютере. Например, PIL симуляция.
Вы узнаете об интерфейсе rtiostream и как он обеспечивает типовой канал связи, который можно реализовать в форме целевых драйверов возможности соединения для различных типов подключения. Этот пример описывает, как использовать реализацию TCP/IP по умолчанию.
Две сущности, Станция A и Станция B, используют интерфейс rtiostream, чтобы настроить канал связи и обмениваться данными. В данном примере Станция A и Станция B сконфигурированы в рамках того же процесса на вашем рабочем компьютере.
Целевые драйверы возможности соединения поддерживают PIL симуляцию на цели. В симуляции Станция A и Станция B представляют цель и хосты - компьютеры, которые обмениваются данными через канал связи. На стороне хоста целевой драйвер возможности соединения реализован как разделяемая библиотека, которая загружается и названа из продукта MATLAB®. На целевой стороне драйвер является исходным кодом или библиотекой, которая соединяется с приложением, которое работает на цели.
Кроме того, вы можете:
Сконфигурируйте свой собственный драйвер целевой стороны для TCP/IP, чтобы управлять со стороной хоста по умолчанию драйвером TCP/IP.
Сконфигурируйте предоставленный драйвер стороны хоста для последовательной передачи данных.
Реализуйте пользовательские целевые драйверы возможности соединения, например, при помощи CAN или USB для хоста и предназначайтесь для сторон канала связи.
См. также Тестовый Сгенерированный код с SIL и PIL симуляциями и Сконфигурируйте Процессор В Цикле (PIL) для Пользовательской Цели.
Файл rtiostream_tcpip.c реализует клиентскую и серверную сторону коммуникация TCP/IP. Параметр запуска конфигурирует драйвер, чтобы действовать или в клиенте или в режиме сервера. Можно использовать этот исходный файл в качестве начальной точки для пользовательской реализации. Каждая сторона канала связи требует только одного или других из клиентских реализаций или сервера. Если драйверы клиент-сервера работают на различной архитектуре, рассматривают размещение кода драйвера для каждой архитектуры в отдельном исходном файле.
Заголовочный файл rtiostream.h содержит прототипы для функций rtIOStreamOpen/Send/Recv/Close. Включайте его (использующий #include) для пользовательских реализаций.
Извлеките местоположение исходного кода драйвера TCP/IP.
rtiostreamtcpip_dir=fullfile(matlabroot,'toolbox','coder','rtiostream','src',... 'rtiostreamtcpip');
Просмотрите rtiostream_tcpip.c.
edit(fullfile(rtiostreamtcpip_dir,'rtiostream_tcpip.c'));
Просмотрите rtiostream.h.
edit(fullfile(matlabroot,'rtw','c','src','rtiostream.h'));
Чтобы получить доступ к целевым драйверам возможности соединения от продукта MATLAB, необходимо скомпилировать их к разделяемой библиотеке. Разделяемая библиотека должна быть расположена на вашем системном пути. Разделяемая библиотека для драйверов TCP/IP по умолчанию расположена в matlabroot/bin/$ARCH ($ARCH является вашей архитектурой системы, например, win64).
Разделяемое расширение файла библиотеки и местоположение зависят от вашей операционной системы.
[~, ~, sharedLibExt] = coder.BuildConfig.getStdLibInfo;
Идентифицируйте разделяемую библиотеку для Станции A и Станции B.
libTcpip = ['libmwrtiostreamtcpip' sharedLibExt];
disp(libTcpip)
Если вы реализуете пользовательский целевой драйвер возможности соединения, полезно протестировать его из продукта MATLAB. Следующий пример показывает, как загрузить целевые драйверы возможности соединения TCP/IP по умолчанию и использовать их в обмене данными между Станцией A и Станцией B.
Чтобы получить доступ к драйверам, можно использовать файл MEX rtiostream_wrapper. С этим файлом MEX можно загрузить разделяемую библиотеку и получить доступ к функциям rtiostream, чтобы открыть и закрыть канал rtiostream, и отправить и получить данные.
Станция A и Станция B работают на хосте - компьютере. Станция A сконфигурирована как сервер TCP/IP и Станция B как клиент TCP/IP. Для хоста, чтобы предназначаться для коммуникации, вы обычно конфигурируете хост как клиент TCP/IP и цель как сервер TCP/IP.
Выберите номер порта для TCP.
if usejava('jvm') % Find a free port tempSocket = java.net.ServerSocket(0); port = num2str(tempSocket.getLocalPort); tempSocket.close; else % Use a hard-coded port port = '14646'; end
Откройте Станцию rtiostream как сервер TCP/IP.
stationA = rtiostream_wrapper(libTcpip,'open',... '-client', '0',... '-blocking', '0',... '-port',port);
Если канал связи открывается, возвращаемое значение является указателем на связь. Возвращаемое значение-1 указывает на ошибку.
Проверяйте возвращаемое значение.
assert(stationA~=(-1))
Откройте Станцию B rtiostream как клиент TCP/IP.
stationB = rtiostream_wrapper(libTcpip,'open',... '-client','1',... '-blocking', '0',... '-port',port,... '-hostname','localhost');
Если канал связи открывается, возвращаемое значение является указателем на связь. Возвращаемое значение-1 указывает на ошибку.
Проверяйте возвращаемое значение.
assert(stationB~=(-1))
Целевые драйверы возможности соединения отправляют поток данных в 8-битных байтах. Для процессоров, которые не с байтовой адресацией, данные отправляются в самом маленьком адресуемом размере слова.
Отправьте данные о сообщении из Станции B к Станции A.
msgOut = uint8('Station A, this is Station B. Are you there? OVER'); [retVal, sizeSent] = rtiostream_wrapper(libTcpip,... 'send',... stationB,... msgOut,... length(msgOut));
Возвращаемое значение нуля указывает на успех.
assert(retVal==0);
Убедитесь, что байты в сообщении были отправлены.
assert(sizeSent==length(msgOut));
Позвольте времени для передачи данных быть завершенным.
pause(0.2)
Получите данные в Станции A.
[retVal, msgRecvd, sizeRecvd] = rtiostream_wrapper(libTcpip,... 'recv',... stationA,... 100);
Возвращаемое значение нуля указывает на успех.
assert(retVal==0);
Убедитесь, что байты в сообщении были получены.
assert(sizeRecvd==sizeSent);
Отобразите полученные данные.
disp(char(msgRecvd))
Отправьте данные об ответе из Станции к Станции B.
msgOut = uint8('Station B, this is Station A. Yes, I''m here! OVER.'); [~, sizeSent] = rtiostream_wrapper(libTcpip,... %#ok 'send',... stationA,... msgOut,... length(msgOut));
Позвольте времени для передачи данных быть завершенным.
pause(0.2)
Получите данные в Станции B.
[~, msgRecvd, sizeRecvd] = rtiostream_wrapper(libTcpip,... %#ok 'recv',... stationB,... 100);
Отобразите полученные данные.
disp(char(msgRecvd))
Закройте rtiostream на Станции B.
retVal = rtiostream_wrapper(libTcpip,'close',stationB);
Возвращаемое значение нуля указывает на успех.
assert(retVal==0);
Закройте rtiostream на Станции A.
retVal = rtiostream_wrapper(libTcpip,'close',stationA);
Возвращаемое значение нуля указывает на успех.
assert(retVal==0)
Разгрузите разделяемую библиотеку.
rtiostream_wrapper(libTcpip, 'unloadlibrary');
Можно использовать предоставленный драйвер стороны хоста для последовательной передачи данных как альтернатива драйверам для TCP/IP. Чтобы сконфигурировать последовательный драйвер, см. rtiostream_wrapper в справочной документации Embedded Coder®.
Если ваша цель имеет соединение Ethernet, и вы имеете стек TCP/IP в наличии, выполняете эти шаги:
Запишите обертку для своего стека TCP/IP, который делает ее доступной через интерфейс rtiostream заданный в rtiostream.h.
Запишите тестовое приложение для своей цели, которая отправляет и получает некоторые данные.
Используйте rtiostream_wrapper файл MEX и сторону хоста драйвер TCP/IP, чтобы протестировать ваше программное обеспечение драйвера, которое работает на цели.
Когда вы имеете рабочий драйвер целевой стороны, включаете исходные файлы драйвера в сборку для вашего автоматически сгенерированного кода.
Можно сконфигурировать драйвер целевой стороны, чтобы действовать только в качестве сервера TCP/IP, потому что драйвер стороны хоста по умолчанию для PIL сконфигурирован как клиент TCP/IP.
Если необходимо использовать коммуникационный канал, который уже не поддержан на стороне хоста, запишите драйверы для хоста и цели. В этом случае можно все еще использовать rtiostream_wrapper файл MEX в тестировании rtiostream драйверов.
Можно реализовать целевые драйверы возможности соединения при помощи различных каналов связи. Например, можно реализовать целевые хостом коммуникации через специальную последовательную связь, которая требует, чтобы вы обеспечили драйверы для хоста и цели.
На стороне хоста можно протестировать драйверы при помощи rtiostream_wrapper файла MEX. Если ваш драйвер включает диагностический выход от printf операторов, и rtiostream_wrapper загружает разделяемую библиотеку, необходимо заменить printf операторы на mexPrintf операторы.
Когда у вас есть рабочий драйвер устройства стороны хоста, необходимо сделать его доступным в программной среде Simulink. Для PIL симуляции укажите совместно использованную библиотеку разделяемой стороны хоста через sl_customization.