小C:
老A,洗车机的HMI跟传统的触摸屏不太一样,我想好好理解一下这个架构是怎么搭起来的。
老A:
行。从头说。
一个自动化项目里,数据从机器到你眼睛看到的画面,中间经过了几层?
洗车机这套方案由四个部分组成——TwinCAT、Python、EEL、HTML/JS。
这四个东西串了一条完整的链路,缺一个都跑不通。
老A:
TwinCAT是倍福的PLC编程环境,跑在Windows工控机上。
它的角色就是"机器的大脑"——读传感器信号、算控制逻辑、发指令给驱动器。
洗车机里那些机器人的控制逻辑,全在里面跑。机器人转矩多少、限位开关有没有碰到、当前运行到哪一步——这些数字都存在TwinCAT的PLC变量里。
老A:
TwinCAT只管"跑逻辑",不管"显示界面"。
它有一个在线监视窗口,能看到一大堆变量的实时值——但那是给工程师调试用的,密密麻麻一行行变量名和数值。
现场操作员不会看这个。操作员需要一个HMI,一个能直观看到机器状态的屏幕。
所以必须把数据从TwinCAT里"接出来",送给做界面那端。
接出来的活儿,交给Python。
小C:
Python在自动化项目里不是写数据分析的吗?
老A:
Python在这里的角色很特殊。它不属于控制层——不直接管机器。也不属于展示层——不做用户界面。它在中间,是连接层。
Python有一个pyads库,能直接跟TwinCAT通信。
ADS是Beckhoff的通信协议:代码里写一行plc.read_by_name(".dRobot00_Torque"),就能读到TwinCAT里那个转矩变量的值。
写一行plc.write_by_name(".bPause", True),就能让系统暂停。
老A:
不需要。Python直接跟PLC对话。
但Python自己不会做界面——你可以在终端里print数据,操作员不能看黑窗口。
Python读到数据之后,需要送到一个能显示的地方——浏览器。
那Python怎么把数据送到浏览器?靠EEL。
老A:
EEL是一个Python库,解决了一个核心问题——Python读到的PLC数据,怎么送给浏览器显示?反过来,用户在前端按了按钮,怎么通知PLC执行动作?
它做的事只有两件:第一,启动一个本地Web服务器,打开一个浏览器窗口显示你的HTML页面。
第二,让Python函数和JS函数可以互相调用。
老A:
走得通,但要绕远路。
你得自己手写一套WebSocket服务器或者HTTP接口——建一个Flask应用,定义路由,处理请求和响应,管理连接。
不是不能做,但费时费力。EEL替你把这一层全干了。三行核心代码就打通:
import eel
eel.init('web') # 指定前端文件夹
eel.start('index.html') # 启动服务器+打开浏览器
老A:
Python函数加一个@eel.expose装饰器,前端就可以await eel.func_name()()直接调用它。
底层走WebSocket传JSON,这些细节你不需要管。
它就是Python和浏览器之间的一根电话线——拿起就能说话,不需要自己接线。
老A:
对。到了这一层,就是用户直接面对的东西了。
HTML搭骨架,CSS化妆,JavaScript让页面动起来。按钮、实时数值、报警弹窗、状态指示灯——所有的界面元素都是标准Web技术做出来的。
前端JS通过await eel.read_plc(".bLimTouch_V_Fault")()拿到TwinCAT里的数据,然后根据返回的True/False改变页面上指示灯的样式。
操作员点击"急停复位"按钮,JS调eel.reset_alarm(),Python写PLC变量,机器执行复位。
小C:
那HTML/JS做界面,跟传统组态比有什么优势吗?
老A:
两个最大的好处。
第一,你想画成什么样就画成什么样。没有厂家定死的控件库,没有配置限制——工厂的工控机大屏上完整显示,管理者的手机上自动适配小屏。
传统组态软件要做到多终端适配,要么加网关做转发,要么买更贵的版本。
小C:
所以这四个东西连起来就是一条完整的数据链?
TwinCAT ──ADS──▶ Python ──EEL──▶ HTML/JS
↑ │
用户操作
└────────────────┘
老A:
按层级来理解——控制层(TwinCAT)管机器,连接层(Python + EEL)管通信,展示层(HTML/JS)管界面。
每一层各司其职,没有多余的中间环节。
我用洗车机的实际场景给你串一遍:
机器人的竖旋限位碰到了车身——TwinCAT收到信号,变量从False变成True。
Python那边有一个被@eel.expose装饰的函数,每几百毫秒轮询读这个变量。
读到的True通过EEL的WebSocket送到了浏览器。
前端拿到这个True,把页面上的指示灯从白色变成红色。
操作员看到红灯,点击复位按钮——JS调Python写PLC——TwinCAT执行复位。
整个链路走完一个来回。
小C:
这四个完全不同的东西能串在一起,靠的是什么?
老A:
靠四样东西:ADS协议(TwinCAT对外开放的通信协议)、pyads库(Python这边对接ADS的库)、EEL(Python这边对接浏览器的库)、浏览器(每台工控机都有的标准组件)。
缺任何一个,这条链都跑不通。但这四样东西没有一样是组态软件厂商提供的:
全部来自开源社区或系统自带,成本几乎为零。
传统组态卖给你的是"从PLC到屏幕的完整方案"——省心但贵。
这条路线是"你自己把四个零件拼起来"——费事但便宜且灵活。