自动化立体仓库 - WCS系统
#
Junjie
2025-03-13 5b440ab96a0c5194654107bc1e29245074bd015e
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
package com.zy.core.thread.impl;
 
import HslCommunication.Core.Types.OperateResult;
import HslCommunication.Core.Types.OperateResultExOne;
import HslCommunication.Profinet.Siemens.SiemensPLCS;
import HslCommunication.Profinet.Siemens.SiemensS7Net;
import com.core.common.DateUtils;
import com.zy.common.utils.RedisUtil;
import com.zy.core.News;
import com.zy.core.ThreadHandler;
import com.zy.core.cache.OutputQueue;
import com.zy.core.model.ForkLiftSlave;
import com.zy.core.model.protocol.ForkLiftProtocol;
import lombok.extern.slf4j.Slf4j;
 
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
 
@Slf4j
@SuppressWarnings("all")
public class LfdZyForkLiftMasterThread implements ThreadHandler {
 
    private ForkLiftSlave slave;
    private ForkLiftProtocol forkLiftProtocol;
    private RedisUtil redisUtil;
    private SiemensS7Net siemensS7Net;
    private List<HashMap<String,Object>> slaveAddressList = null;
    private boolean connect = false;
 
    public LfdZyForkLiftMasterThread(ForkLiftSlave slave, RedisUtil redisUtil) {
        this.slave = slave;
        this.redisUtil = redisUtil;
        ArrayList<HashMap<String, Object>> addressList = new ArrayList<>();
 
        HashMap<String, Object> lift1 = new HashMap<>();
        lift1.put("status", new DbData("DB101.0", (short) 16));//提升机数据
        lift1.put("staStatus", new DbData("DB102.0", (short) 8));//站点数据
        lift1.put("write", new DbData("DB103.0", null));//写入数据
        lift1.put("writeConfirm", new DbData("DB103.8", null));//写入确认数据
        lift1.put("confirm", new DbData("DB103.10", null));//确认命令
 
        HashMap<String, Object> lift2 = new HashMap<>();
        lift2.put("status", new DbData("DB104.0", (short) 16));//提升机数据
        lift2.put("staStatus", new DbData("DB105.0", (short) 8));//站点数据
        lift2.put("write", new DbData("DB106.0", null));//写入数据
        lift2.put("writeConfirm", new DbData("DB106.8", null));//写入确认数据
        lift2.put("confirm", new DbData("DB106.10", null));//确认命令
 
        addressList.add(lift1);
        addressList.add(lift2);
        this.slaveAddressList = addressList;
    }
 
    @Override
    public boolean connect() {
        boolean result = false;
        siemensS7Net = new SiemensS7Net(SiemensPLCS.S1200, slave.getIp());
        siemensS7Net.setRack(slave.getRack().byteValue());
        siemensS7Net.setSlot(slave.getSlot().byteValue());
        OperateResult connect = siemensS7Net.ConnectServer();
        if(connect.IsSuccess){
            result = true;
            OutputQueue.FORKLIFT.offer(MessageFormat.format( "【{0}】货叉提升机连接成功 ===>> [id:{1}] [ip:{2}] [port:{3}] [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()));
            News.info("货叉提升机连接成功 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
        } else {
            OutputQueue.FORKLIFT.offer(MessageFormat.format( "【{0}】货叉提升机连接失败!!! ===>> [id:{1}] [ip:{2}] [port:{3}]  [rack:{4}] [slot:{5}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort(), slave.getRack(), slave.getSlot()));
            News.error("货叉提升机连接失败!!! ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
        }
        // siemensS7Net.ConnectClose();
        this.connect = result;
        return result;
    }
 
    @Override
    public void close() {
 
    }
 
    @Override
    public void run() {
        News.info("{}号货叉提升机Master线程启动", slave.getId());
        this.connect();
        while (true) {
            try {
                if (!this.connect) {
                    this.connect();
                }
 
                Thread.sleep(500);
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
 
    public OperateResultExOne<byte[]> read(Integer slaveId, String dbTag) {
        try {
            HashMap<String, Object> map = this.slaveAddressList.get(slaveId - 1);
            DbData dbData = (DbData) map.get(dbTag);
            OperateResultExOne<byte[]> result = siemensS7Net.Read(dbData.dbAddress, dbData.dbAddressLength);
            return result;
        } catch (Exception e) {
            OutputQueue.FORKLIFT.offer(MessageFormat.format("【{0}】读取提升机状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
        }
        return null;
    }
 
    public OperateResult write(Integer slaveId, String dbTag, short[] array) {
        try {
            HashMap<String, Object> map = this.slaveAddressList.get(slaveId - 1);
            DbData dbData = (DbData) map.get(dbTag);
            OperateResult result = siemensS7Net.Write(dbData.dbAddress, array);
            return result;
        } catch (Exception e) {
            OutputQueue.FORKLIFT.offer(MessageFormat.format("【{0}】写入提升机状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
        }
        return null;
    }
 
    public OperateResult write(Integer slaveId, String dbTag, short val) {
        try {
            HashMap<String, Object> map = this.slaveAddressList.get(slaveId - 1);
            DbData dbData = (DbData) map.get(dbTag);
            OperateResult result = siemensS7Net.Write(dbData.dbAddress, val);
            return result;
        } catch (Exception e) {
            OutputQueue.FORKLIFT.offer(MessageFormat.format("【{0}】写入提升机状态信息失败 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
        }
        return null;
    }
 
    private class DbData {
        private String dbAddress;
        private Short dbAddressLength;
 
        public DbData(String dbAddress, Short dbAddressLength) {
            this.dbAddress = dbAddress;
            this.dbAddressLength = dbAddressLength;
        }
 
    }
}