package com.mes.connect; import com.mes.connect.IndustrialInterface.IndustrialDataHandler; import com.mes.connect.addressParser.ModbusAddressParser; import com.mes.connect.protocol.ProtocolAddress; public class ExampleDataHandler implements IndustrialDataHandler { private final boolean[] coils = new boolean[1000]; private final boolean[] discreteInputs = new boolean[1000]; private final int[] holdingRegisters = new int[1000]; private final int[] inputRegisters = new int[1000]; @Override public boolean handleReadBit(String address) { ProtocolAddress parsedAddress = new ModbusAddressParser().parse(address); if (parsedAddress.getFunctionCode() == 1) { // 线圈 int index = parsedAddress.getAddress(); return coils[index]; } else if (parsedAddress.getFunctionCode() == 2) { // 离散输入 int index = parsedAddress.getAddress(); return discreteInputs[index]; } return false; } @Override public void handleWriteBit(String address, boolean value) { ProtocolAddress parsedAddress = new ModbusAddressParser().parse(address); if (parsedAddress.getFunctionCode() == 1) { // 线圈 int index = parsedAddress.getAddress(); coils[index] = value; System.out.println("写入线圈 " + address + " 值: " + value); } } @Override public int handleReadRegister(String address) { ProtocolAddress parsedAddress = new ModbusAddressParser().parse(address); if (parsedAddress.getFunctionCode() == 3) { // 保持寄存器 int index = parsedAddress.getAddress(); return holdingRegisters[index]; } else if (parsedAddress.getFunctionCode() == 4) { // 输入寄存器 int index = parsedAddress.getAddress(); return inputRegisters[index]; } return 0; } @Override public void handleWriteRegister(String address, int value) { ProtocolAddress parsedAddress = new ModbusAddressParser().parse(address); if (parsedAddress.getFunctionCode() == 3) { // 保持寄存器 int index = parsedAddress.getAddress(); holdingRegisters[index] = value; System.out.println("写入寄存器 " + address + " 值: " + value); } } @Override public void handleWriteRegisters(String address, int[] values) { ProtocolAddress parsedAddress = new ModbusAddressParser().parse(address); if (parsedAddress.getFunctionCode() == 16) { // 写多个寄存器 int index = parsedAddress.getAddress(); System.arraycopy(values, 0, holdingRegisters, index, values.length); System.out.println("写入寄存器 " + address + " 数量: " + values.length); } } @Override public int[] handleReadRegisters(String address, int quantity) { ProtocolAddress parsedAddress = new ModbusAddressParser().parse(address); if (parsedAddress.getFunctionCode() == 3) { // 保持寄存器 int startIndex = parsedAddress.getAddress(); int[] result = new int[quantity]; System.arraycopy(holdingRegisters, startIndex, result, 0, Math.min(quantity, holdingRegisters.length - startIndex)); return result; } else if (parsedAddress.getFunctionCode() == 4) { // 输入寄存器 int startIndex = parsedAddress.getAddress(); int[] result = new int[quantity]; System.arraycopy(inputRegisters, startIndex, result, 0, Math.min(quantity, inputRegisters.length - startIndex)); return result; } else if (address.startsWith("S7.")) { return handleS7ReadRegisters(address, quantity); } return new int[0]; } private int[] handleS7ReadRegisters(String address, int quantity) { // 解析S7地址格式并读取多个寄存器 String[] parts = address.split("\\."); if (parts.length >= 3 && parts[0].equals("S7") && parts[1].startsWith("DB")) { try { int dbNumber = Integer.parseInt(parts[1].substring(2)); String type = parts[2].substring(0, 3); int startIndex = Integer.parseInt(parts[2].substring(3)); int baseIndex = dbNumber * 1000 + startIndex; int[] result = new int[quantity]; if (type.equals("DBW")) { // 字(16位)数组 for (int i = 0; i < quantity && baseIndex + i < holdingRegisters.length; i++) { result[i] = holdingRegisters[baseIndex + i]; } } else if (type.equals("DBD")) { // 双字(32位)数组,每个双字占两个寄存器位置 for (int i = 0; i < quantity && baseIndex + i * 2 + 1 < holdingRegisters.length; i++) { result[i] = (holdingRegisters[baseIndex + i * 2] << 16) | (holdingRegisters[baseIndex + i * 2 + 1] & 0xFFFF); } } return result; } catch (NumberFormatException e) { System.err.println("地址解析错误: " + address); } } return new int[0]; } @Override public float handleReadFloat(String address) { int[] registers = handleReadRegisters(address, 2); if (registers.length >= 2) { int intBits = (registers[0] << 16) | registers[1]; return Float.intBitsToFloat(intBits); } return 0.0f; } @Override public void handleWriteFloat(String address, float value) { int intBits = Float.floatToIntBits(value); int highWord = (intBits >> 16) & 0xFFFF; int lowWord = intBits & 0xFFFF; handleWriteRegisters(address, new int[]{highWord, lowWord}); } @Override public String handleReadString(String address, int length) { int[] registers = handleReadRegisters(address, (length + 1) / 2); byte[] bytes = new byte[registers.length * 2]; for (int i = 0; i < registers.length; i++) { bytes[i * 2] = (byte) ((registers[i] >> 8) & 0xFF); bytes[i * 2 + 1] = (byte) (registers[i] & 0xFF); } return new String(bytes, 0, length); } @Override public void handleWriteString(String address, String value) { byte[] bytes = value.getBytes(); int[] registers = new int[(bytes.length + 1) / 2]; for (int i = 0; i < bytes.length; i++) { int regIndex = i / 2; int byteIndex = i % 2; if (byteIndex == 0) { registers[regIndex] = (bytes[i] & 0xFF) << 8; } else { registers[regIndex] |= (bytes[i] & 0xFF); } } handleWriteRegisters(address, registers); } }