#1
dubin
3 天以前 bfbb0cbe87bbacbaf3fdfb5fb3caa935ec91da1f
src/main/java/com/zy/core/network/real/ZyStationRealConnect.java
@@ -2,7 +2,9 @@
import HslCommunication.Core.Types.OperateResult;
import HslCommunication.Core.Types.OperateResultExOne;
import HslCommunication.Profinet.Siemens.SiemensPLCS;
import HslCommunication.Profinet.Siemens.SiemensS7Net;
import com.zy.common.utils.RedisUtil;
import lombok.extern.slf4j.Slf4j;
import com.alibaba.fastjson.JSON;
@@ -20,6 +22,7 @@
import com.zy.core.network.api.ZyStationConnectApi;
import com.zy.core.network.entity.ZyStationStatusEntity;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.text.MessageFormat;
@@ -33,17 +36,20 @@
    private List<ZyStationStatusEntity> statusList;
    private List<ZyStationStatusEntity> barcodeStatusList;
    private final SiemensS7Net siemensNet;
    private final DeviceConfig deviceConfig;
    private List<ZyStationStatusEntity> scaleStatusList;
    private SiemensS7Net siemensNet;
    private DeviceConfig deviceConfig;
    private RedisUtil redisUtil;
    public ZyStationRealConnect(SiemensS7Net siemensNet, DeviceConfig deviceConfig) {
        this.siemensNet = siemensNet;
    public ZyStationRealConnect(DeviceConfig deviceConfig, RedisUtil redisUtil) {
        this.deviceConfig = deviceConfig;
        this.redisUtil = redisUtil;
    }
    @Override
    public boolean connect() {
        boolean connected = false;
        siemensNet = new SiemensS7Net(SiemensPLCS.S1200, deviceConfig.getIp());
        OperateResult connect = siemensNet.ConnectServer();
        if (connect.IsSuccess) {
            connected = true;
@@ -69,7 +75,7 @@
    }
    @Override
    public List<ZyStationStatusEntity> getStatus() {
    public List<ZyStationStatusEntity> getStatus(Integer deviceNo) {
        if (statusList == null) {
            BasDevpService basDevpService = SpringUtils.getBean(BasDevpService.class);
            if (basDevpService == null) {
@@ -83,34 +89,31 @@
            }
            statusList = JSONObject.parseArray(basDevp.getStationList(), ZyStationStatusEntity.class);
            if (statusList != null) {
                statusList.sort(Comparator.comparing(ZyStationStatusEntity::getStationId));
            }
            barcodeStatusList = JSONObject.parseArray(basDevp.getBarcodeStationList(), ZyStationStatusEntity.class);
        }
        OperateResultExOne<byte[]> result = siemensNet.Read("DB101.0", (short) (statusList.size() * 2));
        OperateResultExOne<byte[]> result = siemensNet.Read("DB100.0", (short) (statusList.size() * 8));
        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);
                boolean[] status = siemensNet.getByteTransform().TransBool(result.Content, i * 8 + 6, 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)); // 目标站
                statusEntity.setTaskNo(siemensNet.getByteTransform().TransInt32(result.Content, i * 8)); // 工作号
                statusEntity.setTargetStaNo((int) siemensNet.getByteTransform().TransInt16(result.Content, i * 8 + 4)); // 目标站
            }
        }
        // 条码扫描器
        OperateResultExOne<byte[]> result2 = siemensNet.Read("DB101.100", (short) (statusList.size() * 10));
        OperateResultExOne<byte[]> result2 = siemensNet.Read("DB101.0", (short) (barcodeStatusList.size() * 16));
        if (result2.IsSuccess) {
            for (int i = 0; i < barcodeStatusList.size(); i++) {
                ZyStationStatusEntity barcodeEntity = barcodeStatusList.get(i);
@@ -118,9 +121,9 @@
                if (statusEntity == null) {
                    continue;
                }
                String barcode = siemensNet.getByteTransform().TransString(result2.Content, i * 10 + 2, 8, "UTF-8");
                String barcode = siemensNet.getByteTransform().TransString(result2.Content, i * 16, 4, "UTF-8");
                barcode = barcode.trim();
                barcodeEntity.setBarcode(barcode);
                statusEntity.setBarcode(barcode);
            }
        }
@@ -128,7 +131,7 @@
    }
    @Override
    public CommandResponse sendCommand(StationCommand command) {
    public CommandResponse sendCommand(Integer deviceNo, StationCommand command) {
        CommandResponse commandResponse = new CommandResponse(false);
        if (null == command) {
            commandResponse.setMessage("命令为空");
@@ -141,16 +144,14 @@
            return commandResponse;
        }
        OperateResult write = null;
        OperateResult writeTaskNo = null;
        OperateResult writeTargetStaNo = 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) {
            writeTaskNo = siemensNet.Write("DB100." + index * 4, command.getTaskNo());
            writeTargetStaNo = siemensNet.Write("DB100." + index * 4 + 4, command.getTargetStaNo().shortValue());
            if (writeTaskNo.IsSuccess && writeTargetStaNo.IsSuccess) {
                log.error("写入输送线命令成功。站点编号={},站点数据={},写入次数={}", command.getStationId(), JSON.toJSON(command),
                        writeCount);
                commandResponse.setResult(true);
@@ -163,12 +164,7 @@
            }
        } while (writeCount < 5);
        if (write == null) {
            commandResponse.setMessage("写入命令失败");
            return commandResponse;
        }
        if (!write.IsSuccess) {
        if (!writeTaskNo.IsSuccess || !writeTargetStaNo.IsSuccess) {
            ZyStationStatusEntity staProtocol = findStatusEntity(command.getStationId());
            OutputQueue.DEVP.offer(MessageFormat.format("写入输送线站点数据失败。站点编号={1},站点数据={2}", command.getStationId(),
                    JSON.toJSON(staProtocol)));
@@ -180,6 +176,34 @@
                    JSON.toJSON(command));
        }
        return commandResponse;
    }
    @Override
    public CommandResponse sendOriginCommand(String address, short[] data) {
        CommandResponse commandResponse = new CommandResponse(false);
        if (null == data || data.length == 0) {
            commandResponse.setMessage("数据为空");
            return commandResponse;
        }
        OperateResult write = siemensNet.Write(address, data);
        if (write.IsSuccess) {
            log.info("写入原始命令成功。地址={},数据={}", address, JSON.toJSON(data));
            commandResponse.setResult(true);
        } else {
            log.error("写入原始命令失败。地址={},数据={}", address, JSON.toJSON(data));
            commandResponse.setResult(false);
        }
        return commandResponse;
    }
    @Override
    public byte[] readOriginCommand(String address, int length) {
        OperateResultExOne<byte[]> result = siemensNet.Read(address, (short) length);
        if (result.IsSuccess) {
            return result.Content;
        }
        return new byte[0];
    }
    private ZyStationStatusEntity findStatusEntity(Integer stationId) {
@@ -200,4 +224,4 @@
        }
        return -1;
    }
}
}