package com.zy.core.network.real;
|
|
import HslCommunication.Core.Types.OperateResult;
|
import HslCommunication.Core.Types.OperateResultExOne;
|
import HslCommunication.Profinet.Siemens.SiemensS7Net;
|
import lombok.extern.slf4j.Slf4j;
|
|
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSONObject;
|
import com.baomidou.mybatisplus.mapper.EntityWrapper;
|
import com.core.common.DateUtils;
|
import com.core.common.SpringUtils;
|
import com.zy.asrs.entity.BasDevp;
|
import com.zy.asrs.entity.DeviceConfig;
|
import com.zy.asrs.service.BasDevpService;
|
import com.zy.core.News;
|
import com.zy.core.cache.OutputQueue;
|
import com.zy.core.model.CommandResponse;
|
import com.zy.core.model.command.StationCommand;
|
import com.zy.core.network.api.ZyStationConnectApi;
|
import com.zy.core.network.entity.ZyStationStatusEntity;
|
import java.util.Collections;
|
import java.util.List;
|
|
import java.text.MessageFormat;
|
import java.util.Date;
|
|
/**
|
* 输送站真实连接(PLC)
|
*/
|
@Slf4j
|
public class ZyStationRealConnect implements ZyStationConnectApi {
|
|
private List<ZyStationStatusEntity> statusList;
|
private List<ZyStationStatusEntity> barcodeStatusList;
|
private final SiemensS7Net siemensNet;
|
private final DeviceConfig deviceConfig;
|
|
public ZyStationRealConnect(SiemensS7Net siemensNet, DeviceConfig deviceConfig) {
|
this.siemensNet = siemensNet;
|
this.deviceConfig = deviceConfig;
|
}
|
|
@Override
|
public boolean connect() {
|
boolean connected = false;
|
OperateResult connect = siemensNet.ConnectServer();
|
if (connect.IsSuccess) {
|
connected = true;
|
OutputQueue.DEVP.offer(MessageFormat.format("【{0}】输送站plc连接成功 ===>> [id:{1}] [ip:{2}] [port:{3}]",
|
DateUtils.convert(new Date()), deviceConfig.getDeviceNo(), deviceConfig.getIp(),
|
deviceConfig.getPort()));
|
News.info("SiemensDevp" + " - 1" + " - 输送站plc连接成功 ===>> [id:{}] [ip:{}] [port:{}]",
|
deviceConfig.getDeviceNo(), deviceConfig.getIp(), deviceConfig.getPort());
|
} else {
|
OutputQueue.DEVP.offer(MessageFormat.format("【{0}】输送站plc连接失败!!! ===>> [id:{1}] [ip:{2}] [port:{3}]",
|
DateUtils.convert(new Date()), deviceConfig.getDeviceNo(), deviceConfig.getIp(),
|
deviceConfig.getPort()));
|
News.error("SiemensDevp" + " - 2" + " - 输送站plc连接失败!!! ===>> [id:{}] [ip:{}] [port:{}]",
|
deviceConfig.getDeviceNo(), deviceConfig.getIp(), deviceConfig.getPort());
|
}
|
return connected;
|
}
|
|
@Override
|
public boolean disconnect() {
|
siemensNet.ConnectClose();
|
return true;
|
}
|
|
@Override
|
public List<ZyStationStatusEntity> getStatus() {
|
if (statusList == null) {
|
BasDevpService basDevpService = SpringUtils.getBean(BasDevpService.class);
|
if (basDevpService == null) {
|
return Collections.emptyList();
|
}
|
|
BasDevp basDevp = basDevpService
|
.selectOne(new EntityWrapper<BasDevp>().eq("devp_no", deviceConfig.getDeviceNo()));
|
if (basDevp == null) {
|
return Collections.emptyList();
|
}
|
|
statusList = JSONObject.parseArray(basDevp.getStationList(), ZyStationStatusEntity.class);
|
barcodeStatusList = JSONObject.parseArray(basDevp.getBarcodeStationList(), ZyStationStatusEntity.class);
|
}
|
|
OperateResultExOne<byte[]> result = siemensNet.Read("DB101.0", (short) (statusList.size() * 2));
|
if (result.IsSuccess) {
|
for (int i = 0; i < statusList.size(); i++) {
|
ZyStationStatusEntity statusEntity = statusList.get(i); // 站点编号
|
boolean[] status = siemensNet.getByteTransform().TransBool(result.Content, i * 2, 2);
|
statusEntity.setAutoing(status[0]); // 自动
|
statusEntity.setLoading(status[1]); // 有物
|
statusEntity.setInEnable(status[2]); // 可入
|
statusEntity.setOutEnable(status[3]);// 可出
|
statusEntity.setEmptyMk(status[4]); // 空板信号
|
statusEntity.setFullPlt(status[5]); // 满托盘
|
}
|
}
|
|
OperateResultExOne<byte[]> result1 = siemensNet.Read("DB100.0", (short) (statusList.size() * 4));
|
if (result1.IsSuccess) {
|
for (int i = 0; i < statusList.size(); i++) {
|
ZyStationStatusEntity statusEntity = statusList.get(i);
|
statusEntity.setTaskNo((int) siemensNet.getByteTransform().TransInt16(result1.Content, i * 4)); // 工作号
|
statusEntity.setTargetStaNo((int) siemensNet.getByteTransform().TransInt16(result1.Content, i * 4 + 2)); // 目标站
|
}
|
}
|
|
// 条码扫描器
|
OperateResultExOne<byte[]> result2 = siemensNet.Read("DB101.100", (short) (statusList.size() * 10));
|
if (result2.IsSuccess) {
|
for (int i = 0; i < barcodeStatusList.size(); i++) {
|
ZyStationStatusEntity barcodeEntity = barcodeStatusList.get(i);
|
ZyStationStatusEntity statusEntity = findStatusEntity(barcodeEntity.getStationId());
|
if (statusEntity == null) {
|
continue;
|
}
|
String barcode = siemensNet.getByteTransform().TransString(result2.Content, i * 10 + 2, 8, "UTF-8");
|
barcode = barcode.trim();
|
barcodeEntity.setBarcode(barcode);
|
}
|
}
|
|
return statusList;
|
}
|
|
@Override
|
public CommandResponse sendCommand(StationCommand command) {
|
CommandResponse commandResponse = new CommandResponse(false);
|
if (null == command) {
|
commandResponse.setMessage("命令为空");
|
return commandResponse;
|
}
|
|
int index = findIndex(command.getStationId());
|
if (index < 0) {
|
commandResponse.setMessage("站点不存在");
|
return commandResponse;
|
}
|
|
OperateResult write = null;
|
// 任务下发次数
|
int writeCount = 0;
|
do {
|
short[] data = new short[2];
|
data[0] = command.getTaskNo().shortValue();
|
data[1] = command.getTargetStaNo().shortValue();
|
|
write = siemensNet.Write("DB100." + index * 4, data);
|
if (write.IsSuccess) {
|
log.error("写入输送线命令成功。站点编号={},站点数据={},写入次数={}", command.getStationId(), JSON.toJSON(command),
|
writeCount);
|
commandResponse.setResult(true);
|
break;
|
} else {
|
writeCount++;
|
log.error("写入输送线命令失败。站点编号={},站点数据={},写入次数={}", command.getStationId(), JSON.toJSON(command),
|
writeCount);
|
commandResponse.setResult(false);
|
}
|
} while (writeCount < 5);
|
|
if (write == null) {
|
commandResponse.setMessage("写入命令失败");
|
return commandResponse;
|
}
|
|
if (!write.IsSuccess) {
|
ZyStationStatusEntity staProtocol = findStatusEntity(command.getStationId());
|
OutputQueue.DEVP.offer(MessageFormat.format("写入输送线站点数据失败。站点编号={1},站点数据={2}", command.getStationId(),
|
JSON.toJSON(staProtocol)));
|
News.error("写入输送线站点数据失败。站点编号={},站点数据={}", command.getStationId(), JSON.toJSON(staProtocol));
|
} else {
|
OutputQueue.DEVP.offer(MessageFormat.format("【{0}】 输送线命令下发 [id:{1}] >>>>> {2}",
|
DateUtils.convert(new Date()), command.getStationId(), JSON.toJSON(command)));
|
News.info("输送线命令下发 [id:{}] >>>>> 命令下发: {}", command.getStationId(),
|
JSON.toJSON(command));
|
}
|
return commandResponse;
|
}
|
|
private ZyStationStatusEntity findStatusEntity(Integer stationId) {
|
for (ZyStationStatusEntity statusEntity : statusList) {
|
if (statusEntity.getStationId().equals(stationId)) {
|
return statusEntity;
|
}
|
}
|
return null;
|
}
|
|
private int findIndex(Integer stationId) {
|
for (int i = 0; i < statusList.size(); i++) {
|
ZyStationStatusEntity statusEntity = statusList.get(i);
|
if (statusEntity.getStationId().equals(stationId)) {
|
return i;
|
}
|
}
|
return -1;
|
}
|
}
|