package com.example.springboot.component; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.charset.StandardCharsets; import java.sql.Time; import java.util.ArrayList; import java.util.List; import com.github.xingshuangs.iot.protocol.s7.enums.EPlcType; import com.github.xingshuangs.iot.protocol.s7.service.MultiAddressWrite; import com.github.xingshuangs.iot.protocol.s7.service.S7PLC; import com.github.xingshuangs.iot.utils.FloatUtil; import com.google.common.primitives.Bytes; import org.apache.ibatis.jdbc.Null; public class S7control { S7PLC s7PLC; // PLC通讯类实例 private EPlcType plcType = EPlcType.S1500; // 西门子PLC类型 private String ip = "192.168.10.1"; // plc ip地址 private int port = 102; // plc 端口号 private static volatile S7control instance = null; private S7control() { if (s7PLC == null) s7PLC = new S7PLC(plcType, ip, port,0,0); } // 单例模式 获取类的唯一实例 public static S7control getinstance() { if (instance == null) { synchronized (S7control.class) { if (instance == null) instance = new S7control(); } } return instance; } /** * 关闭西门子s7通讯连接 */ public void CloseS7client() { if (s7PLC == null) s7PLC.close(); s7PLC.checkConnected(); } /** * s7通讯连接状态 */ public boolean CheckConnected() { return s7PLC.checkConnected(); } /** * 按指定的地址 写入一个word * * @param address 地址 * @param data word的值 */ public void WriteWord(String address, short data) { if (s7PLC==null) { return; } s7PLC.writeInt16(address, data); } /** * 从某地址连续 写入多个word * * @param address 地址 * @param datas word的值 */ public void WriteWord(String address, List datas) { if (s7PLC==null) return; // s7PLC.write(address, data); List addresslist = GetAddressList(address, datas.size(), 16); MultiAddressWrite addressWrite = new MultiAddressWrite(); for (int i = 0; i < datas.size(); i++) { addressWrite.addInt16(addresslist.get(i), datas.get(i)); } s7PLC.writeMultiData(addressWrite); } /** * 按指定的地址 写入多个word * * @param address 地址 * @param datas word的值 */ /** * 按指定的地址 写入一个Bit * * @param address 地址 * @param data Bit的值 */ public void WriteBit(String address, Boolean data) { if (s7PLC==null) return; s7PLC.writeBoolean(address, data); } /** * 按指定的地址 写入多个bit * * @param address 地址 * @param datas bit的值 */ public void WriteBit(List address, List datas) { if (s7PLC==null) return; // s7PLC.write(address, data); MultiAddressWrite addressWrite = new MultiAddressWrite(); for (int i = 0; i < address.size(); i++) { addressWrite.addBoolean(address.get(i), datas.get(i)); } s7PLC.writeMultiData(addressWrite); } /** * 从某地址连续 写入多个bit * * @param address 地址 * @param datas word的值 */ public void WriteBit(String address, List datas) { if (s7PLC==null) return; // s7PLC.write(address, data); List addresslist = GetAddressList(address, datas.size(), 1); MultiAddressWrite addressWrite = new MultiAddressWrite(); for (int i = 0; i < datas.size(); i++) { addressWrite.addBoolean(addresslist.get(i), datas.get(i)); } s7PLC.writeMultiData(addressWrite); } /** * 按指定的地址 写入多个byte * * @param address 地址 * @param datas byte的值 */ public void WriteByte(String address, byte[] datas) { if (s7PLC==null) return; // s7PLC.write(address, data); s7PLC.writeByte(address, datas); } /** * 按指定的地址 读取word结果集 * * @param address 地址 * @return 结果 */ public List ReadWord(List address) { if (s7PLC == null) return null; try { return s7PLC.readInt16(address); } catch (Exception e) { System.out.println("读取 " + address + " 失败:" + e.getMessage()); return null; } } private int getIndexFromAddress(String address) { // 可以解析出地址中的数字部分,并转换为整数 return 0; } private String getAddressFromIndex(int index) { // 整数转换为地址格式的字符串 return ""; } /** * 按指定的地址 读取word结果集 * * @param address 地址 * @param count 连续读多少个word * @return 结果 */ public List ReadWord(String address, int count) { if (s7PLC == null) return null; List addresslist = GetAddressList(address, count, 16); try { return s7PLC.readInt16(addresslist); } catch (Exception e) { System.out.println("读取 " + address + " 失败:" + e.getMessage()); return null; } } public byte[] Readbyte(String address, int count) { byte[] byt=new byte[count]; int wordcount=((count%2==0)?count/2:count+1); List word=ReadWord(address,wordcount); return byt; } /** * 按指定的地址 读取byte结果集 * * @param address 地址 * @param count 连续读多少个byte * @return 结果 */ public byte[] ReadByte(String address, int count) { if (s7PLC==null) return null; // List addresslist = GetAddressList(address, count, 16); try { return s7PLC.readByte(address, count); }catch (Exception e) { // 处理异常 System.out.println("读取 " + address + " 失败:" + e.getMessage()); return null; } } /** * 按指定的地址 按bit位 0 flase 1 true 读取结果 * * @param addresslist 地址集 * @return Boolean结果 */ public List ReadBits(List addresslist) { if (s7PLC==null) return null; return s7PLC.readBoolean(addresslist); } //读取不连续地址bit public List readBits(List addressList) { if (s7PLC == null || addressList.isEmpty()) { return null; } List values = new ArrayList<>(); for (String address : addressList) { try { boolean value = s7PLC.readBoolean(address); values.add(value); } catch (Exception e) { // 处理异常 System.out.println("读取 " + address + " 失败:" + e.getMessage()); } } return values; } //读取String public List readStrings(List addressList) { if (s7PLC == null) { return null; } List result = new ArrayList<>(); for (String address : addressList) { try { byte[] bytes = s7PLC.readByte(address, 14); if (bytes != null) { String str = new String(bytes, StandardCharsets.UTF_8); result.add(str); } } catch (Exception e) { System.out.println("读取 " + address + " 失败:" + e.getMessage()); result.add(null); } } return result; } public List readStringsandword(List addressList) { if (s7PLC == null) { return null; } List result = new ArrayList<>(); for (String address : addressList) { try { if (address.contains("-")) { address = address.substring(0, address.indexOf("-")); byte[] bytes = s7PLC.readByte(address, 14); if (bytes != null) { String str = new String(bytes, StandardCharsets.UTF_8); result.add(str); } } else { Short value = s7PLC.readInt16(address); result.add(value.toString()); } } catch (Exception e) { System.out.println("读取 " + address + " 失败:" + e.getMessage()); result.add(null); } } return result; } //不连续地址写入Word public void WriteWord(List address, List datas) { if (s7PLC == null) return; for (int i = 0; i < address.size(); i++) { String addr = address.get(i); short data = datas.get(i); if (addr.contains("-")) { outmesid(String.valueOf(data),addr); // 单独处理带破折号的地址 } else { s7PLC.writeInt16(addr, data); // 将数据写入单个地址 } } } //字符串写入 public void outmesid(String data, String addr) { // System.out.println("outmesid: " + data); List glassidlist = new ArrayList<>(); String[] parts = addr.split("-"); if (parts.length == 2) { addr = parts[0]; // 只保留 "-" 前面的部分 } for (char iditem : data.toCharArray()) { glassidlist.add(Byte.valueOf(String.valueOf(iditem))); } byte[] bytes = Bytes.toArray(glassidlist); S7control.getinstance().WriteByte(addr, bytes); } //读取不连续word public List readWords(List addresses) { if (s7PLC == null) { return null; } List data = new ArrayList<>(); for (String address : addresses) { try { // 单个地址 Short value = s7PLC.readInt16(address); data.add(value); } catch (Exception e) { System.out.println("读取 " + address + " 失败:" + e.getMessage()); } } return data; } //读取时间 public Long readtime(String address) { if (s7PLC == null) return null; try { return s7PLC.readTime(address); } catch (Exception e) { System.out.println("读取 " + address + " 失败:" + e.getMessage()); return null; } } public void writetime(String address, long datas) { if (s7PLC == null) return; s7PLC.writeTime(address, datas); // 将数据写入单个地址 } private int extractAddressNumber(String address) { String numberStr = address.replaceAll("\\D+", ""); // 使用正则表达式提取数字部分 return Integer.parseInt(numberStr); } /** * 从指定的地址开始 连续按bit位读取 * * @param address 地址 * @param count 长度 * @return Boolean结果 */ public List ReadBits(String address, int count) { if (s7PLC == null) return null; List addresslist = GetAddressList(address, count, 1); try { return s7PLC.readBoolean(addresslist); } catch (Exception e) { System.out.println("读取 " + address + " 失败:" + e.getMessage()); return null; } }; private List GetAddressList(String address, int count, int addedbit) { List addresslist = new ArrayList(); String[] stringdatas = address.trim().split("\\."); if (stringdatas.length < 2 || !address.startsWith("DB")) return null; int dbwindex = 0; int bitindex = 0; if (stringdatas.length == 2) { dbwindex = Integer.parseInt(stringdatas[1]); } else if (stringdatas.length == 3) { dbwindex = Integer.parseInt(stringdatas[1]); bitindex = Integer.parseInt(stringdatas[2]); } else return null; addresslist.add(address); for (int i = 0; i < count-1; i++) { int bitcurrent = bitindex + addedbit; if (bitcurrent > 7) { dbwindex += bitcurrent / 8; bitindex = 0; } else bitindex = bitcurrent; String endstr=stringdatas.length==3?"." + bitindex:""; addresslist.add(stringdatas[0] + "." + dbwindex + endstr); } return addresslist; } public void writeString(String addr,String data) { s7PLC.writeString(addr,data); } public String readStrings(String addr) { return s7PLC.readString(addr); } public float readFloat32(String addr) { return s7PLC.readFloat32(addr); } public double readFloat64(String addr) { return s7PLC.readFloat64(addr); } // public float[] readfloat32(List addr) { // float[] result=new float[addr.size()]; // for (int i=0;i readFloat32(List addr) { List result=new ArrayList<>(); for (String string : addr) { if(string.equals("DB10.2000")||string.equals("DB10.2008")){ result.add((float)s7PLC.readFloat64(string)); }else if (string.equals("DB10.224")||string.equals("DB10.226")||string.equals("DB10.228")||string.equals("DB10.230")) { List word=ReadWord(string,1); for (Short short1 : word) { result.add((float)short1); } } else{ result.add(s7PLC.readFloat32(string)); } } return result; } public void writeFloat32(String addr, float data) { s7PLC.writeFloat32(addr,data); } public List readtimes(List addr) { List result=new ArrayList<>(); for (String string : addr) { result.add(s7PLC.readTime(string)); } return result; } }