Newer
Older
pgdsc / src / com / szpg / plc / message / response / read / ReadJgStatusCommandResponse.java
ty-pc\admin on 14 Dec 2019 6 KB 20191214 调试工具设备控制
package com.szpg.plc.message.response.read;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.List;

import com.szpg.db.data.PgJgStat;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;

import com.szpg.db.dao.PgJgDao;
import com.szpg.db.dao.PgDeviceDao;
import com.szpg.db.dao.PgHjsbblDao;
import com.szpg.db.dao.impl.PgJgDaoImpl;
import com.szpg.db.data.PgHjsbbl;
import com.szpg.db.dao.impl.PgDeviceDaoImpl;
import com.szpg.db.dao.impl.PgHjsbblDaoImpl;
import com.szpg.plc.message.response.ReadMemoryCommandResponse;
import com.szpg.plc.util.ByteUtil;
import com.szpg.util.Configure;
import com.szpg.util.TimeFormat;

public class ReadJgStatusCommandResponse extends ReadMemoryCommandResponse {

	/**
	 * 
	 */
	private static final long serialVersionUID = -8618969419223150064L;

	private final Logger logger = Logger.getLogger(this.getClass().getName());
	
	private List<Boolean> jgdk; // 井盖开到位
	private List<Boolean> jggb; // 井盖关到位
	private List<Boolean> jgsd; // 井盖锁定/解锁
	private List<String> jgzt; // 井盖状态(开到位、关到位、半开半关)
	private String[] zcList; //井盖的资产列表,从配置文件中获取
	
	public ReadJgStatusCommandResponse() {
		jgdk = new ArrayList<Boolean>();
		jggb = new ArrayList<Boolean>();
		jgsd = new ArrayList<Boolean>();
		jgzt = new ArrayList<String>();
	}
	
	public List<Boolean> getJgdk() {
		return jgdk;
	}

	public void setJgdk(List<Boolean> jgdk) {
		this.jgdk = jgdk;
	}

	public List<Boolean> getJggb() {
		return jggb;
	}

	public void setJggb(List<Boolean> jggb) {
		this.jggb = jggb;
	}

	public List<Boolean> getJgsd() {
		return jgsd;
	}

	public void setJgsd(List<Boolean> jgsd) {
		this.jgsd = jgsd;
	}

	public List<String> getJgzt() {
		return jgzt;
	}

	public void setJgzt(List<String> jgzt) {
		this.jgzt = jgzt;
	}

	public String[] getZcList() {
		return zcList;
	}

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

	@Override
	public void afterAction() {
		// 1将井盖状态数据存入数据库
		PgJgDao jgDao = new PgJgDaoImpl();
		PgDeviceDao deviceDao = new PgDeviceDaoImpl();
		
		// 遍历资产列表,将井盖状态存入数据库
		for (int i = 0; i < zcList.length; i++) {
			String zcbh = zcList[i];
			
			int id = deviceDao.findDeviceIdByCode(zcbh);
			if (id > 0) {
				deviceDao.updateDeviceStatus(id, jgzt.get(i));

				// 更新风机状态现状表
				PgJgStat temp = jgDao.findLatestStatByDevice(id);
				if (null == temp) {
					jgDao.addJgStatRecord(jgzt.get(i), jgsd.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), id);
				} else {
					jgDao.updateJgStatRecord(jgzt.get(i), jgsd.get(i), TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), id);
				}
			}
		}
	}

	@Override
	public void parseData() {
		// 获取目标ACU的代码
		String acucode = this.getAcucode();
		byte[] messageData = this.getResponseData();
		
		logger.info("开始解析[读取井盖状态][" + acucode + "]指令响应");
		
		// 判断数据的长度是否满足要求
		if (messageData.length != Integer.parseInt(Configure.getProperty("acubl", acucode + ".JGSTAT.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 + ".JGSTAT.START"));
		
		// 获取目标ACU井盖相关的资产列表,即井盖设备列表
		String zcListStr = Configure.getProperty("acubl", acucode + ".JG.ZC.LIST");
		if (StringUtils.isEmpty(zcListStr) == true) {
			this.setValid(false);
			return;
		}
		zcList = zcListStr.split(";");

		// 初始化结果集合
		jgdk = Arrays.asList(new Boolean[zcList.length]);
		jggb = Arrays.asList(new Boolean[zcList.length]);
		jgsd = Arrays.asList(new Boolean[zcList.length]);
		jgzt = Arrays.asList(new String[zcList.length]);
		
		// 解析井盖状态
		for (int i = 0; i < zcList.length; i++) {
			String zcbh = zcList[i];
			
			// 解析井盖打开/关闭状态
			PgHjsbbl openBlObj = blDao.findBlByBh(zcbh + ".OpenS");
			PgHjsbbl closeBlObj = blDao.findBlByBh(zcbh + ".CloseS");
			if (null == openBlObj || null == closeBlObj) {
				continue;
			}
			
			int okszdz = openBlObj.getKszdz(); //开始字地址
			int ooffset = okszdz - start; //与开始字的偏移量
			int obit = openBlObj.getSzw(); //所在位
			
			int ckszdz = closeBlObj.getKszdz(); //开始字地址
			int coffset = ckszdz - start; //与开始字的偏移量
			int cbit = closeBlObj.getSzw(); //所在位

			int indexOpen = dataStr.length() - 1 - ooffset * 16 - obit;
			int indexClose = dataStr.length() - 1 - coffset * 16 - cbit;
			if (indexOpen >= 0 && indexClose >= 0) {

				char openBt = dataStr.charAt(indexOpen); // 井盖开到位标志位
				char closeBt = dataStr.charAt(indexClose); // 井盖关到位标志位

				getJgdk().set(i, openBt == '0' ? true : false); //1-开到位,0-未开到位
				getJggb().set(i, closeBt == '0' ? true : false); //1-关到位,0-未关到位

				// 判断井盖打开状态
				if (openBt == '0' && closeBt == '0') {
					getJgzt().set(i, "半开半闭"); //半开半闭
				} else if (openBt == '1' && closeBt == '0') {
					getJgzt().set(i, "全开"); //全开
				} else if (openBt == '0' && closeBt == '1') {
					getJgzt().set(i, "全关"); //全关
				} else {
					getJgzt().set(i, "数值异常"); //数值异常
				}
			}
			
			// 解析井盖锁定/解锁状态
			PgHjsbbl lockBlObj = blDao.findBlByBh(zcbh + ".Lock");
			if (null == lockBlObj) {
				continue;
			}
			
			int lkszdz = lockBlObj.getKszdz(); //开始字地址
			int loffset = lkszdz - start; //与开始字的偏移量
			int lbit = lockBlObj.getSzw(); //所在位

			int indexLock = dataStr.length() - 1 - loffset * 16 - lbit;
			if (indexLock >= 0) {
				char lockBt = dataStr.charAt(indexLock); // 井盖解锁/锁定标志位
				getJgsd().set(i, lockBt == '0' ? true : false); //0-锁定;1-解锁
			}
			
			logger.info("[" + zcbh + "][井盖状态" + getJgzt().get(i) + "][井盖锁定" + getJgsd().get(i) + "]");
		}
		
		logger.info("解析[读取井盖状态]响应指令结束");
	}

}