当前位置:首页>python>Python+Eel+TwinCAT上位机联调:连踩4个大坑!

Python+Eel+TwinCAT上位机联调:连踩4个大坑!

  • 2026-10-11 06:15:46
Python+Eel+TwinCAT上位机联调:连踩4个大坑!
   
   

   一、 幕一:工程拉下即崩溃?No module named 与 SSL 网络陷阱  

   
   小C:老A,快救场!我刚把咱们智能洗车机项目源码 main.py 拉到现场工控机上,用 PyCharm 打开一运行,控制台直接红成一片!   
 
   ModuleNotFoundError: No module named 'eel'
   ModuleNotFoundError: No module named 'pyads'
   Warning: Cannot find reference '_MEIPASS' in 'sys.pyi'  
   
   老A:哈哈,小C,别慌!咱们先把这几个报错分分类:

   1. 静态警告 _MEIPASS:这是 PyInstaller 单文件打包时的动态属性。源码里用了 getattr(sys, 'frozen', False) 做了安全防护,直接跑源码时它只是静态语法提示警告,完全不影响程序运行。

   2. 红字报错 No module named:说明你当前选中的 Python 环境里,还没安装 eel 和 pyads。  
   
 小C:懂了!那还不简单,我直接在命令行跑 pip install eel pyads 不就行了?……哎等等,怎么又抛一长串异常了?!  
 
   WARNING: Retrying after connection broken by 'SSLError(SSLEOFError...)'
   Could not fetch URL https://pypi.org/simple/eel/: Max retries exceeded with url
   ERROR: Could not find a version that satisfies the requirement eel  
   
老A:工控机现场网络环境复杂,直接连官方 PyPI 常常会遇到 SSL 握手超时阻断。
此外,eel 依赖 gevent 和 greenlet,如果直接 pip 最新版,在没有安装 MSVC C++ 14.0 编译环境的工控机上还会触发源码编译失败!  
   
   
💡 老A的第 1 个避坑卡片:镜像源 + 预编译轮子锁定
   

     python -m pip install "greenlet<3.0.0" "gevent<24.0.0" pyads eel -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com    
 
   

   二、 幕二:鬼打墙!明明 pip 成功了,PyCharm 为什么依然标红?  

   
小C:老A,我在命令行运行 python -c "import eel; import pyads" 已经打印成功了,但为什么我的 PyCharm 编辑器里,import eel 依然挂着红线警告?  
   
老A:小C,注意看你 PyCharm 编辑器最上方的那行黄色警告条!  
 
   ⚠️ Invalid Python interpreter selected for the project  
       
 老A:这就是典型的“路径漂移导致的解释器失效”大坑!

   这个洗车机工程最初是在 C:\car_washer240816 目录下创建的,后来项目整体复制或移动到了 F:\car_washer240816。

   PyCharm 配置文件记录的依然是旧路径下的虚拟环境。因为 PyCharm 找不到那个失效的 Python 解释器,它彻底停止了对整个项目的包索引!  
   
   
🛠️ 老A的第 2 个避坑卡片:30秒重置 PyCharm 解释器
     
  1. 点击编辑器顶部黄色的 Invalid Python interpreter selected for the project 警告
  2. 选择 Configure Python Interpreter...。
  3. 在下拉框中选择当前项目真实的虚拟环境路径:F:\car_washer240816\venv\Scripts\python.exe。
  4. 点击 OK 保存,PyCharm 重新建立索引后,红色标红瞬间消失!
 
   

   三、 幕三:暗礁密布!Windows 下 Python 3.8+ 找不到 TcAdsDll.dll  

   
 小C:标红都没了!我赶紧运行 main.py……啊?又报错了!  
 
   FileNotFoundError: Could not find module 'TcAdsDll.dll' (or one of its dependencies). Try using the full path with constructor syntax.  
   
老A:这就是 **Python 3.8+ 在 Windows 平台上的一个重要底层机制变更**!

   在 Python 3.8 之前,C-DLL 动态库会自动沿着系统的 PATH 环境变量去寻找;但从 Python 3.8 开始,出于安全考虑,ctypes.WinDLL 不再默认搜索 PATH。如果不显式使用 os.add_dll_directory() 注册 DLL 目录,Python 就会直接报 FileNotFoundError!  
   
   
💡 老A的第 3 个避坑卡片:TwinCAT 动态库自动注册(写入 main.py 顶部)
   
     # 自动注册 TwinCAT ADS DLL 动态库搜索路径(兼容 Python 3.8+ Windows)
     if sys.platform == 'win32' and hasattr(os, 'add_dll_directory'):
       for twincat_dll_path in [r'C:\TwinCAT\Common64', r'C:\TwinCAT\Common32']:
         if os.path.exists(twincat_dll_path):
           try:
             os.add_dll_directory(twincat_dll_path)
           except Exception:
             pass    
 
   
   小C:再次运行,控制台终于打印出了:
   ADS通讯端口已成功打开!
   倍福 TwinCAT PLC 的 AMS NetID (5.59.43.40.1.1) 通讯彻底建联成功了!  
   

   四、 幕四:临门一脚!Chrome 崩溃与 WinError 14001 并行配置错误  

   
  小C:老A,PLC 通讯成功了,但是程序在最后弹出 Web HMI 界面时又卡崩了!  
 
   ADS通讯端口已成功打开
   Traceback (most recent call last):
     File "F:\car_washer240816\main.py", line 206, in <module>
       eel.start('main.html', port=0)
     File "C:\Python39\lib\subprocess.py", line 1420, in _execute_child
       hp, ht, pid, tid = _winapi.CreateProcess(executable, args,
   OSError: [WinError 14001] 应用程序无法启动,因为应用程序的并行配置不正确。有关详细信息,请参阅应用程序事件日志...  
   
 老A:这是最后一关——浏览器进程唤起异常!
   eel.start('main.html', port=0) 在没有指定 mode 参数时,默认会唤起系统的 Google Chrome 浏览器。

   工控机上的 Chrome 浏览器因为版本陈旧或缺失对应的 Visual C++ SxS 运行时组件,导致 Windows 在执行 subprocess.Popen 调用 Chrome 时弹出了系统级的 WinError 14001 并行配置错误。  
   
   
💡 老A的第 4 个避坑卡片:Eel 启动 Edge 模式与容错降级
   
     # web初始化
     plc_symbol_link()
     eel.init('.')

     try:
       # 优先使用系统内置的 Edge 浏览器打开 Web 界面(避开 Chrome WinError 14001 并行配置错误)
       eel.start('main.html', mode='edge', port=0)
     except Exception as e:
       print(f"Edge 模式启动提示: {e},尝试使用默认模式启动...")
       eel.start('main.html', mode='default', port=0)

     close_plc_port()    
 
   

   五、 幕五:完美收官与现场架构复盘  

   
     
   
 小C:老A,我修改完代码点击 Run——界面弹出来了!精美的洗车机 HMI 控制面板成功显示,PLC 的真实传感器数据、泵阀状态和水枪压力全部实时刷新了!  
   
老A:太棒了!回顾一下,咱们今天这套 Python + Eel + TwinCAT ADS 架构 的优势非常明显:

   • 前端灵活:基于现代 HTML5/CSS3/JS(Bootstrap、Eel.js),界面比传统工业组态屏炫酷得多。

   • 底层强悍:利用 pyads 直接读写倍福 PLC 的符号变量(ADS 通讯周期毫秒级)。

   • 避坑到位:处理好了国内 pip 镜像、PyCharm 路径绑定、Python 3.8+ Windows DLL 目录注册,以及 Edge 混合唤起模式。  
   
   
📋 现场排坑 Checklist 卡片:
   
  •      
  • 依赖安装:使用国内镜像 + 锁定 gevent<24.0.0 避开 C++ 编译陷阱。
  •      
  • IDE 配置:检查 PyCharm 顶部黄色警告条,确保 Interpreter 路径匹配当前目录。
  •      
  • ADS 通讯:import pyads 前务必调用 os.add_dll_directory(r'C:\TwinCAT\Common64') 注册 DLL 路径。
  •      
  • Eel Web 模式:优先指定 mode='edge',避免工控机 Chrome 环境缺失引发 WinError 14001。
  •      
  • 代码容错:在 plc.open() 和配置文件 read_file() 处增加 try...except 保护。
  •    
 
   
   本文由老A与小C联合原创整理 · 工业自动化与 Python 跨界开发实战系列  

最新文章

随机文章