wangfei
8 小时以前 2b91b242113bd10f1be241d19ab154e9ad6506cd
hangzhoumesParent/common/servicebase/src/main/java/com/mes/device/PlcParameterObject.java
@@ -1,11 +1,12 @@
package com.mes.device;
import com.github.xingshuangs.iot.utils.IntegerUtil;
import com.github.xingshuangs.iot.utils.ShortUtil;
import java.lang.reflect.Array;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
public class PlcParameterObject {
@@ -13,7 +14,8 @@
    private String plcAddressBegin;
    // 数据地址长度:第一参数到最后一个参数的长度
    private int plcAddressLength;
    private ArrayList<PlcParameterInfo> plcParameterList;
    //private ArrayList<PlcParameterInfo> plcParameterList;
    private LinkedHashMap<String,PlcParameterInfo> plcParameterMap;
    /**
@@ -47,8 +49,8 @@
    /**
     * @return 获取参数实例集合
     */
    public ArrayList<PlcParameterInfo> getPlcParameterList() {
        return plcParameterList;
    public LinkedHashMap<String,PlcParameterInfo> getPlcParameterMap() {
        return plcParameterMap;
    }
    /**
@@ -58,14 +60,19 @@
     * @return 获取某个参数实例
     */
    public PlcParameterInfo getPlcParameter(String codeid) {
        if (plcParameterList != null) {
        if (plcParameterMap != null) {
                    return plcParameterMap.get(codeid);
        } else {
            return null;
        }
        /*if (plcParameterList != null) {
            for (PlcParameterInfo plcParameterInfo : plcParameterList) {
                if (plcParameterInfo.getCodeId().equals(codeid))
                    return plcParameterInfo;
            }
            return null;
        } else
            return null;
            return null;*/
    }
@@ -77,15 +84,15 @@
     */
    public List<String> getPlcParameterValues(List<String> codeids) {
        List<String> arrayList = new ArrayList<>();
        if (plcParameterList != null) {
            Map<String, PlcParameterInfo> resultMap = new LinkedHashMap<>(); // 使用 LinkedHashMap 保留插入顺序
        if (plcParameterMap != null) {
            /*Map<String, PlcParameterInfo> resultMap = new LinkedHashMap<>(); // 使用 LinkedHashMap 保留插入顺序
            for (PlcParameterInfo plcParameterInfo : plcParameterList) {
                if (codeids.contains(plcParameterInfo.getCodeId())) {
                    resultMap.put(plcParameterInfo.getCodeId(), plcParameterInfo);
                }
            }
            }*/
            for (String codeId : codeids) { // 按照传入参数的顺序遍历
                PlcParameterInfo plcParameterInfo = resultMap.get(codeId);
                PlcParameterInfo plcParameterInfo = plcParameterMap.get(codeId);
                if (plcParameterInfo != null) {
                    arrayList.add(plcParameterInfo.getValue());
                } else {
@@ -96,19 +103,22 @@
        return arrayList;
    }
    /**
     * 根据参数标识 获取传入参数的plc地址
     *
     * @param codeIdList 参数标识
     * @return 传入参数的plc地址
     */
    public List<String> getAddressListByCodeId(List<String> codeIdList) {
        List<String> addressList = new ArrayList<>();
        for (String codeId : codeIdList) {
            for (PlcParameterInfo plcParameterInfo : plcParameterList) {
                if (plcParameterInfo.getCodeId().equals(codeId)) {
                    int index = plcParameterInfo.getAddressIndex();
                    String address = plcParameterInfo.getAddress(index);
        if (plcParameterMap!=null)
        {
            for (String codeId : codeIdList) {
                    String address = plcParameterMap.get(codeId).getAddress();
                    if (address != null) {
                        addressList.add(address);
                    }
                }
            }
        }
        }
        return addressList;
    }
@@ -120,12 +130,19 @@
     * @param param 参数实例
     */
    public void addPlcParameter(PlcParameterInfo param) {
        if (plcParameterList != null)
        if (plcParameterMap != null) {
            plcParameterMap.put(param.getCodeId(), param);
        }
        else {
            plcParameterMap =new  LinkedHashMap<String,PlcParameterInfo>();
            plcParameterMap.put(param.getCodeId(), param);
        }
        /*if (plcParameterList != null)
            plcParameterList.add(param);
        else {
            plcParameterList = new ArrayList<PlcParameterInfo>();
            plcParameterList.add(param);
        }
        }*/
    }
    /**
@@ -134,7 +151,27 @@
     * @param plcValueArray PLC读取回来的byte类型数据集合
     */
    public void setPlcParameterList(byte[] plcValueArray) {
        if (plcParameterList != null) {
        if (plcParameterMap != null) {
            Collection<PlcParameterInfo> values=  plcParameterMap.values();
            for (PlcParameterInfo plcParameterInfo :values) {
                byte[] valueList = new byte[plcParameterInfo.getAddressLength()];
//                System.out.println(plcParameterInfo.getAddressLength());
                for (int i = 0; i < plcParameterInfo.getAddressLength(); i++) {
                    Array.setByte(valueList, i, plcValueArray[plcParameterInfo.getAddressIndex() + i]);
                }
                if (plcParameterInfo.getAddressLength() == 2) {
                    plcParameterInfo.setValue(String.valueOf(ShortUtil.toUInt16(valueList)));
                } else if (plcParameterInfo.getAddressLength() == 4) {
                    plcParameterInfo.setValue(String.valueOf(IntegerUtil.toUInt32(valueList)));
                }
                else if (plcParameterInfo.getAddressLength() >10) {
                    plcParameterInfo.setValue((byteToHexString(valueList)));
                } else {
                    plcParameterInfo.setValue((byteToHexString(valueList)));
                }
            }
        }
/*        if (plcParameterList != null) {
            for (PlcParameterInfo plcParameterInfo : plcParameterList) {
@@ -146,15 +183,38 @@
                    Array.setByte(valueList, i, plcValueArray[plcParameterInfo.getAddressIndex() + i]);
                }
                if (plcParameterInfo.getAddressLength() == 2) {
                    plcParameterInfo.setValue(String.valueOf(byte2short(valueList)));
                } else if (plcParameterInfo.getAddressLength() == 14) {
                } else if (plcParameterInfo.getAddressLength() == 4) {
                    plcParameterInfo.setValue(String.valueOf(byte2int(valueList)));
                }
                else if (plcParameterInfo.getAddressLength() >10) {
                    plcParameterInfo.setValue((byteToHexString(valueList)));
                } else {
                    String valuestr = new String(valueList);
                    plcParameterInfo.setValue(valuestr);
                }
            }
        }*/
    }
    /**
     * 把写入值转化为byte[]
     * @param param 参数实例
     * @param data 写入值的字符类型
     */
    public byte[] setValueToBytes(PlcParameterInfo param, String data) {
        if (param.getAddressLength() == 2) {
            return ShortUtil.toByteArray(Integer.parseInt(data));
        } else if (param.getAddressLength() == 4) {
            return IntegerUtil.toByteArray(Long.parseLong(data));
        }
        else if (param.getAddressLength() >10) {
           return data.getBytes();
        } else {
            return data.getBytes();
        }
    }
@@ -166,7 +226,7 @@
    public static byte[] short2byte(short s) {
        byte[] b = new byte[2];
        for (int i = 0; i < 2; i++) {
            int offset = 16 - (i + 1) * 8; //因为byte占4个字节,所以要计算偏移量
            int offset = 16 - (i + 1) * 8; //计算偏移量
            b[i] = (byte) ((s >> offset) & 0xff); //把16位分为2个8位进行分别存储
        }
        return b;
@@ -186,11 +246,29 @@
        return l;
    }
    /**
     * byte[]类型转short
     *
     * @param b byte[]类型值
     */
    public static int byte2int(byte[] b) {
        int l = 0;
        for (int i = 0; i < 4; i++) {
            l <<= 8; //<<=和我们的 +=是一样的,意思就是 l = l << 8
            l |= (b[3-i] & 0xff); //和上面也是一样的  l = l | (b[i]&0xff)
        }
        return l;
    }
    public static byte[] int2byte(int s){
        byte[] b = new byte[2];
        for(int i = 0; i < 4; i++){
            int offset = 16 - (i+1)*8; //因为byte占4个字节,所以要计算偏移量
            b[i] = (byte)((s >> offset)&0xff); //把32位分为4个8位进行分别存储
        }
        return b;
    }
    public static String byteToHexString(byte[] bytes) {
        String str = new String(bytes, StandardCharsets.UTF_8);
        String str = new String(bytes, StandardCharsets.UTF_8).trim();
        return str;
    }
}