COM(Component Object Model)组件的使用
Plant Simulation软件支持COM,可以利用COM通过其他软件控制仿真进程,或将仿真集成到其他应用中,如Excel、Python等。具体定义可参见百度百科。
创建连接
在不同的语言中有不同的创建连接的方法,具体方法参考官方文档。这里以Python为例说明:
用了Python中的comtypes库,详情参照https://pypi.org/project/comtypes/
# 获取文件路径 def get_path(madel_name): path = os.getcwd() + "\\" + madel_name return path # 打开模型 def open_model(madel_name="testModel.spp"): com_obj = com.CreateObject("Tecnomatix.PlantSimulation.RemoteControl.13.1") # 打开仿真软件 com_obj.setVisible(False) # 当为False时,仿真界面不可见;当为True时,仿真界面可见 com_obj.loadModel(get_path(madel_name)) # 根据路径打开模型 return com_obj
COM接口函数
在外部程序中,可用过一些接口函数控制仿真的运行。可用函数如下,具体功能及用法参照帮助文档(按F1所搜COM,在Related Topics中选择Functions of the COM Interface)。
可用函数:loadModel, newModel, saveModel, closeModel, startSimulation, stopSimulation, resetSimulation, isSimulationRunning, setVisible, setValue, getValue, setPathContext, executeSimTalk, quit
COM接口事件
触发事件在不同应用中有不同的使用方法和事件名称,具体使用参照应用文档。
接口模块化(Python与Plant Simulaiton接口)
通过COM将Python与Plant Simulation连接可实现一些只有仿真无法实现或不便于实现的功能,但是每次使用重新编程的工作造成了大量的时间浪费。所以我将接口程序做成一个独立模块,便于程序复用。以下将Python与Plant Simulation接口模块简称为Py2PS模块。
Py2PS模块使用Python 3.5 和 Plant Simulation 13.1 进行编写,暂时只支持 Plant Simulation 13.1 。使用方法如下,源代码见文章最后下载文件:
简介
Py2PS模块主要分为两部分:Plant Simulation部分(COMInterface.lib)和Python部分(ConnModel.pyc),COMInterface.lib负责对仿真的输入输出数据进行汇总,ConnModel.pyc负责建立COM连接,并控制仿真进程。Py2PS模块支持通过Python控制任意模型,对原模型运行无影响,无需任何程序修改。
使用方法
- 将模型文件、ConnModel.pyc文件和python主程序文件放入同一个文件夹下。
- 在Python中安装comtypes库。
- 将COMInterface.lib导入模型文件中,并将模块(IOInterface)放入模型root目录下。
- 打开IOInterface并按照格式填入需要的输入输出参数路径,目前支持整型、浮点型、字符型三种数据类型。
- 在Python中导入ConnModel库,即可实现与模型的互通。
ConnModel库(Python库)函数说明
- open_model(madel_name=”testModel.spp”, visible=False) # 打开模型, madel_name:模型名称, visible:是否可见
- close_model(com_object) # 关闭模型, com_object:Plant Simulation的COM对象
- run_model(plant_sim, input_dict, root=”.Models.Frame”, timeout=0.2) # 运行模型, plant_sim:Plant Simulation的COM对象, input_dict:输入参数值(字典型数据), root:根目录路径, timeout:超时时间。
实例如下:
import ConnModel input_dict = {} # 定义数据字典 # input_dict['加工时间'] = 50 # input_dict['开始时间'] = 0 plant_sim = ConnModel.open_model(madel_name="testModel.spp") # 打开模型 result = ConnModel.run_model(plant_sim, input_dict) # 运行模型 ConnModel.close_model(plant_sim) # 关闭模型 print(str(result))
文件下载
模块文件下载:PY2PS
测试模型下载:TestModel
没有ConnModel的源码,我对com.PumpEvents(0.1)不太理解,即使接收到事件,超时也报警
我想实现,程序开始就一直监听事件,接收事件并处理事件,同时plant程序关闭时,自动停止监听,结束python程序
超时报警可以用try去处理
try:
com.PumpEvents(timeout)
except Exception:
pass
comtypes这个库并不能自动停止监听,只能用循环加判断的方式确定是否可以结束监听