wuyouming666
2023-12-06 c684729c17bb02ab968cdc2fceae74dacaa9593f
增加 急停后中止/继续选择
21个文件已修改
1个文件已添加
1159 ■■■■ 已修改文件
CanadaMes-ui/src/configuration/Action.json 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
CanadaMes-ui/src/configuration/ManualJog.json 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
CanadaMes-ui/src/configuration/ServoManualone.json 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
CanadaMes-ui/src/lang/locales/en-US.json 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
CanadaMes-ui/src/views/Electrical/Action.vue 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
CanadaMes-ui/src/views/Electrical/ManualJog.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
CanadaMes-ui/src/views/Electrical/ManualonePosition.vue 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
CanadaMes-ui/src/views/Electrical/ManualonePosition2.vue 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
CanadaMes-ui/src/views/Electrical/ServoManualone.vue 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
CanadaMes-ui/src/views/home/index.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
springboot-vue3/src/main/java/com/example/springboot/component/PlcHold.java 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
springboot-vue3/src/main/java/com/example/springboot/component/PlcManualonePosition.java 151 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
springboot-vue3/src/main/java/com/example/springboot/component/PlcManualonePosition2.java 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
springboot-vue3/src/main/java/com/example/springboot/component/PlcServoManualone.java 117 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
springboot-vue3/src/main/java/com/example/springboot/component/Plcalarm.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
springboot-vue3/src/main/java/com/example/springboot/component/Plchome.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
springboot-vue3/src/main/java/com/example/springboot/component/Plcstate.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
springboot-vue3/src/main/java/com/example/springboot/config/AppRunnerConfig.java 43 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
springboot-vue3/src/main/java/com/example/springboot/mapper/SpianMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
springboot-vue3/src/main/java/com/example/springboot/service/SpianService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
springboot-vue3/src/main/resources/Alarm.json 507 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
springboot-vue3/src/main/resources/config.properties 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
CanadaMes-ui/src/configuration/Action.json
@@ -155,42 +155,42 @@
      "page": "1"
    },
    {
      "name": "B01 YV TURN",
      "name": "B01 Solenoid TURN",
      "value": 1,
      "state": "1",
      "type": "1",
      "page": "1"
    },
    {
      "name": "B01 YV UP DOWN",
      "name": "B01 Solenoid UP DOWN",
      "value": 1,
      "state": "1",
      "type": "1",
      "page": "1"
    },
    {
      "name": "B02 YV TURN",
      "name": "B02 Solenoid TURN",
      "value": 1,
      "state": "1",
      "type": "1",
      "page": "1"
    },
    {
      "name": "B02 YV UP DOWN",
      "name": "B02 Solenoid UP DOWN",
      "value": 1,
      "state": "1",
      "type": "1",
      "page": "1"
    },
    {
      "name": "B01 YV Gassing",
      "name": "B01 Solenoid Gassing",
      "value": 1,
      "state": "1",
      "type": "1",
      "page": "1"
    },
    {
      "name": "B02 YV Gassing",
      "name": "B02 Solenoid Gassing",
      "value": 1,
      "state": "1",
      "type": "1",
CanadaMes-ui/src/configuration/ManualJog.json
@@ -12,7 +12,7 @@
    {
      "button": {
        "name": "D02输送",
        "value": 1,
        "value": 0,
        "address": "DB10.0",
        "state": 0
      },
@@ -21,7 +21,7 @@
    {
      "button": {
        "name": "D03输送",
        "value": 1,
        "value": 0,
        "address": "DB10.0",
        "state": 1
      },
CanadaMes-ui/src/configuration/ServoManualone.json
@@ -79,6 +79,7 @@
        "button": {
          "name": "A01半自动",
          "value":0,
          "type":66,
          "address":"DB10.0"
        }
      },
@@ -86,6 +87,7 @@
        "button": {
          "name": "A01半自动启动",
          "value":0,
          "type":66,
          "address":"DB10.0"
        }
      }
@@ -150,6 +152,7 @@
            "button": {
              "name": "A02半自动",
              "value":0,
              "type":66,
              "address":"DB10.0"
            }
          },
@@ -157,6 +160,7 @@
            "button": {
              "name": "A02半自动启动",
              "value":0,
              "type":66,
              "address":"DB10.0"
            }
          }
@@ -342,6 +346,17 @@
          }
          
    ]
    , [
      {
          "button": {
            "name": "急停后中止/继续选择",
            "value":0,
            "address":"DB10.0",
            "type":"66"
          }
        }
  ]
     
    
  ]
CanadaMes-ui/src/lang/locales/en-US.json
@@ -343,7 +343,8 @@
      "A02半自动": "A02 Semi-Auto",
      "A02半自动启动": "A02 Semi-Auto Start",
      "B01 所在格子": "B01 Current Grid",
      "B02 所在格子": "B02 Current Grid"
      "B02 所在格子": "B02 Current Grid",
      "急停后中止/继续选择": "Abort/ResumeTasks"
    },
    "langParameter1": {
@@ -506,11 +507,11 @@
                "B01行走点动": "B01 SERVE TRAVEL",
                "B02行走点动": "B02 SERVE TRAVEL",
                "B02翻转气缸": "B02 YV TURN",
                "B02升降气缸": "B02 YV UP DOWN",
                "B02电磁阀": "B02 YV Gassing",
                "B01翻转气缸": "B01 YV TURN",
                "B01升降气缸": "B01 YV UP DOWN",
                "B01电磁阀": "B01 YV Gassing",
                "B02升降气缸": "B02 Solenoid UP DOWN",
                "B02电磁阀": "B02 Solenoid Gassing",
                "B01翻转气缸": "B01 Solenoid TURN",
                "B01升降气缸": "B01 Solenoid UP DOWN",
                "B01电磁阀": "B01 Solenoid Gassing",
                "A01输送反向": "A01 VFD conveyor reverse",
                "A02输送反向": "A02 VFD conveyor reverse",
                "A01注电泵": "A01 oil pump",
CanadaMes-ui/src/views/Electrical/Action.vue
@@ -71,10 +71,10 @@
          'A02 SERVE TRAVEL POS',
          'B01 SERVE TRAVEL POS',
          'B02 SERVE TRAVEL POS',
          'B01 YV TURN',
          'B01 YV UP DOWN',
          'B02 YV TURN',
          'B02 YV UP DOWN',
          'B01 Solenoid TURN',
          'B01 Solenoid UP DOWN',
          'B02 Solenoid TURN',
          'B02 Solenoid UP DOWN',
        ],
        xyData: [
          { name: 'D01 VFD conveyor', value: "0" },
@@ -99,10 +99,10 @@
          { name: 'A02 SERVE TRAVEL POS', value: "0" },
          { name: 'B01 SERVE TRAVEL POS', value: "0" },
          { name: 'B02 SERVE TRAVEL POS', value: "0" },
          { name: 'B01 YV TURN', value: "0" },
          { name: 'B01 YV UP DOWN', value: "0" },
          { name: 'B02 YV TURN', value: "0" },
          { name: 'B02 YV UP DOWN', value: "0" },
          { name: 'B01 Solenoid TURN', value: "0" },
          { name: 'B01 Solenoid UP DOWN', value: "0" },
          { name: 'B02 Solenoid TURN', value: "0" },
          { name: 'B02 Solenoid UP DOWN', value: "0" },
        ]
        ,
      },
CanadaMes-ui/src/views/Electrical/ManualJog.vue
@@ -125,7 +125,7 @@
    },
    //根据读取PLC的值,根据名称改变颜色1打开,0关闭
    getStatusClass (zhuangtai) {
console.log(zhuangtai);
// console.log(zhuangtai);
      if (zhuangtai === 1) {
        return "op";
      }
CanadaMes-ui/src/views/Electrical/ManualonePosition.vue
@@ -380,6 +380,18 @@
              }
              for (let i = 0; i < jsonData2.length; i++) {
                let arr4 = jsonData2[i];
                for (let j = 0; j < arr4.length; j++) {
                  let obj4 = arr4[j];
                  if (obj4.button && (obj4.button.name.includes("启动") || obj4.button.name.includes("Start"))) {
                    obj4.button.value = obj.qidong[0][i];
                    // console.log(obj2.button.value)
                  }
                }
              }
              for (let i = 2; i < jsonData2.length; i++) {
                let arr2 = jsonData2[i];
                for (let j = 2; j < arr2.length; j++) {
@@ -387,7 +399,7 @@
                  if (obj3.button) {
                    if (obj3.button && (obj3.button.name === "未回零" || obj3.button.name === "NotZero")) {
                      obj3.button.value = weihuiling[0][i];
                       console.log(obj3.button.value)
                      //  console.log(obj3.button.value)
                    }
                  }
CanadaMes-ui/src/views/Electrical/ManualonePosition2.vue
@@ -318,6 +318,9 @@
              }
              for (let i = 0; i < jsonData2.length; i++) {
                let arr2 = jsonData2[i];
                for (let j = 0; j < arr2.length; j++) {
@@ -330,6 +333,20 @@
                  }
                }
              }
              //启动
              for (let i = 0; i < jsonData2.length; i++) {
                let arr4 = jsonData2[i];
                for (let j = 0; j < arr4.length; j++) {
                  let obj4 = arr4[j];
                  if (obj4.button && (obj4.button.name.includes("启动") || obj4.button.name.includes("Start"))) {
                    obj4.button.value = obj.qidong[0][i];
                    // console.log(obj2.button.value)
                  }
                }
@@ -389,7 +406,7 @@
      });
      console.log(this.jsonData)
      // console.log(this.jsonData)
    }
CanadaMes-ui/src/views/Electrical/ServoManualone.vue
@@ -56,8 +56,8 @@
      </el-row>
      <div class="button-row" style="display: flex; justify-content: space-between;">
        <div v-for="(item, itemIndex) in dataGroup" :key="itemIndex">
          <el-button v-if="item.button && language === 'en-US' " :name="item.button.name" v-model="item.button.value" :class="{'action-button': true, 'error-button': item.button.name === 'Fault' && item.button.value === 1,'error-button2': item.button.name === 'NotZero' && item.button.value === 0,'fuwei': item.button.name === 'Reset' && item.button.value === 1,'qidong': item.button.name === 'A01 Semi-Auto' && item.button.value === 1,'qidong2': item.button.name === 'A02 Semi-Auto' && item.button.value === 1}" @click="updateButtonValue(dataGroup, itemIndex); submitDataToBackend(item.button.name);">{{ item.button.name }}</el-button>
          <el-button v-if="item.button && language === 'zh-CN' " :name="item.button.name" v-model="item.button.value" :class="{'action-button': true, 'error-button': item.button.name === '故障' && item.button.value === 1,'error-button2': item.button.name === '未回零' && item.button.value === 0,'fuwei': item.button.name === '复位' && item.button.value === 1,'qidong': item.button.name === 'A01半自动' && item.button.value === 1,'qidong2': item.button.name === 'A02半自动' && item.button.value === 1 }" @click="updateButtonValue(dataGroup, itemIndex); submitDataToBackend(item.button.name);">{{ item.button.name }}</el-button>
          <el-button v-if="item.button && language === 'en-US' " :name="item.button.name" v-model="item.button.value" :class="{'action-button': true, 'error-button': item.button.name === 'Fault' && item.button.value === 1,'error-button2': item.button.name === 'NotZero' && item.button.value === 0,'fuwei': item.button.name === 'Reset' && item.button.value === 1,'huiling': item.button.name === 'Home' && item.button.value === 1,'qidong': item.button.name === 'A01 Semi-Auto' && item.button.value === 1,'qidong2': item.button.name === 'A02 Semi-Auto' && item.button.value === 1,'qidong3': item.button.name === 'A01 Semi-Auto Start' && item.button.value === 1,'qidong4': item.button.name === 'A02 Semi-Auto Start' && item.button.value === 1,'qidong5': item.button.name === 'A02 Semi-Auto Start' && item.button.value === 1}" @click="updateButtonValue(dataGroup, itemIndex); submitDataToBackend(item.button.name);">{{ item.button.name }}</el-button>
          <el-button v-if="item.button && language === 'zh-CN' " :name="item.button.name" v-model="item.button.value" :class="{'action-button': true, 'error-button': item.button.name === '故障' && item.button.value === 1,'error-button2': item.button.name === '未回零' && item.button.value === 0,'fuwei': item.button.name === '复位' && item.button.value === 1,'huiling': item.button.name === '回零' && item.button.value === 1,'qidong': item.button.name === 'A01半自动' && item.button.value === 1,'qidong2': item.button.name === 'A02半自动' && item.button.value === 1,'qidong3': item.button.name === 'A01半自动启动' && item.button.value === 1,'qidong4': item.button.name === 'A02半自动启动' && item.button.value === 1,'qidong5': item.button.name === 'A02半自动' && item.button.value === 1  }" @click="updateButtonValue(dataGroup, itemIndex); submitDataToBackend(item.button.name);">{{ item.button.name }}</el-button>
        </div>
      </div>
    </el-card>
@@ -92,7 +92,7 @@
   
    this.initWebSocket();
    const language = this.$i18n.locale;
  console.log(language);
  // console.log(language);
  if (language === 'en-US') {
    this.replaceChineseWithEnglish();
  }
@@ -419,7 +419,6 @@
          socket.close();
          socket = null;
        }
        // 开启一个websocket服务
        socket = new WebSocket(socketUrl);
@@ -443,6 +442,32 @@
  const inputBox = document.querySelectorAll('.el-card__body');
  const target = event.target;
  if (obj.zuhe1 && inputBox && Array.from(inputBox).every(box => !box.contains(target))) {
    //启动按钮
    jsonData2[0][9].button.value = obj.qidong[0][0];  // 第一个子数组中第一个 type=66 的 button
jsonData2[0][10].button.value = obj.qidong[0][1]; // 第一个子数组中第二个 type=66 的 button
jsonData2[1][7].button.value = obj.qidong[0][2];  // 第二个子数组中第一个 type=66 的 button
jsonData2[1][8].button.value = obj.qidong[0][3];
// 输出更新后的 jsonData2
    // 执行更新逻辑
    for (let i = 0; i < 6; i++) {
  jsonData2[i].forEach((item, index) => {
@@ -481,6 +506,13 @@
     
}
//未回零更新
for (let i = 3; i < jsonData2.length; i++) {
@@ -516,6 +548,26 @@
    }
  });
});
//急停
for (let i = 0; i < jsonData2.length; i++) {
  let arr2 = jsonData2[i];
  for (let j = 0; j < arr2.length; j++) {
    let obj3 = arr2[j];
    if(obj3.button){
      if (obj3.button && (obj3.button.name === "急停后中止/继续选择" || obj3.button.name === "Abort/ResumeTasks" )) {
      obj3.button.value = obj.resumeTasks[0][i];
     console.log(obj3.button.value)
    }
    }
  }
}
@@ -616,9 +668,23 @@
  background-color: green;
}
.qidong2 {
.qidong3 {
  background-color: green;
}
.qidong {
  background-color: green;
}
.qidong4 {
  background-color: green;
}
.qidong5 {
  background-color: green;
}
.huiling {
  background-color: green;
}
</style>
CanadaMes-ui/src/views/home/index.vue
@@ -855,6 +855,7 @@
                        this.form3 = {};
                    }
                    if (obj.form3 != null && obj.form3 != "" && obj.state[0] == 0) {
                        this.form5 = obj.form3[0];
                        this.showform3();
                        this.Sizerange(this.form5, 3);
springboot-vue3/src/main/java/com/example/springboot/component/PlcHold.java
@@ -39,7 +39,20 @@
       spianService = WebSocketServer.applicationContext.getBean(SpianService.class);
      spianMapper = WebSocketServer.applicationContext.getBean(SpianMapper.class);
      jdbcConnections = WebSocketServer.applicationContext.getBean(JdbcConnections.class);
//      List<String> adddresslist = new ArrayList<>();
//      adddresslist.add("DB105.0");// 进片车起始位置
//      adddresslist.add("DB105.2");// 进片车目标位置
//      adddresslist.add("DB105.4");// 进片玻璃宽
//      adddresslist.add("DB105.8");//进片笼内已有玻璃数
//      adddresslist.add("DB105.16");// 进片车启动 1为启动
//      List<Short> datas = new ArrayList<>();
//      datas.add((short) 1000);//起始位置
//      datas.add((short) 5);//目标位置
//      datas.add((short) 610);//进片玻璃宽
//      datas.add((short) 1); //玻璃数
//      spianService.outmesid("123321","DB105.20");
//      datas.add((short) 1);//任务启动
//      S7control.getinstance().WriteWord(adddresslist, datas);
      // 根据玻璃id获取订单号,单独数据源
      // try {
      // north_glass_buffer1 glass = jdbcConnections.selectGlass(112);
@@ -59,7 +72,7 @@
      StringBuilder B02glassid = spianService.queGlassid("DB103.212", 14);// B02的玻璃id
      // 当进片小车完成任务时
      if (B01backs == true) {
        // 当B01小车汇报完成时更改玻璃状态为1
        // 当B01小车汇报完成时更改玻璃状态  为1
        spianMapper.UpdateCageOver(B01glassid.toString(), 1);// 更改笼子表进片状态
        spianMapper.Updatetask(1, 0);// 更改进片任务状态为1
        spianMapper.UpdatetaskOut(B01glassid.toString()); // 完成上一次出片或者进片任务
@@ -87,8 +100,8 @@
      StringBuilder queueid1 = spianService.queGlassid("DB106.26", 14);// 获取请求的id跟DO1同时清
      // 获取DO2数据
      StringBuilder queueid2 = spianService.queGlassid("DB103.58", 14);
      System.out.println("D01|" + queueid1);
      System.out.println("D02|" + queueid2);
//      System.out.println("D01|" + queueid1);
//      System.out.println("D02|" + queueid2);
      int questate = spianMapper.Selectquecount(queueid1.toString());// 判断扫码位是否有玻璃已确认
      // queueid1.toString().isEmpty()
springboot-vue3/src/main/java/com/example/springboot/component/PlcManualonePosition.java
@@ -10,52 +10,41 @@
import java.util.List;
public class PlcManualonePosition extends Thread {
  String name = "";
  Integer count = 0;
  private Configuration config;
  public static String readFileToString(String filePath) throws IOException {
    File file = new File(filePath);
    return FileUtils.readFileToString(file, "UTF-8");
  public PlcManualonePosition() throws IOException {
    config = new Configuration("config.properties");
  }
  public void readValue() {
    String str = "";
    BufferedReader bufferedReader = null;
    FileInputStream fileInputStream;
    try {
      // 从文件中读取字节数据存入 fileInputStream
      fileInputStream = new FileInputStream("CanadaMes-ui/src/configuration/address.json");
      // 读取 fileInputStream 中字节并将其解码为字符
      InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "utf-8");
      // 提高读取效率,在 BufferedReader 内包装 InputStreamReader
      bufferedReader = new BufferedReader(inputStreamReader);
      String line = null;
      // 将 bufferedReader 内容一行一行赋值给str
      while ((line = bufferedReader.readLine()) != null) {
        str += line;
  public static class PLCBooleanConverter {
    public static short[] convertListsToBinaryShortArray(List<Boolean>... lists) {
      // 计算所有列表中元素的总数
      int totalSize = 0;
      for (List<Boolean> list : lists) {
        totalSize += list.size();
      }
      // 将str字符串格式转为json
      JSONObject jsonObject = new JSONObject(str);
      // 创建一个足够大的数组来存放所有的二进制值
      short[] binaryShortArray = new short[totalSize];
      // 获取json中的值
      JSONArray address = jsonObject.getJSONArray("ManualonePosition");
      for (int i = 0; i < address.size(); i++) {
        JSONObject ress = (JSONObject) address.get(i);
      // 当前数组填充位置指针
      int currentIndex = 0;
        this.name = ress.getStr("name");
        this.count = ress.getInt("count");
      // 遍历所有的列表
      for (List<Boolean> list : lists) {
        // 将每个布尔值转换为 0 或 1 并填入数组
        for (Boolean value : list) {
          binaryShortArray[currentIndex++] = (short) (value ? 1 : 0);
        }
      }
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
      return binaryShortArray;
    }
  }
  @Override
  public void run() {
@@ -112,6 +101,25 @@
      addresses10.add("DB104.9.4");
      addresses10.add("DB104.9.5");
      List<Boolean> arraylist10 = S7control.getinstance().readBits(addresses10);
      //A01启动地址
      List<String> A01start = Arrays.asList(config.getProperty("mlp.A01start"));
      //A02启动地址
      List<String> A02start = Arrays.asList(config.getProperty("mlp.A02start"));
      List<String> B01start = Arrays.asList(config.getProperty("mlp.B01start"));
      List<String> B02start = Arrays.asList(config.getProperty("mlp.B02start"));
      List<Boolean> A01readstart = S7control.getinstance().readBits(A01start);
      List<Boolean> A02readstart = S7control.getinstance().readBits(A02start);
      List<Boolean> B01readstart = S7control.getinstance().readBits(B01start);
      List<Boolean> B02readstart = S7control.getinstance().readBits(B02start);
      short[] combinedBinaryShortArray = PlcManualonePosition.PLCBooleanConverter.convertListsToBinaryShortArray(
              A01readstart,  A02readstart,B01readstart, B02readstart
      );
      // Short[] values1 = { 1, 2, 3 };
      // List<Short> arraylist = new ArrayList<>(Arrays.asList(values1));
      // Short[] values2 = { 1, 2, 3 };
@@ -157,7 +165,7 @@
      jsonObject.append("shishi1", arraylist5);
      jsonObject.append("guzhang", params2);
      jsonObject.append("weihuiling", params3);
      // jsonObject.append("weihuiling", arraylist8);
      jsonObject.append("qidong", combinedBinaryShortArray);
      WebSocketServer sendwServer = WebSocketServer.sessionMap.get("ManualonePosition");
      if (sendwServer != null) {
@@ -234,11 +242,20 @@
            }
            if (!sValue.isEmpty()) {
              S7control.getinstance().WriteWord(waddresses1, sValue);
              List<String> A01start = new ArrayList<>();
              A01start.add("DB101.2.2");
              Boolean[] a01values7 = { true};
              List<Boolean> a01startval = new ArrayList<>(Arrays.asList(a01values7));
              S7control.getinstance().WriteBit(A01start, a01startval);
              if (A01readstart != null && !A01readstart.isEmpty()) {
                // 创建一个新的列表用于写入新值
                List<Boolean> a01startval = new ArrayList<>();
                // 遍历所有读取到的位值
                for (Boolean bit : A01readstart) {
                  // 取反当前位的值并添加到新的列表中
                  a01startval.add(!bit);
                }
                // 写入新的位值列表
                S7control.getinstance().WriteBit(A01start, a01startval);
              }
              System.out.println("Values " + sValue + " written to PLC at address " + waddresses1);
            }
          }
@@ -264,11 +281,20 @@
            }
            if (!sValue2.isEmpty()) {
              S7control.getinstance().WriteWord(waddresses2, sValue2);
              List<String> A02start = new ArrayList<>();
              A02start.add("DB101.2.3");
              Boolean[] a02values7 = { true};
              List<Boolean> a01startval = new ArrayList<>(Arrays.asList(a02values7));
              S7control.getinstance().WriteBit(A02start, a01startval);
              if (A02readstart != null && !A02readstart.isEmpty()) {
                // 创建一个新的列表用于写入新值
                List<Boolean> a02startval = new ArrayList<>();
                // 遍历所有读取到的位值
                for (Boolean bit : A02readstart) {
                  // 取反当前位的值并添加到新的列表中
                  a02startval.add(!bit);
                }
                // 写入新的位值列表
                S7control.getinstance().WriteBit(A02start, a02startval);
              }
              System.out.println("Values " + sValue2 + " written to PLC at address " + waddresses2);
            }
          }
@@ -293,11 +319,17 @@
            }
            if (!sValue2.isEmpty()) {
              S7control.getinstance().WriteWord(waddresses3, sValue2);
              List<String> B01start = new ArrayList<>();
              B01start.add("DB101.2.4");
              Boolean[]B01values7 = { true};
              List<Boolean> B01startval = new ArrayList<>(Arrays.asList(B01values7));
              S7control.getinstance().WriteBit(B01start, B01startval);
              if (B01readstart != null && !B01readstart.isEmpty()) {
                // 创建一个新的列表用于写入新值
                List<Boolean> b01startval = new ArrayList<>();
                // 遍历所有读取到的位值
                for (Boolean bit : B01readstart) {
                  // 取反当前位的值并添加到新的列表中
                  b01startval.add(!bit);
                }
                // 写入新的位值列表
                S7control.getinstance().WriteBit(B01start, b01startval);
              }
              System.out.println("Values " + sValue2 + " written to PLC at address " + waddresses3);
            }
          }
@@ -322,11 +354,18 @@
            }
            if (!sValue2.isEmpty()) {
              S7control.getinstance().WriteWord(waddresses4, sValue2);
              List<String> B02start = new ArrayList<>();
              B02start.add("DB101.2.5");
              Boolean[] B02values7 = { true};
              List<Boolean> B02startval = new ArrayList<>(Arrays.asList(B02values7));
              S7control.getinstance().WriteBit(B02start, B02startval);
              if (B02readstart != null && !B02readstart.isEmpty()) {
                // 创建一个新的列表用于写入新值
                List<Boolean> b02startval = new ArrayList<>();
                // 遍历所有读取到的位值
                for (Boolean bit : B02readstart) {
                  // 取反当前位的值并添加到新的列表中
                  b02startval.add(!bit);
                }
                // 写入新的位值列表
                S7control.getinstance().WriteBit(B02start, b02startval);
                System.out.println("Values " + b02startval + " written to PLC at address " + B02start);
              }
              System.out.println("Values " + sValue2 + " written to PLC at address " + waddresses4);
            }
          }
springboot-vue3/src/main/java/com/example/springboot/component/PlcManualonePosition2.java
@@ -10,52 +10,41 @@
import java.util.List;
public class PlcManualonePosition2 extends Thread {
  String name = "";
  Integer count = 0;
  private Configuration config;
  public static String readFileToString(String filePath) throws IOException {
    File file = new File(filePath);
    return FileUtils.readFileToString(file, "UTF-8");
  public PlcManualonePosition2() throws IOException {
    config = new Configuration("config.properties");
  }
  public void readValue() {
    String str = "";
    BufferedReader bufferedReader = null;
    FileInputStream fileInputStream;
    try {
      // 从文件中读取字节数据存入 fileInputStream
      fileInputStream = new FileInputStream("CanadaMes-ui/src/configuration/address.json");
      // 读取 fileInputStream 中字节并将其解码为字符
      InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "utf-8");
      // 提高读取效率,在 BufferedReader 内包装 InputStreamReader
      bufferedReader = new BufferedReader(inputStreamReader);
      String line = null;
      // 将 bufferedReader 内容一行一行赋值给str
      while ((line = bufferedReader.readLine()) != null) {
        str += line;
  public static class PLCBooleanConverter {
    public static short[] convertListsToBinaryShortArray(List<Boolean>... lists) {
      // 计算所有列表中元素的总数
      int totalSize = 0;
      for (List<Boolean> list : lists) {
        totalSize += list.size();
      }
      // 将str字符串格式转为json
      JSONObject jsonObject = new JSONObject(str);
      // 创建一个足够大的数组来存放所有的二进制值
      short[] binaryShortArray = new short[totalSize];
      // 获取json中的值
      JSONArray address = jsonObject.getJSONArray("ServoManualone");
      for (int i = 0; i < address.size(); i++) {
        JSONObject ress = (JSONObject) address.get(i);
      // 当前数组填充位置指针
      int currentIndex = 0;
        this.name = ress.getStr("name");
        this.count = ress.getInt("count");
      // 遍历所有的列表
      for (List<Boolean> list : lists) {
        // 将每个布尔值转换为 0 或 1 并填入数组
        for (Boolean value : list) {
          binaryShortArray[currentIndex++] = (short) (value ? 1 : 0);
        }
      }
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    } catch (UnsupportedEncodingException e) {
      e.printStackTrace();
    } catch (IOException e) {
      e.printStackTrace();
      return binaryShortArray;
    }
  }
  @Override
  public void run() {
@@ -120,12 +109,30 @@
        params3[i] = value ? (short) 1 : (short) 0;
      }
      //A01启动地址
      List<String> A01start = Arrays.asList(config.getProperty("mlp2.A01start"));
      //A02启动地址
      List<String> A02start = Arrays.asList(config.getProperty("mlp2.A02start"));
      List<Boolean> A01readstart = S7control.getinstance().readBits(A01start);
      List<Boolean> A02readstart = S7control.getinstance().readBits(A02start);
      short[] combinedBinaryShortArray = PlcManualonePosition2.PLCBooleanConverter.convertListsToBinaryShortArray(
              A01readstart,  A02readstart
      );
      JSONObject jsonObject = new JSONObject();
      jsonObject.append("zuhe1", arraylist);
      jsonObject.append("zuhe2", arraylist2);
      jsonObject.append("guzhang", params2);
      jsonObject.append("weihuiling", params3);
      jsonObject.append("qidong", combinedBinaryShortArray);
      // System.out.println(jsonObject);
      WebSocketServer sendwServer = WebSocketServer.sessionMap.get("ManualonePosition2");
      if (sendwServer != null) {
@@ -186,11 +193,17 @@
            }
            if (!sValue.isEmpty()) {
              S7control.getinstance().WriteWord(waddresses1, sValue);
              List<String> A01start = new ArrayList<>();
              A01start.add("DB101.2.0");
              Boolean[] a01values7 = { true};
              List<Boolean> a01startval = new ArrayList<>(Arrays.asList(a01values7));
              S7control.getinstance().WriteBit(A01start, a01startval);
              if (A01readstart != null && !A01readstart.isEmpty()) {
                // 创建一个新的列表用于写入新值
                List<Boolean> a01startval = new ArrayList<>();
                // 遍历所有读取到的位值
                for (Boolean bit : A01readstart) {
                  // 取反当前位的值并添加到新的列表中
                  a01startval.add(!bit);
                }
                // 写入新的位值列表
                S7control.getinstance().WriteBit(A01start, a01startval);
              }
              System.out.println("Values " + sValue + " written to PLC at address " + waddresses1);
            }
          }
@@ -215,11 +228,17 @@
            }
            if (!sValue2.isEmpty()) {
              S7control.getinstance().WriteWord(waddresses2, sValue2);
              List<String> A02start = new ArrayList<>();
              A02start.add("DB101.2.1");
              Boolean[] a02values7 = { true};
              List<Boolean> a01startval = new ArrayList<>(Arrays.asList(a02values7));
              S7control.getinstance().WriteBit(A02start, a01startval);
              if (A02readstart != null && !A02readstart.isEmpty()) {
                // 创建一个新的列表用于写入新值
                List<Boolean> a02startval = new ArrayList<>();
                // 遍历所有读取到的位值
                for (Boolean bit : A02readstart) {
                  // 取反当前位的值并添加到新的列表中
                  a02startval.add(!bit);
                }
                // 写入新的位值列表
                S7control.getinstance().WriteBit(A02start, a02startval);
              }
              System.out.println("Values " + sValue2 + " written to PLC at address " + waddresses2);
            }
          }
springboot-vue3/src/main/java/com/example/springboot/component/PlcServoManualone.java
@@ -20,6 +20,32 @@
    config = new Configuration("config.properties");
  }
  public static class PLCBooleanConverter {
    public static short[] convertListsToBinaryShortArray(List<Boolean>... lists) {
      // 计算所有列表中元素的总数
      int totalSize = 0;
      for (List<Boolean> list : lists) {
        totalSize += list.size();
      }
      // 创建一个足够大的数组来存放所有的二进制值
      short[] binaryShortArray = new short[totalSize];
      // 当前数组填充位置指针
      int currentIndex = 0;
      // 遍历所有的列表
      for (List<Boolean> list : lists) {
        // 将每个布尔值转换为 0 或 1 并填入数组
        for (Boolean value : list) {
          binaryShortArray[currentIndex++] = (short) (value ? 1 : 0);
        }
      }
      return binaryShortArray;
    }
  }
//读取id
  public StringBuilder queGlassid(String address,int count) {
@@ -80,16 +106,11 @@
      //B02组合地址
      String b02Address = config.getProperty("B02.address");
      List<Short> arraylist6 = S7control.getinstance().ReadWord(b02Address, 2);
      System.out.println(b02Address);
//      System.out.println(b02Address);
     // 所有故障按钮地址
      List<String> addresses7 = Arrays.asList(config.getProperty("faultButtonAddresses").split(","));
      List<Boolean> arraylist7 = S7control.getinstance().readBits(addresses7);
      // 进片id地址
      String inputGlassIdAddress = config.getProperty("inputGlassIdAddress");
      String outputGlassIdAddress = config.getProperty("outputGlassIdAddress");
      StringBuilder queueid1 = queGlassid(inputGlassIdAddress, 14);
      // 存片id地址
      StringBuilder queueid2 = queGlassid(outputGlassIdAddress, 14);
      //A01启动地址
      List<String> A01start = Arrays.asList(config.getProperty("A01start"));
      //A02启动地址
@@ -98,12 +119,33 @@
      List<String> A01Bstart = Arrays.asList(config.getProperty("A01Bstart"));
      //A02半自动地址
      List<String> A02Bstart = Arrays.asList(config.getProperty("A02Bstart"));
      //
      List<String> abortresumeTasks = Arrays.asList(config.getProperty("abortresumeTasks"));
      //回零按钮地址
      List<String> waddresses4 = Arrays.asList(config.getProperty("HomedButtonAddresses").split(","));
      // 所有复位按钮地址
      List<String> Reset = Arrays.asList(config.getProperty("resetButtonAddresses"));
      List<String> Reset = Arrays.asList(config.getProperty("resetButtonAddresses").split(","));
//      System.out.println(Reset);
      // 所有未回零按钮地址
      List<String> addresses8 = Arrays.asList(config.getProperty("notHomedButtonAddresses"));
      List<String> addresses8 = Arrays.asList(config.getProperty("notHomedButtonAddresses").split(","));
      // 进片id地址
      String inputGlassIdAddress = config.getProperty("inputGlassIdAddress");
      String outputGlassIdAddress = config.getProperty("outputGlassIdAddress");
      StringBuilder queueid1 = queGlassid(inputGlassIdAddress, 14);
      // 存片id地址
      StringBuilder queueid2 = queGlassid(outputGlassIdAddress, 14);
      List<Boolean> A01readstart = S7control.getinstance().readBits(A01start);
      List<Boolean> A02readstart = S7control.getinstance().readBits(A02start);
      List<Boolean> A01readBstart = S7control.getinstance().readBits(A01Bstart);
      List<Boolean> A02readsBtart = S7control.getinstance().readBits(A02Bstart);
      List<Boolean> resumeTasks = S7control.getinstance().readBits(abortresumeTasks);
      short[] combinedBinaryShortArray = PLCBooleanConverter.convertListsToBinaryShortArray(
              A01readstart, A01readBstart, A02readstart, A02readsBtart
      );
// 所有故障按钮转换为1和0
      short[] params2 = new short[arraylist7.size()];
@@ -114,7 +156,7 @@
      List<Boolean> Reset1 = S7control.getinstance().readBits(Reset);
    //  System.out.println(Reset1);
// 所有故障按钮转换为1和0
      short[] rReset = new short[Reset1.size()];
      for (int i = 0; i < Reset1.size(); i++) {
@@ -182,6 +224,8 @@
      jsonObject.append("jinpianid", queueid1);
      jsonObject.append("qupianid", queueid2);
      jsonObject.append("fuwei", rReset);
      jsonObject.append("qidong", combinedBinaryShortArray);
      jsonObject.append("resumeTasks", resumeTasks);
@@ -224,9 +268,18 @@
            if (!sValue.isEmpty()) {
          S7control.getinstance().WriteWord(addresses, sValue);
              Boolean[] a01values7 = { true};
              List<Boolean> a01startval = new ArrayList<>(Arrays.asList(a01values7));
              S7control.getinstance().WriteBit(A01start, a01startval);
              // 检查是否读取到了位值,并且列表不为空
              if (A01readstart != null && !A01readstart.isEmpty()) {
                // 创建一个新的列表用于写入新值
                List<Boolean> a01startval = new ArrayList<>();
                // 遍历所有读取到的位值
                for (Boolean bit : A01readstart) {
                  // 取反当前位的值并添加到新的列表中
                  a01startval.add(!bit);
                }
                // 写入新的位值列表
                S7control.getinstance().WriteBit(A01start, a01startval);
              }
              System.out.println("Values " + sValue + " written to PLC at address " + addresses);
            }
          }
@@ -253,9 +306,17 @@
            if (!sValue2.isEmpty()) {
            S7control.getinstance().WriteWord(addresses2, sValue2);
              Boolean[] a02values7 = {true};
              List<Boolean> a02startval = new ArrayList<>(Arrays.asList(a02values7));
              S7control.getinstance().WriteBit(A02start, a02startval);
              if (A02readstart != null && !A02readstart.isEmpty()) {
                // 创建一个新的列表用于写入新值
                List<Boolean> a02startval = new ArrayList<>();
                // 遍历所有读取到的位值
                for (Boolean bit : A02readstart) {
                  // 取反当前位的值并添加到新的列表中
                  a02startval.add(!bit);
                }
                // 写入新的位值列表
                S7control.getinstance().WriteBit(A02start, a02startval);
              }
              System.out.println("Values " + sValue2 + " written to PLC at address " + addresses2);
            }
          }
@@ -380,6 +441,30 @@
            }
          }
          if (messageArray.getJSONArray(8).size() > 0) {
            JSONArray jsonArray5 = messageArray.getJSONArray(8);
            List<Boolean> sValueb5 = new ArrayList<>();
            for (int i = 0; i < jsonArray5.size(); i++) {
              Object value = jsonArray5.get(i);
              if (value != null && !value.toString().equals("null")) {
                try {
                  String cleanedValue = value.toString().replaceAll("[^0-9-]", "");
                  boolean val = "1".equals(cleanedValue.trim());
                  sValueb5.add(val);
                  System.out.println("messageValue: " + Arrays.asList(val) + " added to the list");
                } catch (NumberFormatException e) {
                  // 如果无法解析为 boolean 类型,则忽略该部分
                  System.err.println("Could not parse value: " + value);
                }
              }
            }
            if (!sValueb5.isEmpty()) {
              S7control.getinstance().WriteBit(abortresumeTasks, sValueb5);
              System.out.println("Values " + sValueb5 + " written to PLC at address " + A02Bstart);
            }
          }
          // 清空消息列表
          webSocketServer.clearMessages();
springboot-vue3/src/main/java/com/example/springboot/component/Plcalarm.java
@@ -28,7 +28,7 @@
    FileInputStream fileInputStream;
    try {
      // 从文件中读取字节数据存入 fileInputStream
      fileInputStream = new FileInputStream("CanadaMes-ui/src/configuration/Alarm.json");
      fileInputStream = new FileInputStream("src/main/resources/Alarm.json");
      // 读取 fileInputStream 中字节并将其解码为字符
      InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream, "utf-8");
      // 提高读取效率,在 BufferedReader 内包装 InputStreamReader
@@ -121,7 +121,7 @@
        List<String> myCollection;
        myCollection = readValue();
        String[] array1 = myCollection.toArray(new String[myCollection.size()]);
      //  System.out.println(array1.length);
        alarmMapper = WebSocketServer.applicationContext.getBean(AlarmMapper.class);
        for (short i = 0; i < array1.length; i++) {
          // 查询对应报警信息结束时间为null的条数
@@ -130,7 +130,7 @@
          // System.out.println(result);
          if (shuzu1[i] == 1 && result == 0) {
            // 填加一条报警信息,有开始时间
            // alarmMapper.Insertalarm(array1[i]);
             alarmMapper.Insertalarm(array1[i]);
          } else if (shuzu1[i] == 0 && result > 0) {
            // 修改该条报警信息的结束时间
            alarmMapper.updatealarm(array1[i]);
springboot-vue3/src/main/java/com/example/springboot/component/Plchome.java
@@ -32,7 +32,7 @@
    //铝框id
    public static String FrameNo;
    //是否需要手动确认玻璃
    public static Boolean isConfirm=true;
    public static Boolean isConfirm=false;
    // public static Map b=new HashMap<>();
    // b.put()
    @Override
@@ -92,7 +92,7 @@
            // 伍 获取进是否有待确认的玻璃id
            String queid = spianMapper.Selectqueueid();
            int state = spianMapper.Selectqueuestate();
            jsonObject.append("state", queid);
            jsonObject.append("queid", queid);
            jsonObject.append("state", state);
            // 获取扫码位与上片位玻璃信息
            Queue form2 = homeMapper.GetQueueInfo(2);
springboot-vue3/src/main/java/com/example/springboot/component/Plcstate.java
@@ -79,7 +79,7 @@
        List<String> Intlist = new ArrayList<>();
        for (Short value : plclist) {
          Intlist.add(value == 1 ? "自动" : "手动");
          Intlist.add(value == 1 ? "AUTO" : "Manual");
        }
        JSONObject jsonObject = new JSONObject();
springboot-vue3/src/main/java/com/example/springboot/config/AppRunnerConfig.java
@@ -17,29 +17,28 @@
    //
    System.out.println("启动完成");
    // new PlcHold().start();
//    new PlcHold().start();
//
    //
    //
    new Plchome().start();
    //  new PlcParameter().start();
    //  //
    //  // new Plcalarm().start();
    //  //
    //  new Plcsign().start();
    //  //
    //  new Plcaction().start();
    //  new Plcstate().start();
    //  new PlcPositioning1().start();
    //  new PlcPositioning2().start();
    //  new PlcParameter2().start();
    //  new PlcParameter1().start();
    //  new PLCAutomaticParameterSetting().start();
//    new Plchome().start();
//    //
     new PlcParameter().start();
     //
     new Plcalarm().start();
     //
     new Plcsign().start();
     //
     new Plcaction().start();
     new Plcstate().start();
     new PlcPositioning1().start();
     new PlcPositioning2().start();
    new PlcParameter2().start();
     new PlcParameter1().start();
     new PLCAutomaticParameterSetting().start();
    //  new PlcManualonePosition().start();
    //  new PlcManualonePosition2().start();
    //  new PlcServoManualone().start();
    //  new PLCManualJog().start();
     new PlcManualonePosition().start();
     new PlcManualonePosition2().start();
     new PlcServoManualone().start();
     new PLCManualJog().start();
  }
}
springboot-vue3/src/main/java/com/example/springboot/mapper/SpianMapper.java
@@ -29,7 +29,7 @@
     @Select("select cage,cell,tier,id,ROUND(id/2)as prcId,width from storage_cage where cage=#{cage1} and cell=#{cell} and state=0 and disabled=0 and width>=#{width} ORDER BY cell asc,tier asc LIMIT 1")
     StorageCage selectCage1(int  cage1,int cell,double width);
     //判断笼子内玻璃数
     @Select("select COUNT(tier)as tier from storage_cage where  cage=#{cage} and cell=#{cell} and state=1;")
     @Select("select COUNT(tier)as tier from storage_cage where  cage=#{cage} and cell=#{cell} and state!=0;")
     int selectsum(int cage,int cell);
     //完成进片中的玻璃状态
     @Update("update storage_cage set state=#{state} where glass_id=#{glassid};")
@@ -58,7 +58,7 @@
     StorageCage selectGlassCage(int cage,double width,int cage1,int cage2);
    //删除笼子信息(出片)
    @Update("update storage_cage as a set state=#{state},glass_id=null,order_id=null,glasswidth=0,a.glassheight=null,a.glasswidthmm=null,a.glassheightmm=null,a.listid=null,a.boxid=null where glassid=#{glassid};")
    @Update("update storage_cage as a set state=#{state},glass_id=null,order_id=null,glasswidth=0,a.glassheight=null,a.glasswidthmm=null,a.glassheightmm=null,a.listid=null,a.boxid=null where glass_id=#{glassid} and state=3;")
    void UpdataGlassCage(String glassid,int state);
     //改变玻璃状态为出片中
    @Update("update storage_cage as a set state=#{state} where glass_id=#{glassid};")        
springboot-vue3/src/main/java/com/example/springboot/service/SpianService.java
@@ -95,6 +95,7 @@
                    spianMapper.UpdataAddCage1(widths, cage1, cells);// 减少格子宽度
                    spianMapper.Inserttask(0, 0, 1000, ids, glassid.toString());// 新增任务
                    S7control.getinstance().WriteWord(adddresslist, datas);
                    System.out.println("汇报时任务|" + datas);
                   
                }else{
                 // 数据库修改笼子表新增一条玻璃
@@ -103,6 +104,8 @@
                spianMapper.UpdataAddCage1(widths, cage1, cells);// 减少格子宽度
                spianMapper.Inserttask(0, 0, 1000, ids, glassid.toString());// 新增任务
                S7control.getinstance().WriteWord(adddresslist, datas);
                    System.out.println("汇报时任务|" + datas);
                // S7control.getinstance().WriteByte("DB105.16",glassid);
                }
springboot-vue3/src/main/resources/Alarm.json
New file
@@ -0,0 +1,507 @@
{
  "content": [
    {
      "name": "D01 VFD error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "D02 VFD error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "D03 VFD error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "D04 VFD error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "D05 VFD error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "D06 VFD error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "B01 VFD error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "B02 VFD error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "A01 VFD error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "A02 VFD error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "A01 servo turn error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "A02 servo turn error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "A01 servo travel error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "A02 servo travel error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "B01 servo travel error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "B02 servo travel error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "D01 DEC error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "D01 pos error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "D02 DEC error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "D02 pos error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "D03 DEC error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "D03 pos error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "D04 DEC error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "D04 pos error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "D05 DEC error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "D05 pos error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "D06 DEC error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "D06 pos error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "A01 DEC error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "A01 pos error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "A02 DEC error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "A02 pos error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "B01 IN DEC error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "B01 IN pos error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "B01 OUT DEC error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "B01 OUT pos error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "B02 IN DEC error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "B02 IN pos error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "B02 OUT DEC error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "B02 OUT pos error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "D01 Scan glass exceeding limit",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "emergency stop alarm",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "More glass than known",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "less glass than known",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "D01 conveyor timeout alarm",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "D02 conveyor timeout alarm",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "D03 conveyor timeout alarm",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "D04 conveyor timeout alarm",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "D05 conveyor timeout alarm",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "D06 conveyor timeout alarm",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "A01 conveyor timeout alarm",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "A02 conveyor timeout alarm",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "B01 conveyor timeout alarm",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "B02 conveyor timeout alarm",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "A01 conveyor Left safety alarm",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "A01 conveyor right safety alarm",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "A02 conveyor Left safety alarm",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "A02 conveyor right safety alarm",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "1# buffer safety alarm",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "2# buffer safety alarm",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "3# buffer safety alarm",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "4# buffer safety alarm",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "A01.SR right in pos error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "A02.SR left in pos error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "B01.SR left in pos error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "B01.SR left dec error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "B01.SR right dec error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "B01.SR right in pos error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "B02.SR left in pos error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "B02.SR left dec error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    },
    {
      "name": "B02.SR right dec error",
      "value": "1",
      "state": "1",
      "type": "3",
      "page": "1"
    }
  ],
  "address": [
    {
      "name": "DB104.0.0",
      "count": 71
    }
  ]
}
springboot-vue3/src/main/resources/config.properties
@@ -31,4 +31,22 @@
A02Bstart=DB101.11.1
#A01start
A01Bstart=DB101.11.0
#------------------------------------------------------------
#abort/resumeTasks
abortresumeTasks=DB101.10.4
#------------------------------------------------------------
#A02start
mlp.A02start=DB101.2.3
#A01start
mlp.A01start=DB101.2.2
#A02start
mlp.B02start=DB101.2.5
#A01start
mlp.B01start=DB101.2.4
#--------------------------
#A02start
mlp2.A02start=DB101.2.1
#A01start
mlp2.A01start=DB101.2.0