InSys JSC制造的设备在MATLAB / Simulink中的应用

一个重要的实际任务是将Matlab / Simulink与实际设备一起使用,这将使您能够接收来自真实世界的信号。 这对于调试算法非常有用。 本文介绍了将InSys JSC制造的ADC器件连接到Simulink的技术。 DLL用于连接,在Simulink中作为sm_adc组件可见。 使用单独的控制台程序来操作设备。 与DLL的通信是通过共享内存进行的。 根据该技术,可以连接InSys JSC的任何负载模块上的任何ADC。 该作品介绍了一个由A7_DAC发生器和FMC128E / FM412x500M采集模块组成的系统。

在2018年3月27日至28日举行的“复杂技术系统的开发和调试技术”会议上演示了此工作。





问题陈述

它需要从信号发生器和ADC开发系统,以产生具有给定参数的信号并将其数字化。 接收到的数据必须传输到Simulink进行处理。

配套设备

为了工作,从ADC模块和发电机组装了一个支架。 作为ADC,使用FM412x500M子模块,其中有四个ADC通道,采样频率为500 MHz。 子模块安装在FMC128E载体模块上,其中有Artix 7 FPGA和USB 3.0接口。 两个设备都连接到运行Simulink的笔记本电脑。 为了监视性能,当然要使用示波器。

展台外观:



展台结构图:



信号产生:



展位的算法:

  1. Simulink准备启动ADC和发生器
  2. Simulink指示发电机启动
  3. 发生器形成一个选通信号(黄色信号)和实际信号(蓝色)
  4. 门前的ADC开始收集数据
  5. ADC收集阵列并将其传递给Simulink
  6. Simulink显示从ADC接收的信号


这是经典的一次性收集模式。 它的独特之处恰恰是单一性。 沿信号前端的设备收集给定的数据阵列。 数据收集阶段发生在“硬实时”模式下,但是处理方法是如何获取它。 采集速率取决于所选通道的数量和采样率。 对于四个ADC通道和500 MHz的采样频率,数据速率为4 GB / s。 以这种速度,可以将数据写入FMC128E的SODIMM。 也就是说,可以保存4 GB的样本。

此外,数据应传输到计算机。 FMC128E模块通过USB 3.0接口连接到计算机。 数据传输速率为300 MB / s。

Simulink接收数据数组并将其传递以进行进一步处理。 该处理的时间已经由模型的复杂性确定。 在此示例中,该阵列仅显示在示波器面板上。

在某个时候,Simulink决定有必要执行下一个循环,然后一切重复。 再次发送USB命令以准备ADC,启动发生器并收集数据。

此模式对于调试硬件和算法非常方便。 您不能在任何地方着急。 收集数据数组。 您可以冷静地看一眼,将其刻录到光盘上,然后喝咖啡。 但是,当一切都解决了之后,就可以切换到连续收集模式了。

DLL连接

Matlab允许您连接在外部DLL中实现的功能。 Simulink还具有连接外部DLL的能力,同时增加了一些要求。 在Simulink内部,外部DLL看起来像一个S功能块。



MATLAB提供了大量示例,包括创建外部DLL。 但是,MATLAB提供的方法不是很方便。 有一个开源的easyLink项目。 该项目开发了一个用于连接Simulink的类库。

要创建组件,您需要创建一个从BaseBlock派生的类并声明端口:





DLL连接问题

外部DLL允许很多,但是使用它们时有很多问题。 对我个人而言,最重要的是:

  1. DLL调试困难
  2. 观看printf()输出很尴尬
  3. 重新编译DLL需要退出MATLAB

调试程序时,需要分步调试。 对于DLL,可以连接到已加载到内存中的DLL,在其中分配断点,并进行调试会话。 但是有必要抓住通过Simulink加载DLL的时刻,以某种方式延迟了工作的开始。 所有这些都可以完成,但是不方便。

在此过程中,我真的很想看到作为标准stdout流形成的调试输出。 在DLL的情况下,可以某种方式截获此线程,但我没有成功。

最后,最重要的不便是重新编译DLL时需要退出MATLAB。 否则,您将无法编写新文件。 退出和随后启动MATLAB需要很多时间。

为了解决这些问题,有一种构建复杂软件系统的经典方法。 这是程序之间通过共享内存进行的交互。

共享内存连接

Windows和Linux都可以使用现代操作系统来组织内存的公共区域。 这使您可以创建可靠的程序。 例如,一个程序可以包含图形界面并与操作员进行交互,而另一个程序可以与设备进行交互。 在这种情况下,冻结与设备交互的程序不会导致冻结与操作员交互的程序。 在Simulink的情况下,此方法还提供了一些优点。 与设备一起使用的程序将启动一次,它将准备设备并等待通过共享内存发出的命令。 每次在仿真上运行Simulink时,DLL将加载。 由于DLL不能直接与硬件一起使用,因此启动会很快。

为此支架开发了两个程序和两个DLL:

  1. simulink_a7dac-发电机控制程序
  2. simulink_adc-ADC控制程序
  3. sm_ctrl-生成器控件DLL
  4. sm_adc-ADC控制DLL


框图如下图所示:



simulink_adc程序基于Bardy库。 该程序使您可以使用InSys JSC制造的任何ADC。 通过初始化文件完成对特定ADC和载波模块的调整。

Simulink中的方案视图

最后,Simulink内部的外观是:



一切看起来都与Simulink相同。 一台用于ADC控制的单元。 第二块控制发电机。 许多参数可用于控制发电机。 对于ADC,一切都通过初始化文件完成。 如有必要,还可以在块级别显示许多ADC参数。

注意两个主振荡器。 在模型时间方面,它们指定数据收集的开始时间和时刻。 这些要点非常重要。 他们实际上设置了模型与现实世界之间的联系。 起始信号进入ADC模块,并在DLL中进行处理。 通过共享内存,他进入了ADC程序。 然后,将其转换为对寄存器的一系列写入命令,然后通过USB进入FPGA。 在FPGA内部,启动信号的搜索前沿被锁定。 并且只有在机器朝相反方向翘起之后,确认才经过同一链。 当确认到达Simulink时,start_out信号将出现在sm_adc块的输出处,该信号将传递到sm_ctrl块。 这将是在建模时间的同一时刻。 在sm_ctrl块中,沿着同一链,信号将被传输到生成器的FPGA,并形成信号。 ADC将在其存储器中捕获此信号。 将从第二主振荡器产生数据采集信号。 以同样的方式,数据进入Simulink,并进入sm_adc块的数据输出。 目前,正在返回一个16384个计数的块。 接收到的块显示在示波器上。



结果

事实证明,通过共享内存进行工作是有效的。 ADC管理程序使您可以使用我们的任何ADC。 同时,仍然存在通过配置文件配置参数的便捷方法。 该程序被设计为控制台应用程序,而所有调试输出均可见。 有可操作性的迹象。 SM_CTRL组件允许您连接各种外部应用程序以控制设备。 调试ADC控制程序不会造成任何困难。 这是一个通用程序,您可以在其中设置断点并进行调试。 使用相同的技术,可以开发用于Matlab / Simulink与外界交互的其他程序。

该工作发表在网站hub.exponenta.ru上 ;

参考文献:
  1. SIMULINK_SM项目-程序源代码:https://github.com/dsmv/simulink_sm
  2. EasyLink项目:https://sourcesup.renater.fr/frs/?group_id=1500
  3. 载体模块FMC128E http://insys.ru/fmc/fmc128e
  4. 子模块FM412x500M http://insys.ru/mezzanine/fm412x500m
  5. 电报频道InSys Research

Source: https://habr.com/ru/post/zh-CN470327/


All Articles