下面这篇按“从 0 到能跑通”的思路,把西门子(Siemens)PLC和永宏(FATEK/永宏电机)PLC在用 Java 对接硬件时的差异讲清楚:差异到底来自哪里、配置要点是什么、代码通常怎么写、踩坑点有哪些。读完你应该能选出更适合的对接方式,并能在后续项目里直接参考。
1. 先说结论:差异的根源是什么?
Java 对接 PLC 的区别,本质上不在 Java,而在“PLC 暴露出来的通信协议/通信口/访问模型”不同。
西门子 PLC最常见的是走S7 协议(S7comm / ISO-on-TCP,TCP 102 端口),这是西门子工程师站/上位机(PG/HMI)常用的访问方式。它的连接通常有分层握手流程(TCP → ISO/COTP → S7comm)。([wiki.wireshark.org][1])
永宏 PLC(FBs 系列等)常见的是:
- 永宏自家的FATEK 标准通讯协议(典型是ASCII 帧:STX…ETX + LRC这种格式),([esea.cz][2])
- 或者更通用的Modbus(RTU/ASCII/TCP)。永宏手册也明确:端口访问要符合“FATEK-PLC Protocol 或 Modbus”。([ResearchGate][3])
所以你会看到:
西门子更像“专有协议 + 专有内存模型(DB/I/Q/M)”;
永宏更像“厂商协议(可自己拼帧)+ 也常用 Modbus(更通用)”。
2. “怎么连上”的区别:端口、握手、链路层级
2.1 西门子:S7 协议通常走 TCP 102(ISO-on-TCP)
默认端口:102(ISO-on-TCP / RFC1006 场景里常见)。([industry-mobile-support.siemens-info.com][4])
典型连接步骤(你不一定要手写,但要理解它为什么“不是普通 TCP 一连就完事”):
- TCP 连接到 102
- ISO 层(COTP Connect)
- S7comm Setup communication
Wireshark 的 S7comm 说明里就把这个流程写得很清楚。([wiki.wireshark.org][1])
体现在哪里?
- 你用 Java 裸 Socket 直连 102 端口,通常并不能直接读写变量;你要么使用实现了 S7 协议栈的库(例如 Moka7/Snap7 系),要么改走 OPC UA / Modbus TCP / OUC 等方式。
另外,S7-1200/1500 这类机型,还经常涉及工程侧的访问权限(比如 PUT/GET 之类的访问控制),配置不对会“能 ping 通但读不到”。相关讨论在 Snap7/Moka7 社区里非常常见。([SourceForge][5])
2.2 永宏:常见是串口/扩展口 +(FATEK 协议或 Modbus)
永宏的 FATEK 标准协议(手册附录)明确了帧结构:
- STX(02H)开头 → 站号 → 命令 → 数据 → 校验(LRC)→ ETX等字段。([esea.cz][2])
永宏通信章节也提到:端口由 CPU 管控,访问必须符合FATEK 协议或Modbus 驱动格式。([ResearchGate][3])
并且在一些资料里会提到:某些端口/默认口对协议有固定要求(例如 Port0 固定为永宏标准协议等),这就会影响你选 Modbus 还是选 FATEK 协议。([calip.com.tw][6])
体现在哪里?
- 永宏这边,你更容易用Java 串口库 + 自己拼帧直接搞定;或者用成熟的Modbus 库(RTU/TCP)走通用方案。
- 你要更关注:站号、串口参数(波特率/校验/停止位)、端口被配置成什么协议、寄存器/地址映射规则。
3. “读写什么”的区别:地址模型与数据类型差异(最容易让小白崩溃)
3.1 西门子:DB / I / Q / M +(字节偏移、位偏移)
西门子变量常见存储区域:
- I:输入区(Input)
- Q:输出区(Output)
- M:中间存储区(Merker)
- DB:数据块(Data Block)
你在 Java 侧读写时,经常要提供类似这些信息:
- DB 号(DB number)
- 起始字节(byte offset)
- 长度(多少字节)
- rack/slot(尤其是 S7-300/400、或某些通信库需要)
体现在哪里?
- 你很少是“读一个变量名”。更多是“读某个内存区域的一段字节”,然后自己在 Java 里把它解析成 int/float/bool/string。
- 字节序、对齐、字符串格式(S7 string 有长度头)也会带来额外解析工作。
实战建议:
- 项目早期就统一“PLC 侧变量布局规范”:哪些 DB 专门给上位机读写、每个字段偏移多少、类型是什么、是否留扩展位。
- 不然到后面维护就是灾难。
3.2 永宏:更多是寄存器/线圈/内部继电器概念(或厂商地址)
永宏如果用Modbus:你面对的是 0x/1x/3x/4x 那套(线圈/离散输入/输入寄存器/保持寄存器)。
如果用FATEK 标准协议:你面对的是永宏定义的命令与地址编码方式(帧里带站号、命令、数据、LRC)。([esea.cz][2])
体现在哪里?
- 对小白来说,Modbus 更“资料多、例子多、库多”;
- FATEK 协议更“直接、可控”,但你要理解并实现报文格式与校验。
4. Java 对接时,最常见的技术路线对比(怎么选)
下面用一张“工程选型表”总结:
| 方案 | 西门子 PLC | 永宏 PLC | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|---|
| 专有协议直连 | S7 协议(TCP 102,ISO-on-TCP)([wiki.wireshark.org][1]) | FATEK 标准协议(STX…ETX + LRC)([esea.cz][2]) | 性能高、直达内存、延迟低 | 配置/权限/协议细节多,跨品牌不可复用 | 单品牌深度集成、实时性高 |
| Modbus(RTU/TCP) | 需要 PLC/模块支持并做映射 | 常见,文档也提及可选 Modbus([ResearchGate][3]) | 通用、库多、好招人 | 映射表维护成本、功能相对有限 | 多品牌兼容、项目交付快 |
| OPC UA | 很多西门子机型/方案支持(具体看型号/授权) | 视型号/网关而定 | 面向对象、安全性好、生态成熟 | 可能涉及授权/部署成本 | 大型 SCADA/MES、跨系统集成 |
如果你要写一套“以后能复用到各种 PLC”的 Java 接口:优先 Modbus 或 OPC UA。
如果你只做西门子并且追求性能:**S7 协议直连(Snap7/Moka7 系)**很常见。Moka7 就是 Java 侧对 S7 的实现之一。([Snap7][7])
5. 具体“差异体现”清单(面试/评审/落地最有用)
5.1 配置与权限差异
- 西门子:经常要在 TIA/硬件侧打开相应访问能力,否则库连得上但读写失败(社区里大量类似问题)。([SourceForge][5])
- 永宏:更多是“端口协议模式”与“串口参数/站号”一致性,协议选错或站号不对就完全不通。([ResearchGate][3])
5.2 报文与握手复杂度
- 西门子:S7/ISO-on-TCP 分层握手,你不想手搓就用库。([wiki.wireshark.org][1])
- 永宏:FATEK 协议报文更“规则化”,你可以自己拼帧(STX/ETX/LRC)。([esea.cz][2])
5.3 地址与数据解析成本
- 西门子:DB/偏移/类型解析是主要工作量。
- 永宏:如果走 Modbus,主要工作量在“寄存器映射表”;如果走 FATEK,主要在“地址编码 + 报文解析”。
5.4 Java 生态与库成熟度
- 西门子侧常见:Snap7/Moka7这类库路线(Moka7 是 Java 形式的 S7 通讯实现)。([Snap7][7])
- 永宏侧:要么直接 Modbus(Java 库非常多),要么自己实现 FATEK 协议(协议文档可对照附录)。([esea.cz][2])
6. 给小白的“落地步骤模板”:不管西门子还是永宏,都按这个排查
Step A:确认物理与网络层
- 网线/交换机/串口线
- IP、网段、网关(以太网)
- 波特率、校验位、站号(串口)
Step B:确认 PLC 端协议开关/端口模式
- 西门子:是否允许 HMI/OP 访问、相关访问控制是否打开(不同机型叫法不同)。([SourceForge][5])
- 永宏:端口被设置成 FATEK 协议还是 Modbus,是否允许当从站/主站等。([ResearchGate][3])
Step C:确认“地址表/变量布局”
- 西门子:DB 号、偏移、数据类型、字符串规则
- 永宏:寄存器映射表(Modbus)或 FATEK 地址规则(厂商协议)
Step D:再写 Java(不要反过来)
先用抓包/调试工具(如 Wireshark、Modbus Poll、串口调试助手)验证“协议层能通”,再写 Java,效率会高很多。
7. 两套“推荐架构”(你后面项目能直接抄)
架构 1:统一接口层(强烈建议)
做一个统一 Java 接口:
PlcClient.connect()readBool/readInt/readFloat/readBytes(...)writeBool/writeInt/writeFloat(...)healthCheck()
底下实现两套驱动:
SiemensS7Client(Moka7/Snap7 思路)([Snap7][7])FatekClient(Modbus 或 FATEK 协议)([ResearchGate][3])
这样上层业务完全不关心 PLC 品牌,换设备只换驱动。
架构 2:数据点配置化(越到后期越省命)
把点位做成配置(JSON/YAML/DB):
name: "line1.speed"type: "float"plc: "siemens"address: "DB10.DBW4"(示意)- 或
modbus: {unitId: 1, holdingRegister: 40010, length: 2}
好处:工厂现场改点位不用改代码,减少返工。
8. 常见坑位速查(最实用)
西门子常见坑
- 只会
ping不代表 S7 协议能读写(权限/访问控制/机型差异很常见)。([SourceForge][5]) - rack/slot 配错(尤其 300/400 或库需要时)
- DB/偏移理解错:Byte/Word/DWord 边界、布尔位偏移
- 字符串解析(S7 String 不是普通 C 字符串)
永宏常见坑
- 串口参数不一致(波特率、校验位、停止位)
- 端口协议模式选错:以为是 Modbus 实际端口跑的是 FATEK(或反过来)。([ResearchGate][3])
- 自己实现 FATEK 协议时 LRC/帧边界处理错误(STX/ETX + 校验)。([esea.cz][2])
9. 选型建议(直接给结论)
- 你追求快速交付、还可能换 PLC 品牌:优先Modbus TCP/RTU(通用、资料多)。([ResearchGate][3])
- 你明确只做西门子,并且需要更深度/更高性能的内存访问:走S7 协议(Moka7/Snap7 系)。([Snap7][7])
- 你做中大型系统(MES/SCADA)且重视安全与标准化:优先OPC UA(看机型/授权/网关)。
、