springboot-vue3/src/main/java/com/example/springboot/component/PlcParameter1Review.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
springboot-vue3/src/main/java/com/example/springboot/component/PlcsignReview.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
springboot-vue3/src/main/java/com/example/springboot/entity/device/PlcBitInfo.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
springboot-vue3/src/main/java/com/example/springboot/entity/device/PlcBitObject.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
springboot-vue3/src/main/java/com/example/springboot/entity/device/PlcParameterInfo.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
springboot-vue3/src/main/java/com/example/springboot/entity/device/PlcParameterObject.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
springboot-vue3/src/main/resources/JsonFile/PlcParameter.json | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
springboot-vue3/src/main/resources/JsonFile/PlcSign.json | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
springboot-vue3/src/main/java/com/example/springboot/component/PlcParameter1Review.java
New file @@ -0,0 +1,213 @@ 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; private 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<String> addresses = new ArrayList<>(); addresses.add("conveyorVelocity(AutoFAST)"); addresses.add("conveyorVelocity(AutoSLOW)"); addresses.add("conveyorVelocity(Manual)"); addresses.add("A01A02TURNJOGVelocity"); addresses.add("A01A02TRAVELJOGVelocity"); 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()); WebSocketServer sendwServer = WebSocketServer.sessionMap.get("Parameter1"); if (sendwServer != null) { sendwServer.sendMessage(jsonObject.toString()); } WebSocketServer webSocketServer = WebSocketServer.sessionMap.get("Parameter1"); if (webSocketServer != null) { List<String> messages = webSocketServer.getMessages(); List<String> 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<Short> 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); } // 清空消息列表 webSocketServer.clearMessages(); } } } } } springboot-vue3/src/main/java/com/example/springboot/component/PlcsignReview.java
New file @@ -0,0 +1,124 @@ package com.example.springboot.component; import cn.hutool.json.JSONArray; import cn.hutool.json.JSONObject; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.List; import com.example.springboot.entity.device.PlcBitObject; import com.example.springboot.entity.device.PlcBitInfo; public class PlcsignReview extends Thread { String name = ""; Integer count = 0; private volatile static PlcsignReview instance = null; private PlcsignReview() { init(); } // 单例模式 线程安全 public static PlcsignReview getInstance() { if (instance == null) { synchronized (PlcsignReview.class) { if (instance == null) { instance = new PlcsignReview(); } } } return instance; } PlcBitObject plcBitObject = new PlcBitObject();//该DB区数据实例 private void init() { try { String jsonfilename= PlcsignReview.class.getResource("/JsonFile/PlcSign.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"); plcBitObject.setPlcAddressBegin(jsonfileobj.getStr("plcAddressBegin"));//设置起始位地址 plcBitObject.setPlcAddressLength(Integer.valueOf(jsonfileobj.getStr("plcAddressLenght")));//设置地址长度 for (int i = 0; i < jsonArray.size(); i++) { JSONObject parameterObj = jsonArray.getJSONObject(i); PlcBitInfo plcBitInfo = new PlcBitInfo(jsonfileobj.getStr("plcAddressBegin")); //参数实例 String codeid=parameterObj.getStr("codeId"); plcBitInfo.setCodeId(codeid); plcBitInfo.setAddressIndex(Integer.valueOf(parameterObj.getStr("addressIndex"))); plcBitObject.addPlcBit(plcBitInfo); } System.out.println(""); } catch (IOException e) { e.printStackTrace(); } } @Override public void run() { while (this != null) { try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } List<Boolean> getplcbits=S7control.getinstance().ReadBits(plcBitObject.getPlcAddressBegin(),plcBitObject.getPlcAddressLength()); plcBitObject.setPlcBitList(getplcbits); // this.readValue(); // String PlcAddress = this.name; // Integer Plccount = this.count; // System.out.println(PlcAddress); // List<Boolean> plclist = S7control.getinstance().ReadBits(PlcAddress, Plccount); List<Boolean> plclist = S7control.getinstance().ReadBits("DB102.0.0", 64); // Boolean[] values = { true, true, true, true, true, false, true, false, // true, false, true, false, true, false, // true, false, true, false, true, false, true, false, true, false, true, false, // true, false, true, false, true, // false, true, false, true, false, // true, false, true, false, true, false, true, false, null, // true, false, // true, false, true, false, true, false, // true, false, true, false, true, }; // List<Boolean> plclist = new ArrayList<>(Arrays.asList(values)); if (plclist != null) { // 将获取的布尔类型转换为整数类型 List<Integer> Intlist = new ArrayList<>(); for (Boolean value : plclist) { if (value != null) { Intlist.add(value == true ? 0 : 1); } } JSONObject jsonObject = new JSONObject(); jsonObject.append("sig", Intlist); WebSocketServer sendwServer3 = WebSocketServer.sessionMap.get("Sign"); if (sendwServer3 != null) { sendwServer3.sendMessage(jsonObject.toString()); } } } } } springboot-vue3/src/main/java/com/example/springboot/entity/device/PlcBitInfo.java
New file @@ -0,0 +1,74 @@ package com.example.springboot.entity.device; import com.example.springboot.component.S7control; public class PlcBitInfo { public PlcBitInfo(String startAddress) { this.startAddress = startAddress; } private String startAddress; // 参数标识 private String codeId; // 参数名称 private String name; // 读取 参数值 private Boolean value; // 参数地址 private int addressIndex; public String getCodeId() { return this.codeId; } public void setCodeId(String codeId) { this.codeId = codeId; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } public Boolean getValue() { return this.value; } public void setValue(Boolean value) { this.value = value; } public int getAddressIndex() { return this.addressIndex; } /** * 获取地址 * * @param index 索引地址 */ public String getAddress(int index) { String[] stringdatas = this.startAddress.trim().split("\\."); if (stringdatas.length < 2 ) return null; int dbwindex = 0; int bitindex = 0; if (stringdatas.length == 3) { dbwindex = Integer.parseInt(stringdatas[1]); bitindex = Integer.parseInt(stringdatas[2]); } else return null; dbwindex+=index/8; bitindex+=index%8; return stringdatas[0]+"."+dbwindex+"."+bitindex; } public void setAddressIndex(int addressindex) { this.addressIndex = addressindex; } } springboot-vue3/src/main/java/com/example/springboot/entity/device/PlcBitObject.java
New file @@ -0,0 +1,113 @@ package com.example.springboot.entity.device; import java.lang.reflect.Array; import java.util.ArrayList; import java.util.List; public class PlcBitObject { // 该模块数据类型,数据起始位置 private String plcAddressBegin; // 数据地址长度:第一参数到最后一个参数的长度 private int plcAddressLength; private ArrayList<PlcBitInfo> plcBitList; /** * @return 数据区开始地址 */ public String getPlcAddressBegin() { return plcAddressBegin; } /** * @param plcAddressBegin 设置数据区开始地址 */ public void setPlcAddressBegin(String plcAddressBegin) { this.plcAddressBegin = plcAddressBegin; } /** * @return 数据区 读取所有数据所需的长度(以byte类型为基准) */ public int getPlcAddressLength() { return plcAddressLength; } /** * @return 设置:数据区 读取所有数据所需的长度(以byte类型为基准) */ public void setPlcAddressLength(int plcAddressLength) { this.plcAddressLength = plcAddressLength; } /** * @return 获取参数实例集合 */ public ArrayList<PlcBitInfo> getBitList() { return plcBitList; } /** * 根据参数标识 获取某个参数实例 * * @param codeid 参数标识 * @return 获取某个参数实例 */ public PlcBitInfo getPlcBit(String codeid) { if (plcBitList != null) { for (PlcBitInfo plcbitInfo : plcBitList) { if (plcbitInfo.getCodeId().equals(codeid)) return plcbitInfo; } return null; } else return null; } /** * 根据参数标识 获取某个参数实例 * * @param codeid 参数标识 * @return 获取某个参数实例 */ public List<Boolean> getPlcBitValues(List<String> codeids) { List<Boolean> arrayList = new ArrayList(); if (plcBitList != null) { for (PlcBitInfo plcbitInfo : plcBitList) { if (codeids.contains(plcbitInfo.getCodeId().toString())) arrayList.add(plcbitInfo.getValue()); } } return arrayList; } /** * 添加参数实例 * * @param param 参数实例 */ public void addPlcBit(PlcBitInfo param) { if (plcBitList != null) plcBitList.add(param); else { plcBitList = new ArrayList<PlcBitInfo>(); plcBitList.add(param); } } /** * 根据PLC返回的数据 给参数实例赋值 * * @param plcValueArray PLC读取回来的byte类型数据集合 */ public void setPlcBitList(List<Boolean> plcValueArray) { if (plcBitList != null) { for (PlcBitInfo plcbitInfo : plcBitList) { plcbitInfo.setValue(plcValueArray.get(plcbitInfo.getAddressIndex())); } } } } springboot-vue3/src/main/java/com/example/springboot/entity/device/PlcParameterInfo.java
New file @@ -0,0 +1,112 @@ package com.example.springboot.entity.device; public class PlcParameterInfo { public PlcParameterInfo(String startAddress) { this.startAddress = startAddress; } private String startAddress; // 参数标识 private String codeId; // 参数名称 private String name; // 读取 参数值 private String value; // // 写入 参数值 // private String writeValue; // 参数单位 private String unit; // 参数值转换系数 private int ratio; // 参数地址 private int addressIndex; // 参数地址位长度 private int addressLength; public String getCodeId() { return this.codeId; } public void setCodeId(String codeId) { this.codeId = codeId; } public String getName() { return this.name; } public void setName(String name) { this.name = name; } public String getValue() { return this.value; } public void setValue(String value) { this.value = value; } // public String getWriteValue() { // return this.writeValue; // } // public void setWriteValue(String writeValue) { // this.writeValue = writeValue; // } public String getUnit() { return this.unit; } public void setUnit(String unit) { this.unit = unit; } public int getAddressIndex() { return this.addressIndex; } public void setAddressIndex(int addressindex) { this.addressIndex = addressindex; } public int getAddressLength() { return this.addressLength; } public void setAddressLength(int addresslength) { this.addressLength = addresslength; } public int getRatio() { return this.ratio; } public void setRatio(int ratio) { this.ratio = ratio; } /** * 获取地址 * * @param index 索引地址 */ public String getAddress(int index) { String[] stringdatas = this.startAddress.trim().split("\\."); if (stringdatas.length < 2 ) return null; int dbwindex = 0; int bitindex = 0; if (stringdatas.length == 2) { dbwindex = Integer.parseInt(stringdatas[1]); } else return null; return stringdatas[0]+"."+dbwindex+bitindex; } } springboot-vue3/src/main/java/com/example/springboot/entity/device/PlcParameterObject.java
New file @@ -0,0 +1,149 @@ package com.example.springboot.entity.device; import java.lang.reflect.Array; import java.util.ArrayList; import java.util.List; public class PlcParameterObject { // 该模块数据类型,数据起始位置 private String plcAddressBegin; // 数据地址长度:第一参数到最后一个参数的长度 private int plcAddressLength; private ArrayList<PlcParameterInfo> plcParameterList; /** * @return 数据区开始地址 */ public String getPlcAddressBegin() { return plcAddressBegin; } /** * @param plcAddressBegin 设置数据区开始地址 */ public void setPlcAddressBegin(String plcAddressBegin) { this.plcAddressBegin = plcAddressBegin; } /** * @return 数据区 读取所有数据所需的长度(以byte类型为基准) */ public int getPlcAddressLength() { return plcAddressLength; } /** * @return 设置:数据区 读取所有数据所需的长度(以byte类型为基准) */ public void setPlcAddressLength(int plcAddressLength) { this.plcAddressLength = plcAddressLength; } /** * @return 获取参数实例集合 */ public ArrayList<PlcParameterInfo> getPlcParameterList() { return plcParameterList; } /** * 根据参数标识 获取某个参数实例 * * @param codeid 参数标识 * @return 获取某个参数实例 */ public PlcParameterInfo getPlcParameter(String codeid) { if (plcParameterList != null) { for (PlcParameterInfo plcParameterInfo : plcParameterList) { if (plcParameterInfo.getCodeId().equals(codeid)) return plcParameterInfo; } return null; } else return null; } /** * 根据参数标识 获取某个参数实例 * * @param codeid 参数标识 * @return 获取某个参数实例 */ public List<String> getPlcParameterValues(List<String> codeids) { List<String> arrayList = new ArrayList(); if (plcParameterList != null) { for (PlcParameterInfo plcParameterInfo : plcParameterList) { if (codeids.contains(plcParameterInfo.getCodeId().toString())) arrayList.add(plcParameterInfo.getValue()); } } return arrayList; } /** * 添加参数实例 * * @param param 参数实例 */ public void addPlcParameter(PlcParameterInfo param) { if (plcParameterList != null) plcParameterList.add(param); else { plcParameterList = new ArrayList<PlcParameterInfo>(); plcParameterList.add(param); } } /** * 根据PLC返回的数据 给参数实例赋值 * * @param plcValueArray PLC读取回来的byte类型数据集合 */ public void setPlcParameterList(byte[] plcValueArray) { if (plcParameterList != null) { for (PlcParameterInfo plcParameterInfo : plcParameterList) { byte[] valueList = new byte[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(byte2short(valueList))); } else { String valuestr = new String(valueList); plcParameterInfo.setValue(valuestr); } } } } /** * short类型转byte[] * * @param s short类型值 */ 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个字节,所以要计算偏移量 b[i] = (byte)((s >> offset)&0xff); //把16位分为2个8位进行分别存储 } return b; } /** * byte[]类型转short * * @param b byte[]类型值 */ public static short byte2short(byte[] b){ short l = 0; for (int i = 0; i < 2; i++) { l<<=8; //<<=和我们的 +=是一样的,意思就是 l = l << 8 l |= (b[i] & 0xff); //和上面也是一样的 l = l | (b[i]&0xff) } return l; } } springboot-vue3/src/main/resources/JsonFile/PlcParameter.json
New file @@ -0,0 +1,77 @@ { "plcAddressBegin":"DB100.0", "plcAddressLenght":"86", "dataType":"word", "parameteInfor":[ { "codeId": "conveyorVelocity(Max)", "addressIndex":"0", "addressLenght":"2", "ratio":"1", "unit":"m/min" }, { "codeId": "conveyorVelocity(AutoSLOW)", "addressIndex":"6", "addressLenght":"2", "ratio":"1", "unit":"m/min" }, { "codeId": "conveyorVelocity(Manual)", "addressIndex":"4", "addressLenght":"2", "ratio":"1", "unit":"m/min" }, { "codeId": "A01A02TURNJOGVelocity", "addressIndex":"6", "addressLenght":"2", "ratio":"1", "unit":"m/min" }, { "codeId": "A01A02TRAVELJOGVelocity", "addressIndex":"8", "addressLenght":"2", "ratio":"1", "unit":"m/min" }, { "codeId": "B01B02TRAVELJOGVelocity", "addressIndex":"10", "addressLenght":"2", "ratio":"1", "unit":"m/min" }, { "codeId": "A01A02TURNPOSVelocityAUTO", "addressIndex":"12", "addressLenght":"2", "ratio":"1", "unit":"m/min" }, { "codeId": "A01A02TURNPOSVelocitymanual", "addressIndex":"14", "addressLenght":"2", "ratio":"1", "unit":"m/min" }, { "codeId": "A01A02TRAVELPOSVelocityAUTO", "addressIndex":"16", "addressLenght":"2", "ratio":"1", "unit":"m/min" }, { "codeId": "DO1id", "addressIndex":"18", "addressLenght":"14", "ratio":"1", "unit":"m/min" } ] } springboot-vue3/src/main/resources/JsonFile/PlcSign.json
New file @@ -0,0 +1,47 @@ { "plcAddressBegin":"DB100.0.0", "plcAddressLenght":"20", "dataType":"bit", "parameteInfor":[ { "codeId": "D01.SRdec", "addressIndex":"0" }, { "codeId": "conveyorVelocity(AutoSLOW)", "addressIndex":"1" }, { "codeId": "conveyorVelocity(Manual)", "addressIndex":"2" }, { "codeId": "A01A02TURNJOGVelocity", "addressIndex":"3" }, { "codeId": "A01A02TRAVELJOGVelocity", "addressIndex":"4" }, { "codeId": "B01B02TRAVELJOGVelocity", "addressIndex":"5" }, { "codeId": "A01A02TURNPOSVelocityAUTO", "addressIndex":"12" }, { "codeId": "A01A02TURNPOSVelocitymanual", "addressIndex":"14" }, { "codeId": "A01A02TRAVELPOSVelocityAUTO", "addressIndex":"16" }, { "codeId": "DO1id", "addressIndex":"18" } ] }