package com.szpg.rmi; import com.szpg.db.dao.PgAlarmDao; import com.szpg.db.dao.PgDeviceDao; import com.szpg.db.dao.impl.PgAlarmDaoImpl; import com.szpg.db.dao.impl.PgDeviceDaoImpl; import com.szpg.db.data.PgAlarm; import com.szpg.db.data.PgDevice; import com.szpg.util.TimeFormat; import org.apache.log4j.Logger; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; import com.szpg.db.dao.PgAcuDao; import com.szpg.db.dao.PgHjsbblDao; import com.szpg.db.dao.impl.PgAcuDaoImpl; import com.szpg.db.dao.impl.PgHjsbblDaoImpl; import com.szpg.db.data.PgAcu; import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.message.command.write.SetDsRstBitCommand; 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.service.ReadControllerStatusService; import com.szpg.util.Configure; import com.szpg.util.UnicodeConvertor; import z.json.JSONObject; import java.net.URLEncoder; import java.util.Calendar; public class RemoteDSCommandAction extends ActionSupport { /** * */ private static final long serialVersionUID = 2221187086461756012L; private String zcbh; private String format; private String jsoncallback; private Logger logger = Logger.getLogger(this.getClass().getName()); public String getZcbh() { return zcbh; } public void setZcbh(String zcbh) { this.zcbh = zcbh; } public String getFormat() { return format; } public void setFormat(String format) { this.format = format; } public String getJsoncallback() { return jsoncallback; } public void setJsoncallback(String jsoncallback) { this.jsoncallback = jsoncallback; } /** * 读取对射实时状态 * @return * @throws Exception */ public String readDsStatus() throws Exception { // 返回结果 JSONObject jResult = new JSONObject(); PgAcuDao acuDao = new PgAcuDaoImpl(); if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; } String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); PgAcu acu = acuDao.findACUByCode(acucode); if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; } ACUClient client = ACUClientUtil.getInstance().getClients().get(acu.getAcu_host() + ":" + acu.getAcu_port()); if (null != client) { ReadMemoryCommand command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READDSSTATUS); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); command.setMessageProducerId(sour); command.setMessageProducerHost(client.getHost()); String dest = client.getNet() + client.getNode() + client.getUnit(); command.setDestinationId(dest); command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); //按字读取内容 try { // 设置读取的地址范围 // 从配置文件读取而来 command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".DSALM.START")), 2)) + "00"); command.setCountWord(Integer.parseInt(Configure.getProperty("acubl", client.getAcucode() + ".DSALM.WORDCOUNT"))); // 调用服务过程执行命令发送服务 ReadControllerStatusService service = new ReadControllerStatusService(); service.executeService(client, command); logger.info(command); } catch (Exception ex) { logger.error("发送查询对射指令异常" + ex); } jResult.put("success", true); jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); returnToFront(jResult); return null; } else { jResult.put("success", false); jResult.put("code", "3"); jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; } } /** * 清除对射报警 * @return * @throws Exception */ public String clearDsAlarm() throws Exception { // 返回结果 JSONObject jResult = new JSONObject(); if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); jResult.put("resaon", UnicodeConvertor.string2Unicode("资产编号为空")); returnToFront(jResult); return null; } // 查找ACU的信息 PgAcuDao acuDao = new PgAcuDaoImpl(); String acucode = zcbh.substring(0, zcbh.indexOf(".", 6)); PgAcu acu = acuDao.findACUByCode(acucode); if (null == acu) { jResult.put("success", false); jResult.put("code", "2"); jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到资产对应的PLC主机")); returnToFront(jResult); return null; } 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(); PgHjsbblDao blDao = new PgHjsbblDaoImpl(); // 构建指令 SetDsRstBitCommand rstCmd = new SetDsRstBitCommand(); rstCmd.setRst(SetDsRstBitCommand.DS_RST); PgHjsbbl rstBlObj = blDao.findBlByBh(zcbh + ".RST"); if (null != rstBlObj) { rstCmd.setMessageProducerId(sour); rstCmd.setDestinationId(dest); rstCmd.setMessageProducerHost(client.getHost()); // SID在new对象的时候已经生成 // 内存区域——按位写 rstCmd.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_BIT); int start = rstBlObj.getKszdz(); int end = rstBlObj.getJszdz(); int bit = rstBlObj.getSzw(); // 开始字地址 rstCmd.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2))); // 位地址 rstCmd.setBit(bit); // 位数 rstCmd.setCount(end - start + 1); // 位内容 rstCmd.setValue(new byte[] {(byte) SetDsRstBitCommand.DS_RST} ); // 解析命令对象为字节数组 byte[] content = finspi.messageToBytes(rstCmd); // 通过socket接口发送出去 ACUClientUtil.getInstance().sendACUCommand(client, content); } else { jResult.put("success", false); jResult.put("code", "4"); jResult.put("reason", UnicodeConvertor.string2Unicode("未找到资产对应的解锁井盖变量")); returnToFront(jResult); return null; } // 返回成功给界面 jResult.put("success", true); jResult.put("code", "0"); returnToFront(jResult); return null; } else { jResult.put("success", false); jResult.put("code", "3"); jResult.put("resaon", UnicodeConvertor.string2Unicode("PLC主机不在线")); returnToFront(jResult); return null; } } public String readDsStatusFromDB() throws Exception { // 返回结果 JSONObject jResult = new JSONObject(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); PgAlarmDao alarmDao = new PgAlarmDaoImpl(); PgDevice device = deviceDao.findDeviceByCode(zcbh); if (null != device) { JSONObject obj = new JSONObject(); if (null != device.getIsopen() && device.getIsopen().indexOf("入侵") > 0) { PgAlarm alarm = alarmDao.findLatestAlarmByDevice(device.getId()); if (null != alarm) { obj.put("alm", null != alarm.getDescription() ? URLEncoder.encode(alarm.getDescription(), "UTF-8") : ""); obj.put("time", TimeFormat.formatTimestamp(alarm.getAlarm_date())); } } else { obj.put("alm", URLEncoder.encode("正常", "UTF-8")); obj.put("time", TimeFormat.formatTimestamp(Calendar.getInstance().getTime())); } jResult.put("dsStat", obj); } returnToFront(jResult); return null; } /** * 给前端返回 * @param jResult * @throws Exception */ private void returnToFront(JSONObject jResult) throws Exception { // 返回jsonp格式的数据 if (null != format && format.equalsIgnoreCase("jsonp") == true) { ServletActionContext.getResponse().getWriter().write(jsoncallback + "(" + jResult.toString() + ");"); } ServletActionContext.getResponse().getWriter().write(jResult.toString()); } }