换个思路:用 C++ 搞定跨品牌 PLC 通信
老旧产线上的设备协同,是不少工程师的棘手问题。一条产线可能既有跑了十多年的西门子 S7-200 控制传送带,又有新上的合信 M226ES 运动控制器带伺服轴。它们各干各的还行,但要让 S7-200 通知 M226ES '物料到位',或者 M226ES 反馈'抓取完成',就得靠通信。
以往这类跨品牌通信,要么买昂贵的协议网关,要么搞复杂的 OPC 服务器,成本高、维护难。现在有更轻量的办法:在一台普通工控机上跑 C++ 程序,通过开源库 Snap7 直接跟两台 PLC 的网络端口打交道。这样,数据就能在 S7-200 和 M226ES 之间自由流动。
这篇文章会把焦点放在一个具体场景上:如何用 Snap7 同时读写西门子 S7-200(或兼容的合信 M226ES)的 MB 存储区,以及 S7-1200 的 DB 数据块。一旦跑通,你会发现整合新旧设备的门道其实不复杂。
Snap7 到底是什么
可以简单地把 Snap7 理解为 C++ 程序与西门子 S7 协议之间的翻译层。我们用 C++ 调 API 读写数据,Snap7 把它打包成 S7 协议报文发到 PLC;收到回包后再解包,还给我们能直接用的数据。
它有几个好处:
- 跨平台:Windows、Linux、macOS 上都能用,不挑操作系统。
- 多语言封装:除了 C/C++,官方还提供 C#、Python、Java 的绑定,生态挺全。
- 协议覆盖面广:支持 S7-200/300/400/1200/1500,新旧型号通吃。
但有一个必须注意的区别:S7-1200/1500 可以直接访问数据块(DB),这是常规做法;而老款的 S7-200 不支持直接 DB 访问,只能用 MB(位存储区字节)、VB(变量存储区)。后面写代码时,调用 Snap7 的函数会因为这个差异而不同。
用合信 M226ES 当 S7-200 的替身
测 S7-200 通信不一定非得用真机。合信 CTMC M226ES 运动控制器在通信兼容性上做得很到位,它既可以被当做 S7 从站让上位机访问,也能作为 S7 主站去访问其他设备(比如 S7-1200)。用它当开发测试的替身,结果跟真实 S7-200 基本一致,我们实测下来通信稳定性和数据准确性都没问题。
而且 M226ES 本身不弱,支持 EtherCAT 总线带 16 轴,有完整的 PLCopen 运动控制指令库。这就意味着项目架构里,它既能模拟老款 S7-200 的逻辑控制,又能同时干复杂运动控制,典型的新旧产线混用方案。
五分钟搭好开发环境
写代码之前,先把工具备齐:
- C++ 编译器与 IDE:Windows 上推荐 Visual Studio 2019/2022 社区版,免费够用。Linux 下 GCC 或 Qt Creator 也行,Snap7 跨平台。
- Snap7 库文件:去 SourceForge 下最新版。Windows 用户解压后重点留意
snap7.dll。

