Newer
Older
pgdsc / src / com / szpg / task / SetWSThresholdTask.java
ty-pc\admin on 12 Nov 2019 6 KB 20191112 定时任务增加设置host
package com.szpg.task;

import java.util.List;

import org.apache.log4j.Logger;

import com.szpg.db.dao.PgAcuDao;
import com.szpg.db.dao.PgAlarmRuleDao;
import com.szpg.db.dao.PgDeviceDao;
import com.szpg.db.dao.PgHjsbblDao;
import com.szpg.db.dao.impl.PgAcuDaoImpl;
import com.szpg.db.dao.impl.PgAlarmRuleDaoImpl;
import com.szpg.db.dao.impl.PgDeviceDaoImpl;
import com.szpg.db.dao.impl.PgHjsbblDaoImpl;
import com.szpg.db.data.PgAcu;
import com.szpg.db.data.PgAlarmRule;
import com.szpg.db.data.PgDevice;
import com.szpg.db.data.PgHjsbbl;
import com.szpg.plc.message.command.write.SetSdThresholdWordCommand;
import com.szpg.plc.message.command.write.SetWdThresholdWordCommand;
import com.szpg.plc.protocol.DTProtocolInterface;
import com.szpg.plc.protocol.ProtocolFactory;
import com.szpg.plc.protocol.fins.FINSConstants;
import com.szpg.plc.server.ACUClient;
import com.szpg.plc.server.ACUClientUtil;
import com.szpg.plc.util.ByteUtil;
import com.szpg.plc.util.Bytes;
import com.szpg.service.SetSensorThresholdService;
import com.szpg.util.Configure;
import com.szpg.util.NumberFormat;

/**
 * 设置温湿度报警阈值
 * 
 * @author admin
 *
 */
public class SetWSThresholdTask implements Runnable {
	
	private Logger logger = Logger.getLogger(this.getClass().getName());

	private PgHjsbblDao blDao = new PgHjsbblDaoImpl();
	
	public SetWSThresholdTask() {
		
	}

	@Override
	public void run() {
		// 1查找所有的温湿度报警阈值
		PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl();
		PgDeviceDao devDao = new PgDeviceDaoImpl();
		PgAcuDao acuDao = new PgAcuDaoImpl();
		
		List<PgAlarmRule> rules = ruleDao.findRuleListByDevtype("温湿度检测仪");
		if (null != rules && rules.isEmpty() == false) {
			logger.info("开始启动校正温湿度报警阈值 定时任务[" + rules.size() + "]");
			
			for (PgAlarmRule rule : rules) {
				int deviceId = rule.getPgdeviceid();
				double wdHigh = 0.0;
				double sdHigh = 0.0;
				try {
					String highStr = rule.getHighvalue();
					if (null != highStr && highStr.isEmpty() == false && highStr.indexOf(";") > 0) {
						wdHigh = NumberFormat.parseDouble(highStr.split(";")[0], "0.00");
						sdHigh = NumberFormat.parseDouble(highStr.split(";")[1], "0.00");
					}
				} catch (Exception ex) {
					logger.error(ex);
					ex.printStackTrace();
				}
				
				PgDevice device = devDao.findDeviceById(deviceId);
				if (null != device) {
					String deviceCode = device.getAssetcode();
					String acucode = deviceCode.substring(0, deviceCode.indexOf(".", 6));
					PgAcu acu = acuDao.findACUByCode(acucode);
					ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port());
					if (null != client) {
						// 源地址
						String sour = Configure.getProperty("sys", "LOCALHOST.NET") + 
									  Configure.getProperty("sys", "LOCALHOST.NODE") + 
									  Configure.getProperty("sys", "LOCALHOST.UNIT");
						
						// 目标地址
						String dest = client.getNet() + client.getNode() + client.getUnit();
						
						DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol();
						
						// 发送设置温度报警阈值
						SetWdThresholdWordCommand setTemThreCmd = new SetWdThresholdWordCommand();
						setTemThreCmd.setThreshold((float) wdHigh);
						PgHjsbbl temBlObj = blDao.findBlByBh(deviceCode + ".TemSet");
						if (null != temBlObj) {
							setTemThreCmd.setMessageProducerId(sour);
							setTemThreCmd.setMessageProducerHost(client.getHost());
							setTemThreCmd.setDestinationId(dest);
							
							// SID在new对象的时候已经生成
							
							// 内存区域——按字写
							setTemThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD);
							
							int start = temBlObj.getKszdz();
							int end = temBlObj.getJszdz();
							
							// 开始字地址
							setTemThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00");
							
							// 字数
							int n = end - start + 1;
							setTemThreCmd.setCount(n);
							
							// 字内容
							// 根据一期与二期设备不同的处理逻辑生成字节
							Bytes dataByte = SetSensorThresholdService.parseValueToBytes((float) wdHigh, n, client.getFlag());
							setTemThreCmd.setValue( dataByte.toBytes() );
							
							// 解析命令对象为字节数组
							byte[] content = finspi.messageToBytes(setTemThreCmd);
							
							// 通过socket接口发送出去
							ACUClientUtil.getInstance().sendACUCommand(client, content);
						}
						
						// 间隔半秒设置湿度阈值
						try {
							Thread.sleep(500);
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						
						// 发送设置湿度报警阈值
						SetSdThresholdWordCommand setWetThreCmd = new SetSdThresholdWordCommand();
						setWetThreCmd.setThreshold((float) sdHigh);
						PgHjsbbl wetBlObj = blDao.findBlByBh(deviceCode + ".WetSet");
						if (null != wetBlObj) {
							setWetThreCmd.setMessageProducerId(sour);
							setWetThreCmd.setDestinationId(dest);
							
							// SID在new对象的时候已经生成
							
							// 内存区域——按字写
							setWetThreCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD);
							
							int start = wetBlObj.getKszdz();
							int end = wetBlObj.getJszdz();
							
							// 开始字地址
							setWetThreCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00");
							
							// 字数
							int n = end - start + 1;
							setWetThreCmd.setCount(n);
							
							// 字内容
							Bytes dataByte = SetSensorThresholdService.parseValueToBytes((float) sdHigh, n, client.getFlag());
							setWetThreCmd.setValue( dataByte.toBytes() );
							
							// 解析命令对象为字节数组
							byte[] content = finspi.messageToBytes(setWetThreCmd);
							
							// 通过socket接口发送出去
							ACUClientUtil.getInstance().sendACUCommand(client, content);
						}
					}
				}
				
				// 每个设备间隔1秒发送
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			
			logger.info("结束启动校正温湿度报警阈值 定时任务");
		}
	}
}