主要内容

本页采用了机器翻译。点击此处可查看英文原文。

使用 Python 脚本运行实时应用程序

本示例演示了如何从 Python® 脚本调用 Simulink® Real-Time™ 函数,以基于模型构建实时应用程序、加载并运行该应用程序、调整参数值以及采集信号数据。

为 Python 配置 MATLAB 会话

要为此示例配置 MATLAB® 会话:

1.打开 MATLAB,并安装适用于 Python 的 MATLAB 引擎。有关详细信息,请参阅从 Python 中调用 MATLAB

2.将 MATLAB 会话转换为共享会话。在命令行窗口中,输入 matlab.engine.shareEngine。有关详细信息,请参阅matlab.engine.shareEngine

配置文件并运行 Python 脚本

要配置文件并运行 Python 脚本:

1.将模型 slrt_ex_pendulum_100Hz 复制到工作文件夹中。

2.将 Python 脚本 CallingSlrealtimeFromPython.py 复制到同一工作文件夹中。

3.打开操作系统的“命令提示符”窗口,并将工作文件夹设为该窗口的当前文件夹。

4.要运行该 Python 脚本,请在命令提示符下输入:

py CallingSlrealtimeFromPython.py -m [.slx file path] -t [target name] -s [STF name]

例如,

py CallingSlrealtimeFromPython.py -m C:\myModels\myPendulum.slx -t TargetPC1 -s speedgoat.tlc

提示:要获取与已连接的目标计算机相对应的系统目标文件 (STF) 名称,请使用getSTFName函数。

5.该 Python 脚本负责建模、运行实时应用程序,并生成关于小车位置的采集信号数据图表。

Python 脚本的逐行说明

该 Python 脚本使用 Simulink Real-Time 函数 API 来运行实时应用程序并采集信号数据。

注意脚本中的以下几点:

  • 要在 Python 中调用 MATLAB 命令,请导入 matlab.engine 模块。

import matlab.engine
  • modelManagement 负责打开和加载 Simulink 模型,然后构建该模型。

class modelManagement():
  • targetManagement 负责处理与 MATLAB 中 slrealtime.Target 对象的交互。例如,该类负责加载应用程序、启动应用程序、停止应用程序、获取和设置参数值,以及捕获信号数据。

class targetManagement():
  • 在主函数中,该函数会尝试查找所有处于活动状态且被共享的 MATLAB 会话,并连接到第一个会话。如果不存在会话,该函数将打开一个新的 MATLAB 会话。

engs = matlab.engine.find_matlab()
if not engs:
   eng = matlab.engine.start_matlab()
else:
   eng = matlab.engine.connect_matlab(engs[0])
  • 在主函数中,该函数实例化了一个 modelManagement 对象并构建了模型。

mm = modelManagement(eng, modelFilePath)
appPath = mm.buildModel()
  • 在主函数中,该函数会为给定的目标名称实例化一个 targetManagement 对象。

tg = targetManagement(eng, targetName)
  • 在主函数中,该函数会在目标计算机上加载应用程序。

tg.load(appPath)
  • 在主函数中,该函数在 MATLAB 中创建一个 slrealtime.Instrument 对象,向仪表对象添加一个用于表示小车位置的信号,将该仪表对象添加到目标对象中,并启用 BufferData 模式。直播信号被保存在内存中,等待被调取。有关缓冲数据模式的信息,请参阅 getBufferedData

blockPaths = ['slrt_ex_pendulum_100Hz/Pendulum']
portNumbers = [1]
tg.captureSignals(appPath, blockPaths, portNumbers)
  • 在主函数中,该函数开始在目标计算机上运行应用程序。

tg.start()
  • 在主函数中,该函数等待 5 秒,然后将“波形控制”模块的参数 Value 设置为 2。此设置会使小车以正弦波轨迹移动。再次读取该值,以确保参数值已成功更新。

tg.setparam('slrt_ex_pendulum_100Hz/Wave Control','Value',2)
newValue = tg.getparam('slrt_ex_pendulum_100Hz/Wave Control','Value')
assert newValue == 2
  • 在主函数中,该函数会等待 15 秒,然后终止应用程序。

time.sleep(15)
tg.stop()
  • 在主函数中,该函数会获取信号数据,并将数据传输回 Python。

[t, data] = tg.getCapturedSignals('slrt_ex_pendulum_100Hz/Pendulum',1)
  • 在主函数中,该函数会从目标对象中移除先前添加的仪表对象,使目标对象恢复到初始状态。

tg.removeInstrument()
  • 在主函数中,该函数将捕获的信号数据随时间变化绘制出来。在生成的图表中,可以看到小车的位置在约 5 秒时稳定在 5 处,随后如预期所示,小车开始以正弦波形式运动。

plt.plot(t, data)
plt.xlabel('Time(s)')
plt.ylabel('Cart Position')
plt.show()