package com.zy.core.thread;
|
|
import HslCommunication.Core.Types.OperateResult;
|
import HslCommunication.Core.Types.OperateResultExOne;
|
import HslCommunication.Profinet.Siemens.SiemensPLCS;
|
import HslCommunication.Profinet.Siemens.SiemensS7Net;
|
import com.alibaba.fastjson.JSON;
|
import com.zy.core.Slave;
|
import com.zy.core.ThreadHandler;
|
import com.zy.core.cache.MessageQueue;
|
import com.zy.core.enums.SlaveType;
|
import com.zy.core.model.Task;
|
import com.zy.core.model.protocol.StaProtocol;
|
import lombok.Data;
|
import lombok.extern.slf4j.Slf4j;
|
|
import java.util.Map;
|
import java.util.concurrent.ConcurrentHashMap;
|
|
/**
|
* 输送线线程
|
* Created by vincent on 2020/8/4
|
*/
|
@Data
|
@Slf4j
|
public class DevpThread implements Runnable, ThreadHandler {
|
|
private Slave slave;
|
private SiemensS7Net siemensS7Net;
|
private Map<Integer, StaProtocol> station = new ConcurrentHashMap<>();
|
|
public DevpThread(Slave slave) {
|
this.slave = slave;
|
connect();
|
}
|
|
@Override
|
@SuppressWarnings("InfiniteLoopStatement")
|
public void run() {
|
while (true) {
|
try {
|
int step = 1;
|
Task task = MessageQueue.poll(SlaveType.Devp, slave.getId());
|
if (task != null) {
|
step = task.getStep();
|
}
|
switch (step) {
|
// 读数据
|
case 1:
|
read();
|
break;
|
// 写数据
|
case 2:
|
write((StaProtocol)task.getData());
|
break;
|
default:
|
break;
|
}
|
Thread.sleep(3000);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
|
}
|
}
|
|
@Override
|
public boolean connect() {
|
boolean result = false;
|
siemensS7Net = new SiemensS7Net(SiemensPLCS.S1200, slave.getIp());
|
siemensS7Net.setRack((byte) 0);
|
siemensS7Net.setSlot((byte) 1);
|
OperateResult connect = siemensS7Net.ConnectServer();
|
if(connect.IsSuccess){
|
result = true;
|
log.info("输送线plc连接成功 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
|
} else {
|
log.info("输送线plc连接失败!!! ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
|
}
|
siemensS7Net.ConnectClose();
|
return result;
|
}
|
|
/**
|
* 读取状态
|
*/
|
private void read(){
|
OperateResultExOne<byte[]> result = siemensS7Net.Read("DB100.0", (short) 40);
|
for (int i = 1; i <= 8; i++) {
|
StaProtocol staProtocol = station.get(i);
|
if (null == staProtocol) {
|
staProtocol = new StaProtocol();
|
staProtocol.setSiteId(i);
|
station.put(i, staProtocol);
|
}
|
System.out.println(siemensS7Net.getByteTransform().TransInt16(result.Content, (i-1)*2));
|
staProtocol.setWorkNo(siemensS7Net.getByteTransform().TransInt16(result.Content, (i-1)*2));
|
staProtocol.setStaNo(siemensS7Net.getByteTransform().TransInt16(result.Content, (i-1)*2+20));
|
// staProtocol.setAutoing(siemensS7Net.getByteTransform().TransBool());
|
}
|
System.out.println("===> 状态");
|
OperateResultExOne<byte[]> result1 = siemensS7Net.Read("DB100.40", (short) 10);
|
for (int i = 1; i <= 8; i++) {
|
System.out.println(siemensS7Net.getByteTransform().TransByte(result.Content, (i-1)));
|
}
|
}
|
|
/**
|
* 写入
|
*/
|
private void write(StaProtocol staProtocol){
|
if (null == staProtocol) {
|
return;
|
}
|
OperateResult write = siemensS7Net.Write("DB100." + (staProtocol.getSiteId() - 1) * 2, staProtocol.getWorkNo()); // 工作号
|
OperateResult write1 = siemensS7Net.Write("DB100." + (staProtocol.getSiteId() - 1) * 2 + 20, staProtocol.getSiteId()); // 目标站
|
boolean[] status = new boolean[8];
|
status[0] = staProtocol.isAutoing();
|
status[1] = staProtocol.isLoading();
|
status[2] = staProtocol.isInEnable();
|
status[3] = staProtocol.isOutEnable();
|
status[4] = staProtocol.isEmptyMk();
|
OperateResult write2 = siemensS7Net.Write("DB100." + (staProtocol.getSiteId() - 1) * 2 + 40, status);// 状态
|
if (!write.IsSuccess || !write1.IsSuccess || !write2.IsSuccess) {
|
log.error("写入输送线站点数据失败。输送线plc编号={},站点数据={}", slave.getId(), JSON.toJSON(staProtocol));
|
}
|
}
|
|
@Override
|
public void close() {
|
|
}
|
|
public static void main(String[] args) {
|
Slave slave = new Slave();
|
slave.setIp("192.168.2.125");
|
DevpThread devpThread = new DevpThread(slave);
|
boolean connect = devpThread.connect();
|
System.out.println(connect);
|
devpThread.read();
|
// 写
|
StaProtocol staProtocol = devpThread.getStation().get(1);
|
staProtocol.setWorkNo((short) 666);
|
staProtocol.setAutoing(true);
|
staProtocol.setEmptyMk(true);
|
devpThread.write(staProtocol);
|
System.out.println("----------------------------------------");
|
// 读
|
devpThread.read();
|
System.out.println(JSON.toJSONString(devpThread.station));
|
}
|
|
}
|