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.PgHjsbblDao; import com.szpg.db.dao.PgWsDao; import com.szpg.db.dao.impl.PgDeviceDaoImpl; import com.szpg.db.dao.impl.PgHjsbblDaoImpl; import com.szpg.db.dao.impl.PgWsDaoImpl; import com.szpg.db.data.PgAlarm; import com.szpg.db.data.PgHjsbbl; import com.szpg.db.data.PgTemphum; import com.szpg.plc.message.response.ReadMemoryCommandResponse; import com.szpg.plc.util.ByteUtil; import com.szpg.util.Configure; import com.szpg.util.NumberFormat; public class ReadWSStatusCommandResponse extends ReadMemoryCommandResponse { /** * */ private static final long serialVersionUID = -3778608871616106346L; private final Logger logger = Logger.getLogger(this.getClass().getName()); private List<Boolean> wdbj; // 温度报警状态 private List<Boolean> sdbj; // 湿度报警状态 private List<Boolean> wdldbj; // 温度是否联动报警 private List<Boolean> sdldbj; // 湿度是否联动报警 private String[] zcList; //温湿度监测的资产列表,从配置文件中获取 public ReadWSStatusCommandResponse() { wdbj = new ArrayList<Boolean>(); sdbj = new ArrayList<Boolean>(); wdldbj = new ArrayList<Boolean>(); sdldbj = new ArrayList<Boolean>(); } public List<Boolean> getWdbj() { return wdbj; } public void setWdbj(List<Boolean> wdbj) { this.wdbj = wdbj; } public List<Boolean> getSdbj() { return sdbj; } public void setSdbj(List<Boolean> sdbj) { this.sdbj = sdbj; } public List<Boolean> getWdldbj() { return wdldbj; } public void setWdldbj(List<Boolean> wdldbj) { this.wdldbj = wdldbj; } public List<Boolean> getSdldbj() { return sdldbj; } public void setSdldbj(List<Boolean> sdldbj) { this.sdldbj = sdldbj; } public String[] getZcList() { return zcList; } public void setZcList(String[] zcList) { this.zcList = zcList; } @Override public void afterAction() { // 1将温湿度报警状态存入数据库 PgWsDao wsDao = new PgWsDaoImpl(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); // 遍历资产列表,将温湿度报警状态存入数据库 for (int i = 0; i < zcList.length; i++) { String zcbh = zcList[i]; int id = deviceDao.findDeviceIdByCode(zcbh); if (id > 0) { if (wdbj.get(i) == true) { PgAlarm alarmRec = new PgAlarm(); alarmRec.setAlarm_date(this.getTime().getTime()); alarmRec.setAlarmdevid(id); alarmRec.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); PgTemphum value = wsDao.findLatestWsdzByDevice(id); if (null != value) { alarmRec.setAlarm_value(NumberFormat.format(value.getTemp(), "0.00")); } deviceDao.addGenerlAlarmRecord(alarmRec); // 推送到上级平台 } if (sdbj.get(i) == true) { PgAlarm alarmRec = new PgAlarm(); alarmRec.setAlarm_date(this.getTime().getTime()); alarmRec.setAlarmdevid(id); alarmRec.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN); PgTemphum value = wsDao.findLatestWsdzByDevice(id); if (null != value) { alarmRec.setAlarm_value(NumberFormat.format(value.getHum(), "0.00")); } deviceDao.addGenerlAlarmRecord(alarmRec); // 推送到上级平台 } } } } @Override public void parseData() { // 获取目标ACU的代码 String acucode = this.getAcucode(); byte[] messageData = this.getResponseData(); // 判断数据的长度是否满足要求 if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".WSALM.WORDCOUNT")) * 2) { logger.error("返回的数据长度与读取的不一致!"); this.setValid(false); return; } // 将数据转换为字符串 // 按照高字在前,低字在后;高字节在前,低字节在后的顺序 String dataStr = ""; for (int c = 0; c < messageData.length; c = c + 2) { dataStr = ByteUtil.binToBinString(new byte[] {messageData[c], messageData[c + 1]}) + dataStr; } PgHjsbblDao blDao = new PgHjsbblDaoImpl(); // 获取目标ACU温湿度监测值内存区域的起始字地址 int start = Integer.parseInt(Configure.getProperty("acubl", acucode + ".WSALM.START")); // 获取目标ACU温湿度相关的资产列表,即温湿度设备列表 String zcListStr = Configure.getProperty("acubl", acucode + ".WS.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 almBlTemObj = blDao.findBlByBh(zcbh + ".TemAH"); if (null == almBlTemObj) { continue; } int awkszdz = almBlTemObj.getKszdz(); //开始字地址 int awoffset = awkszdz - start; //与开始字的偏移量 int awbit = almBlTemObj.getSzw(); //所在位 char bjTemBt = dataStr.charAt(dataStr.length() - 1 - awoffset * 16 - awbit); // 温度报警状态标志位 // 2解析温度浓度报警联动标志位 PgHjsbbl enBlObj = blDao.findBlByBh(zcbh + ".TemEN"); if (null == enBlObj) { continue; } int ewkszdz = enBlObj.getKszdz(); //开始字地址 int ewoffset = ewkszdz - start; //与开始字的偏移量 int ewbit = enBlObj.getSzw(); //所在位 char enTemBt = dataStr.charAt(dataStr.length() - 1 - ewoffset * 16 - ewbit); // 温度联动报警使能标志位 // 3解析湿度报警值 PgHjsbbl almBlWetObj = blDao.findBlByBh(zcbh + ".WetAH"); if (null == almBlWetObj) { continue; } int askszdz = almBlWetObj.getKszdz(); //开始字地址 int asoffset = askszdz - start; //与开始字的偏移量 int asbit = almBlWetObj.getSzw(); //所在位 char bjWetBt = dataStr.charAt(dataStr.length() - 1 - asoffset * 16 - asbit); // 湿度报警状态标志位 // 4解析湿度报警联动标志位 PgHjsbbl enBlWetObj = blDao.findBlByBh(zcbh + ".WetEN"); if (null == enBlWetObj) { continue; } int eskszdz = enBlWetObj.getKszdz(); //开始字地址 int esoffset = eskszdz - start; //与开始字的偏移量 int esbit = enBlWetObj.getSzw(); //所在位 char enWetBt = dataStr.charAt(dataStr.length() - 1 - esoffset * 16 - esbit); // 温湿度浓度联动报警使能标志位 getWdbj().add(bjTemBt == '1' ? true : false); getSdbj().add(bjWetBt == '1' ? true : false); getWdldbj().add(enTemBt == '1' ? true : false); getSdldbj().add(enWetBt == '1' ? true : false); } } }