package com.mes.common.PlcTools; import java.util.HashMap; import java.util.Map; /** * 模拟S7 PLC的简单实现,用于测试和开发阶段 */ public class MockS7PLC { // 使用Map模拟PLC的内存存储,键是地址,值是存储的数据 private Map memory = new HashMap<>(); private static volatile MockS7PLC instance; // 单例实例 public static MockS7PLC getInstance() { if (instance == null) { synchronized (MockS7PLC.class) { if (instance == null) instance = new MockS7PLC(); } } return instance; } /** * 模拟写入一个或多个字节到指定地址 * * @param address 地址 * @param data 要写入的数据 */ public void writeByte(String address, byte[] data) { memory.put(address, data); } /** * 模拟从指定地址读取一定数量的字节 * * @param address 地址 * @param count 要读取的字节数 * @return 读取到的数据 */ public byte[] readByte(String address, int count) { byte[] bytes = memory.getOrDefault(address, new byte[0]); if (count >= 0 && count <= bytes.length) { byte[] result = new byte[count]; System.arraycopy(bytes, 0, result, 0, count); return result; } else { // 如果请求的字节数超出了实际可用的字节数,则返回全部可用的字节 return bytes; } } /** * 模拟写入一个16位整数到指定地址 * * @param address 地址 * @param data 要写入的数据 */ public void writeInt16(String address, short data) { memory.put(address, new byte[]{(byte) (data >> 8), (byte) data}); } /** * 模拟从指定地址读取一个16位整数 * * @param address 地址 * @return 读取到的数据 */ public short readInt16(String address) { byte[] data = memory.getOrDefault(address, new byte[]{0, 0}); return (short) ((data[0] << 8) | (data[1] & 0xFF)); } /** * 模拟写入一个布尔值到指定地址 * * @param address 地址 * @param data 要写入的数据 */ public void writeBoolean(String address, boolean data) { memory.put(address, new byte[]{(byte) (data ? 1 : 0)}); } /** * 模拟从指定地址读取一个布尔值 * * @param address 地址 * @return 读取到的数据 */ public boolean readBoolean(String address) { return memory.getOrDefault(address, new byte[]{0})[0] != 0; } // 根据需要,您可以添加更多模拟PLC操作的方法 }