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 statusList; private List 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 getStatus() { if (statusList == null) { BasDevpService basDevpService = SpringUtils.getBean(BasDevpService.class); if (basDevpService == null) { return Collections.emptyList(); } BasDevp basDevp = basDevpService .selectOne(new EntityWrapper().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 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 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 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; } }