package com.example.lxcameraapi; import com.sourceforge.snap7.moka7.S7; import com.sourceforge.snap7.moka7.S7Client; /** * S7 PLC 数据写入测试工具 */ public class S7WriteTest { // PLC连接参数 private static final String IP = "127.0.0.1"; private static final int RACK = 0; private static final int SLOT = 2; private static final int DB_NUMBER = 1; public static void main(String[] args) { S7Client client = new S7Client(); try { // 连接PLC int result = client.ConnectTo(IP, RACK, SLOT); if (result != 0) { System.out.println("连接PLC失败,错误码: " + result); return; } System.out.println("连接PLC成功"); // 写入数据 writePlcData(client); System.out.println("写入完成"); } catch (Exception e) { System.out.println("异常: " + e.getMessage()); e.printStackTrace(); } finally { client.Disconnect(); } } private static void writePlcData(S7Client client) { byte[] buffer = new byte[100]; // 托盘号 String[50] (偏移0,长度52字节,含2字节长度前缀) writeS7String(buffer, 0, 50, "TRAY-20260427-001"); // 批次号 String[20] (偏移52,长度22字节) writeS7String(buffer, 52, 20, "BATCH-ABC123"); // 日期 String[20] (偏移74,长度22字节) writeS7String(buffer, 74, 20, "2026-04-27 10:30:00"); // 拍照标志 byte (偏移96) buffer[96] = 1; // 拍照结果 byte (偏移97) buffer[97] = 0; // 写入PLC (从偏移0开始,写入98字节) int writeResult = client.WriteArea(S7.S7AreaDB, DB_NUMBER, 0, buffer.length, buffer); if (writeResult == 0) { System.out.println("写入成功"); } else { System.out.println("写入失败,错误码: " + writeResult); } } /** * 写入S7 String格式 * @param buffer 目标缓冲区 * @param offset 偏移量 * @param maxLen 最大长度 * @param value 要写入的字符串 */ private static void writeS7String(byte[] buffer, int offset, int maxLen, String value) { // S7 String格式: [0]=最大长度, [1]=实际长度, [2+]=字符串内容 buffer[offset] = (byte) maxLen; byte[] valueBytes = value.getBytes(); byte actualLen = (byte) Math.min(valueBytes.length, maxLen); buffer[offset + 1] = actualLen; // 复制字符串内容 for (int i = 0; i < actualLen; i++) { buffer[offset + 2 + i] = valueBytes[i]; } // 剩余部分填充空格 for (int i = actualLen; i < maxLen; i++) { buffer[offset + 2 + i] = ' '; } } }