主要内容

使用设备驱动模块进行仿真

外部模式

外部模式使主机上的 Simulink® 能够在运行时与硬件板上部署的模型通信。它还提供一种简单的方式来可视化源的输出,并实时显示信宿模块的影响。

外部模式在主机和硬件板上创建通信服务。这两个服务在 Simulink 引擎和部署在硬件板上的生成代码之间建立通信信道。通信服务将硬件板上的模型进程与代码以及用于格式化、传输和接收数据包的传输层隔离开来。主机上的通信服务通过传输层接收数据包,并更新 Simulink 模型显示。下图显示外部模式通信服务在主机上的 Simulink 与硬件板上部署的代码之间创建的连接。

通过在外部模式下执行包含设备驱动模块的简单模型,您可以直接观测来自硬件板的数据。

有关外部模式仿真的更多详细信息,请参阅用于参数调节、信号监控和代码执行探查的外部模式仿真 (Simulink Coder)

普通模式

在普通模式下,Simulink 模型完全在仿真中运行,而 MATLAB System 模块中的 C/C++ 设备驱动代码从不执行。然而,Simulink 模型通常要求信源模块在仿真期间产生人工生成的或先前记录的数据。通过使用仿真数据,可以在将模型部署到硬件板之前改进算法开发、测试和调试。设备驱动信宿模块无需任何修改即可在普通模式仿真下运行,并具有 Terminator 模块的行为。相反,设备驱动信源模块需要修改 stepImpl 方法,才能在模型处于仿真状态时发出运行时生成的数据或从 MATLAB® 基础工作区检索的数据。

运行时的数据生成

以下代码示例说明如何修改 stepImpl 方法以便设备驱动模块在每个仿真时间步返回随机生成的逻辑值。

methods(Access=protected)
    ...
    function stepImpl(obj,u) %#ok<INUSD>
        if isempty(coder.target)
            % Generate random data during simulation
            y = rand > 0.5;
        else
            % Call C-function implementing device output
            coder.ceval('writeDigitalPin', 9, u);
        end
    end
    ...
end

stepImpl 方法经过修改,以便在 coder.target 返回空值时执行代码。空值表示模型未部署到硬件。

MATLAB 工作区中检索数据

在许多情况下,设备驱动源模块发出的随机生成的数据不足以在仿真中准确评估模型。它们需要以前捕获或生成的数据。

为了实现此行为,可以修改 stepImpl 方法以从 MATLAB 工作区中检索数据变量,如下所示:

properties (Access = private)
    Count = 1
end
methods(Access=protected)
    ...
    function stepImpl(obj,u) %#ok<INUSD>
        if isempty(coder.target)
            % Generate random data during simulation
            x = evalin('base','x');
            y = x(obj.Count);
            obj.Count = obj.Count + 1;
            if obj.Count > numel(x)
                obj.Count = 1;
            end        
        else
            % Call C-function implementing device output
            coder.ceval('writeDigitalPin', 9, u);
        end
    end
    ...
end

其他仿真模式

其他可用的仿真模式,如加速模式和快速加速模式,编译并执行设备驱动模块中包含的 C/C++ 代码。在这些仿真模式中,必须修改 C/C++ 头文件以包含空宏。

另请参阅

| |