使用 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()