package com.mes.common.PlcTools;
|
|
import java.util.HashMap;
|
import java.util.Map;
|
|
/**
|
* 模拟S7 PLC的简单实现,用于测试和开发阶段
|
*/
|
public class MockS7PLC {
|
// 使用Map模拟PLC的内存存储,键是地址,值是存储的数据
|
private Map<String, byte[]> 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操作的方法
|
}
|