package com.szpg.rmi; import com.szpg.db.dao.*; import com.szpg.db.dao.impl.*; import com.szpg.db.data.PgO2; import com.szpg.db.data.PgSH; import com.szpg.plc.message.command.write.SetHSThresholdWordCommand; import org.apache.log4j.Logger; import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; 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.WriteMemoryCommand; 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.ReadSensorValueService; import com.szpg.service.SetSensorThresholdService; import com.szpg.util.Configure; import com.szpg.util.NumberFormat; import com.szpg.util.UnicodeConvertor; import z.json.JSONObject; public class RemoteHSCommandAction extends ActionSupport { /** * */ private static final long serialVersionUID = 2221187086461756012L; private String zcbh; private String threshold; private String format; private String jsoncallback; public String getZcbh() { return zcbh; } public void setZcbh(String zcbh) { this.zcbh = zcbh; } public String getThreshold() { return threshold; } public void setThreshold(String threshold) { this.threshold = threshold; } 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 readHSValue() 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_READHSVALUE); // 二期设备发送查询硫化氢及甲烷指令 if (client.getFlag().equals("23") || client.getFlag().equals("24")) { command = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READHSCH4VALUE); } 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_DM_AREA); try { // 没有找到对应的配置项,直接返回 String start = ""; String countWord = ""; if (client.getFlag().equals("11")) { // 一期PLC配置 start = Configure.getProperty("acubl", client.getAcucode() + ".HS.START"); countWord = Configure.getProperty("acubl", client.getAcucode() + ".HS.WORDCOUNT"); } else if (client.getFlag().equals("23") || client.getFlag().equals("24")) { // 二期PLC配置 start = Configure.getProperty("acubl", client.getAcucode() + ".HSCH4.START"); countWord = Configure.getProperty("acubl", client.getAcucode() + ".HSCH4.WORDCOUNT"); } if (null == start || start.equals("")) { jResult.put("success", false); jResult.put("code", "4"); jResult.put("resaon", UnicodeConvertor.string2Unicode("未找到对应的变量配置项")); returnToFront(jResult); return null; } // 设置读取的地址范围 command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(start), 2)) + "00"); command.setCountWord(Integer.parseInt(countWord)); // 调用服务过程执行命令发送服务 ReadSensorValueService service = new ReadSensorValueService(); service.executeService(client, (ReadMemoryCommand) command); Logger.getLogger(this.getClass().getName()).info(command); } catch (Exception ex) { Logger.getLogger(getClass().getName()).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 setHSThreshold() throws Exception { // 返回结果 JSONObject jResult = new JSONObject(); PgAcuDao acuDao = new PgAcuDaoImpl(); PgHjsbblDao blDao = new PgHjsbblDaoImpl(); 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) { WriteMemoryCommand command = WriteMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_SETHSTHRESHOLD); // 源地址 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(); PgHjsbbl blObj = blDao.findBlByBh(zcbh + ".Set"); if (null != blObj) { // SID在new对象的时候已经生成 command.setMessageProducerId(sour); command.setMessageProducerHost(client.getHost()); command.setDestinationId(dest); command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); ((SetHSThresholdWordCommand) command).setThreshold(Float.parseFloat(threshold)); int start = blObj.getKszdz(); int end = blObj.getJszdz(); // 开始字地址 command.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(start, 2)) + "00"); // 字数 int n = end - start + 1; command.setCount(n); // 字内容 Bytes dataByte = SetSensorThresholdService.parseValueToBytes((float) NumberFormat.parseDouble(threshold, "0.00"), n, client.getFlag()); command.setValue( dataByte.toBytes() ); // 调用服务过程执行命令发送服务 SetSensorThresholdService service = new SetSensorThresholdService(); service.executeService(client, command); Logger.getLogger(this.getClass().getName()).info(command); jResult.put("success", true); jResult.put("resaon", UnicodeConvertor.string2Unicode("发送成功,请等待响应")); // 修改数据库中的报警阈值 PgAlarmRuleDao ruleDao = new PgAlarmRuleDaoImpl(); PgDeviceDao devDao = new PgDeviceDaoImpl(); int deviceId = devDao.findDeviceIdByCode(zcbh); if (deviceId > 0) { try { // 更新阈值 ruleDao.updateHighThresholdByDevice(deviceId, NumberFormat.parseDouble(threshold, "0.00")); } catch (Exception ex) { ex.printStackTrace(); } } returnToFront(jResult); return null; } else { jResult.put("success", false); jResult.put("code", "4"); 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; } } public String readHSValueFromDB() throws Exception { // 返回结果 JSONObject jResult = new JSONObject(); PgDeviceDao deviceDao = new PgDeviceDaoImpl(); PgHSDao dao = new PgHSDaoImpl(); int deviceId = deviceDao.findDeviceIdByCode(zcbh); if (deviceId > 0) { PgSH hs = dao.findLatestPblzByDevice(deviceId); if (null != hs) { jResult.put("data", hs.toJson()); } } 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()); } }