Java实现从PLC读取数据的常见主流且可行方案

 更新时间:2026年03月09日 08:36:17   作者:Full Stack Developme  
要从PLC读取数据,Java本身并不直接支持PLC的通信协议,所以你需要借助一些中间件或库来实现,以下是几种主流且可行的方案,大家可以根据自己的需要进行选择

这是一个非常经典且常见的工业物联网(IIoT)或自动化集成需求。

要从PLC读取数据,Java本身并不直接支持PLC的通信协议,所以你需要借助一些中间件或库来实现。

核心思路:PLC通常使用工业以太网协议(如Modbus TCP、S7协议、OPC UA等)进行通信。Java需要通过特定的库来“说”这些协议。

以下是几种主流且可行的方案,按推荐程度和应用场景排序

方案一:使用 Modbus TCP 协议(最常见、跨平台性好)

如果PLC支持Modbus TCP协议(西门子、三菱、施耐德等很多品牌都支持,或者通过扩展模块支持),这是Java接入最简单的方式。

推荐库: Jamod 或 EasyModbus

步骤示例:

1.引入依赖(以 EasyModbus 为例,Maven):

<dependency>
    <groupId>de.re.easymodbus</groupId>
    <artifactId>easymodbus4j</artifactId>
    <version>1.2.1</version> 
</dependency>

2.Java 代码示例(读取保持寄存器):

import de.re.easymodbus.modbus.ModbusClient;

public class ReadPLC {
    public static void main(String[] args) {
        ModbusClient modbusClient = null;
        try {
            // 1. 创建Modbus客户端,指定PLC的IP和端口(Modbus TCP默认端口为502)
            modbusClient = new ModbusClient("192.168.1.100", 502);
            
            // 2. 建立连接
            modbusClient.Connect();
            
            // 3. 读取数据(示例:从地址0开始读取3个保持寄存器)
            //    函数说明:ReadHoldingRegisters(起始地址, 数量)
            int[] registers = modbusClient.ReadHoldingRegisters(0, 3);
            
            // 4. 输出读取到的值
            System.out.println("寄存器0的值: " + registers[0]);
            System.out.println("寄存器1的值: " + registers[1]);
            System.out.println("寄存器2的值: " + registers[2]);
            
            // 写入数据示例(可选)
            // modbusClient.WriteSingleRegister(0, 100); // 向地址0写入值100
            
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 5. 关闭连接
            if (modbusClient != null && modbusClient.isConnected()) {
                modbusClient.Disconnect();
            }
        }
    }
}

适用场景: PLC支持Modbus TCP,且需要快速开发、无需太复杂的配置。

方案二:使用西门子 S7 协议(针对西门子PLC)

如果你面对的是西门子S7系列(如S7-1200, S7-1500, S7-200 Smart),它们通常使用专有的S7协议。

推荐库: S7Connector 或 Moka7 (Java移植版)

步骤示例(使用 S7Connector):

1.引入依赖(Github项目,需手动导入Jar或通过Jitpack集成)。

2.代码示例

// 以开源库 S7Connector 为例
import pl.com.s7p.s7connector.*;

public class SiemensS7Reader {
    public static void main(String[] args) {
        S7Connection connection = new S7Connection();
        try {
            // 1. 连接到PLC (IP地址, 机架号0, 插槽号1 通常用于S7-1200/1500)
            //    对于S7-200,机架和插槽通常是0/0或0/1,需查阅PLC配置
            connection.ConnectTo("192.168.1.10", 0, 1);
            
            // 2. 读取DB块数据 (DB编号, 起始字节, 读取字节长度)
            byte[] buffer = connection.ReadArea(S7Area.DB, 1, 0, 10); // 读取DB1,从第0字节开始,读10个字节
            
            // 3. 解析字节数据为Java类型 (需要根据PLC数据类型手动解析)
            //    例如,前4个字节是一个浮点数
            float value = S7Util.getFloatAt(buffer, 0);
            System.out.println("DB1.DBD0 的值为: " + value);
            
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            connection.Disconnect();
        }
    }
}

适用场景: 项目特定针对西门子PLC,追求更高的执行效率和对S7协议的支持。

方案三:使用 OPC UA(现代工业标准,适合复杂系统)

OPC UA 是工业4.0的核心通信标准,它独立于厂商,安全性高,数据建模能力强。如果你需要对接多种品牌PLC,或者构建一个中大型的MES(制造执行系统),这是最佳选择。

推荐库: Eclipse Milo(纯Java实现,功能强大,官方推荐)

步骤示例(Eclipse Milo 读取节点):

1.引入依赖(Maven):

<dependency>
    <groupId>org.eclipse.milo</groupId>
    <artifactId>sdk-client</artifactId>
    <version>0.6.8</version>
</dependency>

2.代码逻辑(简化版):

  • 创建OPC UA客户端。
  • 配置Endpoint(服务器地址,如 opc.tcp://192.168.1.10:4840)。
  • 身份验证(可能需用户名密码或证书)。
  • 连接并浏览节点。
  • 读取节点的值。

适用场景: 系统集成要求高、需对接多种品牌设备、强调安全性和标准化的大型项目。

方案四:通过中间件/数据库(间接读取)

如果不想处理复杂的协议,或者PLC端已经配置好了向上位机发送数据的功能:

  • MQTT(消息队列):PLC端通过网关或自身功能将数据发布到MQTT Broker,Java程序通过Eclipse Paho库订阅主题接收数据。适合物联网云平台场景。
  • ODBC/JDBC(数据库):某些工业PC或高端PLC支持将数据实时写入SQL Server、MySQL或Oracle。Java直接通过JDBC去查询这些表即可。注意: 这不适用于大多数小型PLC,通常配合IPC(工控机)使用。
  • REST API:一些现代物联网PLC或边缘网关提供HTTP接口,Java可以用OkHttp或HttpClient直接GET数据。

总结与建议

你的情况推荐方案
PLC型号未知,但大概率支持Modbus方案一 (Modbus TCP) —— 最简单,代码量最少。
明确知道是西门子 S7-1200/1500方案二 (S7协议) —— 直接与西门子对话,性能好。
对接多个品牌PLC/大型工厂项目方案三 (OPC UA) —— 使用Eclipse Milo,符合未来趋势。
不想碰协议,只想拿数据方案四 (MQTT) —— 通过消息队列解耦,更现代化。

提示: 开始编码前,务必确认以下几点,否则代码写得再好也连不上:

  • PLC的IP地址是否和电脑在同一网段?
  • PLC的端口是否开放?(Modbus是502,S7是102,OPC UA通常是4840)
  • PLC侧是否开启了允许远程/外部读写的权限?(很多PLC默认禁止外部写入,甚至禁止GET请求)

到此这篇关于Java实现从PLC读取数据的常见主流且可行方案的文章就介绍到这了,更多相关Java PLC读取数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MyBatis拦截器动态替换表名的方法详解

    MyBatis拦截器动态替换表名的方法详解

    因为我们持久层框架更多地使用MyBatis,那我们就借助于MyBatis的拦截器来完成我们的功能,这篇文章主要给大家介绍了关于MyBatis拦截器动态替换表名的相关资料,需要的朋友可以参考下
    2022-04-04
  • Java 定时器的多种实现方式

    Java 定时器的多种实现方式

    本文介绍了Java中定时器的多种实现方式,有此需求的朋友可以根据实际选择适合自己的方式
    2021-06-06
  • IDEA JavaWeb项目启动运行后出现404错误的解决方法

    IDEA JavaWeb项目启动运行后出现404错误的解决方法

    这篇文章主要介绍了IDEA JavaWeb项目启动运行后出现404错误的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • 使用Java和Apache POI实现HTML转Word的完整指南

    使用Java和Apache POI实现HTML转Word的完整指南

    在数据处理和报告生成中,将HTML转换为Word文档是一个常见需求,本文介绍使用Java和Apache POI库完成这一转换任务的步骤,包括依赖引入、HTML内容读取、Word文档创建、HTML解析并添加到Word,以及最终的文档保存,需要的朋友可以参考下
    2025-08-08
  • Java批量操作如何提升ORM框架的批处理性能

    Java批量操作如何提升ORM框架的批处理性能

    本文介绍的批量插入、更新、删除和读取优化技术,以及性能监控与调优方法,为开发者提供了全面的批处理性能优化思路,感兴趣的朋友一起看看吧
    2025-05-05
  • 在springboot中对kafka进行读写的示例代码

    在springboot中对kafka进行读写的示例代码

    本篇文章主要介绍了在springboot中对kafka进行读写的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • 使用JavaMail发送邮件保证成功的方法

    使用JavaMail发送邮件保证成功的方法

    JavaMail是利用现有的邮件账户发送邮件的工具,使用过JavaMail的api发送邮件的人可能会有这样一个疑惑:我如何知道我调用该api发送的邮件是否成功呢?那么通过下面这篇文章大家一起来看看使用JavaMail保证邮件发送成功的方法,有需要的朋友们可以参考借鉴。
    2016-11-11
  • SpringBoot使用@Cacheable出现预览工具乱码的解决方法

    SpringBoot使用@Cacheable出现预览工具乱码的解决方法

    直接使用注解进行缓存数据,我们再使用工具去预览存储的数据时发现是乱码,这是由于默认序列化的问题,所以接下来将给大家介绍一下SpringBoot使用@Cacheable出现预览工具乱码的解决方法,需要的朋友可以参考下
    2023-10-10
  • 一文搞懂Java中的序列化与反序列化

    一文搞懂Java中的序列化与反序列化

    序列化是将对象转换成二进制字节流的过程;反序列化是从二进制字节流中恢复对象的过程。文中降通过示例详解二者的使用与区别,需要的可以参考一下
    2022-08-08
  • Json传输出现中文乱码问题的解决办法

    Json传输出现中文乱码问题的解决办法

    最近遇到一个问题,就是将中文消息以json格式推给微信服务器时,收到的消息是乱码,所以下面这篇文章主要给大家介绍了关于Json传输出现中文乱码问题的解决办法,需要的朋友可以参考下
    2023-05-05

最新评论