Administrator
2021-05-13 80ef12799a70a916846aa9cf50562c919e6e9357
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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
package com.dev.modbus4j;
 
import java.io.IOException;
import java.net.Socket;
 
import com.serotonin.modbus4j.ModbusMaster;
import com.serotonin.modbus4j.ip.IpParameters;
import com.serotonin.modbus4j.serial.SerialPortWrapper;
 
public class MyModbusMaster {
    public final static int SLAVEID_DEFAULT = 2;
    
    public final static int MAX_ERROR_COUNT = 2;        //最大连续错误计数
    public final static int LOSE_CONNECT_COUNT = 10;    //通讯中断最大计数
    
    private ModbusMaster master;
    private int errcount;                                //错误计数    错误连续超过三个时重新获取master
    private int totalerr = 31;                            //总的错误计数[默认失去连接]    用于判别设备是否掉线
    private int tolcommcount = 0 ;                        //总的通讯计数 
    private String target_ip;                            //目标ip
    private int slaveId;                                //设备ID
    private Socket socket;                                
    private int ModbusType = MyModbusFactory.ModBus_TCP;
    private MyIpParameters params;
    
    public MyModbusMaster(String target_ip,int slaveId) {
        this.target_ip = target_ip;
        this.slaveId = slaveId;
        this.params = new MyIpParameters(target_ip);
        this.master = MyModbusFactory.getMaster(params,MyModbusFactory.ModBus_TCP);
    }
    
    public MyModbusMaster(Socket socket,int ModbusType,int slaveId) {
        this.slaveId = slaveId;
        SerialPortWrapper impl = new SerialPortWrapperImpl(socket);
        this.params = new MyIpParameters(impl,ModbusType);
        this.master = MyModbusFactory.getMaster(params,ModbusType);
    }
    
    public void addErrorCount() {
        this.errcount++;
        if(this.errcount > MAX_ERROR_COUNT) {
            reConnect();
        }
        if(this.totalerr > 99999999) {
            this.totalerr = 5;
        }
        this.totalerr ++;
    }
    
    public void addTotalCommCount() {
        this.tolcommcount++;
        if(this.tolcommcount > 999999999) {
            this.tolcommcount = 100;
        }
    }
    
    //清空错误计数
    public void clearError() {
        errcount = 0;
        totalerr = 0;
    }
    
    
    
    public int getTolcommcount() {
        return tolcommcount;
    }
 
    public void reConnect() {
        //System.out.println(target_ip);
        IpParameters params = new IpParameters();
        params.setHost(target_ip);
        if(this.master != null) {
            //清空上一个master
            this.master.destroy();
        }
        this.errcount = 0;
        if(MyModbusFactory.ModBus_TCP == ModbusType) {            
            this.master = MyModbusFactory.getMaster(this.params,MyModbusFactory.ModBus_TCP);
        }
    }
    
    /**
     *     判断获取到的值是否为空
     * @param target
     * @param source
     * @return
     */
    public static Object checkNullData(Object target,Object source) {
        if(null == target) {
            return source;
        }
        try {
            if(target instanceof Number) {
                if(source instanceof Integer) {
                    return ((Number) target).intValue();
                }else if(source instanceof Float) {
                    return ((Number) target).floatValue();
                }
            }
            if(target instanceof Boolean) {
                //判断Boolean类型数据
                if((Boolean)target) {
                    target = 1;
                }else {
                    target = 0;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return target;
        
    }
    
    public int getConnectState() {
        if(this.totalerr < LOSE_CONNECT_COUNT) {
            return 1;
        }
        return 0;
    }
    
    public int getTotalerr() {
        return totalerr;
    }
 
    public void setTotalerr(int totalerr) {
        this.totalerr = totalerr;
    }
 
    public ModbusMaster getMaster() {
        return master;
    }
    public int getErrcount() {
        return errcount;
    }
    public void setMaster(ModbusMaster master) {
        this.master = master;
    }
    public void setErrcount(int errcount) {
        this.errcount = errcount;
    }
 
    public String getTarget_ip() {
        return target_ip;
    }
 
    public void setTarget_ip(String target_ip) {
        this.target_ip = target_ip;
    }
 
    public int getSlaveId() {
        return slaveId;
    }
 
    public void setSlaveId(int slaveId) {
        this.slaveId = slaveId;
    }
 
    public void destory() {
        master.destroy();
        if(null != socket) {
            try {
                socket.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    @Override
    public String toString() {
        return "MyModbusMaster [SLAVEID_DEFAULT=" + SLAVEID_DEFAULT + ", master=" + master + ", errcount=" + errcount
                + ", target_ip=" + target_ip + ", slaveId=" + slaveId + "]";
    }
}