diff --git a/README.md b/README.md index 35bd46031ef1c1768760618c6fc4a239104112ee..c4f3fe64a763b58206e3f329593849db11e424aa 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,111 @@ -Modbus4j的源代码分析 +# Modbus4j 源代码分析 +本项目是对 [modbus4j](https://github.com/serotonin/modbus4j) 的源代码分析,modbus4j 是一个用于实现 Modbus 协议的 Java 库,支持多种通信方式(如 TCP、UDP、串口 RTU 和 ASCII)。该项目主要用于工业自动化领域,实现设备之间的数据通信。 + +## 项目结构 + +- **lib/**: 包含项目依赖的第三方库,如 `commons-lang3`, `commons-logging`, `slf4j` 等。 +- **src/**: 项目源代码目录,包含多个模块: + - **Main.java**: 程序入口点。 + - **com/mbus/demo/**: 包含 Modbus 主站和从站的示例代码。 + - **com/mbus/test/**: 包含各种测试类,用于验证 Modbus 功能。 + - **com/serotonin/modbus4j/**: 核心 Modbus 协议实现,包括主站、从站、消息解析、数据读写等功能。 + - **com/serotonin/modbus4j/sero/**: 包含底层工具类,如日志、IO 操作、定时器等。 + +## 核心功能 + +### Modbus 主站(Master) + +- **TCPMasterTest.java**: 实现 Modbus TCP 主站功能,支持批量读取数据。 +- **MasterTest.java**: 提供多种 Modbus 功能测试,如读取线圈、离散输入、保持寄存器、输入寄存器等。 +- **BatchRead.java**: 支持批量读取多个寄存器或线圈。 + +### Modbus 从站(Slave) + +- **TCPSlaveTest.java**: 实现 Modbus TCP 从站功能,支持模拟多个从站节点。 +- **BasicProcessImage.java**: 表示从站的寄存器和线圈状态,支持监听写入操作。 + +### 数据解析与测试 + +- **DecodingTest.java**: 测试 Modbus 请求和响应的解析。 +- **AsciiDecodingTest.java**: 测试 ASCII 模式下的数据解析。 +- **ListenerTest.java**: 测试数据写入监听功能。 + +## 使用示例 + +### 启动 Modbus TCP 从站 + +```java +public class TCPSlaveTest { + public static void main(String[] args) throws Exception { + // 创建从站 + ModbusSlaveSet slaveSet = new TcpSlave(502, false); + + // 创建从站的寄存器和线圈数据 + BasicProcessImage processImage1 = new BasicProcessImage(1); + BasicProcessImage processImage2 = new BasicProcessImage(2); + + // 添加从站到从站集合 + slaveSet.addProcessImage(processImage1); + slaveSet.addProcessImage(processImage2); + + // 启动从站 + slaveSet.start(); + + // 定时更新寄存器数据 + Timer update = new Timer(); + update.schedule(new TimerTask() { + @Override + public void run() { + // 更新寄存器数据 + processImage1.setHoldingRegister(0, (short) 123); + processImage2.setHoldingRegister(0, (short) 456); + } + }, 0, 1000); + } +} +``` + +### 启动 Modbus TCP 主站 + +```java +public class TCPMasterTest { + public static void main(String[] args) throws Exception { + // 创建 Modbus 主站 + ModbusMaster master = new TcpMaster("127.0.0.1", 502); + + // 初始化主站 + master.init(); + + // 批量读取数据 + BatchRead batch = new BatchRead<>(); + batch.addLocator("coil1", BaseLocator.coilStatus(1, 0)); + batch.addLocator("register1", BaseLocator.holdingRegister(1, 0, DataType.TWO_BYTE_INT_UNSIGNED)); + + // 发送请求并获取结果 + BatchResults results = master.send(batch); + + // 打印结果 + System.out.println("Coil 1: " + results.getValue("coil1")); + System.out.println("Register 1: " + results.getValue("register1")); + + // 关闭主站 + master.destroy(); + } +} +``` + +## 依赖库 + +- **commons-lang3**: 提供常用工具类。 +- **commons-logging**: 提供日志功能。 +- **slf4j**: 提供日志接口。 +- **slf4j-log4j12**: SLF4J 的 Log4j 实现。 + +## 许可证 + +本项目使用 [Apache License 2.0](https://www.apache.org/licenses/LICENSE-2.0) 开源许可证。 + +## 贡献 + +欢迎提交 Pull Request 和 Issue,帮助改进项目。 \ No newline at end of file