package com.szpg.plc.message.response.read; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; import com.szpg.db.dao.PgDeviceDao; import com.szpg.db.dao.PgSbDao; import com.szpg.db.dao.PgHjsbblDao; import com.szpg.db.dao.impl.PgDeviceDaoImpl; import com.szpg.db.dao.impl.PgSbDaoImpl; import com.szpg.db.dao.impl.PgHjsbblDaoImpl; import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.plc.util.Bytes; import com.szpg.util.Configure; import com.szpg.util.TimeFormat; public class ReadSbRtCommandResponse extends ReadMemoryCommandResponse { /** * */ private static final long serialVersionUID = 8066103988242013978L; private final Logger logger = Logger.getLogger(this.getClass().getName()); private List<Integer> sb1scs; // 水泵1运行时长——秒数 private List<Integer> sb2scs; // 水泵2运行时长——秒数 private List<Integer> sb1sch; // 水泵1运行时长——小时数 private List<Integer> sb2sch; // 水泵2运行时长——小时数 private String[] zcList; //资产列表,从配置文件中获取 public ReadSbRtCommandResponse() { sb1scs = new ArrayList<Integer>(); sb2scs = new ArrayList<Integer>(); sb1sch = new ArrayList<Integer>(); sb2sch = new ArrayList<Integer>(); } public List<Integer> getSb1scs() { return sb1scs; } public void setSb1scs(List<Integer> sb1scs) { this.sb1scs = sb1scs; } public List<Integer> getSb2scs() { return sb2scs; } public void setSb2scs(List<Integer> sb2scs) { this.sb2scs = sb2scs; } public List<Integer> getSb1sch() { return sb1sch; } public void setSb1sch(List<Integer> sb1sch) { this.sb1sch = sb1sch; } public List<Integer> getSb2sch() { return sb2sch; } public void setSb2sch(List<Integer> sb2sch) { this.sb2sch = sb2sch; } public String[] getZcList() { return zcList; } public void setZcList(String[] zcList) { this.zcList = zcList; } @Override public void afterAction() { // 1将水泵累计运行时长数据存入数据库 PgSbDao sbDao = new PgSbDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); if (null != zcList && zcList.length > 0) { // 遍历设备列表,将水泵运行时长存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { // 根据是否有数据来判断单泵还是双泵 if (null == sb2sch.get(i)) { sbDao.addRtRecord(sb1scs.get(i), sb1sch.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); } else { sbDao.addRtRecord(sb1scs.get(i), sb1sch.get(i), sb2scs.get(i), sb2sch.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id); } } } } } @Override public void parseData(byte[] messageData) { // 获取目标ACU的代码 String acucode = this.getAcucode(); // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".SBRT.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); this.setValid(false); return; } PgHjsbblDao blDao = new PgHjsbblDaoImpl(); // 获取目标ACU水泵运行时间内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".SBRT.START")); // 获取目标ACU水泵相关的资产列表,即水泵设备列表 String zcListStr = Configure.getProperty("acubl", acucode + ".SB.ZC.LIST"); if (StringUtils.isEmpty(zcListStr) == true) { this.setValid(false); return; } zcList = zcListStr.split(";"); // 解析水泵运行时长相关变量 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; // 解析水泵1运行时长的小时数 PgHjsbbl hour1BlObj = blDao.findBlByBh(zcbh + ".RunH1"); if (null == hour1BlObj) { continue; } int h1kszdz = hour1BlObj.getKszdz(); //开始字地址 int h1jszdz = hour1BlObj.getJszdz(); //结束字地址 int h1n = h1jszdz - (h1kszdz - 1); //字数 int h1offset = h1kszdz - start; //与开始字的偏移量 Bytes hour1Bytes = new Bytes(); for (int j = h1n; j > 0; j--) { hour1Bytes.append(new byte[] {messageData[(h1offset + j - 1) * 2], messageData[(h1offset + j - 1) * 2 + 1]}); } int hour1 = ByteUtil.binToInt(hour1Bytes.toBytes()); //运行时长的小时数 // 解析水泵2运行时长的小时数 PgHjsbbl hour2BlObj = blDao.findBlByBh(zcbh + ".RunH2"); if (null == hour2BlObj) { sb2sch.add(null); } else { int h2kszdz = hour2BlObj.getKszdz(); //开始字地址 int h2jszdz = hour2BlObj.getJszdz(); //结束字地址 int h2n = h2jszdz - (h2kszdz - 1); //字数 int h2offset = h2kszdz - start; //与开始字的偏移量 Bytes hour2Bytes = new Bytes(); for (int j = h2n; j > 0; j--) { hour2Bytes.append(new byte[] {messageData[(h2offset + j - 1) * 2], messageData[(h2offset + j - 1) * 2 + 1]}); } int hour2 = ByteUtil.binToInt(hour2Bytes.toBytes()); //运行时长的小时数 sb2sch.add(hour2); } // 解析水泵1运行时长的秒数 PgHjsbbl second1BlObj = blDao.findBlByBh(zcbh + ".RunS1"); if (null == second1BlObj) { continue; } int s1kszdz = second1BlObj.getKszdz(); //开始字地址 int s1jszdz= second1BlObj.getJszdz(); //结束字地址 int s1n = s1jszdz - (s1kszdz - 1); //字数 int s1offset = s1kszdz - start; //与开始字的偏移量 Bytes second1Bytes = new Bytes(); for (int k = s1n; k > 0; k--) { second1Bytes.append(new byte[] {messageData[(s1offset + k - 1) * 2], messageData[(s1offset + k - 1) * 2 + 1]}); } int second1 = ByteUtil.binToInt(second1Bytes.toBytes()); //运行时长的秒数 // 解析水泵2运行时长的秒数 PgHjsbbl second2BlObj = blDao.findBlByBh(zcbh + ".RunS2"); if (null == second2BlObj) { sb2scs.add(null); } else { int s2kszdz = second2BlObj.getKszdz(); //开始字地址 int s2jszdz= second2BlObj.getJszdz(); //结束字地址 int s2n = s2jszdz - (s2kszdz - 1); //字数 int s2offset = s2kszdz - start; //与开始字的偏移量 Bytes second2Bytes = new Bytes(); for (int k = s2n; k > 0; k--) { second2Bytes.append(new byte[] {messageData[(s2offset + k - 1) * 2], messageData[(s2offset + k - 1) * 2 + 1]}); } int second2 = ByteUtil.binToInt(second2Bytes.toBytes()); //运行时长的秒数 sb2scs.add(second2); } getSb1sch().add(hour1); getSb1scs().add(second1); } } }