你觉得这篇文章怎么样? 帮助我们为您提供更好的内容。
Thank you! Your feedback has been received.
There was a problem submitting your feedback, please try again later.
你觉得这篇文章怎么样?
现在我们开始第 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 选项…)”。这时将会出现一个新的窗口,如下所示:
勾选“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 节点拖放到流区域。双击节点进行配置:
输入主题“RevPiProcessImage/io/Temp10”并点击“Done(完成)”。我们想让温度值以 °C 为单位显示,因此需要将来自过程映像的数据记录(从 MQTT 代理接收)乘以 10。这可以通过“function(函数)”节点(位于“function(函数)”部分下方的第一个节点)实现。将它拖放到 mqtt 节点的右侧,然后双击进行配置:
“Function(函数)”编辑器允许输入 Java 代码。所有的节点都认识对象“msg”,即流入节点以及由节点发出的消息。为了更改消息的内容,我们使用它的“payload(有效负载)”(即所有节点消息的主要内容,您可以特意添加任何新的内容变量)。于是,只需输入 msg.payload = msg-payload/10 即可达到目标。点击“Done(完成)”。
现在添加两个仪表板节点,并将它们拖放到函数节点的右侧:
测量仪节点和图表节点的配置如下所示:
现在我们连接(“接线”)节点:点击一个节点右边缘上的小圆圈(即节点输出),按住鼠标键不放,然后向另一个节点左边缘上的圆圈(即输入)画一条线。可以看到,一个圆圈可连接多条线。
蓝色圆点表示未保存的(“未部署的”)节点。所以我们点击“Deploy(部署)”,然后我们的流得到执行。只要收到 MQTT 消息,其数值都会乘以 10 并用作 UI 元素的输入值。但是怎样才能看到结果呢?这很简单:只需打开浏览器窗口,输入 http://192.168.0.241:1880/ui(请用您自己的 RevPi 的 IP 取代以上 IP)即可:
使用右侧菜单“dashboard(仪表板)”,将 UI 页面名称 (“Home”) 和组名 (“Default”) 编辑为自定义文本:
我把添加 PWM 值的图表和测量仪作为学习任务留给大家。这里,大家应当使用 MQTT 主题“RevPiProcessImage/event/PWM_heater1”。
至此,如果您对我们的演示项目还满意,可以跟着我学习添加设定点滑块:
我将一个滑块拖放到流,并将流添加至第三个名为“Setpoint”的 UI 组(我使用 30 - 50°C 的范围,步长为 0.5,并将输出设置为“only on release(仅在释放时)”)。我将此节点连接至一个 mqtt 输出节点。mqtt 输出节点配置为发布主题“Setpoint”:
我们使用 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 脚本成功启动:
我希望大家能够成功地按照上述逐步说明进行操作。尽管需要完成大量的配置,但是最后仅有 19 行 Python 代码(我删除了调试打印代码)。为何不试试 IBM Watson 节点呢?您将会对云数据上传的简易程度感到非常欣喜(对于实验目的,可以使用 IBM 提供的免费“Quickstart”访问权限)。访问此地址,看看我的设备是否已经上线,以及我办公室里的温度是多少。如果您在尝试制作 RevPi Python 控制器时遇到任何问题,请在此留言或者发送消息给我。RevPiModIO 的编写者 Sven Sager 想和大家分享一些如何将本次演示扩展至专业版本的构想。他也许很快会在评论区发表他的想法。因此,如果您想进一步探索 Python 在自动化中的应用潜力,欢迎继续关注本文。