嘿!您似乎在 United States,您想使用我们的 English 网站吗?
Switch to English site
Skip to main content

PYTHON – 让“Monty 语言”进入自动化行业:第 4 部分

现在我们开始第 4 部分的介绍,如果需要回顾往期内容,请阅读第 1 部分第 2 部分第 3 部分。

我们将在运行 PID 控制器的同一个 RevPi 系统上运行我们系统的 GUI,它可以通过任何浏览器访问。但是首先,我们需要安装 MQTT 代理。

我们返回 PuTTY 会话,然后使用以下命令在此系统上安装 MQTT 代理。

sudo apt-get install mosquitto mosquitto-clients

MQTT 代理的任务是什么?它接受来自客户端的数值。客户端在“主题”(有点像已命名的容器)下“发布”这类“数据记录”。其它客户端可以“订阅”这类主题。一旦新的数值发送至代理,代理会将该数值转发至所有已订阅该数值主题的客户端。您可以通过加密来保护此数据分配的安全,但在本次演示中,我放弃使用加密以简化步骤。

可以将 RevPiPyLoad 服务配置为将来自标记为“export(导出)”的过程映像的所有 IO 值发布至 MQTT 代理。让我们返回到 RevPiPyControl 应用程序,然后打开“PLC”->”PLC options…(PLC 选项…)”。这时将会出现一个新的窗口,如下所示:

image075_51203798601db56c853b13efbb65310eb68b2ea0.jpgimage077_695f3419862047e13cfd2ef88e1225c4dffb9137.jpgimage0791_7884c79a6113376f8fec24ea537b637e5dbf2fe8.jpg

勾选“RevPiPyLoad server services(RevPiPyLoad 服务器服务)”部分中的“MQTT process image publisher(MQTT 过程映像发布器)”,然后点击“Settings(设置)”。请使用本次演示的屏幕转存图片中的设置。如果您在网络中的任何位置使用 MQTT 代理,应当考虑延长发布间隔时间,例如从 1 秒延长至 10 秒。

点击两次“Save(保存)”,然后 RevPi 立即开始将来自过程映像的数据记录发布至 Mosquitto MQTT 代理。任何客户端均可订阅主题

  • RevPiProcessImage/event/PWM_heater1
  • RevPiProcessImage/event/PWM_heater2
  • RevPiProcessImage/event/Temp10
  • RevPiProcessImage/io/PWM_heater1
  • RevPiProcessImage/io/PWM_heater2
  • RevPiProcessImage/io/Setpoint
  • RevPiProcessImage/io/Temp10

以接收发布的数值。

我们将使用 Node-Red 作为 MQTT 客户端来订阅这些数值,并将它们显示在 UI 上。Node-Red 是一款出色的“拖拽式软件制作工具”。它原本由 IBM 开发,后来 IBM 将它提供给 JS-Foundation 的开放源池。IDE 基于浏览器工作,因此可以轻松建立所谓的消息“流”。只需将“节点”组件从一系列预定节点中拖拽出来组成流即可。然后使用鼠标将节点输出“接线”(连接)至节点输入。对于所有的节点,均可通过点击参数来配置相应的参数。

Node-Red 预装在所有的 RevPi 上,并且该服务器服务只需启动即可。使用以下命令(使用 PuIIY 会话)即可永久启用并启动 Node-Red:

sudo systemctl enable nodered.service
sudo systemctl start nodered

如果您已经对“流”进行了编程并已保存(“部署”),那么在启动后将会自动执行流(现在无需重新启动,Node-Red 已手动启动)。

我们需要向 Node-Red IDE 中添加新的“节点”,因此我们用以下命令安装“npm”(JavaScript 运行时系统“Node.js”的包管理器):

sudo apt-get install npm

马上就完成了,接下来只需建立流即可。我可以通过个人电脑上的浏览器使用以下 IP 和端口地址访问 IDE:http://192.168.0.241:1880(您需要使用自己的 RevPi 的 IP 取代以上内容)。IDE 语言是浏览器的首选语言。

在左侧工具栏中,您可以找到所有的“节点”,您可以将它们拖放到窗口中央的空白流上。我们需要添加仪表板 (UI) 节点。有了 npm,只需点击菜单图标(右上角)并选择“Manage Palette(管理面板)”即可快速完成这一操作。选择“install(安装)”选项卡并输入“dashboard(仪表板)”作为搜索字符串。等待系统显示搜索结果,选择“node-red-dashboard”并点击“install(安装)”。然后关闭 Palette Manager(面板管理器)并刷新浏览器 (F5)。现在,您可以在左侧面板的标题“dashboard(仪表板)”下方找到新安装的节点。

找到面板中的“input(输入)”部分,然后将 mqtt 节点拖放到流区域。双击节点进行配置:

image083_f6d5f229acad936f20cb0fd062064e40bb115e7a.jpg

输入主题“RevPiProcessImage/io/Temp10”并点击“Done(完成)”。我们想让温度值以 °C 为单位显示,因此需要将来自过程映像的数据记录(从 MQTT 代理接收)乘以 10。这可以通过“function(函数)”节点(位于“function(函数)”部分下方的第一个节点)实现。将它拖放到 mqtt 节点的右侧,然后双击进行配置:

image085_36a685f53c17ebfbb30ad2beecf3d19745f1a47f.jpg

“Function(函数)”编辑器允许输入 Java 代码。所有的节点都认识对象“msg”,即流入节点以及由节点发出的消息。为了更改消息的内容,我们使用它的“payload(有效负载)”(即所有节点消息的主要内容,您可以特意添加任何新的内容变量)。于是,只需输入 msg.payload = msg-payload/10 即可达到目标。点击“Done(完成)”。

现在添加两个仪表板节点,并将它们拖放到函数节点的右侧:

测量仪节点和图表节点的配置如下所示:

image087_6ae760fcf22dee35add9d70fdea8eb74b1096a1c.jpgimage089_79746cf3cf9e5b578d914b6605386af5ca3606a6.jpg

现在我们连接(“接线”)节点:点击一个节点右边缘上的小圆圈(即节点输出),按住鼠标键不放,然后向另一个节点左边缘上的圆圈(即输入)画一条线。可以看到,一个圆圈可连接多条线。

image091_c0c518e5f07562e87971b7e842c633f1883eb977.jpg

蓝色圆点表示未保存的(“未部署的”)节点。所以我们点击“Deploy(部署)”,然后我们的流得到执行。只要收到 MQTT 消息,其数值都会乘以 10 并用作 UI 元素的输入值。但是怎样才能看到结果呢?这很简单:只需打开浏览器窗口,输入 http://192.168.0.241:1880/ui(请用您自己的 RevPi 的 IP 取代以上 IP)即可:

image093_174bbbf28e98a287e2018cbfebac96c251f92ce3.jpg

使用右侧菜单“dashboard(仪表板)”,将 UI 页面名称 (“Home”) 和组名 (“Default”) 编辑为自定义文本:

image0951_5f9c56a893404daf004293740f58e23ee03e4bb3.jpg

我把添加 PWM 值的图表和测量仪作为学习任务留给大家。这里,大家应当使用 MQTT 主题“RevPiProcessImage/event/PWM_heater1”。

image0971_4627c7ec857c1badd073fc01ea68b86a5ea59ba4.jpg

image099_a53dd48fce32689b80c68442bdb1ed041dc2b8da.jpg

至此,如果您对我们的演示项目还满意,可以跟着我学习添加设定点滑块:

我将一个滑块拖放到流,并将流添加至第三个名为“Setpoint”的 UI 组(我使用 30 - 50°C 的范围,步长为 0.5,并将输出设置为“only on release(仅在释放时)”)。我将此节点连接至一个 mqtt 输出节点。mqtt 输出节点配置为发布主题“Setpoint”:

image101_bf710a32861a2575a13dc904be48797ae465a952.jpg

image103_5aa3529fd805e2580ba46b80ed9cebfaf061ca59.jpg

我们使用 Python 软件订阅此数值,并用它取代定值作为 PID 函数调用的设定点。因此,我们需要安装名为“paho mqtt”的 Python MQTT 客户端库。使用 PuTTY 并输入

sudo pip3 install paho-mqtt

然后编辑 Python 代码。添加库的导入语句。添加由 “def” 语句组成的所谓“回调”函数。每当已订阅的主题收到来自 MQTT 代理的新消息时,Paho MQTT 客户端就会调用此函数。凭借五条额外的代码行,我们初始化并启动了 MQTT 客户端,同时订阅“Setpoint”。

from simple_pid import PID
import revpimodio2
import time
import paho.mqtt.client as mqtt

def on_message(client, userdata, message):
    TempController.setpoint = int(float(message.payload)*10)

client = mqtt.Client("myplc")
client.connect("localhost")
client.on_message=on_message
client.subscribe("Setpoint",2)
client.loop_start()

TempController = PID(5,0.13,10.5,sample_time=0.1, setpoint=400, output_limits=(0,100))
rpi = revpimodio2.RevPiModIO(autorefresh=True)

while True:
    Temp = rpi.io.Temp10.value
    pwm = TempController(Temp)
    rpi.io.PWM_heater1.value = int(pwm)
    rpi.io.PWM_heater2.value = int(pwm)
    time.sleep(0.05)

现在,让我们将此脚本保存在 RevPiPyLoad 的“自动执行文件夹”中,路径为“/var/lib/revpipyload”,将它命名“program.py”(这两个参数可在配置文件中更改,您已经在我们的小项目开始时编辑过它)。此操作无法通过 IDLE 编辑器中的“save as …(保存为 …)”完成,因为路径“/var/”需要管理员权限才能写入文件。因此,我们最后一次使用 PuTTY,并输入 Linux 命令

sudo mv ~/myplc.py /var/lib/revpipyload/program.py

“Sudo”就是给予您管理员权限以便执行这一命令的神奇词语。

在 RevPiPyControl 窗口中,点击“PLC restart(PLC 重启)”,然后红色错误消息应当消失。绿条表示 Python PLC 脚本成功启动:

image105_96e8936baa856cf84b8b9c17c4ce0fa687f4b6bb.jpg

我希望大家能够成功地按照上述逐步说明进行操作。尽管需要完成大量的配置,但是最后仅有 19 行 Python 代码(我删除了调试打印代码)。为何不试试 IBM Watson 节点呢?您将会对云数据上传的简易程度感到非常欣喜(对于实验目的,可以使用 IBM 提供的免费“Quickstart”访问权限)。访问此地址,看看我的设备是否已经上线,以及我办公室里的温度是多少。如果您在尝试制作 RevPi Python 控制器时遇到任何问题,请在此留言或者发送消息给我。RevPiModIO 的编写者 Sven Sager 想和大家分享一些如何将本次演示扩展至专业版本的构想。他也许很快会在评论区发表他的想法。因此,如果您想进一步探索 Python 在自动化中的应用潜力,欢迎继续关注本文。

image107_795a02e3f1e5c467fa0c0f936ec1b185773cbbdd.jpg

Volker de Haas started electronics and computing with a KIM1 and machine language in the 70s. Then FORTRAN, PASCAL, BASIC, C, MUMPS. Developed complex digital circuits and analogue electronics for neuroscience labs (and his MD grade). Later: database engineering, C++, C#, industrial hard- and software developer (transport, automotive, automation). Designed and constructed the open-source PLC / IPC "Revolution Pi". Now offering advanced development and exceptional exhibits.