"# Java Modbus \u5f00\u53d1\u5b8c\u5168\u6307\u5357\uff1a\u6784\u5efa\u4f01\u4e1a\u7ea7\u5de5\u4e1a\u5e94\u7528\n\n> 2026-03-01 | 2026-03-01\n> https:\/\/www.modbus.cn\/en\/40581.html\n\n**Modbus\u7f16\u7a0b\u5f00\u53d1**\n\n---\n\nJava Modbus\u5f00\u53d1\u5b8c\u5168\u6307\u5357\uff1a\u6784\u5efa\u4f01\u4e1a\u7ea7\u5de5\u4e1a\u5e94\u7528\n\n## \u5f15\u8a00\uff1aJava\u5728\u5de5\u4e1a\u81ea\u52a8\u5316\u4e2d\u7684\u4f18\u52bf\n\nJava\u51ed\u501f\u5176\u8de8\u5e73\u53f0\u7279\u6027\u3001\u5f3a\u5927\u7684\u7c7b\u578b\u7cfb\u7edf\u3001\u4e30\u5bcc\u7684\u4f01\u4e1a\u7ea7\u7c7b\u5e93\u548c\u6210\u719f\u7684\u751f\u6001\u7cfb\u7edf\uff0c\u5728\u5de5\u4e1a\u81ea\u52a8\u5316\u9886\u57df\u5360\u636e\u91cd\u8981\u5730\u4f4d\u3002\u4ece\u5927\u578b SCADA \u7cfb\u7edf\u5230\u5d4c\u5165\u5f0f\u7f51\u5173\u8bbe\u5907\uff0cJava \u63d0\u4f9b\u4e86\u5b8c\u6574\u7684\u89e3\u51b3\u65b9\u6848\u6808\uff0c\u7279\u522b\u9002\u5408\u9700\u8981\u9ad8\u53ef\u9760\u6027\u3001\u9ad8\u6027\u80fd\u548c\u957f\u671f\u7ef4\u62a4\u7684\u4f01\u4e1a\u7ea7\u5de5\u4e1a\u5e94\u7528\u3002\n\n\u672c\u6587\u5c06\u6df1\u5165\u63a2\u8ba8 Java \u5728 Modbus \u5f00\u53d1\u4e2d\u7684\u5e94\u7528\uff0c\u91cd\u70b9\u4ecb\u7ecd Modbus4J\u3001jamod\u3001j2mod \u7b49\u4e3b\u6d41\u5e93\u7684\u4f7f\u7528\uff0c\u5e76\u7ed3\u5408 Spring Boot\u3001MQTT \u7b49\u73b0\u4ee3\u6280\u672f\u6808\uff0c\u5c55\u793a\u5982\u4f55\u6784\u5efa\u4e13\u4e1a\u7ea7\u7684\u5de5\u4e1a\u7269\u8054\u7f51\u7cfb\u7edf\u3002\n\n## \u4e00\u3001Java Modbus \u5f00\u53d1\u73af\u5883\u914d\u7f6e\n\n### 1.1 \u5f00\u53d1\u73af\u5883\u8981\u6c42\n\n```\n&lt;!-- Maven \u9879\u76ee\u914d\u7f6e --&gt;\n&lt;project&gt;\n    &lt;modelVersion&gt;4.0.0&lt;\/modelVersion&gt;\n    &lt;groupId&gt;com.example&lt;\/groupId&gt;\n    &lt;artifactId&gt;industrial-modbus&lt;\/artifactId&gt;\n    &lt;version&gt;1.0.0&lt;\/version&gt;\n    &lt;properties&gt;\n        &lt;maven.compiler.source&gt;17&lt;\/maven.compiler.source&gt;\n        &lt;maven.compiler.target&gt;17&lt;\/maven.compiler.target&gt;\n        &lt;project.build.sourceEncoding&gt;UTF-8&lt;\/project.build.sourceEncoding&gt;\n    &lt;\/properties&gt;\n&lt;\/project&gt;\n\n```\n\n### 1.2 \u6838\u5fc3\u4f9d\u8d56\u914d\u7f6e\n\n```\n&lt;dependencies&gt;\n    &lt;!-- Modbus4J - \u529f\u80fd\u6700\u5168\u9762\u7684 Modbus \u5e93 --&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;com.infiniteautomation&lt;\/groupId&gt;\n        &lt;artifactId&gt;modbus4j&lt;\/artifactId&gt;\n        &lt;version&gt;3.4.0&lt;\/version&gt;\n    &lt;\/dependency&gt;\n\n    &lt;!-- j2mod - \u73b0\u4ee3\u5316\u8f7b\u91cf\u7ea7\u9009\u62e9 --&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;com.ghgande&lt;\/groupId&gt;\n        &lt;artifactId&gt;j2mod&lt;\/artifactId&gt;\n        &lt;version&gt;3.1.4&lt;\/version&gt;\n    &lt;\/dependency&gt;\n\n    &lt;!-- Spring Boot - \u4f01\u4e1a\u7ea7\u5e94\u7528\u6846\u67b6 --&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n        &lt;artifactId&gt;spring-boot-starter-web&lt;\/artifactId&gt;\n        &lt;version&gt;3.2.0&lt;\/version&gt;\n    &lt;\/dependency&gt;\n\n    &lt;!-- MQTT \u5ba2\u6237\u7aef - \u7269\u8054\u7f51\u901a\u4fe1 --&gt;\n    &lt;dependency&gt;\n        &lt;groupId&gt;org.eclipse.paho&lt;\/groupId&gt;\n        &lt;artifactId&gt;org.eclipse.paho.client.mqttv3&lt;\/artifactId&gt;\n        &lt;version&gt;1.2.5&lt;\/version&gt;\n    &lt;\/dependency&gt;\n&lt;\/dependencies&gt;\n\n```\n\n## \u4e8c\u3001\u4e3b\u6d41 Java Modbus \u5e93\u5bf9\u6bd4\n\n### 2.1 Modbus4J\uff1a\u4f01\u4e1a\u7ea7\u9996\u9009\n\n**\u7279\u70b9\uff1a**\n- \u529f\u80fd\u6700\u5168\u9762\uff0c\u652f\u6301\u6240\u6709 Modbus \u529f\u80fd\u7801\n- \u652f\u6301 TCP\u3001RTU\u3001ASCII \u6240\u6709\u4f20\u8f93\u6a21\u5f0f\n- \u540c\u65f6\u652f\u6301\u4e3b\u7ad9\u548c\u4ece\u7ad9\u6a21\u5f0f\n- \u6d3b\u8dc3\u7684\u793e\u533a\u7ef4\u62a4\uff08Infinite Automation\uff09\n- \u5b8c\u5584\u7684\u5f02\u5e38\u5904\u7406\u548c\u65e5\u5fd7\u7cfb\u7edf\n\n**\u9002\u7528\u573a\u666f\uff1a**\n- \u5927\u578b SCADA \u7cfb\u7edf\n- \u4f01\u4e1a\u7ea7\u5de5\u4e1a\u76d1\u63a7\u5e73\u53f0\n- \u9700\u8981\u9ad8\u53ef\u9760\u6027\u7684\u751f\u4ea7\u73af\u5883\n\n### 2.2 j2mod\uff1a\u73b0\u4ee3\u5316\u8f7b\u91cf\u7ea7\u65b9\u6848\n\n**\u7279\u70b9\uff1a**\n- \u4ee3\u7801\u7b80\u6d01\uff0cAPI \u8bbe\u8ba1\u73b0\u4ee3\u5316\n- \u652f\u6301 Modbus TCP \u548c RTU\n- \u8f7b\u91cf\u7ea7\uff0c\u4f9d\u8d56\u5c11\n- \u9002\u5408\u5fae\u670d\u52a1\u67b6\u6784\n\n**\u9002\u7528\u573a\u666f\uff1a**\n- \u5fae\u670d\u52a1\u67b6\u6784\u7684\u5de5\u4e1a\u5e94\u7528\n- \u8d44\u6e90\u53d7\u9650\u7684\u5d4c\u5165\u5f0f\u8bbe\u5907\n- \u5feb\u901f\u539f\u578b\u5f00\u53d1\n\n### 2.3 jamod\uff1a\u7ecf\u5178\u7a33\u5b9a\u9009\u62e9\n\n**\u7279\u70b9\uff1a**\n- \u5386\u53f2\u60a0\u4e45\uff0c\u7a33\u5b9a\u6027\u597d\n- \u7eaf Java \u5b9e\u73b0\uff0c\u65e0 native \u4f9d\u8d56\n- \u6587\u6863\u5b8c\u5584\uff0c\u793a\u4f8b\u4e30\u5bcc\n- \u793e\u533a\u6d3b\u8dc3\u5ea6\u9ad8\n\n**\u9002\u7528\u573a\u666f\uff1a**\n- \u4f20\u7edf\u5de5\u4e1a\u7cfb\u7edf\u5347\u7ea7\n- \u6559\u5b66\u548c\u5b66\u4e60\u7528\u9014\n- \u9700\u8981\u957f\u671f\u7a33\u5b9a\u652f\u6301\u7684\u9879\u76ee\n\n## \u4e09\u3001Modbus4J \u5b9e\u6218\u5f00\u53d1\n\n### 3.1 Modbus TCP \u5ba2\u6237\u7aef\u5b9e\u73b0\n\n```\npackage com.example.modbus;\n\nimport com.serotonin.modbus4j.ModbusFactory;\nimport com.serotonin.modbus4j.ModbusMaster;\nimport com.serotonin.modbus4j.ip.tcp.TcpParameters;\nimport com.serotonin.modbus4j.exception.ModbusInitException;\n\npublic class ModbusTcpClient {\n\n    private final ModbusMaster master;\n\n    public ModbusTcpClient(String host, int port) {\n        ModbusFactory factory = new ModbusFactory();\n        TcpParameters params = new TcpParameters();\n        params.setHost(host);\n        params.setPort(port);\n        params.setKeepAlive(true);\n\n        master = factory.createTcpMaster(params, true);\n        master.setRetries(3);\n        master.setExceptionListeners(new ExceptionListenerImpl());\n    }\n\n    public void start() throws ModbusInitException {\n        master.init();\n        System.out.println(\"Modbus TCP \u8fde\u63a5\u5df2\u5efa\u7acb\");\n    }\n\n    public short readHoldingRegister(int slaveId, int offset) {\n        return master.readHoldingRegister(slaveId, offset).getValue();\n    }\n\n    public int[] readHoldingRegisters(int slaveId, int offset, int count) {\n        return master.readHoldingRegisters(slaveId, offset, count).getValue();\n    }\n\n    public void writeRegister(int slaveId, int offset, short value) {\n        master.writeRegister(slaveId, offset, value);\n    }\n\n    public void stop() {\n        master.destroy();\n    }\n\n    \/\/ \u4f7f\u7528\u793a\u4f8b\n    public static void main(String[] args) {\n        try {\n            ModbusTcpClient client = new ModbusTcpClient(\"192.168.1.100\", 502);\n            client.start();\n\n            \/\/ \u8bfb\u53d6\u4fdd\u6301\u5bc4\u5b58\u5668\n            short temperature = client.readHoldingRegister(1, 0);\n            System.out.println(\"\u6e29\u5ea6\uff1a\" + temperature + \"\u00b0C\");\n\n            \/\/ \u6279\u91cf\u8bfb\u53d6\n            int[] values = client.readHoldingRegisters(1, 0, 10);\n            for (int i = 0; i &lt; values.length; i++) {\n                System.out.println(\"\u5bc4\u5b58\u5668\" + i + \": \" + values[i]);\n            }\n\n            \/\/ \u5199\u5165\u5bc4\u5b58\u5668\n            client.writeRegister(1, 0, (short) 250);\n\n            client.stop();\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n    }\n}\n\n```\n\n### 3.2 Modbus RTU \u5ba2\u6237\u7aef\u5b9e\u73b0\n\n```\npackage com.example.modbus;\n\nimport com.serotonin.modbus4j.ModbusFactory;\nimport com.serotonin.modbus4j.ModbusMaster;\nimport com.serotonin.modbus4j.serial.rtu.RtuParameters;\n\npublic class ModbusRtuClient {\n\n    private final ModbusMaster master;\n\n    public ModbusRtuClient(String serialPort, int baudRate) {\n        ModbusFactory factory = new ModbusFactory();\n        RtuParameters params = new RtuParameters();\n        params.setCommPortId(serialPort); \/\/ \u5982\uff1a\"\/dev\/ttyUSB0\" \u6216 \"COM3\"\n        params.setBaudRate(baudRate);\n        params.setStopBits(1);\n        params.setParity(0); \/\/ 0=None, 1=Odd, 2=Even\n        params.setFlowControlIn(0);\n        params.setFlowControlOut(0);\n\n        master = factory.createRtuMaster(params);\n        master.setRetries(3);\n        master.setTimeout(500);\n    }\n\n    public void start() throws Exception {\n        master.init();\n        System.out.println(\"Modbus RTU \u8fde\u63a5\u5df2\u5efa\u7acb\");\n    }\n\n    public short readInputRegister(int slaveId, int offset) {\n        return master.readInputRegister(slaveId, offset).getValue();\n    }\n\n    public boolean readCoil(int slaveId, int offset) {\n        return master.readCoil(slaveId, offset).getValue();\n    }\n\n    public void writeCoil(int slaveId, int offset, boolean value) {\n        master.writeCoil(slaveId, offset, value);\n    }\n\n    public void stop() {\n        master.destroy();\n    }\n}\n\n```\n\n### 3.3 Modbus \u4ece\u7ad9\u670d\u52a1\u5668\u5b9e\u73b0\n\n```\npackage com.example.modbus;\n\nimport com.serotonin.modbus4j.ModbusFactory;\nimport com.serotonin.modbus4j.ModbusMaster;\nimport com.serotonin.modbus4j.ip.tcp.TcpParameters;\nimport com.serotonin.modbus4j.slave.ModbusSlave;\nimport com.serotonin.modbus4j.slave.SlaveEventListener;\n\npublic class ModbusServer {\n\n    private ModbusSlave slave;\n\n    public void start(int port) throws Exception {\n        ModbusFactory factory = new ModbusFactory();\n        TcpParameters params = new TcpParameters();\n        params.setHost(\"0.0.0.0\");\n        params.setPort(port);\n\n        slave = factory.createTcpSlave(params, true);\n        slave.setEventListener(new SlaveEventListenerImpl());\n        slave.addProcessImage(1, new ModbusProcessImageImpl());\n\n        slave.start();\n        System.out.println(\"Modbus \u670d\u52a1\u5668\u5df2\u542f\u52a8\uff0c\u76d1\u542c\u7aef\u53e3\uff1a\" + port);\n    }\n\n    public void stop() {\n        if (slave != null) {\n            slave.stop();\n        }\n    }\n}\n\n```\n\n## \u56db\u3001Spring Boot \u96c6\u6210\u5b9e\u6218\n\n### 4.1 \u9879\u76ee\u7ed3\u6784\n\n```\nsrc\/main\/java\/com\/example\/industrial\/\n\u251c\u2500\u2500 IndustrialApplication.java\n\u251c\u2500\u2500 config\/\n\u2502   \u2514\u2500\u2500 ModbusConfig.java\n\u251c\u2500\u2500 service\/\n\u2502   \u251c\u2500\u2500 ModbusService.java\n\u2502   \u2514\u2500\u2500 DataProcessingService.java\n\u251c\u2500\u2500 controller\/\n\u2502   \u2514\u2500\u2500 ModbusController.java\n\u2514\u2500\u2500 model\/\n    \u2514\u2500\u2500 DeviceData.java\n\n```\n\n### 4.2 Modbus \u914d\u7f6e\u7c7b\n\n```\npackage com.example.industrial.config;\n\nimport com.example.industrial.service.ModbusService;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\n\n@Configuration\npublic class ModbusConfig {\n\n    @Bean\n    public ModbusService modbusService() {\n        return new ModbusService(\"192.168.1.100\", 502);\n    }\n}\n\n```\n\n### 4.3 Modbus \u670d\u52a1\u5c42\n\n```\npackage com.example.industrial.service;\n\nimport com.example.modbus.ModbusTcpClient;\nimport com.example.industrial.model.DeviceData;\nimport org.springframework.stereotype.Service;\nimport javax.annotation.PostConstruct;\nimport javax.annotation.PreDestroy;\nimport java.util.ArrayList;\nimport java.util.List;\n\n@Service\npublic class ModbusService {\n\n    private ModbusTcpClient client;\n    private final String host;\n    private final int port;\n\n    public ModbusService(String host, int port) {\n        this.host = host;\n        this.port = port;\n    }\n\n    @PostConstruct\n    public void init() {\n        client = new ModbusTcpClient(host, port);\n        try {\n            client.start();\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n    }\n\n    @PreDestroy\n    public void destroy() {\n        if (client != null) {\n            client.stop();\n        }\n    }\n\n    public DeviceData readDeviceData(int slaveId) {\n        DeviceData data = new DeviceData();\n        data.setDeviceId(slaveId);\n        data.setTemperature(client.readHoldingRegister(slaveId, 0));\n        data.setHumidity(client.readHoldingRegister(slaveId, 1));\n        data.setPressure(client.readHoldingRegister(slaveId, 2));\n        data.setTimestamp(System.currentTimeMillis());\n        return data;\n    }\n\n    public List&lt;DeviceData&gt; readAllDevices(int startId, int count) {\n        List&lt;DeviceData&gt; devices = new ArrayList&lt;&gt;();\n        for (int i = 0; i &lt; count; i++) {\n            devices.add(readDeviceData(startId + i));\n        }\n        return devices;\n    }\n\n    public void writeSetpoint(int slaveId, short value) {\n        client.writeRegister(slaveId, 100, value);\n    }\n}\n\n```\n\n### 4.4 REST API \u63a7\u5236\u5668\n\n```\npackage com.example.industrial.controller;\n\nimport com.example.industrial.model.DeviceData;\nimport com.example.industrial.service.ModbusService;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.web.bind.annotation.*;\n\nimport java.util.List;\n\n@RestController\n@RequestMapping(\"\/api\/modbus\")\n@CrossOrigin(origins = \"*\")\npublic class ModbusController {\n\n    @Autowired\n    private ModbusService modbusService;\n\n    @GetMapping(\"\/device\/{slaveId}\")\n    public DeviceData getDeviceData(@PathVariable int slaveId) {\n        return modbusService.readDeviceData(slaveId);\n    }\n\n    @GetMapping(\"\/devices\")\n    public List&lt;DeviceData&gt; getAllDevices(\n        @RequestParam(defaultValue = \"1\") int startId,\n        @RequestParam(defaultValue = \"10\") int count\n    ) {\n        return modbusService.readAllDevices(startId, count);\n    }\n\n    @PostMapping(\"\/device\/{slaveId}\/setpoint\")\n    public String writeSetpoint(\n        @PathVariable int slaveId,\n        @RequestParam short value\n    ) {\n        modbusService.writeSetpoint(slaveId, value);\n        return \"\u8bbe\u7f6e\u70b9\u5df2\u66f4\u65b0\";\n    }\n}\n\n```\n\n### 4.5 \u6570\u636e\u6a21\u578b\n\n```\npackage com.example.industrial.model;\n\nimport lombok.Data;\n\n@Data\npublic class DeviceData {\n    private int deviceId;\n    private short temperature;\n    private short humidity;\n    private short pressure;\n    private long timestamp;\n}\n\n```\n\n## \u4e94\u3001\u9ad8\u7ea7\u5e94\u7528\u573a\u666f\n\n### 5.1 \u5f02\u6b65\u6570\u636e\u91c7\u96c6\n\n```\npackage com.example.industrial.service;\n\nimport java.util.concurrent.*;\nimport java.util.function.Consumer;\n\npublic class AsyncDataCollector {\n\n    private final ScheduledExecutorService scheduler = \n        Executors.newScheduledThreadPool(4);\n\n    private final ModbusService modbusService;\n\n    public AsyncDataCollector(ModbusService modbusService) {\n        this.modbusService = modbusService;\n    }\n\n    public void startPeriodicCollection(int slaveId, long interval, \n                                        Consumer&lt;DeviceData&gt; callback) {\n        scheduler.scheduleAtFixedRate(() -&gt; {\n            try {\n                DeviceData data = modbusService.readDeviceData(slaveId);\n                callback.accept(data);\n            } catch (Exception e) {\n                System.err.println(\"\u6570\u636e\u91c7\u96c6\u5931\u8d25\uff1a\" + e.getMessage());\n            }\n        }, 0, interval, TimeUnit.MILLISECONDS);\n    }\n\n    public void stop() {\n        scheduler.shutdown();\n    }\n}\n\n```\n\n### 5.2 \u6570\u636e\u7f13\u5b58\u4e0e\u6279\u91cf\u5904\u7406\n\n```\npackage com.example.industrial.service;\n\nimport java.util.concurrent.ConcurrentHashMap;\nimport java.util.concurrent.TimeUnit;\n\npublic class DataCacheService {\n\n    private final ConcurrentHashMap&lt;Integer, DeviceData&gt; cache = \n        new ConcurrentHashMap&lt;&gt;();\n\n    private final long cacheTimeout = 5000; \/\/ 5 \u79d2\n\n    public DeviceData getCachedData(int slaveId) {\n        DeviceData data = cache.get(slaveId);\n        if (data != null &amp;&amp; \n            System.currentTimeMillis() - data.getTimestamp() &lt; cacheTimeout) {\n            return data;\n        }\n        return null;\n    }\n\n    public void updateCache(DeviceData data) {\n        cache.put(data.getDeviceId(), data);\n    }\n\n    public void cleanup() {\n        long now = System.currentTimeMillis();\n        cache.entrySet().removeIf(entry -&gt; \n            now - entry.getValue().getTimestamp() &gt; cacheTimeout\n        );\n    }\n}\n\n```\n\n### 5.3 \u5f02\u5e38\u5904\u7406\u4e0e\u91cd\u8bd5\u673a\u5236\n\n```\npackage com.example.industrial.service;\n\nimport com.serotonin.modbus4j.exception.ModbusException;\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\npublic class ResilientModbusService {\n\n    private static final Logger logger = LoggerFactory.getLogger(\n        ResilientModbusService.class\n    );\n\n    private final ModbusService delegate;\n    private final int maxRetries = 3;\n    private final long retryDelay = 1000;\n\n    public ResilientModbusService(ModbusService delegate) {\n        this.delegate = delegate;\n    }\n\n    public DeviceData readWithRetry(int slaveId) throws Exception {\n        int attempts = 0;\n        while (attempts &lt; maxRetries) {\n            try {\n                return delegate.readDeviceData(slaveId);\n            } catch (ModbusException e) {\n                attempts++;\n                logger.warn(\"\u8bfb\u53d6\u5931\u8d25\uff0c\u91cd\u8bd5 {}\/{}\", attempts, maxRetries);\n                if (attempts &gt;= maxRetries) {\n                    throw e;\n                }\n                Thread.sleep(retryDelay);\n            }\n        }\n        throw new Exception(\"\u8fbe\u5230\u6700\u5927\u91cd\u8bd5\u6b21\u6570\");\n    }\n}\n\n```\n\n## \u516d\u3001\u6027\u80fd\u4f18\u5316\u6700\u4f73\u5b9e\u8df5\n\n### 6.1 \u8fde\u63a5\u6c60\u7ba1\u7406\n\n```\npackage com.example.industrial.pool;\n\nimport org.apache.commons.pool2.impl.GenericObjectPool;\nimport org.apache.commons.pool2.impl.GenericObjectPoolConfig;\n\npublic class ModbusConnectionPool {\n\n    private final GenericObjectPool&lt;ModbusTcpClient&gt; pool;\n\n    public ModbusConnectionPool(String host, int port, int maxConnections) {\n        GenericObjectPoolConfig&lt;ModbusTcpClient&gt; config = \n            new GenericObjectPoolConfig&lt;&gt;();\n        config.setMaxTotal(maxConnections);\n        config.setMaxIdle(maxConnections);\n        config.setMinIdle(2);\n        config.setTestOnBorrow(true);\n\n        pool = new GenericObjectPool&lt;&gt;(\n            new ModbusClientFactory(host, port), \n            config\n        );\n    }\n\n    public ModbusTcpClient borrowClient() throws Exception {\n        return pool.borrowObject();\n    }\n\n    public void returnClient(ModbusTcpClient client) {\n        pool.returnObject(client);\n    }\n\n    public void close() {\n        pool.close();\n    }\n}\n\n```\n\n### 6.2 \u6279\u91cf\u8bfb\u53d6\u4f18\u5316\n\n```\n\/\/ \u4f18\u5316\u524d\uff1a\u591a\u6b21\u5355\u72ec\u8bfb\u53d6\nfor (int i = 0; i &lt; 100; i++) {\n    short value = master.readHoldingRegister(slaveId, i).getValue();\n}\n\n\/\/ \u4f18\u5316\u540e\uff1a\u4e00\u6b21\u6279\u91cf\u8bfb\u53d6\nshort[] values = master.readHoldingRegisters(slaveId, 0, 100).getValue();\n\n```\n\n### 6.3 \u8d85\u65f6\u914d\u7f6e\u4f18\u5316\n\n```\n\/\/ \u6839\u636e\u7f51\u7edc\u73af\u5883\u8c03\u6574\u8d85\u65f6\u65f6\u95f4\nmaster.setTimeout(500);  \/\/ \u672c\u5730\u7f51\u7edc\nmaster.setTimeout(2000); \/\/ \u8fdc\u7a0b\u7f51\u7edc\nmaster.setRetries(3);    \/\/ \u91cd\u8bd5\u6b21\u6570\n\n```\n\n## \u4e03\u3001\u5b89\u5168\u4e0e\u76d1\u63a7\n\n### 7.1 \u8bbf\u95ee\u63a7\u5236\n\n```\npackage com.example.industrial.security;\n\nimport java.util.HashSet;\nimport java.util.Set;\n\npublic class ModbusAccessControl {\n\n    private final Set&lt;Integer&gt; allowedSlaves = new HashSet&lt;&gt;();\n    private final Set&lt;Integer&gt; readOnlyRegisters = new HashSet&lt;&gt;();\n\n    public void allowSlave(int slaveId) {\n        allowedSlaves.add(slaveId);\n    }\n\n    public boolean isSlaveAllowed(int slaveId) {\n        return allowedSlaves.contains(slaveId);\n    }\n\n    public void markReadOnly(int registerOffset) {\n        readOnlyRegisters.add(registerOffset);\n    }\n\n    public boolean isReadOnly(int registerOffset) {\n        return readOnlyRegisters.contains(registerOffset);\n    }\n}\n\n```\n\n### 7.2 \u64cd\u4f5c\u65e5\u5fd7\n\n```\npackage com.example.industrial.logging;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\npublic class ModbusOperationLogger {\n\n    private static final Logger logger = LoggerFactory.getLogger(\n        ModbusOperationLogger.class\n    );\n\n    public void logRead(int slaveId, int register, Object value) {\n        logger.info(\"READ | Slave={} Register={} Value={}\", \n            slaveId, register, value);\n    }\n\n    public void logWrite(int slaveId, int register, Object value) {\n        logger.warn(\"WRITE | Slave={} Register={} Value={}\", \n            slaveId, register, value);\n    }\n\n    public void logError(int slaveId, String operation, Exception e) {\n        logger.error(\"ERROR | Slave={} Operation={} Error={}\", \n            slaveId, operation, e.getMessage());\n    }\n}\n\n```\n\n## \u516b\u3001\u5b9e\u6218\u6848\u4f8b\uff1a\u5de5\u4e1a\u6570\u636e\u91c7\u96c6\u7cfb\u7edf\n\n### 8.1 \u7cfb\u7edf\u67b6\u6784\n\n```\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510     \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510     \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n\u2502 PLC \u8bbe\u5907     \u2502\u2500\u2500\u2500\u2500\u25b6\u2502 Modbus \u7f51\u5173   \u2502\u2500\u2500\u2500\u2500\u25b6\u2502 Java \u5e94\u7528    \u2502\n\u2502 (\u4ece\u7ad9)      \u2502     \u2502 (TCP\/RTU)    \u2502     \u2502 (\u4e3b\u7ad9)      \u2502\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518     \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518     \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n                                              \u2502\n                                              \u25bc\n                                       \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510\n                                       \u2502 \u6570\u636e\u5e93       \u2502\n                                       \u2502 (MySQL)     \u2502\n                                       \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n\n```\n\n### 8.2 \u5b8c\u6574\u5b9e\u73b0\u4ee3\u7801\n\n```\npackage com.example.industrial;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.scheduling.annotation.EnableScheduling;\nimport org.springframework.scheduling.annotation.Scheduled;\n\n@SpringBootApplication\n@EnableScheduling\npublic class IndustrialApplication {\n\n    public static void main(String[] args) {\n        SpringApplication.run(IndustrialApplication.class, args);\n    }\n}\n\n```\n\n## \u4e5d\u3001\u5e38\u89c1\u95ee\u9898\u4e0e\u89e3\u51b3\u65b9\u6848\n\n### 9.1 \u8fde\u63a5\u8d85\u65f6\u95ee\u9898\n\n**\u95ee\u9898\uff1a** Modbus \u8bbe\u5907\u54cd\u5e94\u6162\u5bfc\u81f4\u8d85\u65f6\n\n**\u89e3\u51b3\u65b9\u6848\uff1a**\n\n```\nmaster.setTimeout(2000);  \/\/ \u589e\u52a0\u8d85\u65f6\u65f6\u95f4\nmaster.setRetries(3);     \/\/ \u589e\u52a0\u91cd\u8bd5\u6b21\u6570\n\n```\n\n### 9.2 \u6570\u636e\u4e0d\u4e00\u81f4\u95ee\u9898\n\n**\u95ee\u9898\uff1a** \u8bfb\u53d6\u7684\u6570\u636e\u5076\u5c14\u51fa\u73b0\u5f02\u5e38\u503c\n\n**\u89e3\u51b3\u65b9\u6848\uff1a**\n\n```\n\/\/ \u6dfb\u52a0\u6570\u636e\u9a8c\u8bc1\npublic short readValidatedRegister(int slaveId, int offset) {\n    short value = master.readHoldingRegister(slaveId, offset).getValue();\n    if (value &lt; -1000 || value &gt; 10000) {\n        throw new RuntimeException(\"\u6570\u636e\u8d85\u51fa\u5408\u7406\u8303\u56f4\");\n    }\n    return value;\n}\n\n```\n\n### 9.3 \u5185\u5b58\u6cc4\u6f0f\u95ee\u9898\n\n**\u95ee\u9898\uff1a** \u957f\u65f6\u95f4\u8fd0\u884c\u540e\u5185\u5b58\u5360\u7528\u6301\u7eed\u589e\u957f\n\n**\u89e3\u51b3\u65b9\u6848\uff1a**\n\n```\n\/\/ \u5b9a\u671f\u6e05\u7406\u7f13\u5b58\n@Scheduled(fixedRate = 300000) \/\/ \u6bcf 5 \u5206\u949f\npublic void cleanupCache() {\n    cacheService.cleanup();\n}\n\n\/\/ \u6b63\u786e\u5173\u95ed\u8fde\u63a5\n@PreDestroy\npublic void destroy() {\n    if (master != null) {\n        master.destroy();\n    }\n}\n\n```\n\n## \u5341\u3001\u603b\u7ed3\u4e0e\u5c55\u671b\n\n### 10.1 Java Modbus \u5f00\u53d1\u4f18\u52bf\u603b\u7ed3\n\n- **\u8de8\u5e73\u53f0\u6027**\uff1a\u4e00\u6b21\u7f16\u5199\uff0c\u5230\u5904\u8fd0\u884c\n- **\u4f01\u4e1a\u7ea7\u652f\u6301**\uff1a\u6210\u719f\u7684\u6846\u67b6\u548c\u5e93\u751f\u6001\n- **\u6027\u80fd\u4f18\u5f02**\uff1aJVM \u4f18\u5316\u5e26\u6765\u9ad8\u6027\u80fd\n- **\u53ef\u7ef4\u62a4\u6027**\uff1a\u5f3a\u7c7b\u578b\u3001\u826f\u597d\u7684\u4ee3\u7801\u7ec4\u7ec7\n- **\u793e\u533a\u6d3b\u8dc3**\uff1a\u4e30\u5bcc\u7684\u5b66\u4e60\u8d44\u6e90\u548c\u6280\u672f\u652f\u6301\n\n### 10.2 \u6280\u672f\u9009\u578b\u5efa\u8bae\n\n  \u573a\u666f\n  \u63a8\u8350\u5e93\n  \u7406\u7531\n\n  \u4f01\u4e1a\u7ea7\u5e94\u7528\n  Modbus4J\n  \u529f\u80fd\u5168\u9762\uff0c\u7a33\u5b9a\u6027\u597d\n\n  \u5fae\u670d\u52a1\n  j2mod\n  \u8f7b\u91cf\u7ea7\uff0c\u73b0\u4ee3\u5316 API\n\n  \u5b66\u4e60\/\u6559\u5b66\n  jamod\n  \u6587\u6863\u5b8c\u5584\uff0c\u793a\u4f8b\u4e30\u5bcc\n\n  \u9ad8\u6027\u80fd\n  Modbus4J + \u8fde\u63a5\u6c60\n  \u652f\u6301\u5e76\u53d1\u548c\u6c60\u5316\n\n### 10.3 \u672a\u6765\u53d1\u5c55\u65b9\u5411\n\n- **\u4e91\u539f\u751f\u96c6\u6210**\uff1a\u4e0e Kubernetes\u3001Docker \u6df1\u5ea6\u96c6\u6210\n- **\u8fb9\u7f18\u8ba1\u7b97**\uff1a\u5728\u8fb9\u7f18\u8bbe\u5907\u4e0a\u8fd0\u884c Modbus \u670d\u52a1\n- **AI \u878d\u5408**\uff1a\u7ed3\u5408\u673a\u5668\u5b66\u4e60\u8fdb\u884c\u9884\u6d4b\u6027\u7ef4\u62a4\n- **\u5b89\u5168\u589e\u5f3a**\uff1aTLS\/SSL \u52a0\u5bc6\u901a\u4fe1\u652f\u6301\n\n## \u9644\u5f55\uff1a\u5feb\u901f\u53c2\u8003\n\n### A.1 Maven \u4f9d\u8d56\u901f\u67e5\n\n```\n&lt;!-- Modbus4J --&gt;\n&lt;dependency&gt;\n    &lt;groupId&gt;com.infiniteautomation&lt;\/groupId&gt;\n    &lt;artifactId&gt;modbus4j&lt;\/artifactId&gt;\n    &lt;version&gt;3.4.0&lt;\/version&gt;\n&lt;\/dependency&gt;\n\n&lt;!-- j2mod --&gt;\n&lt;dependency&gt;\n    &lt;groupId&gt;com.ghgande&lt;\/groupId&gt;\n    &lt;artifactId&gt;j2mod&lt;\/artifactId&gt;\n    &lt;version&gt;3.1.4&lt;\/version&gt;\n&lt;\/dependency&gt;\n\n```\n\n### A.2 \u5e38\u7528\u529f\u80fd\u7801\n\n  \u529f\u80fd\u7801\n  \u529f\u80fd\n  \u8bf4\u660e\n\n  01\n  \u8bfb\u7ebf\u5708\n  \u8bfb\u53d6\u5f00\u5173\u91cf\u8f93\u51fa\n\n  02\n  \u8bfb\u79bb\u6563\u8f93\u5165\n  \u8bfb\u53d6\u5f00\u5173\u91cf\u8f93\u5165\n\n  03\n  \u8bfb\u4fdd\u6301\u5bc4\u5b58\u5668\n  \u8bfb\u53d6\u6a21\u62df\u91cf\u8f93\u51fa\n\n  04\n  \u8bfb\u8f93\u5165\u5bc4\u5b58\u5668\n  \u8bfb\u53d6\u6a21\u62df\u91cf\u8f93\u5165\n\n  05\n  \u5199\u5355\u4e2a\u7ebf\u5708\n  \u63a7\u5236\u5f00\u5173\u91cf\u8f93\u51fa\n\n  06\n  \u5199\u5355\u4e2a\u5bc4\u5b58\u5668\n  \u63a7\u5236\u6a21\u62df\u91cf\u8f93\u51fa\n\n  15\n  \u5199\u591a\u4e2a\u7ebf\u5708\n  \u6279\u91cf\u63a7\u5236\n\n  16\n  \u5199\u591a\u4e2a\u5bc4\u5b58\u5668\n  \u6279\u91cf\u8bbe\u7f6e\n\n### A.3 \u8d44\u6e90\u94fe\u63a5\n\n- **Modbus4J GitHub**: https:\/\/github.com\/serotonin\/modbus4j\n- **j2mod GitHub**: https:\/\/github.com\/ghgande\/j2mod\n- **Spring Boot**: https:\/\/spring.io\/projects\/spring-boot\n- **Modbus \u89c4\u8303**: https:\/\/modbus.org\/specs.php\n\n**\u5173\u952e\u8bcd**: Java Modbus, Modbus4J, \u5de5\u4e1a\u7269\u8054\u7f51, \u4f01\u4e1a\u7ea7\u5e94\u7528, Spring Boot, \u6570\u636e\u91c7\u96c6, \u81ea\u52a8\u5316\u63a7\u5236\n\n**\u5b57\u6570**: \u7ea6 8,500 \u5b57\n\n---\n*modbus.cn*\n"