package com.example.springboot.component; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import org.apache.commons.io.FileUtils; import org.apache.tomcat.jni.Lock; import org.springframework.beans.factory.annotation.Autowired; import java.io.*; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.locks.ReentrantLock; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; import com.example.springboot.entity.device.PlcParameterObject; import com.example.springboot.entity.device.PlcParameterInfo; public class PlcParameter1Review extends Thread { @Autowired private ResourceLoader resourceLoader; private volatile static PlcParameter1Review instance = null; public PlcParameter1Review() { init(); } // 单例模式 线程安全 public static PlcParameter1Review getInstance() { if (instance == null) { synchronized (PlcParameter1Review.class) { if (instance == null) { instance = new PlcParameter1Review(); } } } return instance; } PlcParameterObject plcParameterObject = new PlcParameterObject();//该DB区数据实例 private void init() { try { String jsonfilename = PlcParameter1Review.class.getResource("/JsonFile/PlcParameter.json").getFile(); FileReader fileReader = new FileReader(jsonfilename); BufferedReader bufferedReader = new BufferedReader(fileReader); StringBuilder content = new StringBuilder(); String line; while ((line = bufferedReader.readLine()) != null) { content.append(line); } bufferedReader.close(); fileReader.close(); JSONObject jsonfileobj = new JSONObject(content.toString()); JSONArray jsonArray = jsonfileobj.getJSONArray("parameteInfor"); plcParameterObject.setPlcAddressBegin(jsonfileobj.getStr("plcAddressBegin"));//设置起始位地址 plcParameterObject.setPlcAddressLength(Integer.valueOf(jsonfileobj.getStr("plcAddressLenght")));//设置地址长度 for (int i = 0; i < jsonArray.size(); i++) { JSONObject parameterObj = jsonArray.getJSONObject(i); PlcParameterInfo plcParameterInfo = new PlcParameterInfo(jsonfileobj.getStr("plcAddressBegin")); //参数实例 String codeid = parameterObj.getStr("codeId"); plcParameterInfo.setCodeId(codeid); plcParameterInfo.setAddressIndex(Integer.valueOf(parameterObj.getStr("addressIndex"))); plcParameterInfo.setRatio(Integer.valueOf(parameterObj.getStr("ratio"))); plcParameterInfo.setAddressLength(Integer.valueOf(parameterObj.getStr("addressLenght"))); plcParameterInfo.setUnit(parameterObj.getStr("unit")); plcParameterObject.addPlcParameter(plcParameterInfo); } System.out.println(""); } catch (IOException e) { e.printStackTrace(); } } @Override public void run() { while (this != null) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } byte[] getplcvlues = S7control.getinstance().ReadByte(plcParameterObject.getPlcAddressBegin(), plcParameterObject.getPlcAddressLength()); plcParameterObject.setPlcParameterList(getplcvlues); // int index = plcParameterObject.getPlcParameter("conveyorVelocity(AutoFAST)").getAddressIndex(); // S7control.getinstance().WriteWord(plcParameterObject.getPlcParameter("conveyorVelocity(AutoFAST)").getAddress(index), (short) 100); List addresses = new ArrayList<>(); addresses.add("conveyorVelocity(AutoFAST)"); addresses.add("conveyorVelocity(AutoSLOW)"); addresses.add("conveyorVelocity(Manual)"); addresses.add("A01A02TURNJOGVelocity"); addresses.add("A01A02TRAVELJOGVelocity"); System.out.println(plcParameterObject.getPlcParameterValues(addresses)); JSONObject jsonObject = new JSONObject(); jsonObject.append("params", plcParameterObject.getPlcParameterValues(addresses)); jsonObject.append("fanzhuan", plcParameterObject.getPlcParameter("conveyorVelocity(AutoFAST)").getValue()); jsonObject.append("xiaoche", plcParameterObject.getPlcParameter("").getValue()); ArrayList sendwServer = WebSocketServer.sessionMap.get("Parameter1"); if (sendwServer != null) { for (WebSocketServer webserver : sendwServer) { webserver.sendMessage(jsonObject.toString()); if (webserver != null) { List messages = webserver.getMessages(); List waddresses1 = new ArrayList<>(); waddresses1.add("DB100.0"); waddresses1.add("DB100.2"); waddresses1.add("DB100.4"); waddresses1.add("DB100.6"); waddresses1.add("DB100.26"); waddresses1.add("DB100.28"); waddresses1.add("DB100.30"); waddresses1.add("DB100.32"); waddresses1.add("DB100.34"); waddresses1.add("DB100.36"); waddresses1.add("DB100.38"); waddresses1.add("DB100.40"); String addressList2 = "DB100.8"; String addressList3 = "DB100.12"; if (!messages.isEmpty()) { // 将最后一个消息转换为 short 类型的列表 String lastMessage = messages.get(messages.size() - 1); // System.out.println("lastMessage:" + lastMessage); JSONArray messageArray = new JSONArray(lastMessage); // 整合第 1 到 3 个数组并去掉 null 元素 List mergedList = new ArrayList<>(); for (int i = 0; i < 3; i++) { JSONArray sublist = messageArray.getJSONArray(i); for (int j = 0; j < sublist.size(); j++) { Object value = sublist.get(j); if (value != null && !value.toString().equals("null")) { try { String cleanedValue = value.toString().replaceAll("[^0-9-]", ""); short sValue = Short.parseShort(cleanedValue.trim()); mergedList.add(sValue); } catch (NumberFormatException e) { // 如果无法解析为 short 类型,则忽略该部分 System.err.println("Could not parse value: " + value); } } } } // 写入第一个地址 if (messageArray.getJSONArray(3).size() > 0) { Object value = messageArray.getJSONArray(3).get(0); if (value != null && !value.toString().equals("null")) { try { String cleanedValue = value.toString().replaceAll("[^0-9-]", ""); short sValue = Short.parseShort(cleanedValue.trim()); S7control.getinstance().WriteWord(addressList2, Arrays.asList(sValue)); System.out .println("messageValue:" + Arrays.asList(sValue) + " written to PLC at address " + addressList2); } catch (NumberFormatException e) { // 如果无法解析为 short 类型,则忽略该部分 System.err.println("Could not parse value: " + value); } } } // 写入第二个地址 if (messageArray.getJSONArray(4).size() > 0) { Object value = messageArray.getJSONArray(4).get(0); if (value != null && !value.toString().equals("null")) { try { String cleanedValue = value.toString().replaceAll("[^0-9-]", ""); short sValue = Short.parseShort(cleanedValue.trim()); S7control.getinstance().WriteWord(addressList3, Arrays.asList(sValue)); System.out .println("messageValue:" + Arrays.asList(sValue) + " written to PLC at address " + addressList3); } catch (NumberFormatException e) { // 如果无法解析为 short 类型,则忽略该部分 System.err.println("Could not parse value: " + value); } } } // 写入第三个地址 if (!mergedList.isEmpty()) { S7control.getinstance().WriteWord(waddresses1, mergedList); System.out.println("messageValue:" + mergedList + " written to PLC at address " + waddresses1); } // 清空消息列表 webserver.clearMessages(); } } } } } } }