为处理器在环(PIL)仿真实现一个通信通道。
通信信道能够在不同进程之间交换数据。通信频道支持需要在开发计算机(主机)上运行的Simu金宝applink®软件环境之间的数据交换数据和在目标硬件上运行的代码之间的数据交换。金宝app例如,PIL模拟。
您了解RTIOSTREAM界面以及它如何提供一种通用通信通道,可以以不同的连接类型的目标连接驱动程序的形式实现。此示例描述了如何使用默认的TCP / IP实现。
两个实体,站A和站B,使用RTIOStream接口设置通信信道和交换数据。对于此示例,站A和站B在桌面计算机上的同一过程中配置。
目标连接驱动程序支持目标的PIL模拟。金宝app在模拟中,站A和站B代表经由通信信道交换数据的目标和主计算机。在主机侧,目标连接驱动程序被实现为从Matlab®产品中加载和调用的共享库。在目标方面,驱动程序是源代码或与在目标上运行的应用程序链接的库。
此外,您可以:
为TCP / IP配置自己的目标侧驱动程序以使用默认主机端TCP / IP驱动程序运行。
为串行通信配置提供的主机端驱动程序。
例如,实现自定义目标连接驱动程序,例如,通过使用通信通道的主机和目标边的CAN或USB。
也可以看看使用SIL和PIL仿真测试生成的代码和配置自定义目标的处理器内循环(PIL)。
FileTRIOStream_TCPIP.c实现客户端和服务器端TCP / IP通信。启动参数将驱动程序配置为在客户端或服务器模式下运行。您可以将此源文件用作自定义实现的起点。通信信道的每一侧只需要一个或另一个服务器或客户端实现。如果客户端和服务器驱动程序在不同的体系结构上运行,请考虑将驱动程序代码放置在单独的源文件中的每个架构。
头文件rtiostream.h包含了rtIOStreamOpen/Send/Recv/Close函数的原型。在自定义实现中包含它(使用# Include)。
提取TCP / IP驱动程序源代码的位置。
Rtiostreamtcpip_dir = fullfile(matlabroot,'工具箱'那“编码器”那'rtiostream'那'src'那......“rtiostreamtcpip”);
查看RtriosTream_tcpip.c。
编辑(FullFile(RTIOSTREADTCPIP_DIR,“rtiostream_tcpip.c”));
查看Rtriostream.h。
编辑(fullfile (matlabroot,'RTW'那'C'那'src'那'ttriostream.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-File Rtiostream_Wrapper。使用此MEX文件,您可以加载共享库并访问RTIOStream函数以打开并关闭RTIOSTREAM通道,并发送和接收数据。
站A和站B在主机上运行。站A配置为TCP / IP服务器和站B,为TCP / IP客户端。对于主机来定位通信,您通常将主机配置为TCP / IP客户端以及目标作为TCP / IP服务器。
选择TCP的端口号。
如果umermava('JVM'的)找到一个空闲端口tempSocket = java.net.ServerSocket (0);端口= num2str (tempSocket.getLocalPort);tempSocket.close;别的%使用硬编码端口端口='14646';结尾
将StoreTream作为TCP / IP服务器打开。
stationA = rtiostream_wrapper (libTcpip,'打开'那......'-客户'那'0'那......'-blocking'那'0'那......'-港口',港口);
如果通信通道打开,则返回值是连接的句柄。返回值为-1表示出错。
检查返回值。
断言(Stationa〜=( - 1))
作为TCP/IP客户端打开站B流。
stationB = rtiostream_wrapper (libTcpip,'打开'那......'-客户'那'1'那......'-blocking'那'0'那......'-港口',港口,......的主机名那'localhost');
如果通信通道打开,则返回值是连接的句柄。返回值为-1表示出错。
检查返回值。
断言(stationb〜=( - 1))
目标连接驱动程序在8位字节中发送数据流。对于不是字节可寻址的处理器,数据以最小的可寻址字大小发送。
从Station B发送消息数据到Station A.
msgout = uint8('站A,这是B B.你在吗?超过');[retval,sizeent] = rtiostream_wrapper(libtcpip,......'发送'那......第3号,......msgout,......长度(msgout));
返回值为零表示成功。
断言(Retval == 0);
确保消息中的字节已经发送。
断言(Sizeent ==长度(msgout));
留出时间要完成数据传输。
暂停(0.2)
在站A中接收数据。
[rectval,msgrecvd,sizerecvd] = rtiostream_wrapper(libtcpip,......'recv'那......stationA,......100);
返回值为零表示成功。
断言(Retval == 0);
确保收到消息中的字节。
断言(Sizerecvd == sizeent);
显示收到的数据。
disp(char(msgrecvd))
从Station A发送响应数据到Station B.
msgout = uint8('B站,这是站A.是的,我在这里!超过。');[〜,sizeent] = rtiostream_wrapper(libtcpip,......%#好的'发送'那......stationA,......msgout,......长度(msgout));
留出时间要完成数据传输。
暂停(0.2)
在B B中接收数据。
[〜,msgrecvd,sizerecvd] = rtiostream_wrapper(libtcpip,......%#好的'recv'那......第3号,......100);
显示收到的数据。
disp(char(msgrecvd))
在B B中关闭RTIOSTREAM。
RetVal = RTIOSTREAM_WRAPPER(libtcpip,'关闭',stationb);
返回值为零表示成功。
断言(Retval == 0);
关闭站A上的Rtiostream。
RetVal = RTIOSTREAM_WRAPPER(libtcpip,'关闭', stationA);
返回值为零表示成功。
断言(Retval == 0)
卸载共享库。
Rtiostream_wrapper(libtcpip,'unloadLibrary');
您可以使用提供的主机端驱动程序进行串行通信作为TCP / IP驱动程序的替代方案。配置串行驱动程序,请参阅RTIOSTREAM_WRAPPER.在嵌入式译码器®参考文档中。
如果您的目标具有以太网连接,并且您有一个可用的TCP / IP堆栈,请按照下列步骤操作:
为你的TCP/IP堆栈编写一个包装器,使其通过rtiostream.h中定义的rtiostream接口可用。
为您的目标写一个测试应用程序,用于发送和接收一些数据。
使用rtiostream_wrapper的MEX-file和主机端TCP/IP驱动程序来测试在目标上运行的驱动软件。
当您有一个工作的目标端驱动程序时,为您自动生成的代码在构建中包含驱动程序源文件。
您可以将目标侧驱动程序配置为仅作为TCP / IP服务器运行,因为PIL的默认主机端驱动程序配置为TCP / IP客户端。
如果您需要使用尚未在主机端支持的通信频道,则为主机和目标的写驱动程序。金宝app在这种情况下,您仍然可以使用RTIOStream_Wrapper MEX文件来测试RTIOStream驱动程序。
您可以使用不同的通信通道来实现目标连接驱动程序。例如,您可以通过特殊的串行连接实现主机目标通信,这要求您为主机和目标提供驱动程序。
在主机端,您可以使用RTIOSTREAM_WRAPPER MEX文件测试驱动程序。如果您的驱动程序包括从printf语句和Rtiostream_wrapper加载共享库的诊断输出,则必须使用mexprintf语句替换printf语句。
当您有一个工作主机端设备驱动程序时,必须使其在Simulink软件环境中可用。金宝app对于PIL模拟,通过SL_Customization注册共享主机端共享库。