wuyouming666
2024-03-26 90110ed128dd9212caf3b7d5fb4a8d5f870d2905
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
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操作的方法
}