在本课程中,您将通过从本地计算机上运行的Python脚本中读取和写入变量来控制Simumatik中的系统或设备。
首先加载名为Python介绍教程的系统(simumatik 公共系统--python introduction tutorial)。
现在,让我们看一下系统中包含的内容。从右到左,我们有入口,合并,左下角是控制箱。在本课程中,我们将重点介绍右侧的部分。
入口部分的两台输送带已经安装了一些传感器和气缸。工作区中部件之间的电、气连接也已经完成,因此你只需要专注于对系统进行编程。
通过六个传感器以及电箱上的选择器开关可以确定系统的输入状态。输出可用于单独控制每个气缸,前两个输送带也可以单独控制。
紧急按钮直接连接到电机接触器的输入。无论控制器发出哪种输出信号,按下急停按钮都将使输送机停止。
进入系统后,在界面中点击view按钮,在右侧assets中确保下载"Controller.py"和"label_printer.py"文件。您可以将这些文件放在任何文件夹中,只要它们在一起即可。如果您在查找这两个附件时遇到问题,可以在 https://simumatik.com/learn/Workspace/system_assets/中找到文档。下载python文件时,浏览器可能会发出警告,请确保"保留"文件以完成下载。
提示:"Controller.py"文件是Simumatik/python-controller的公共 github 存储库的一部分。最新版本以及有关库的更多信息始终可以在那里找到。
若要开始使用系统,需要首先运行 python 控制器脚本(controller.py)。然后在代码编辑器中打开"label_printer.py"文件,再然后开始运行脚本。例如 – 在 IDLE 编辑器中打开该文件,然后按 F5 开始运行脚本。对脚本进行更改后,再次按 F5 保存更改并运行新版本。
在工作区中,通过按工具栏中的"连接网关"按钮确保网关已连接。
按"播放"开始仿真,查看系统中发生的情况,并将该行为与脚本中的代码进行比较,以了解如何使用输入和输出。
在对代码进行更改之前,让我们看一下已经完成的内容,以了解它的工作原理。
python程序脚本的第一部分在使用此特定控制器组件的任何脚本中都是相同的。首先,我们需要导入将在脚本中使用的库,然后定义UDP_Controller类的对象,该对象将用于获取输入并将输出发送到 Simumatik。
提示:可以将log_lever更改为 logging.INFO 或日志记录。DEBUG 可在运行脚本时获取更多输出信息。
import time
from Controller import UDP_Controller
import logging
if __name__ == '__main__':
_controller = UDP_Controller(log_lever=logging.ERROR)
_controller.addVariable("inputs", "byte", 0)
_controller.addVariable("outputs", "byte", 0)
_controller.start()
接下来,将发送到控制器的所有输出都将初始化并设置为"False"。这意味着,除非稍后在脚本中更改它们,否则它们将从控制器提供0V输出。"last_dropped_green"是一个内部变量,稍后将在脚本中使用。
# Initialize all outputs
# List of outputs:
# DROP_GREEN, DROP_BLUE: Connected to product entries, drops a product when activated
# MCL = motor contactor left
# MCR = motor contactor right
# CR1-2 = cylinder right
# CL1-2 = cylinder left
DROP_GREEN = DROP_BLUE = MCL = MCR = CR2 = CR1 = CL2 = CL1 = False
last_dropped_green = 0.0
接下来是 while 循环,这是编写程序主逻辑的地方。每个循环需要做的第一件事是获取更新的输入。这些输入为我们提供了有关系统状态的足够信息,以便对输出执行必要的操作。时钟变量在每个循环开始时都会更新,这在随后的一些地方用于跟踪延迟等。
while True:
# Start by getting the updated inputs. List of inputs:
# - SWITCH_L & SWITCH_R: sigals from the selection switch
# - SR1-3: sensors on the right side
# - SL1-3: sensors on the left side
[SWITCH_L, SWITCH_R, SR3, SR2, SR1, SL3, SL2, SL1] = _controller.getMappedValue("inputs")
clock = time.perf_counter()
这部分代码处理如何控制安装在左侧输送带上的气缸。当前面的传感器检测到易拉罐时,后面的气缸会伸出,计时器就会启动。当计时器达到4秒时,前面的气缸缩回,让罐子通过。在罐子通过后,前气缸再次关闭,循环重新开始。
# Handling of green cans, cylinder control
if SL3:
CL1 = True
CL2 = False if (clock - last_passed_green) > 4 else True
else:
CL1 = False
CL2 = True
last_passed_green = clock
接下来,我们有一个代码,如果队列到达后面的传感器,则停止输送带电机。只有当前面的传感器和最后面的传感器同时检测到易拉罐时,输送带才会停止。此外,如果"CL2"被收回,则不会输入"if"情况,因为在这种情况下,我们希望将罐子向前移动。"green_full"变量稍后用于确定何时应放弃新产品。
# Stop left conveyor if the queue has reached the sensor in the back (after duration 5s)
# but not if the cylinder is letting the first can through
if SL1 and SL3 and CL2:
green_full = True
if (clock - green_queue_starttime) > 5:
MCL = False
else:
MCL = True
# Start counting time when a can leaves the sensor in the back
if not SL1:
green_queue_starttime = clock
green_full = False
下面的代码尝试每三秒生成一个新产品。但是,仅当"green_full"变量为 False 时,才会发生这种情况。否则,就没有新产品的位置。
# Drop a green can every third second
if not green_full and (clock - last_dropped_green) > 3:
DROP_GREEN = True
last_dropped_green = clock
else:
DROP_GREEN = False
代码的最后一部分只是将更新的输出发送到 Simumatik。"time.sleep(0.1)"语句的作用最大,是为了确保脚本不会占用 100% 的 CPU 。
# Send updated outputs to controller
_controller.setMappedValue("outputs", [DROP_GREEN, DROP_BLUE, MCR, MCL, CR2, CR1, CL2, CL1])
# Sleep for short duration to prevent taking much CPU power
time.sleep(0.1)
该脚本已经为输入和输出定义了变量,这些变量是使用蓝色易拉罐控制正确的输送带入口所必需的。请尝试实现与绿色易拉罐的相同功能,并使系统在绿色和蓝色罐同步的情况下运行。
控制盒上的开关可用于选择系统应以何种模式运行。它已经连接到控制器,并在示例程序中定义为"SWITCH_L"和"SWITCH_R"。使用这些输入在以下三种模式之间切换:
1.只有绿色易拉罐才允许通过。每3秒就有一个罐子通过。
2.绿色和蓝色易拉罐都允许通过,但每3秒只有一个。
3. 只有蓝色的罐子才允许通过。每3秒就有一个罐头通过。