Newer
Older
pgdsc / src / com / szpg / plc / message / response / read / ReadO2StatusCommandResponse.java
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.PgO2Dao;
import com.szpg.db.dao.impl.PgDeviceDaoImpl;
import com.szpg.db.dao.impl.PgHjsbblDaoImpl;
import com.szpg.db.dao.impl.PgO2DaoImpl;
import com.szpg.db.data.PgAlarm;
import com.szpg.db.data.PgHjsbbl;
import com.szpg.db.data.PgO2;
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 ReadO2StatusCommandResponse extends ReadMemoryCommandResponse {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 2070206047602742122L;

	private final Logger logger = Logger.getLogger(this.getClass().getName());
	
	private List<Boolean> o2bj; // 氧气浓度报警状态
	private List<Boolean> o2ldbj; // 氧气是否联动报警
	private String[] zcList; //氧气监测的资产列表,从配置文件中获取

	public ReadO2StatusCommandResponse() {
		o2bj = new ArrayList<Boolean>();
		o2ldbj = new ArrayList<Boolean>();
	}

	public List<Boolean> getO2bj() {
		return o2bj;
	}

	public void setO2bj(List<Boolean> o2bj) {
		this.o2bj = o2bj;
	}

	public List<Boolean> getO2ldbj() {
		return o2ldbj;
	}

	public void setO2ldbj(List<Boolean> o2ldbj) {
		this.o2ldbj = o2ldbj;
	}
	
	public String[] getZcList() {
		return zcList;
	}

	public void setZcList(String[] zcList) {
		this.zcList = zcList;
	}

	@Override
	public void afterAction() {
		// 1将氧气报警状态数据存入数据库
		PgO2Dao o2Dao = new PgO2DaoImpl();
		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 (o2bj.get(i) == true) {
					PgAlarm alarmRec = new PgAlarm();
					alarmRec.setAlarm_date(this.getTime().getTime());
					alarmRec.setAlarmdevid(id);
					alarmRec.setAlarmtypeid(PgAlarm.ALARM_TYPE_PGRUN);
					
					PgO2 value = o2Dao.findLatestPblzByDevice(id);
					if (null != value) {
						alarmRec.setAlarm_value(NumberFormat.format(value.getO2(), "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 + ".YQALM.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 + ".YQALM.START"));
		
		// 获取目标ACU氧气相关的资产列表,即氧气设备列表
		String zcListStr = Configure.getProperty("acubl", acucode + ".YQ.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];
			
			// 解析氧气浓度报警值
			PgHjsbbl almBlObj = blDao.findBlByBh(zcbh + ".AH");
			if (null == almBlObj) {
				continue;
			}
			
			int akszdz = almBlObj.getKszdz(); //开始字地址
			int aoffset = akszdz - start; //与开始字的偏移量
			int abit = almBlObj.getSzw(); //所在位
			
			char bjBt = dataStr.charAt(dataStr.length() - 1 - aoffset * 16 - abit); // 氧气浓度报警状态标志位
			
			// 解析氧气浓度报警联动标志位
			PgHjsbbl enBlObj = blDao.findBlByBh(zcbh + ".EN");
			if (null == enBlObj) {
				continue;
			}
			
			int ekszdz = enBlObj.getKszdz(); //开始字地址
			int eoffset = ekszdz - start; //与开始字的偏移量
			int ebit = enBlObj.getSzw(); //所在位
			
			char enBt = dataStr.charAt(dataStr.length() - 1 - eoffset * 16 - ebit); // 氧气浓度联动报警使能标志位
			
			getO2bj().add(bjBt == '1' ? true : false);
			getO2ldbj().add(enBt == '1' ? true : false);
		}
	}

}