package com.example.springboot.component; 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; public class S7control { S7PLC s7PLC; // PLC通讯类实例 private EPlcType plcType = EPlcType.S1200; // 西门子PLC类型 private String ip = "127.0.0.1"; // plc ip地址 private int port = 21; // plc 端口号 private static volatile S7control instance = null; private S7control() { if (s7PLC == null) s7PLC = new S7PLC(plcType, ip, port); } // 单例模式 获取类的唯一实例 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(); } /** * 按指定的地址 写入一个word * * @param address 地址 * @param data word的值 */ public void WriteWord(String address, short data) { if (!s7PLC.checkConnected()) return; s7PLC.writeInt16(address, data); } /** * 从某地址连续 写入多个word * * @param address 地址 * @param datas word的值 */ public void WriteWord(String address, List datas) { if (!s7PLC.checkConnected()) 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的值 */ public void WriteWord(List address, List datas) { if (!s7PLC.checkConnected()) return; // s7PLC.write(address, data); MultiAddressWrite addressWrite = new MultiAddressWrite(); for (int i = 0; i < address.size(); i++) { addressWrite.addInt16(address.get(i), datas.get(i)); } s7PLC.writeMultiData(addressWrite); } /** * 按指定的地址 写入一个Bit * * @param address 地址 * @param data Bit的值 */ public void WriteBit(String address, Boolean data) { if (!s7PLC.checkConnected()) return; s7PLC.writeBoolean(address, data); } /** * 按指定的地址 写入多个bit * * @param address 地址 * @param datas bit的值 */ public void WriteBit(List address, List datas) { if (!s7PLC.checkConnected()) 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.checkConnected()) 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); } /** * 按指定的地址 读取word结果集 * * @param address 地址 * @return 结果 */ public List ReadWord(List address) { if (!s7PLC.checkConnected()) return null; return s7PLC.readInt16(address); } /** * 按指定的地址 读取word结果集 * * @param address 地址 * @param count 连续读多少个word * @return 结果 */ public List ReadWord(String address, int count) { if (!s7PLC.checkConnected()) return null; List addresslist = GetAddressList(address, count, 16); return s7PLC.readInt16(addresslist); } /** * 按指定的地址 按bit位 0 flase 1 true 读取结果 * * @param addresslist 地址集 * @return Boolean结果 */ public List ReadBits(List addresslist) { if (!s7PLC.checkConnected()) return null; return s7PLC.readBoolean(addresslist); } /** * 从指定的地址开始 连续按bit位读取 * * @param address 地址 * @param count 长度 * @return Boolean结果 */ public List ReadBits(String address, int count) { if (!s7PLC.checkConnected()) return null; List addresslist = GetAddressList(address, count, 1); return s7PLC.readBoolean(addresslist); } private List GetAddressList(String address, int count, int addedbit) { List addresslist = new ArrayList<>(); String[] stringdatas = address.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) { bitindex = Integer.parseInt(stringdatas[2]); } else return null; for (int i = 0; i < count; i++) { int bitcurrent = bitindex + addedbit; if (bitcurrent > 7) { dbwindex += bitcurrent / 8; bitindex = 0; } else bitindex = bitcurrent; addresslist.add(stringdatas[0] + "." + dbwindex + "." + bitindex); } return addresslist; } }