diff --git a/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java index fe487b7..e1de835 100644 --- a/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java @@ -181,6 +181,8 @@ char lockBt = dataStr.charAt(dataStr.length() - 1 - loffset * 16 - lbit); // 井盖解锁/锁定标志位 getJgsd().add(lockBt == '0' ? true : false); //0-锁定;1-解锁 + + logger.info("[" + zcbh + "][井盖状态" + getJgzt().get(i) + "][井盖锁定" + getJgsd().get(i) + "]"); } logger.info("解析[读取井盖状态]响应指令结束"); diff --git a/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java index fe487b7..e1de835 100644 --- a/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java @@ -181,6 +181,8 @@ char lockBt = dataStr.charAt(dataStr.length() - 1 - loffset * 16 - lbit); // 井盖解锁/锁定标志位 getJgsd().add(lockBt == '0' ? true : false); //0-锁定;1-解锁 + + logger.info("[" + zcbh + "][井盖状态" + getJgzt().get(i) + "][井盖锁定" + getJgsd().get(i) + "]"); } logger.info("解析[读取井盖状态]响应指令结束"); diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index fda3077..4366960 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -167,7 +167,7 @@ String fjzcbh = fj.getAssetcode(); // 调用远程接口启动风机 - HttpRequest.sendGet(baseURL + "remote/turnOnFj.do", "zcbh=" + fjzcbh); + HttpRequest.sendGet(baseURL + "remote/turnOnFj.action", "zcbh=" + fjzcbh); } } } diff --git a/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java index fe487b7..e1de835 100644 --- a/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java @@ -181,6 +181,8 @@ char lockBt = dataStr.charAt(dataStr.length() - 1 - loffset * 16 - lbit); // 井盖解锁/锁定标志位 getJgsd().add(lockBt == '0' ? true : false); //0-锁定;1-解锁 + + logger.info("[" + zcbh + "][井盖状态" + getJgzt().get(i) + "][井盖锁定" + getJgsd().get(i) + "]"); } logger.info("解析[读取井盖状态]响应指令结束"); diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index fda3077..4366960 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -167,7 +167,7 @@ String fjzcbh = fj.getAssetcode(); // 调用远程接口启动风机 - HttpRequest.sendGet(baseURL + "remote/turnOnFj.do", "zcbh=" + fjzcbh); + HttpRequest.sendGet(baseURL + "remote/turnOnFj.action", "zcbh=" + fjzcbh); } } } diff --git a/src/com/szpg/rmi/RemoteCH4CommandAction.java b/src/com/szpg/rmi/RemoteCH4CommandAction.java index aff3866..cb63ae1 100644 --- a/src/com/szpg/rmi/RemoteCH4CommandAction.java +++ b/src/com/szpg/rmi/RemoteCH4CommandAction.java @@ -201,7 +201,7 @@ command.setMessageProducerId(sour); command.setDestinationId(dest); - command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); int start = blObj.getKszdz(); int end = blObj.getJszdz(); diff --git a/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java index fe487b7..e1de835 100644 --- a/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java @@ -181,6 +181,8 @@ char lockBt = dataStr.charAt(dataStr.length() - 1 - loffset * 16 - lbit); // 井盖解锁/锁定标志位 getJgsd().add(lockBt == '0' ? true : false); //0-锁定;1-解锁 + + logger.info("[" + zcbh + "][井盖状态" + getJgzt().get(i) + "][井盖锁定" + getJgsd().get(i) + "]"); } logger.info("解析[读取井盖状态]响应指令结束"); diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index fda3077..4366960 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -167,7 +167,7 @@ String fjzcbh = fj.getAssetcode(); // 调用远程接口启动风机 - HttpRequest.sendGet(baseURL + "remote/turnOnFj.do", "zcbh=" + fjzcbh); + HttpRequest.sendGet(baseURL + "remote/turnOnFj.action", "zcbh=" + fjzcbh); } } } diff --git a/src/com/szpg/rmi/RemoteCH4CommandAction.java b/src/com/szpg/rmi/RemoteCH4CommandAction.java index aff3866..cb63ae1 100644 --- a/src/com/szpg/rmi/RemoteCH4CommandAction.java +++ b/src/com/szpg/rmi/RemoteCH4CommandAction.java @@ -201,7 +201,7 @@ command.setMessageProducerId(sour); command.setDestinationId(dest); - command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); int start = blObj.getKszdz(); int end = blObj.getJszdz(); diff --git a/src/com/szpg/rmi/RemoteCOCommandAction.java b/src/com/szpg/rmi/RemoteCOCommandAction.java index dde2ac3..728211c 100644 --- a/src/com/szpg/rmi/RemoteCOCommandAction.java +++ b/src/com/szpg/rmi/RemoteCOCommandAction.java @@ -201,7 +201,7 @@ command.setMessageProducerId(sour); command.setDestinationId(dest); - command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); int start = blObj.getKszdz(); int end = blObj.getJszdz(); diff --git a/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java index fe487b7..e1de835 100644 --- a/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java @@ -181,6 +181,8 @@ char lockBt = dataStr.charAt(dataStr.length() - 1 - loffset * 16 - lbit); // 井盖解锁/锁定标志位 getJgsd().add(lockBt == '0' ? true : false); //0-锁定;1-解锁 + + logger.info("[" + zcbh + "][井盖状态" + getJgzt().get(i) + "][井盖锁定" + getJgsd().get(i) + "]"); } logger.info("解析[读取井盖状态]响应指令结束"); diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index fda3077..4366960 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -167,7 +167,7 @@ String fjzcbh = fj.getAssetcode(); // 调用远程接口启动风机 - HttpRequest.sendGet(baseURL + "remote/turnOnFj.do", "zcbh=" + fjzcbh); + HttpRequest.sendGet(baseURL + "remote/turnOnFj.action", "zcbh=" + fjzcbh); } } } diff --git a/src/com/szpg/rmi/RemoteCH4CommandAction.java b/src/com/szpg/rmi/RemoteCH4CommandAction.java index aff3866..cb63ae1 100644 --- a/src/com/szpg/rmi/RemoteCH4CommandAction.java +++ b/src/com/szpg/rmi/RemoteCH4CommandAction.java @@ -201,7 +201,7 @@ command.setMessageProducerId(sour); command.setDestinationId(dest); - command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); int start = blObj.getKszdz(); int end = blObj.getJszdz(); diff --git a/src/com/szpg/rmi/RemoteCOCommandAction.java b/src/com/szpg/rmi/RemoteCOCommandAction.java index dde2ac3..728211c 100644 --- a/src/com/szpg/rmi/RemoteCOCommandAction.java +++ b/src/com/szpg/rmi/RemoteCOCommandAction.java @@ -201,7 +201,7 @@ command.setMessageProducerId(sour); command.setDestinationId(dest); - command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); int start = blObj.getKszdz(); int end = blObj.getJszdz(); diff --git a/src/com/szpg/rmi/RemoteDSCommandAction.java b/src/com/szpg/rmi/RemoteDSCommandAction.java new file mode 100644 index 0000000..d1ec179 --- /dev/null +++ b/src/com/szpg/rmi/RemoteDSCommandAction.java @@ -0,0 +1,257 @@ +package com.szpg.rmi; + +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; + +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); + + 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); + + // 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; + } + } + + /** + * 给前端返回 + * @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()); + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java index fe487b7..e1de835 100644 --- a/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java @@ -181,6 +181,8 @@ char lockBt = dataStr.charAt(dataStr.length() - 1 - loffset * 16 - lbit); // 井盖解锁/锁定标志位 getJgsd().add(lockBt == '0' ? true : false); //0-锁定;1-解锁 + + logger.info("[" + zcbh + "][井盖状态" + getJgzt().get(i) + "][井盖锁定" + getJgsd().get(i) + "]"); } logger.info("解析[读取井盖状态]响应指令结束"); diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index fda3077..4366960 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -167,7 +167,7 @@ String fjzcbh = fj.getAssetcode(); // 调用远程接口启动风机 - HttpRequest.sendGet(baseURL + "remote/turnOnFj.do", "zcbh=" + fjzcbh); + HttpRequest.sendGet(baseURL + "remote/turnOnFj.action", "zcbh=" + fjzcbh); } } } diff --git a/src/com/szpg/rmi/RemoteCH4CommandAction.java b/src/com/szpg/rmi/RemoteCH4CommandAction.java index aff3866..cb63ae1 100644 --- a/src/com/szpg/rmi/RemoteCH4CommandAction.java +++ b/src/com/szpg/rmi/RemoteCH4CommandAction.java @@ -201,7 +201,7 @@ command.setMessageProducerId(sour); command.setDestinationId(dest); - command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); int start = blObj.getKszdz(); int end = blObj.getJszdz(); diff --git a/src/com/szpg/rmi/RemoteCOCommandAction.java b/src/com/szpg/rmi/RemoteCOCommandAction.java index dde2ac3..728211c 100644 --- a/src/com/szpg/rmi/RemoteCOCommandAction.java +++ b/src/com/szpg/rmi/RemoteCOCommandAction.java @@ -201,7 +201,7 @@ command.setMessageProducerId(sour); command.setDestinationId(dest); - command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); int start = blObj.getKszdz(); int end = blObj.getJszdz(); diff --git a/src/com/szpg/rmi/RemoteDSCommandAction.java b/src/com/szpg/rmi/RemoteDSCommandAction.java new file mode 100644 index 0000000..d1ec179 --- /dev/null +++ b/src/com/szpg/rmi/RemoteDSCommandAction.java @@ -0,0 +1,257 @@ +package com.szpg.rmi; + +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; + +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); + + 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); + + // 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; + } + } + + /** + * 给前端返回 + * @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()); + } + +} diff --git a/src/com/szpg/rmi/RemoteFJCommandAction.java b/src/com/szpg/rmi/RemoteFJCommandAction.java index b0a1ed1..81510c8 100644 --- a/src/com/szpg/rmi/RemoteFJCommandAction.java +++ b/src/com/szpg/rmi/RemoteFJCommandAction.java @@ -4,14 +4,10 @@ import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; -import com.szpg.db.dao.PgAcuCmdDao; import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; import com.szpg.db.dao.impl.PgAcuDaoImpl; import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.CommandResponse; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.message.command.write.SetFjOffBitCommand; import com.szpg.plc.message.command.write.SetFjOnBitCommand; @@ -24,6 +20,7 @@ import com.szpg.service.ReadControllerStatusService; import com.szpg.service.command.ExhaustFanCommandService; import com.szpg.util.Configure; +import com.szpg.util.HttpRequest; import com.szpg.util.UnicodeConvertor; import z.json.JSONObject; @@ -120,7 +117,7 @@ service.executeService(client, command); logger.info(command); } catch (Exception ex) { - logger.error("发送查询温湿度指令异常" + ex); + logger.error("发送查询风机状态指令异常" + ex); } jResult.put("success", true); @@ -194,6 +191,7 @@ // 通过socket接口发送出去 ACUClientUtil.getInstance().sendACUCommand(client, content); + Logger.getLogger(this.getClass().getName()).info(setOnCmd); } else { jResult.put("success", false); jResult.put("code", "4"); @@ -203,72 +201,27 @@ return null; } - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOnCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOnCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); - - returnToFront(jResult); - return null; - } + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + Thread.sleep(1 * 1000); + setOnCmd = ExhaustFanCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + Logger.getLogger(this.getClass().getName()).info("[打开风机置1位复位]"); } - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 - setOnCmd = ExhaustFanCommandService.buildResetTurnOnCommand(sour, dest, zcbh); - if (null != setOnCmd) { - byte[] content = finspi.messageToBytes(setOnCmd); - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); - - returnToFront(jResult); - return null; - } + // 5秒后查询一次风机的状态 + Thread.sleep(5 * 1000); + // 调用远程接口查询风机状态 + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/readFjStatus.action", "zcbh=" + zcbh); + + // 返回成功给界面 + jResult.put("success", true); + jResult.put("code", "0"); + returnToFront(jResult); + + return null; } else { jResult.put("success", false); jResult.put("code", "3"); @@ -334,6 +287,7 @@ // 通过socket接口发送出去 ACUClientUtil.getInstance().sendACUCommand(client, content); + Logger.getLogger(this.getClass().getName()).info(setOffCmd); } else { jResult.put("success", false); jResult.put("code", "4"); @@ -343,72 +297,27 @@ return null; } - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOffCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOffCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); - - returnToFront(jResult); - return null; - } + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + Thread.sleep(1 * 1000); + setOffCmd = ExhaustFanCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + Logger.getLogger(this.getClass().getName()).info("[关闭风机置1位复位]"); } - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 - setOffCmd = ExhaustFanCommandService.buildResetTurnOffCommand(sour, dest, zcbh); - if (null != setOffCmd) { - byte[] content = finspi.messageToBytes(setOffCmd); - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); - - returnToFront(jResult); - return null; - } + // 5秒后查询一次照明的状态 + Thread.sleep(5 * 1000); + // 调用远程接口查询风机状态 + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/readFjStatus.action", "zcbh=" + zcbh); + + // 返回成功给界面 + jResult.put("success", true); + jResult.put("code", "0"); + returnToFront(jResult); + + return null; } else { jResult.put("success", false); jResult.put("code", "3"); diff --git a/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java index fe487b7..e1de835 100644 --- a/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java @@ -181,6 +181,8 @@ char lockBt = dataStr.charAt(dataStr.length() - 1 - loffset * 16 - lbit); // 井盖解锁/锁定标志位 getJgsd().add(lockBt == '0' ? true : false); //0-锁定;1-解锁 + + logger.info("[" + zcbh + "][井盖状态" + getJgzt().get(i) + "][井盖锁定" + getJgsd().get(i) + "]"); } logger.info("解析[读取井盖状态]响应指令结束"); diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index fda3077..4366960 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -167,7 +167,7 @@ String fjzcbh = fj.getAssetcode(); // 调用远程接口启动风机 - HttpRequest.sendGet(baseURL + "remote/turnOnFj.do", "zcbh=" + fjzcbh); + HttpRequest.sendGet(baseURL + "remote/turnOnFj.action", "zcbh=" + fjzcbh); } } } diff --git a/src/com/szpg/rmi/RemoteCH4CommandAction.java b/src/com/szpg/rmi/RemoteCH4CommandAction.java index aff3866..cb63ae1 100644 --- a/src/com/szpg/rmi/RemoteCH4CommandAction.java +++ b/src/com/szpg/rmi/RemoteCH4CommandAction.java @@ -201,7 +201,7 @@ command.setMessageProducerId(sour); command.setDestinationId(dest); - command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); int start = blObj.getKszdz(); int end = blObj.getJszdz(); diff --git a/src/com/szpg/rmi/RemoteCOCommandAction.java b/src/com/szpg/rmi/RemoteCOCommandAction.java index dde2ac3..728211c 100644 --- a/src/com/szpg/rmi/RemoteCOCommandAction.java +++ b/src/com/szpg/rmi/RemoteCOCommandAction.java @@ -201,7 +201,7 @@ command.setMessageProducerId(sour); command.setDestinationId(dest); - command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); int start = blObj.getKszdz(); int end = blObj.getJszdz(); diff --git a/src/com/szpg/rmi/RemoteDSCommandAction.java b/src/com/szpg/rmi/RemoteDSCommandAction.java new file mode 100644 index 0000000..d1ec179 --- /dev/null +++ b/src/com/szpg/rmi/RemoteDSCommandAction.java @@ -0,0 +1,257 @@ +package com.szpg.rmi; + +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; + +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); + + 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); + + // 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; + } + } + + /** + * 给前端返回 + * @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()); + } + +} diff --git a/src/com/szpg/rmi/RemoteFJCommandAction.java b/src/com/szpg/rmi/RemoteFJCommandAction.java index b0a1ed1..81510c8 100644 --- a/src/com/szpg/rmi/RemoteFJCommandAction.java +++ b/src/com/szpg/rmi/RemoteFJCommandAction.java @@ -4,14 +4,10 @@ import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; -import com.szpg.db.dao.PgAcuCmdDao; import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; import com.szpg.db.dao.impl.PgAcuDaoImpl; import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.CommandResponse; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.message.command.write.SetFjOffBitCommand; import com.szpg.plc.message.command.write.SetFjOnBitCommand; @@ -24,6 +20,7 @@ import com.szpg.service.ReadControllerStatusService; import com.szpg.service.command.ExhaustFanCommandService; import com.szpg.util.Configure; +import com.szpg.util.HttpRequest; import com.szpg.util.UnicodeConvertor; import z.json.JSONObject; @@ -120,7 +117,7 @@ service.executeService(client, command); logger.info(command); } catch (Exception ex) { - logger.error("发送查询温湿度指令异常" + ex); + logger.error("发送查询风机状态指令异常" + ex); } jResult.put("success", true); @@ -194,6 +191,7 @@ // 通过socket接口发送出去 ACUClientUtil.getInstance().sendACUCommand(client, content); + Logger.getLogger(this.getClass().getName()).info(setOnCmd); } else { jResult.put("success", false); jResult.put("code", "4"); @@ -203,72 +201,27 @@ return null; } - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOnCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOnCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); - - returnToFront(jResult); - return null; - } + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + Thread.sleep(1 * 1000); + setOnCmd = ExhaustFanCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + Logger.getLogger(this.getClass().getName()).info("[打开风机置1位复位]"); } - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 - setOnCmd = ExhaustFanCommandService.buildResetTurnOnCommand(sour, dest, zcbh); - if (null != setOnCmd) { - byte[] content = finspi.messageToBytes(setOnCmd); - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); - - returnToFront(jResult); - return null; - } + // 5秒后查询一次风机的状态 + Thread.sleep(5 * 1000); + // 调用远程接口查询风机状态 + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/readFjStatus.action", "zcbh=" + zcbh); + + // 返回成功给界面 + jResult.put("success", true); + jResult.put("code", "0"); + returnToFront(jResult); + + return null; } else { jResult.put("success", false); jResult.put("code", "3"); @@ -334,6 +287,7 @@ // 通过socket接口发送出去 ACUClientUtil.getInstance().sendACUCommand(client, content); + Logger.getLogger(this.getClass().getName()).info(setOffCmd); } else { jResult.put("success", false); jResult.put("code", "4"); @@ -343,72 +297,27 @@ return null; } - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOffCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOffCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); - - returnToFront(jResult); - return null; - } + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + Thread.sleep(1 * 1000); + setOffCmd = ExhaustFanCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + Logger.getLogger(this.getClass().getName()).info("[关闭风机置1位复位]"); } - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 - setOffCmd = ExhaustFanCommandService.buildResetTurnOffCommand(sour, dest, zcbh); - if (null != setOffCmd) { - byte[] content = finspi.messageToBytes(setOffCmd); - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); - - returnToFront(jResult); - return null; - } + // 5秒后查询一次照明的状态 + Thread.sleep(5 * 1000); + // 调用远程接口查询风机状态 + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/readFjStatus.action", "zcbh=" + zcbh); + + // 返回成功给界面 + jResult.put("success", true); + jResult.put("code", "0"); + returnToFront(jResult); + + return null; } else { jResult.put("success", false); jResult.put("code", "3"); diff --git a/src/com/szpg/rmi/RemoteHSCommandAction.java b/src/com/szpg/rmi/RemoteHSCommandAction.java index b074b7b..97144c2 100644 --- a/src/com/szpg/rmi/RemoteHSCommandAction.java +++ b/src/com/szpg/rmi/RemoteHSCommandAction.java @@ -201,7 +201,7 @@ command.setMessageProducerId(sour); command.setDestinationId(dest); - command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); int start = blObj.getKszdz(); int end = blObj.getJszdz(); diff --git a/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java index fe487b7..e1de835 100644 --- a/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java @@ -181,6 +181,8 @@ char lockBt = dataStr.charAt(dataStr.length() - 1 - loffset * 16 - lbit); // 井盖解锁/锁定标志位 getJgsd().add(lockBt == '0' ? true : false); //0-锁定;1-解锁 + + logger.info("[" + zcbh + "][井盖状态" + getJgzt().get(i) + "][井盖锁定" + getJgsd().get(i) + "]"); } logger.info("解析[读取井盖状态]响应指令结束"); diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index fda3077..4366960 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -167,7 +167,7 @@ String fjzcbh = fj.getAssetcode(); // 调用远程接口启动风机 - HttpRequest.sendGet(baseURL + "remote/turnOnFj.do", "zcbh=" + fjzcbh); + HttpRequest.sendGet(baseURL + "remote/turnOnFj.action", "zcbh=" + fjzcbh); } } } diff --git a/src/com/szpg/rmi/RemoteCH4CommandAction.java b/src/com/szpg/rmi/RemoteCH4CommandAction.java index aff3866..cb63ae1 100644 --- a/src/com/szpg/rmi/RemoteCH4CommandAction.java +++ b/src/com/szpg/rmi/RemoteCH4CommandAction.java @@ -201,7 +201,7 @@ command.setMessageProducerId(sour); command.setDestinationId(dest); - command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); int start = blObj.getKszdz(); int end = blObj.getJszdz(); diff --git a/src/com/szpg/rmi/RemoteCOCommandAction.java b/src/com/szpg/rmi/RemoteCOCommandAction.java index dde2ac3..728211c 100644 --- a/src/com/szpg/rmi/RemoteCOCommandAction.java +++ b/src/com/szpg/rmi/RemoteCOCommandAction.java @@ -201,7 +201,7 @@ command.setMessageProducerId(sour); command.setDestinationId(dest); - command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); int start = blObj.getKszdz(); int end = blObj.getJszdz(); diff --git a/src/com/szpg/rmi/RemoteDSCommandAction.java b/src/com/szpg/rmi/RemoteDSCommandAction.java new file mode 100644 index 0000000..d1ec179 --- /dev/null +++ b/src/com/szpg/rmi/RemoteDSCommandAction.java @@ -0,0 +1,257 @@ +package com.szpg.rmi; + +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; + +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); + + 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); + + // 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; + } + } + + /** + * 给前端返回 + * @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()); + } + +} diff --git a/src/com/szpg/rmi/RemoteFJCommandAction.java b/src/com/szpg/rmi/RemoteFJCommandAction.java index b0a1ed1..81510c8 100644 --- a/src/com/szpg/rmi/RemoteFJCommandAction.java +++ b/src/com/szpg/rmi/RemoteFJCommandAction.java @@ -4,14 +4,10 @@ import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; -import com.szpg.db.dao.PgAcuCmdDao; import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; import com.szpg.db.dao.impl.PgAcuDaoImpl; import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.CommandResponse; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.message.command.write.SetFjOffBitCommand; import com.szpg.plc.message.command.write.SetFjOnBitCommand; @@ -24,6 +20,7 @@ import com.szpg.service.ReadControllerStatusService; import com.szpg.service.command.ExhaustFanCommandService; import com.szpg.util.Configure; +import com.szpg.util.HttpRequest; import com.szpg.util.UnicodeConvertor; import z.json.JSONObject; @@ -120,7 +117,7 @@ service.executeService(client, command); logger.info(command); } catch (Exception ex) { - logger.error("发送查询温湿度指令异常" + ex); + logger.error("发送查询风机状态指令异常" + ex); } jResult.put("success", true); @@ -194,6 +191,7 @@ // 通过socket接口发送出去 ACUClientUtil.getInstance().sendACUCommand(client, content); + Logger.getLogger(this.getClass().getName()).info(setOnCmd); } else { jResult.put("success", false); jResult.put("code", "4"); @@ -203,72 +201,27 @@ return null; } - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOnCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOnCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); - - returnToFront(jResult); - return null; - } + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + Thread.sleep(1 * 1000); + setOnCmd = ExhaustFanCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + Logger.getLogger(this.getClass().getName()).info("[打开风机置1位复位]"); } - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 - setOnCmd = ExhaustFanCommandService.buildResetTurnOnCommand(sour, dest, zcbh); - if (null != setOnCmd) { - byte[] content = finspi.messageToBytes(setOnCmd); - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); - - returnToFront(jResult); - return null; - } + // 5秒后查询一次风机的状态 + Thread.sleep(5 * 1000); + // 调用远程接口查询风机状态 + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/readFjStatus.action", "zcbh=" + zcbh); + + // 返回成功给界面 + jResult.put("success", true); + jResult.put("code", "0"); + returnToFront(jResult); + + return null; } else { jResult.put("success", false); jResult.put("code", "3"); @@ -334,6 +287,7 @@ // 通过socket接口发送出去 ACUClientUtil.getInstance().sendACUCommand(client, content); + Logger.getLogger(this.getClass().getName()).info(setOffCmd); } else { jResult.put("success", false); jResult.put("code", "4"); @@ -343,72 +297,27 @@ return null; } - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOffCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOffCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); - - returnToFront(jResult); - return null; - } + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + Thread.sleep(1 * 1000); + setOffCmd = ExhaustFanCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + Logger.getLogger(this.getClass().getName()).info("[关闭风机置1位复位]"); } - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 - setOffCmd = ExhaustFanCommandService.buildResetTurnOffCommand(sour, dest, zcbh); - if (null != setOffCmd) { - byte[] content = finspi.messageToBytes(setOffCmd); - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); - - returnToFront(jResult); - return null; - } + // 5秒后查询一次照明的状态 + Thread.sleep(5 * 1000); + // 调用远程接口查询风机状态 + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/readFjStatus.action", "zcbh=" + zcbh); + + // 返回成功给界面 + jResult.put("success", true); + jResult.put("code", "0"); + returnToFront(jResult); + + return null; } else { jResult.put("success", false); jResult.put("code", "3"); diff --git a/src/com/szpg/rmi/RemoteHSCommandAction.java b/src/com/szpg/rmi/RemoteHSCommandAction.java index b074b7b..97144c2 100644 --- a/src/com/szpg/rmi/RemoteHSCommandAction.java +++ b/src/com/szpg/rmi/RemoteHSCommandAction.java @@ -201,7 +201,7 @@ command.setMessageProducerId(sour); command.setDestinationId(dest); - command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); int start = blObj.getKszdz(); int end = blObj.getJszdz(); diff --git a/src/com/szpg/rmi/RemoteJGCommandAction.java b/src/com/szpg/rmi/RemoteJGCommandAction.java index 66ab793..69a8d3f 100644 --- a/src/com/szpg/rmi/RemoteJGCommandAction.java +++ b/src/com/szpg/rmi/RemoteJGCommandAction.java @@ -4,17 +4,13 @@ import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; -import com.szpg.db.dao.PgAcuCmdDao; import com.szpg.db.dao.PgAcuDao; import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; 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.PgAcuCmd; import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.CommandResponse; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.message.command.write.SetJgUnlockBitCommand; import com.szpg.plc.protocol.DTProtocolInterface; @@ -25,6 +21,7 @@ import com.szpg.plc.util.ByteUtil; import com.szpg.service.ReadControllerStatusService; import com.szpg.util.Configure; +import com.szpg.util.HttpRequest; import com.szpg.util.UnicodeConvertor; import z.json.JSONObject; @@ -72,7 +69,7 @@ * @return * @throws Exception */ - public String readZmStatus() throws Exception { + public String readJgStatus() throws Exception { // 返回结果 JSONObject jResult = new JSONObject(); @@ -227,65 +224,18 @@ return null; } - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setUnlockCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setUnlockCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); + // 5秒后查询一次照明的状态 + Thread.sleep(5 * 1000); + // 调用远程接口查询照明状态 + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/readJgStatus.action", "zcbh=" + zcbh); - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); - - returnToFront(jResult); - return null; - } - } + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); - - returnToFront(jResult); - return null; - } + returnToFront(jResult); + return null; } else { jResult.put("success", false); jResult.put("code", "3"); @@ -383,65 +333,18 @@ return null; } - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setLockCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setLockCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); + // 5秒后查询一次照明的状态 + Thread.sleep(5 * 1000); + // 调用远程接口查询照明状态 + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/readJgStatus.action", "zcbh=" + zcbh); - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); - - returnToFront(jResult); - return null; - } - } + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); - - returnToFront(jResult); - return null; - } + returnToFront(jResult); + return null; } else { jResult.put("success", false); jResult.put("code", "3"); diff --git a/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java index fe487b7..e1de835 100644 --- a/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java @@ -181,6 +181,8 @@ char lockBt = dataStr.charAt(dataStr.length() - 1 - loffset * 16 - lbit); // 井盖解锁/锁定标志位 getJgsd().add(lockBt == '0' ? true : false); //0-锁定;1-解锁 + + logger.info("[" + zcbh + "][井盖状态" + getJgzt().get(i) + "][井盖锁定" + getJgsd().get(i) + "]"); } logger.info("解析[读取井盖状态]响应指令结束"); diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index fda3077..4366960 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -167,7 +167,7 @@ String fjzcbh = fj.getAssetcode(); // 调用远程接口启动风机 - HttpRequest.sendGet(baseURL + "remote/turnOnFj.do", "zcbh=" + fjzcbh); + HttpRequest.sendGet(baseURL + "remote/turnOnFj.action", "zcbh=" + fjzcbh); } } } diff --git a/src/com/szpg/rmi/RemoteCH4CommandAction.java b/src/com/szpg/rmi/RemoteCH4CommandAction.java index aff3866..cb63ae1 100644 --- a/src/com/szpg/rmi/RemoteCH4CommandAction.java +++ b/src/com/szpg/rmi/RemoteCH4CommandAction.java @@ -201,7 +201,7 @@ command.setMessageProducerId(sour); command.setDestinationId(dest); - command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); int start = blObj.getKszdz(); int end = blObj.getJszdz(); diff --git a/src/com/szpg/rmi/RemoteCOCommandAction.java b/src/com/szpg/rmi/RemoteCOCommandAction.java index dde2ac3..728211c 100644 --- a/src/com/szpg/rmi/RemoteCOCommandAction.java +++ b/src/com/szpg/rmi/RemoteCOCommandAction.java @@ -201,7 +201,7 @@ command.setMessageProducerId(sour); command.setDestinationId(dest); - command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); int start = blObj.getKszdz(); int end = blObj.getJszdz(); diff --git a/src/com/szpg/rmi/RemoteDSCommandAction.java b/src/com/szpg/rmi/RemoteDSCommandAction.java new file mode 100644 index 0000000..d1ec179 --- /dev/null +++ b/src/com/szpg/rmi/RemoteDSCommandAction.java @@ -0,0 +1,257 @@ +package com.szpg.rmi; + +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; + +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); + + 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); + + // 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; + } + } + + /** + * 给前端返回 + * @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()); + } + +} diff --git a/src/com/szpg/rmi/RemoteFJCommandAction.java b/src/com/szpg/rmi/RemoteFJCommandAction.java index b0a1ed1..81510c8 100644 --- a/src/com/szpg/rmi/RemoteFJCommandAction.java +++ b/src/com/szpg/rmi/RemoteFJCommandAction.java @@ -4,14 +4,10 @@ import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; -import com.szpg.db.dao.PgAcuCmdDao; import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; import com.szpg.db.dao.impl.PgAcuDaoImpl; import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.CommandResponse; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.message.command.write.SetFjOffBitCommand; import com.szpg.plc.message.command.write.SetFjOnBitCommand; @@ -24,6 +20,7 @@ import com.szpg.service.ReadControllerStatusService; import com.szpg.service.command.ExhaustFanCommandService; import com.szpg.util.Configure; +import com.szpg.util.HttpRequest; import com.szpg.util.UnicodeConvertor; import z.json.JSONObject; @@ -120,7 +117,7 @@ service.executeService(client, command); logger.info(command); } catch (Exception ex) { - logger.error("发送查询温湿度指令异常" + ex); + logger.error("发送查询风机状态指令异常" + ex); } jResult.put("success", true); @@ -194,6 +191,7 @@ // 通过socket接口发送出去 ACUClientUtil.getInstance().sendACUCommand(client, content); + Logger.getLogger(this.getClass().getName()).info(setOnCmd); } else { jResult.put("success", false); jResult.put("code", "4"); @@ -203,72 +201,27 @@ return null; } - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOnCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOnCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); - - returnToFront(jResult); - return null; - } + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + Thread.sleep(1 * 1000); + setOnCmd = ExhaustFanCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + Logger.getLogger(this.getClass().getName()).info("[打开风机置1位复位]"); } - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 - setOnCmd = ExhaustFanCommandService.buildResetTurnOnCommand(sour, dest, zcbh); - if (null != setOnCmd) { - byte[] content = finspi.messageToBytes(setOnCmd); - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); - - returnToFront(jResult); - return null; - } + // 5秒后查询一次风机的状态 + Thread.sleep(5 * 1000); + // 调用远程接口查询风机状态 + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/readFjStatus.action", "zcbh=" + zcbh); + + // 返回成功给界面 + jResult.put("success", true); + jResult.put("code", "0"); + returnToFront(jResult); + + return null; } else { jResult.put("success", false); jResult.put("code", "3"); @@ -334,6 +287,7 @@ // 通过socket接口发送出去 ACUClientUtil.getInstance().sendACUCommand(client, content); + Logger.getLogger(this.getClass().getName()).info(setOffCmd); } else { jResult.put("success", false); jResult.put("code", "4"); @@ -343,72 +297,27 @@ return null; } - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOffCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOffCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); - - returnToFront(jResult); - return null; - } + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + Thread.sleep(1 * 1000); + setOffCmd = ExhaustFanCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + Logger.getLogger(this.getClass().getName()).info("[关闭风机置1位复位]"); } - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 - setOffCmd = ExhaustFanCommandService.buildResetTurnOffCommand(sour, dest, zcbh); - if (null != setOffCmd) { - byte[] content = finspi.messageToBytes(setOffCmd); - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); - - returnToFront(jResult); - return null; - } + // 5秒后查询一次照明的状态 + Thread.sleep(5 * 1000); + // 调用远程接口查询风机状态 + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/readFjStatus.action", "zcbh=" + zcbh); + + // 返回成功给界面 + jResult.put("success", true); + jResult.put("code", "0"); + returnToFront(jResult); + + return null; } else { jResult.put("success", false); jResult.put("code", "3"); diff --git a/src/com/szpg/rmi/RemoteHSCommandAction.java b/src/com/szpg/rmi/RemoteHSCommandAction.java index b074b7b..97144c2 100644 --- a/src/com/szpg/rmi/RemoteHSCommandAction.java +++ b/src/com/szpg/rmi/RemoteHSCommandAction.java @@ -201,7 +201,7 @@ command.setMessageProducerId(sour); command.setDestinationId(dest); - command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); int start = blObj.getKszdz(); int end = blObj.getJszdz(); diff --git a/src/com/szpg/rmi/RemoteJGCommandAction.java b/src/com/szpg/rmi/RemoteJGCommandAction.java index 66ab793..69a8d3f 100644 --- a/src/com/szpg/rmi/RemoteJGCommandAction.java +++ b/src/com/szpg/rmi/RemoteJGCommandAction.java @@ -4,17 +4,13 @@ import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; -import com.szpg.db.dao.PgAcuCmdDao; import com.szpg.db.dao.PgAcuDao; import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; 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.PgAcuCmd; import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.CommandResponse; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.message.command.write.SetJgUnlockBitCommand; import com.szpg.plc.protocol.DTProtocolInterface; @@ -25,6 +21,7 @@ import com.szpg.plc.util.ByteUtil; import com.szpg.service.ReadControllerStatusService; import com.szpg.util.Configure; +import com.szpg.util.HttpRequest; import com.szpg.util.UnicodeConvertor; import z.json.JSONObject; @@ -72,7 +69,7 @@ * @return * @throws Exception */ - public String readZmStatus() throws Exception { + public String readJgStatus() throws Exception { // 返回结果 JSONObject jResult = new JSONObject(); @@ -227,65 +224,18 @@ return null; } - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setUnlockCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setUnlockCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); + // 5秒后查询一次照明的状态 + Thread.sleep(5 * 1000); + // 调用远程接口查询照明状态 + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/readJgStatus.action", "zcbh=" + zcbh); - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); - - returnToFront(jResult); - return null; - } - } + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); - - returnToFront(jResult); - return null; - } + returnToFront(jResult); + return null; } else { jResult.put("success", false); jResult.put("code", "3"); @@ -383,65 +333,18 @@ return null; } - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setLockCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setLockCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); + // 5秒后查询一次照明的状态 + Thread.sleep(5 * 1000); + // 调用远程接口查询照明状态 + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/readJgStatus.action", "zcbh=" + zcbh); - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); - - returnToFront(jResult); - return null; - } - } + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); - - returnToFront(jResult); - return null; - } + returnToFront(jResult); + return null; } else { jResult.put("success", false); jResult.put("code", "3"); diff --git a/src/com/szpg/rmi/RemoteO2CommandAction.java b/src/com/szpg/rmi/RemoteO2CommandAction.java index 45beb84..9097cec 100644 --- a/src/com/szpg/rmi/RemoteO2CommandAction.java +++ b/src/com/szpg/rmi/RemoteO2CommandAction.java @@ -200,7 +200,7 @@ command.setMessageProducerId(sour); command.setDestinationId(dest); - command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); ((SetO2ThresholdWordCommand) command).setThreshold(Float.parseFloat(threshold)); int start = blObj.getKszdz(); @@ -220,9 +220,6 @@ for (int j = n; j > 0; j--) { dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); } -// for (int j = 0; j < n; j++) { -// dataByte.append(new byte[] {temps[2 * j], temps[2 * j + 1]}); -// } command.setValue( dataByte.toBytes() ); // 调用服务过程执行命令发送服务 diff --git a/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java index fe487b7..e1de835 100644 --- a/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java @@ -181,6 +181,8 @@ char lockBt = dataStr.charAt(dataStr.length() - 1 - loffset * 16 - lbit); // 井盖解锁/锁定标志位 getJgsd().add(lockBt == '0' ? true : false); //0-锁定;1-解锁 + + logger.info("[" + zcbh + "][井盖状态" + getJgzt().get(i) + "][井盖锁定" + getJgsd().get(i) + "]"); } logger.info("解析[读取井盖状态]响应指令结束"); diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index fda3077..4366960 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -167,7 +167,7 @@ String fjzcbh = fj.getAssetcode(); // 调用远程接口启动风机 - HttpRequest.sendGet(baseURL + "remote/turnOnFj.do", "zcbh=" + fjzcbh); + HttpRequest.sendGet(baseURL + "remote/turnOnFj.action", "zcbh=" + fjzcbh); } } } diff --git a/src/com/szpg/rmi/RemoteCH4CommandAction.java b/src/com/szpg/rmi/RemoteCH4CommandAction.java index aff3866..cb63ae1 100644 --- a/src/com/szpg/rmi/RemoteCH4CommandAction.java +++ b/src/com/szpg/rmi/RemoteCH4CommandAction.java @@ -201,7 +201,7 @@ command.setMessageProducerId(sour); command.setDestinationId(dest); - command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); int start = blObj.getKszdz(); int end = blObj.getJszdz(); diff --git a/src/com/szpg/rmi/RemoteCOCommandAction.java b/src/com/szpg/rmi/RemoteCOCommandAction.java index dde2ac3..728211c 100644 --- a/src/com/szpg/rmi/RemoteCOCommandAction.java +++ b/src/com/szpg/rmi/RemoteCOCommandAction.java @@ -201,7 +201,7 @@ command.setMessageProducerId(sour); command.setDestinationId(dest); - command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); int start = blObj.getKszdz(); int end = blObj.getJszdz(); diff --git a/src/com/szpg/rmi/RemoteDSCommandAction.java b/src/com/szpg/rmi/RemoteDSCommandAction.java new file mode 100644 index 0000000..d1ec179 --- /dev/null +++ b/src/com/szpg/rmi/RemoteDSCommandAction.java @@ -0,0 +1,257 @@ +package com.szpg.rmi; + +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; + +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); + + 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); + + // 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; + } + } + + /** + * 给前端返回 + * @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()); + } + +} diff --git a/src/com/szpg/rmi/RemoteFJCommandAction.java b/src/com/szpg/rmi/RemoteFJCommandAction.java index b0a1ed1..81510c8 100644 --- a/src/com/szpg/rmi/RemoteFJCommandAction.java +++ b/src/com/szpg/rmi/RemoteFJCommandAction.java @@ -4,14 +4,10 @@ import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; -import com.szpg.db.dao.PgAcuCmdDao; import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; import com.szpg.db.dao.impl.PgAcuDaoImpl; import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.CommandResponse; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.message.command.write.SetFjOffBitCommand; import com.szpg.plc.message.command.write.SetFjOnBitCommand; @@ -24,6 +20,7 @@ import com.szpg.service.ReadControllerStatusService; import com.szpg.service.command.ExhaustFanCommandService; import com.szpg.util.Configure; +import com.szpg.util.HttpRequest; import com.szpg.util.UnicodeConvertor; import z.json.JSONObject; @@ -120,7 +117,7 @@ service.executeService(client, command); logger.info(command); } catch (Exception ex) { - logger.error("发送查询温湿度指令异常" + ex); + logger.error("发送查询风机状态指令异常" + ex); } jResult.put("success", true); @@ -194,6 +191,7 @@ // 通过socket接口发送出去 ACUClientUtil.getInstance().sendACUCommand(client, content); + Logger.getLogger(this.getClass().getName()).info(setOnCmd); } else { jResult.put("success", false); jResult.put("code", "4"); @@ -203,72 +201,27 @@ return null; } - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOnCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOnCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); - - returnToFront(jResult); - return null; - } + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + Thread.sleep(1 * 1000); + setOnCmd = ExhaustFanCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + Logger.getLogger(this.getClass().getName()).info("[打开风机置1位复位]"); } - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 - setOnCmd = ExhaustFanCommandService.buildResetTurnOnCommand(sour, dest, zcbh); - if (null != setOnCmd) { - byte[] content = finspi.messageToBytes(setOnCmd); - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); - - returnToFront(jResult); - return null; - } + // 5秒后查询一次风机的状态 + Thread.sleep(5 * 1000); + // 调用远程接口查询风机状态 + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/readFjStatus.action", "zcbh=" + zcbh); + + // 返回成功给界面 + jResult.put("success", true); + jResult.put("code", "0"); + returnToFront(jResult); + + return null; } else { jResult.put("success", false); jResult.put("code", "3"); @@ -334,6 +287,7 @@ // 通过socket接口发送出去 ACUClientUtil.getInstance().sendACUCommand(client, content); + Logger.getLogger(this.getClass().getName()).info(setOffCmd); } else { jResult.put("success", false); jResult.put("code", "4"); @@ -343,72 +297,27 @@ return null; } - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOffCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOffCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); - - returnToFront(jResult); - return null; - } + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + Thread.sleep(1 * 1000); + setOffCmd = ExhaustFanCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + Logger.getLogger(this.getClass().getName()).info("[关闭风机置1位复位]"); } - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 - setOffCmd = ExhaustFanCommandService.buildResetTurnOffCommand(sour, dest, zcbh); - if (null != setOffCmd) { - byte[] content = finspi.messageToBytes(setOffCmd); - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); - - returnToFront(jResult); - return null; - } + // 5秒后查询一次照明的状态 + Thread.sleep(5 * 1000); + // 调用远程接口查询风机状态 + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/readFjStatus.action", "zcbh=" + zcbh); + + // 返回成功给界面 + jResult.put("success", true); + jResult.put("code", "0"); + returnToFront(jResult); + + return null; } else { jResult.put("success", false); jResult.put("code", "3"); diff --git a/src/com/szpg/rmi/RemoteHSCommandAction.java b/src/com/szpg/rmi/RemoteHSCommandAction.java index b074b7b..97144c2 100644 --- a/src/com/szpg/rmi/RemoteHSCommandAction.java +++ b/src/com/szpg/rmi/RemoteHSCommandAction.java @@ -201,7 +201,7 @@ command.setMessageProducerId(sour); command.setDestinationId(dest); - command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); int start = blObj.getKszdz(); int end = blObj.getJszdz(); diff --git a/src/com/szpg/rmi/RemoteJGCommandAction.java b/src/com/szpg/rmi/RemoteJGCommandAction.java index 66ab793..69a8d3f 100644 --- a/src/com/szpg/rmi/RemoteJGCommandAction.java +++ b/src/com/szpg/rmi/RemoteJGCommandAction.java @@ -4,17 +4,13 @@ import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; -import com.szpg.db.dao.PgAcuCmdDao; import com.szpg.db.dao.PgAcuDao; import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; 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.PgAcuCmd; import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.CommandResponse; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.message.command.write.SetJgUnlockBitCommand; import com.szpg.plc.protocol.DTProtocolInterface; @@ -25,6 +21,7 @@ import com.szpg.plc.util.ByteUtil; import com.szpg.service.ReadControllerStatusService; import com.szpg.util.Configure; +import com.szpg.util.HttpRequest; import com.szpg.util.UnicodeConvertor; import z.json.JSONObject; @@ -72,7 +69,7 @@ * @return * @throws Exception */ - public String readZmStatus() throws Exception { + public String readJgStatus() throws Exception { // 返回结果 JSONObject jResult = new JSONObject(); @@ -227,65 +224,18 @@ return null; } - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setUnlockCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setUnlockCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); + // 5秒后查询一次照明的状态 + Thread.sleep(5 * 1000); + // 调用远程接口查询照明状态 + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/readJgStatus.action", "zcbh=" + zcbh); - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); - - returnToFront(jResult); - return null; - } - } + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); - - returnToFront(jResult); - return null; - } + returnToFront(jResult); + return null; } else { jResult.put("success", false); jResult.put("code", "3"); @@ -383,65 +333,18 @@ return null; } - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setLockCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setLockCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); + // 5秒后查询一次照明的状态 + Thread.sleep(5 * 1000); + // 调用远程接口查询照明状态 + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/readJgStatus.action", "zcbh=" + zcbh); - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); - - returnToFront(jResult); - return null; - } - } + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); - - returnToFront(jResult); - return null; - } + returnToFront(jResult); + return null; } else { jResult.put("success", false); jResult.put("code", "3"); diff --git a/src/com/szpg/rmi/RemoteO2CommandAction.java b/src/com/szpg/rmi/RemoteO2CommandAction.java index 45beb84..9097cec 100644 --- a/src/com/szpg/rmi/RemoteO2CommandAction.java +++ b/src/com/szpg/rmi/RemoteO2CommandAction.java @@ -200,7 +200,7 @@ command.setMessageProducerId(sour); command.setDestinationId(dest); - command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); ((SetO2ThresholdWordCommand) command).setThreshold(Float.parseFloat(threshold)); int start = blObj.getKszdz(); @@ -220,9 +220,6 @@ for (int j = n; j > 0; j--) { dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); } -// for (int j = 0; j < n; j++) { -// dataByte.append(new byte[] {temps[2 * j], temps[2 * j + 1]}); -// } command.setValue( dataByte.toBytes() ); // 调用服务过程执行命令发送服务 diff --git a/src/com/szpg/rmi/RemoteWSCommandAction.java b/src/com/szpg/rmi/RemoteWSCommandAction.java index fb813fb..e7dcf85 100644 --- a/src/com/szpg/rmi/RemoteWSCommandAction.java +++ b/src/com/szpg/rmi/RemoteWSCommandAction.java @@ -19,6 +19,7 @@ import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.message.command.WriteMemoryCommand; import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; import com.szpg.plc.protocol.fins.FINSConstants; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; @@ -212,7 +213,7 @@ command.setMessageProducerId(sour); command.setDestinationId(dest); - command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); int start = temBlObj.getKszdz(); int end = temBlObj.getJszdz(); @@ -231,6 +232,10 @@ dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); } command.setValue( dataByte.toBytes() ); + ((SetWdThresholdWordCommand) command).setThreshold(Float.parseFloat(wdThreshold)); + + Logger.getLogger(this.getClass().getName()).info(wdThreshold); + Logger.getLogger(this.getClass().getName()).info(ByteUtil.binToHexString(temps)); // 调用服务过程执行命令发送服务 SetSensorThresholdService service = new SetSensorThresholdService(); diff --git a/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java index fe487b7..e1de835 100644 --- a/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java @@ -181,6 +181,8 @@ char lockBt = dataStr.charAt(dataStr.length() - 1 - loffset * 16 - lbit); // 井盖解锁/锁定标志位 getJgsd().add(lockBt == '0' ? true : false); //0-锁定;1-解锁 + + logger.info("[" + zcbh + "][井盖状态" + getJgzt().get(i) + "][井盖锁定" + getJgsd().get(i) + "]"); } logger.info("解析[读取井盖状态]响应指令结束"); diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index fda3077..4366960 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -167,7 +167,7 @@ String fjzcbh = fj.getAssetcode(); // 调用远程接口启动风机 - HttpRequest.sendGet(baseURL + "remote/turnOnFj.do", "zcbh=" + fjzcbh); + HttpRequest.sendGet(baseURL + "remote/turnOnFj.action", "zcbh=" + fjzcbh); } } } diff --git a/src/com/szpg/rmi/RemoteCH4CommandAction.java b/src/com/szpg/rmi/RemoteCH4CommandAction.java index aff3866..cb63ae1 100644 --- a/src/com/szpg/rmi/RemoteCH4CommandAction.java +++ b/src/com/szpg/rmi/RemoteCH4CommandAction.java @@ -201,7 +201,7 @@ command.setMessageProducerId(sour); command.setDestinationId(dest); - command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); int start = blObj.getKszdz(); int end = blObj.getJszdz(); diff --git a/src/com/szpg/rmi/RemoteCOCommandAction.java b/src/com/szpg/rmi/RemoteCOCommandAction.java index dde2ac3..728211c 100644 --- a/src/com/szpg/rmi/RemoteCOCommandAction.java +++ b/src/com/szpg/rmi/RemoteCOCommandAction.java @@ -201,7 +201,7 @@ command.setMessageProducerId(sour); command.setDestinationId(dest); - command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); int start = blObj.getKszdz(); int end = blObj.getJszdz(); diff --git a/src/com/szpg/rmi/RemoteDSCommandAction.java b/src/com/szpg/rmi/RemoteDSCommandAction.java new file mode 100644 index 0000000..d1ec179 --- /dev/null +++ b/src/com/szpg/rmi/RemoteDSCommandAction.java @@ -0,0 +1,257 @@ +package com.szpg.rmi; + +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; + +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); + + 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); + + // 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; + } + } + + /** + * 给前端返回 + * @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()); + } + +} diff --git a/src/com/szpg/rmi/RemoteFJCommandAction.java b/src/com/szpg/rmi/RemoteFJCommandAction.java index b0a1ed1..81510c8 100644 --- a/src/com/szpg/rmi/RemoteFJCommandAction.java +++ b/src/com/szpg/rmi/RemoteFJCommandAction.java @@ -4,14 +4,10 @@ import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; -import com.szpg.db.dao.PgAcuCmdDao; import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; import com.szpg.db.dao.impl.PgAcuDaoImpl; import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.CommandResponse; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.message.command.write.SetFjOffBitCommand; import com.szpg.plc.message.command.write.SetFjOnBitCommand; @@ -24,6 +20,7 @@ import com.szpg.service.ReadControllerStatusService; import com.szpg.service.command.ExhaustFanCommandService; import com.szpg.util.Configure; +import com.szpg.util.HttpRequest; import com.szpg.util.UnicodeConvertor; import z.json.JSONObject; @@ -120,7 +117,7 @@ service.executeService(client, command); logger.info(command); } catch (Exception ex) { - logger.error("发送查询温湿度指令异常" + ex); + logger.error("发送查询风机状态指令异常" + ex); } jResult.put("success", true); @@ -194,6 +191,7 @@ // 通过socket接口发送出去 ACUClientUtil.getInstance().sendACUCommand(client, content); + Logger.getLogger(this.getClass().getName()).info(setOnCmd); } else { jResult.put("success", false); jResult.put("code", "4"); @@ -203,72 +201,27 @@ return null; } - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOnCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOnCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); - - returnToFront(jResult); - return null; - } + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + Thread.sleep(1 * 1000); + setOnCmd = ExhaustFanCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + Logger.getLogger(this.getClass().getName()).info("[打开风机置1位复位]"); } - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 - setOnCmd = ExhaustFanCommandService.buildResetTurnOnCommand(sour, dest, zcbh); - if (null != setOnCmd) { - byte[] content = finspi.messageToBytes(setOnCmd); - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); - - returnToFront(jResult); - return null; - } + // 5秒后查询一次风机的状态 + Thread.sleep(5 * 1000); + // 调用远程接口查询风机状态 + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/readFjStatus.action", "zcbh=" + zcbh); + + // 返回成功给界面 + jResult.put("success", true); + jResult.put("code", "0"); + returnToFront(jResult); + + return null; } else { jResult.put("success", false); jResult.put("code", "3"); @@ -334,6 +287,7 @@ // 通过socket接口发送出去 ACUClientUtil.getInstance().sendACUCommand(client, content); + Logger.getLogger(this.getClass().getName()).info(setOffCmd); } else { jResult.put("success", false); jResult.put("code", "4"); @@ -343,72 +297,27 @@ return null; } - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOffCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOffCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); - - returnToFront(jResult); - return null; - } + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + Thread.sleep(1 * 1000); + setOffCmd = ExhaustFanCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + Logger.getLogger(this.getClass().getName()).info("[关闭风机置1位复位]"); } - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 - setOffCmd = ExhaustFanCommandService.buildResetTurnOffCommand(sour, dest, zcbh); - if (null != setOffCmd) { - byte[] content = finspi.messageToBytes(setOffCmd); - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); - - returnToFront(jResult); - return null; - } + // 5秒后查询一次照明的状态 + Thread.sleep(5 * 1000); + // 调用远程接口查询风机状态 + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/readFjStatus.action", "zcbh=" + zcbh); + + // 返回成功给界面 + jResult.put("success", true); + jResult.put("code", "0"); + returnToFront(jResult); + + return null; } else { jResult.put("success", false); jResult.put("code", "3"); diff --git a/src/com/szpg/rmi/RemoteHSCommandAction.java b/src/com/szpg/rmi/RemoteHSCommandAction.java index b074b7b..97144c2 100644 --- a/src/com/szpg/rmi/RemoteHSCommandAction.java +++ b/src/com/szpg/rmi/RemoteHSCommandAction.java @@ -201,7 +201,7 @@ command.setMessageProducerId(sour); command.setDestinationId(dest); - command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); int start = blObj.getKszdz(); int end = blObj.getJszdz(); diff --git a/src/com/szpg/rmi/RemoteJGCommandAction.java b/src/com/szpg/rmi/RemoteJGCommandAction.java index 66ab793..69a8d3f 100644 --- a/src/com/szpg/rmi/RemoteJGCommandAction.java +++ b/src/com/szpg/rmi/RemoteJGCommandAction.java @@ -4,17 +4,13 @@ import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; -import com.szpg.db.dao.PgAcuCmdDao; import com.szpg.db.dao.PgAcuDao; import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; 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.PgAcuCmd; import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.CommandResponse; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.message.command.write.SetJgUnlockBitCommand; import com.szpg.plc.protocol.DTProtocolInterface; @@ -25,6 +21,7 @@ import com.szpg.plc.util.ByteUtil; import com.szpg.service.ReadControllerStatusService; import com.szpg.util.Configure; +import com.szpg.util.HttpRequest; import com.szpg.util.UnicodeConvertor; import z.json.JSONObject; @@ -72,7 +69,7 @@ * @return * @throws Exception */ - public String readZmStatus() throws Exception { + public String readJgStatus() throws Exception { // 返回结果 JSONObject jResult = new JSONObject(); @@ -227,65 +224,18 @@ return null; } - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setUnlockCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setUnlockCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); + // 5秒后查询一次照明的状态 + Thread.sleep(5 * 1000); + // 调用远程接口查询照明状态 + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/readJgStatus.action", "zcbh=" + zcbh); - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); - - returnToFront(jResult); - return null; - } - } + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); - - returnToFront(jResult); - return null; - } + returnToFront(jResult); + return null; } else { jResult.put("success", false); jResult.put("code", "3"); @@ -383,65 +333,18 @@ return null; } - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setLockCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setLockCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); + // 5秒后查询一次照明的状态 + Thread.sleep(5 * 1000); + // 调用远程接口查询照明状态 + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/readJgStatus.action", "zcbh=" + zcbh); - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); - - returnToFront(jResult); - return null; - } - } + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); - - returnToFront(jResult); - return null; - } + returnToFront(jResult); + return null; } else { jResult.put("success", false); jResult.put("code", "3"); diff --git a/src/com/szpg/rmi/RemoteO2CommandAction.java b/src/com/szpg/rmi/RemoteO2CommandAction.java index 45beb84..9097cec 100644 --- a/src/com/szpg/rmi/RemoteO2CommandAction.java +++ b/src/com/szpg/rmi/RemoteO2CommandAction.java @@ -200,7 +200,7 @@ command.setMessageProducerId(sour); command.setDestinationId(dest); - command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); ((SetO2ThresholdWordCommand) command).setThreshold(Float.parseFloat(threshold)); int start = blObj.getKszdz(); @@ -220,9 +220,6 @@ for (int j = n; j > 0; j--) { dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); } -// for (int j = 0; j < n; j++) { -// dataByte.append(new byte[] {temps[2 * j], temps[2 * j + 1]}); -// } command.setValue( dataByte.toBytes() ); // 调用服务过程执行命令发送服务 diff --git a/src/com/szpg/rmi/RemoteWSCommandAction.java b/src/com/szpg/rmi/RemoteWSCommandAction.java index fb813fb..e7dcf85 100644 --- a/src/com/szpg/rmi/RemoteWSCommandAction.java +++ b/src/com/szpg/rmi/RemoteWSCommandAction.java @@ -19,6 +19,7 @@ import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.message.command.WriteMemoryCommand; import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; import com.szpg.plc.protocol.fins.FINSConstants; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; @@ -212,7 +213,7 @@ command.setMessageProducerId(sour); command.setDestinationId(dest); - command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); int start = temBlObj.getKszdz(); int end = temBlObj.getJszdz(); @@ -231,6 +232,10 @@ dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); } command.setValue( dataByte.toBytes() ); + ((SetWdThresholdWordCommand) command).setThreshold(Float.parseFloat(wdThreshold)); + + Logger.getLogger(this.getClass().getName()).info(wdThreshold); + Logger.getLogger(this.getClass().getName()).info(ByteUtil.binToHexString(temps)); // 调用服务过程执行命令发送服务 SetSensorThresholdService service = new SetSensorThresholdService(); diff --git a/src/com/szpg/rmi/RemoteZMCommandAction.java b/src/com/szpg/rmi/RemoteZMCommandAction.java index cb3fd17..6c12fcc 100644 --- a/src/com/szpg/rmi/RemoteZMCommandAction.java +++ b/src/com/szpg/rmi/RemoteZMCommandAction.java @@ -4,14 +4,10 @@ import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; -import com.szpg.db.dao.PgAcuCmdDao; import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; import com.szpg.db.dao.impl.PgAcuDaoImpl; import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.CommandResponse; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.message.command.write.SetZmOffBitCommand; import com.szpg.plc.message.command.write.SetZmOnBitCommand; @@ -24,6 +20,7 @@ import com.szpg.service.ReadControllerStatusService; import com.szpg.service.command.LightCommandService; import com.szpg.util.Configure; +import com.szpg.util.HttpRequest; import com.szpg.util.UnicodeConvertor; import z.json.JSONObject; @@ -147,6 +144,8 @@ // 返回结果 JSONObject jResult = new JSONObject(); + logger.info("[进入打开应急照明接口]" + zcbh); + if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); @@ -188,13 +187,14 @@ // 2 发送设置启动位的命令 // 构建打开照明指令 SetZmOnBitCommand setOnCmd = LightCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { // 解析命令对象为字节数组 byte[] content = finspi.messageToBytes(setOnCmd); // 通过socket接口发送出去 ACUClientUtil.getInstance().sendACUCommand(client, content); - logger.info("[发送打开照明指令]" + ByteUtil.binToHexString(content)); + Logger.getLogger(this.getClass().getName()).info(setOnCmd); } else { jResult.put("success", false); jResult.put("code", "4"); @@ -204,72 +204,27 @@ return null; } - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOnCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOnCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); - - returnToFront(jResult); - return null; - } + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + Thread.sleep(1 * 1000); + setOnCmd = LightCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + Logger.getLogger(this.getClass().getName()).info("[打开照明置1位复位]"); } - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 - setOnCmd = LightCommandService.buildResetTurnOnCommand(sour, dest, zcbh); - if (null != setOnCmd) { - byte[] content = finspi.messageToBytes(setOnCmd); - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); - - returnToFront(jResult); - return null; - } + // 5秒后查询一次照明的状态 + Thread.sleep(5 * 1000); + // 调用远程接口查询照明状态 + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/readZmStatus.action", "zcbh=" + zcbh); + + // 返回成功给界面 + jResult.put("success", true); + jResult.put("code", "0"); + returnToFront(jResult); + + return null; } else { jResult.put("success", false); jResult.put("code", "3"); @@ -335,6 +290,7 @@ // 通过socket接口发送出去 ACUClientUtil.getInstance().sendACUCommand(client, content); + Logger.getLogger(this.getClass().getName()).info(setOffCmd); } else { jResult.put("success", false); jResult.put("code", "4"); @@ -344,72 +300,27 @@ return null; } - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOffCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOffCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); - - returnToFront(jResult); - return null; - } + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + Thread.sleep(1 * 1000); + setOffCmd = LightCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + Logger.getLogger(this.getClass().getName()).info("[关闭照明置1位复位]"); } - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 - setOffCmd = LightCommandService.buildResetTurnOffCommand(sour, dest, zcbh); - if (null != setOffCmd) { - byte[] content = finspi.messageToBytes(setOffCmd); - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); - - returnToFront(jResult); - return null; - } + // 5秒后查询一次照明的状态 + Thread.sleep(5 * 1000); + // 调用远程接口查询照明状态 + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/readZmStatus.action", "zcbh=" + zcbh); + + // 返回成功给界面 + jResult.put("success", true); + jResult.put("code", "0"); + returnToFront(jResult); + + return null; } else { jResult.put("success", false); jResult.put("code", "3"); @@ -434,4 +345,5 @@ ServletActionContext.getResponse().getWriter().write(jResult.toString()); } + } diff --git a/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java index fe487b7..e1de835 100644 --- a/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java @@ -181,6 +181,8 @@ char lockBt = dataStr.charAt(dataStr.length() - 1 - loffset * 16 - lbit); // 井盖解锁/锁定标志位 getJgsd().add(lockBt == '0' ? true : false); //0-锁定;1-解锁 + + logger.info("[" + zcbh + "][井盖状态" + getJgzt().get(i) + "][井盖锁定" + getJgsd().get(i) + "]"); } logger.info("解析[读取井盖状态]响应指令结束"); diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index fda3077..4366960 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -167,7 +167,7 @@ String fjzcbh = fj.getAssetcode(); // 调用远程接口启动风机 - HttpRequest.sendGet(baseURL + "remote/turnOnFj.do", "zcbh=" + fjzcbh); + HttpRequest.sendGet(baseURL + "remote/turnOnFj.action", "zcbh=" + fjzcbh); } } } diff --git a/src/com/szpg/rmi/RemoteCH4CommandAction.java b/src/com/szpg/rmi/RemoteCH4CommandAction.java index aff3866..cb63ae1 100644 --- a/src/com/szpg/rmi/RemoteCH4CommandAction.java +++ b/src/com/szpg/rmi/RemoteCH4CommandAction.java @@ -201,7 +201,7 @@ command.setMessageProducerId(sour); command.setDestinationId(dest); - command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); int start = blObj.getKszdz(); int end = blObj.getJszdz(); diff --git a/src/com/szpg/rmi/RemoteCOCommandAction.java b/src/com/szpg/rmi/RemoteCOCommandAction.java index dde2ac3..728211c 100644 --- a/src/com/szpg/rmi/RemoteCOCommandAction.java +++ b/src/com/szpg/rmi/RemoteCOCommandAction.java @@ -201,7 +201,7 @@ command.setMessageProducerId(sour); command.setDestinationId(dest); - command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); int start = blObj.getKszdz(); int end = blObj.getJszdz(); diff --git a/src/com/szpg/rmi/RemoteDSCommandAction.java b/src/com/szpg/rmi/RemoteDSCommandAction.java new file mode 100644 index 0000000..d1ec179 --- /dev/null +++ b/src/com/szpg/rmi/RemoteDSCommandAction.java @@ -0,0 +1,257 @@ +package com.szpg.rmi; + +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; + +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); + + 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); + + // 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; + } + } + + /** + * 给前端返回 + * @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()); + } + +} diff --git a/src/com/szpg/rmi/RemoteFJCommandAction.java b/src/com/szpg/rmi/RemoteFJCommandAction.java index b0a1ed1..81510c8 100644 --- a/src/com/szpg/rmi/RemoteFJCommandAction.java +++ b/src/com/szpg/rmi/RemoteFJCommandAction.java @@ -4,14 +4,10 @@ import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; -import com.szpg.db.dao.PgAcuCmdDao; import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; import com.szpg.db.dao.impl.PgAcuDaoImpl; import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.CommandResponse; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.message.command.write.SetFjOffBitCommand; import com.szpg.plc.message.command.write.SetFjOnBitCommand; @@ -24,6 +20,7 @@ import com.szpg.service.ReadControllerStatusService; import com.szpg.service.command.ExhaustFanCommandService; import com.szpg.util.Configure; +import com.szpg.util.HttpRequest; import com.szpg.util.UnicodeConvertor; import z.json.JSONObject; @@ -120,7 +117,7 @@ service.executeService(client, command); logger.info(command); } catch (Exception ex) { - logger.error("发送查询温湿度指令异常" + ex); + logger.error("发送查询风机状态指令异常" + ex); } jResult.put("success", true); @@ -194,6 +191,7 @@ // 通过socket接口发送出去 ACUClientUtil.getInstance().sendACUCommand(client, content); + Logger.getLogger(this.getClass().getName()).info(setOnCmd); } else { jResult.put("success", false); jResult.put("code", "4"); @@ -203,72 +201,27 @@ return null; } - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOnCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOnCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); - - returnToFront(jResult); - return null; - } + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + Thread.sleep(1 * 1000); + setOnCmd = ExhaustFanCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + Logger.getLogger(this.getClass().getName()).info("[打开风机置1位复位]"); } - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 - setOnCmd = ExhaustFanCommandService.buildResetTurnOnCommand(sour, dest, zcbh); - if (null != setOnCmd) { - byte[] content = finspi.messageToBytes(setOnCmd); - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); - - returnToFront(jResult); - return null; - } + // 5秒后查询一次风机的状态 + Thread.sleep(5 * 1000); + // 调用远程接口查询风机状态 + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/readFjStatus.action", "zcbh=" + zcbh); + + // 返回成功给界面 + jResult.put("success", true); + jResult.put("code", "0"); + returnToFront(jResult); + + return null; } else { jResult.put("success", false); jResult.put("code", "3"); @@ -334,6 +287,7 @@ // 通过socket接口发送出去 ACUClientUtil.getInstance().sendACUCommand(client, content); + Logger.getLogger(this.getClass().getName()).info(setOffCmd); } else { jResult.put("success", false); jResult.put("code", "4"); @@ -343,72 +297,27 @@ return null; } - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOffCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOffCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); - - returnToFront(jResult); - return null; - } + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + Thread.sleep(1 * 1000); + setOffCmd = ExhaustFanCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + Logger.getLogger(this.getClass().getName()).info("[关闭风机置1位复位]"); } - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 - setOffCmd = ExhaustFanCommandService.buildResetTurnOffCommand(sour, dest, zcbh); - if (null != setOffCmd) { - byte[] content = finspi.messageToBytes(setOffCmd); - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); - - returnToFront(jResult); - return null; - } + // 5秒后查询一次照明的状态 + Thread.sleep(5 * 1000); + // 调用远程接口查询风机状态 + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/readFjStatus.action", "zcbh=" + zcbh); + + // 返回成功给界面 + jResult.put("success", true); + jResult.put("code", "0"); + returnToFront(jResult); + + return null; } else { jResult.put("success", false); jResult.put("code", "3"); diff --git a/src/com/szpg/rmi/RemoteHSCommandAction.java b/src/com/szpg/rmi/RemoteHSCommandAction.java index b074b7b..97144c2 100644 --- a/src/com/szpg/rmi/RemoteHSCommandAction.java +++ b/src/com/szpg/rmi/RemoteHSCommandAction.java @@ -201,7 +201,7 @@ command.setMessageProducerId(sour); command.setDestinationId(dest); - command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); int start = blObj.getKszdz(); int end = blObj.getJszdz(); diff --git a/src/com/szpg/rmi/RemoteJGCommandAction.java b/src/com/szpg/rmi/RemoteJGCommandAction.java index 66ab793..69a8d3f 100644 --- a/src/com/szpg/rmi/RemoteJGCommandAction.java +++ b/src/com/szpg/rmi/RemoteJGCommandAction.java @@ -4,17 +4,13 @@ import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; -import com.szpg.db.dao.PgAcuCmdDao; import com.szpg.db.dao.PgAcuDao; import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; 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.PgAcuCmd; import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.CommandResponse; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.message.command.write.SetJgUnlockBitCommand; import com.szpg.plc.protocol.DTProtocolInterface; @@ -25,6 +21,7 @@ import com.szpg.plc.util.ByteUtil; import com.szpg.service.ReadControllerStatusService; import com.szpg.util.Configure; +import com.szpg.util.HttpRequest; import com.szpg.util.UnicodeConvertor; import z.json.JSONObject; @@ -72,7 +69,7 @@ * @return * @throws Exception */ - public String readZmStatus() throws Exception { + public String readJgStatus() throws Exception { // 返回结果 JSONObject jResult = new JSONObject(); @@ -227,65 +224,18 @@ return null; } - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setUnlockCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setUnlockCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); + // 5秒后查询一次照明的状态 + Thread.sleep(5 * 1000); + // 调用远程接口查询照明状态 + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/readJgStatus.action", "zcbh=" + zcbh); - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); - - returnToFront(jResult); - return null; - } - } + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); - - returnToFront(jResult); - return null; - } + returnToFront(jResult); + return null; } else { jResult.put("success", false); jResult.put("code", "3"); @@ -383,65 +333,18 @@ return null; } - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setLockCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setLockCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); + // 5秒后查询一次照明的状态 + Thread.sleep(5 * 1000); + // 调用远程接口查询照明状态 + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/readJgStatus.action", "zcbh=" + zcbh); - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); - - returnToFront(jResult); - return null; - } - } + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); - - returnToFront(jResult); - return null; - } + returnToFront(jResult); + return null; } else { jResult.put("success", false); jResult.put("code", "3"); diff --git a/src/com/szpg/rmi/RemoteO2CommandAction.java b/src/com/szpg/rmi/RemoteO2CommandAction.java index 45beb84..9097cec 100644 --- a/src/com/szpg/rmi/RemoteO2CommandAction.java +++ b/src/com/szpg/rmi/RemoteO2CommandAction.java @@ -200,7 +200,7 @@ command.setMessageProducerId(sour); command.setDestinationId(dest); - command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); ((SetO2ThresholdWordCommand) command).setThreshold(Float.parseFloat(threshold)); int start = blObj.getKszdz(); @@ -220,9 +220,6 @@ for (int j = n; j > 0; j--) { dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); } -// for (int j = 0; j < n; j++) { -// dataByte.append(new byte[] {temps[2 * j], temps[2 * j + 1]}); -// } command.setValue( dataByte.toBytes() ); // 调用服务过程执行命令发送服务 diff --git a/src/com/szpg/rmi/RemoteWSCommandAction.java b/src/com/szpg/rmi/RemoteWSCommandAction.java index fb813fb..e7dcf85 100644 --- a/src/com/szpg/rmi/RemoteWSCommandAction.java +++ b/src/com/szpg/rmi/RemoteWSCommandAction.java @@ -19,6 +19,7 @@ import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.message.command.WriteMemoryCommand; import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; import com.szpg.plc.protocol.fins.FINSConstants; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; @@ -212,7 +213,7 @@ command.setMessageProducerId(sour); command.setDestinationId(dest); - command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); int start = temBlObj.getKszdz(); int end = temBlObj.getJszdz(); @@ -231,6 +232,10 @@ dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); } command.setValue( dataByte.toBytes() ); + ((SetWdThresholdWordCommand) command).setThreshold(Float.parseFloat(wdThreshold)); + + Logger.getLogger(this.getClass().getName()).info(wdThreshold); + Logger.getLogger(this.getClass().getName()).info(ByteUtil.binToHexString(temps)); // 调用服务过程执行命令发送服务 SetSensorThresholdService service = new SetSensorThresholdService(); diff --git a/src/com/szpg/rmi/RemoteZMCommandAction.java b/src/com/szpg/rmi/RemoteZMCommandAction.java index cb3fd17..6c12fcc 100644 --- a/src/com/szpg/rmi/RemoteZMCommandAction.java +++ b/src/com/szpg/rmi/RemoteZMCommandAction.java @@ -4,14 +4,10 @@ import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; -import com.szpg.db.dao.PgAcuCmdDao; import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; import com.szpg.db.dao.impl.PgAcuDaoImpl; import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.CommandResponse; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.message.command.write.SetZmOffBitCommand; import com.szpg.plc.message.command.write.SetZmOnBitCommand; @@ -24,6 +20,7 @@ import com.szpg.service.ReadControllerStatusService; import com.szpg.service.command.LightCommandService; import com.szpg.util.Configure; +import com.szpg.util.HttpRequest; import com.szpg.util.UnicodeConvertor; import z.json.JSONObject; @@ -147,6 +144,8 @@ // 返回结果 JSONObject jResult = new JSONObject(); + logger.info("[进入打开应急照明接口]" + zcbh); + if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); @@ -188,13 +187,14 @@ // 2 发送设置启动位的命令 // 构建打开照明指令 SetZmOnBitCommand setOnCmd = LightCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { // 解析命令对象为字节数组 byte[] content = finspi.messageToBytes(setOnCmd); // 通过socket接口发送出去 ACUClientUtil.getInstance().sendACUCommand(client, content); - logger.info("[发送打开照明指令]" + ByteUtil.binToHexString(content)); + Logger.getLogger(this.getClass().getName()).info(setOnCmd); } else { jResult.put("success", false); jResult.put("code", "4"); @@ -204,72 +204,27 @@ return null; } - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOnCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOnCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); - - returnToFront(jResult); - return null; - } + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + Thread.sleep(1 * 1000); + setOnCmd = LightCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + Logger.getLogger(this.getClass().getName()).info("[打开照明置1位复位]"); } - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 - setOnCmd = LightCommandService.buildResetTurnOnCommand(sour, dest, zcbh); - if (null != setOnCmd) { - byte[] content = finspi.messageToBytes(setOnCmd); - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); - - returnToFront(jResult); - return null; - } + // 5秒后查询一次照明的状态 + Thread.sleep(5 * 1000); + // 调用远程接口查询照明状态 + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/readZmStatus.action", "zcbh=" + zcbh); + + // 返回成功给界面 + jResult.put("success", true); + jResult.put("code", "0"); + returnToFront(jResult); + + return null; } else { jResult.put("success", false); jResult.put("code", "3"); @@ -335,6 +290,7 @@ // 通过socket接口发送出去 ACUClientUtil.getInstance().sendACUCommand(client, content); + Logger.getLogger(this.getClass().getName()).info(setOffCmd); } else { jResult.put("success", false); jResult.put("code", "4"); @@ -344,72 +300,27 @@ return null; } - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOffCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOffCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); - - returnToFront(jResult); - return null; - } + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + Thread.sleep(1 * 1000); + setOffCmd = LightCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + Logger.getLogger(this.getClass().getName()).info("[关闭照明置1位复位]"); } - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 - setOffCmd = LightCommandService.buildResetTurnOffCommand(sour, dest, zcbh); - if (null != setOffCmd) { - byte[] content = finspi.messageToBytes(setOffCmd); - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); - - returnToFront(jResult); - return null; - } + // 5秒后查询一次照明的状态 + Thread.sleep(5 * 1000); + // 调用远程接口查询照明状态 + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/readZmStatus.action", "zcbh=" + zcbh); + + // 返回成功给界面 + jResult.put("success", true); + jResult.put("code", "0"); + returnToFront(jResult); + + return null; } else { jResult.put("success", false); jResult.put("code", "3"); @@ -434,4 +345,5 @@ ServletActionContext.getResponse().getWriter().write(jResult.toString()); } + } diff --git a/src/struts.xml b/src/struts.xml index d5fcaa9..2da47a8 100644 --- a/src/struts.xml +++ b/src/struts.xml @@ -42,5 +42,9 @@ + + + + diff --git a/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java index fe487b7..e1de835 100644 --- a/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadJgStatusCommandResponse.java @@ -181,6 +181,8 @@ char lockBt = dataStr.charAt(dataStr.length() - 1 - loffset * 16 - lbit); // 井盖解锁/锁定标志位 getJgsd().add(lockBt == '0' ? true : false); //0-锁定;1-解锁 + + logger.info("[" + zcbh + "][井盖状态" + getJgzt().get(i) + "][井盖锁定" + getJgsd().get(i) + "]"); } logger.info("解析[读取井盖状态]响应指令结束"); diff --git a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java index fda3077..4366960 100644 --- a/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java +++ b/src/com/szpg/plc/message/response/read/ReadWSValueCommandResponse.java @@ -167,7 +167,7 @@ String fjzcbh = fj.getAssetcode(); // 调用远程接口启动风机 - HttpRequest.sendGet(baseURL + "remote/turnOnFj.do", "zcbh=" + fjzcbh); + HttpRequest.sendGet(baseURL + "remote/turnOnFj.action", "zcbh=" + fjzcbh); } } } diff --git a/src/com/szpg/rmi/RemoteCH4CommandAction.java b/src/com/szpg/rmi/RemoteCH4CommandAction.java index aff3866..cb63ae1 100644 --- a/src/com/szpg/rmi/RemoteCH4CommandAction.java +++ b/src/com/szpg/rmi/RemoteCH4CommandAction.java @@ -201,7 +201,7 @@ command.setMessageProducerId(sour); command.setDestinationId(dest); - command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); int start = blObj.getKszdz(); int end = blObj.getJszdz(); diff --git a/src/com/szpg/rmi/RemoteCOCommandAction.java b/src/com/szpg/rmi/RemoteCOCommandAction.java index dde2ac3..728211c 100644 --- a/src/com/szpg/rmi/RemoteCOCommandAction.java +++ b/src/com/szpg/rmi/RemoteCOCommandAction.java @@ -201,7 +201,7 @@ command.setMessageProducerId(sour); command.setDestinationId(dest); - command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); int start = blObj.getKszdz(); int end = blObj.getJszdz(); diff --git a/src/com/szpg/rmi/RemoteDSCommandAction.java b/src/com/szpg/rmi/RemoteDSCommandAction.java new file mode 100644 index 0000000..d1ec179 --- /dev/null +++ b/src/com/szpg/rmi/RemoteDSCommandAction.java @@ -0,0 +1,257 @@ +package com.szpg.rmi; + +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; + +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); + + 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); + + // 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; + } + } + + /** + * 给前端返回 + * @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()); + } + +} diff --git a/src/com/szpg/rmi/RemoteFJCommandAction.java b/src/com/szpg/rmi/RemoteFJCommandAction.java index b0a1ed1..81510c8 100644 --- a/src/com/szpg/rmi/RemoteFJCommandAction.java +++ b/src/com/szpg/rmi/RemoteFJCommandAction.java @@ -4,14 +4,10 @@ import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; -import com.szpg.db.dao.PgAcuCmdDao; import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; import com.szpg.db.dao.impl.PgAcuDaoImpl; import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.CommandResponse; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.message.command.write.SetFjOffBitCommand; import com.szpg.plc.message.command.write.SetFjOnBitCommand; @@ -24,6 +20,7 @@ import com.szpg.service.ReadControllerStatusService; import com.szpg.service.command.ExhaustFanCommandService; import com.szpg.util.Configure; +import com.szpg.util.HttpRequest; import com.szpg.util.UnicodeConvertor; import z.json.JSONObject; @@ -120,7 +117,7 @@ service.executeService(client, command); logger.info(command); } catch (Exception ex) { - logger.error("发送查询温湿度指令异常" + ex); + logger.error("发送查询风机状态指令异常" + ex); } jResult.put("success", true); @@ -194,6 +191,7 @@ // 通过socket接口发送出去 ACUClientUtil.getInstance().sendACUCommand(client, content); + Logger.getLogger(this.getClass().getName()).info(setOnCmd); } else { jResult.put("success", false); jResult.put("code", "4"); @@ -203,72 +201,27 @@ return null; } - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOnCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOnCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); - - returnToFront(jResult); - return null; - } + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + Thread.sleep(1 * 1000); + setOnCmd = ExhaustFanCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + Logger.getLogger(this.getClass().getName()).info("[打开风机置1位复位]"); } - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 - setOnCmd = ExhaustFanCommandService.buildResetTurnOnCommand(sour, dest, zcbh); - if (null != setOnCmd) { - byte[] content = finspi.messageToBytes(setOnCmd); - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); - - returnToFront(jResult); - return null; - } + // 5秒后查询一次风机的状态 + Thread.sleep(5 * 1000); + // 调用远程接口查询风机状态 + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/readFjStatus.action", "zcbh=" + zcbh); + + // 返回成功给界面 + jResult.put("success", true); + jResult.put("code", "0"); + returnToFront(jResult); + + return null; } else { jResult.put("success", false); jResult.put("code", "3"); @@ -334,6 +287,7 @@ // 通过socket接口发送出去 ACUClientUtil.getInstance().sendACUCommand(client, content); + Logger.getLogger(this.getClass().getName()).info(setOffCmd); } else { jResult.put("success", false); jResult.put("code", "4"); @@ -343,72 +297,27 @@ return null; } - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOffCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOffCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); - - returnToFront(jResult); - return null; - } + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + Thread.sleep(1 * 1000); + setOffCmd = ExhaustFanCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + Logger.getLogger(this.getClass().getName()).info("[关闭风机置1位复位]"); } - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 - setOffCmd = ExhaustFanCommandService.buildResetTurnOffCommand(sour, dest, zcbh); - if (null != setOffCmd) { - byte[] content = finspi.messageToBytes(setOffCmd); - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); - - returnToFront(jResult); - return null; - } + // 5秒后查询一次照明的状态 + Thread.sleep(5 * 1000); + // 调用远程接口查询风机状态 + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/readFjStatus.action", "zcbh=" + zcbh); + + // 返回成功给界面 + jResult.put("success", true); + jResult.put("code", "0"); + returnToFront(jResult); + + return null; } else { jResult.put("success", false); jResult.put("code", "3"); diff --git a/src/com/szpg/rmi/RemoteHSCommandAction.java b/src/com/szpg/rmi/RemoteHSCommandAction.java index b074b7b..97144c2 100644 --- a/src/com/szpg/rmi/RemoteHSCommandAction.java +++ b/src/com/szpg/rmi/RemoteHSCommandAction.java @@ -201,7 +201,7 @@ command.setMessageProducerId(sour); command.setDestinationId(dest); - command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); int start = blObj.getKszdz(); int end = blObj.getJszdz(); diff --git a/src/com/szpg/rmi/RemoteJGCommandAction.java b/src/com/szpg/rmi/RemoteJGCommandAction.java index 66ab793..69a8d3f 100644 --- a/src/com/szpg/rmi/RemoteJGCommandAction.java +++ b/src/com/szpg/rmi/RemoteJGCommandAction.java @@ -4,17 +4,13 @@ import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; -import com.szpg.db.dao.PgAcuCmdDao; import com.szpg.db.dao.PgAcuDao; import com.szpg.db.dao.PgHjsbblDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; 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.PgAcuCmd; import com.szpg.db.data.PgHjsbbl; import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.CommandResponse; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.message.command.write.SetJgUnlockBitCommand; import com.szpg.plc.protocol.DTProtocolInterface; @@ -25,6 +21,7 @@ import com.szpg.plc.util.ByteUtil; import com.szpg.service.ReadControllerStatusService; import com.szpg.util.Configure; +import com.szpg.util.HttpRequest; import com.szpg.util.UnicodeConvertor; import z.json.JSONObject; @@ -72,7 +69,7 @@ * @return * @throws Exception */ - public String readZmStatus() throws Exception { + public String readJgStatus() throws Exception { // 返回结果 JSONObject jResult = new JSONObject(); @@ -227,65 +224,18 @@ return null; } - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setUnlockCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setUnlockCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); + // 5秒后查询一次照明的状态 + Thread.sleep(5 * 1000); + // 调用远程接口查询照明状态 + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/readJgStatus.action", "zcbh=" + zcbh); - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); - - returnToFront(jResult); - return null; - } - } + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); - - returnToFront(jResult); - return null; - } + returnToFront(jResult); + return null; } else { jResult.put("success", false); jResult.put("code", "3"); @@ -383,65 +333,18 @@ return null; } - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setLockCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setLockCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); + // 5秒后查询一次照明的状态 + Thread.sleep(5 * 1000); + // 调用远程接口查询照明状态 + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/readJgStatus.action", "zcbh=" + zcbh); - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); - - returnToFront(jResult); - return null; - } - } + // 成功返回 + jResult.put("success", true); + jResult.put("code", "0"); - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); - - returnToFront(jResult); - return null; - } + returnToFront(jResult); + return null; } else { jResult.put("success", false); jResult.put("code", "3"); diff --git a/src/com/szpg/rmi/RemoteO2CommandAction.java b/src/com/szpg/rmi/RemoteO2CommandAction.java index 45beb84..9097cec 100644 --- a/src/com/szpg/rmi/RemoteO2CommandAction.java +++ b/src/com/szpg/rmi/RemoteO2CommandAction.java @@ -200,7 +200,7 @@ command.setMessageProducerId(sour); command.setDestinationId(dest); - command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); ((SetO2ThresholdWordCommand) command).setThreshold(Float.parseFloat(threshold)); int start = blObj.getKszdz(); @@ -220,9 +220,6 @@ for (int j = n; j > 0; j--) { dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); } -// for (int j = 0; j < n; j++) { -// dataByte.append(new byte[] {temps[2 * j], temps[2 * j + 1]}); -// } command.setValue( dataByte.toBytes() ); // 调用服务过程执行命令发送服务 diff --git a/src/com/szpg/rmi/RemoteWSCommandAction.java b/src/com/szpg/rmi/RemoteWSCommandAction.java index fb813fb..e7dcf85 100644 --- a/src/com/szpg/rmi/RemoteWSCommandAction.java +++ b/src/com/szpg/rmi/RemoteWSCommandAction.java @@ -19,6 +19,7 @@ import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.message.command.WriteMemoryCommand; import com.szpg.plc.message.command.write.SetSdThresholdWordCommand; +import com.szpg.plc.message.command.write.SetWdThresholdWordCommand; import com.szpg.plc.protocol.fins.FINSConstants; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; @@ -212,7 +213,7 @@ command.setMessageProducerId(sour); command.setDestinationId(dest); - command.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + command.setMemoryArea(FINSConstants.MEMORY_DM_AREA); int start = temBlObj.getKszdz(); int end = temBlObj.getJszdz(); @@ -231,6 +232,10 @@ dataByte.append(new byte[] {temps[2 * (j-1)], temps[2 * (j-1) + 1]}); } command.setValue( dataByte.toBytes() ); + ((SetWdThresholdWordCommand) command).setThreshold(Float.parseFloat(wdThreshold)); + + Logger.getLogger(this.getClass().getName()).info(wdThreshold); + Logger.getLogger(this.getClass().getName()).info(ByteUtil.binToHexString(temps)); // 调用服务过程执行命令发送服务 SetSensorThresholdService service = new SetSensorThresholdService(); diff --git a/src/com/szpg/rmi/RemoteZMCommandAction.java b/src/com/szpg/rmi/RemoteZMCommandAction.java index cb3fd17..6c12fcc 100644 --- a/src/com/szpg/rmi/RemoteZMCommandAction.java +++ b/src/com/szpg/rmi/RemoteZMCommandAction.java @@ -4,14 +4,10 @@ import org.apache.struts2.ServletActionContext; import com.opensymphony.xwork2.ActionSupport; -import com.szpg.db.dao.PgAcuCmdDao; import com.szpg.db.dao.PgAcuDao; -import com.szpg.db.dao.impl.PgAcuCmdDaoImpl; import com.szpg.db.dao.impl.PgAcuDaoImpl; import com.szpg.db.data.PgAcu; -import com.szpg.db.data.PgAcuCmd; import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.CommandResponse; import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.message.command.write.SetZmOffBitCommand; import com.szpg.plc.message.command.write.SetZmOnBitCommand; @@ -24,6 +20,7 @@ import com.szpg.service.ReadControllerStatusService; import com.szpg.service.command.LightCommandService; import com.szpg.util.Configure; +import com.szpg.util.HttpRequest; import com.szpg.util.UnicodeConvertor; import z.json.JSONObject; @@ -147,6 +144,8 @@ // 返回结果 JSONObject jResult = new JSONObject(); + logger.info("[进入打开应急照明接口]" + zcbh); + if (null == zcbh || zcbh.equals("") == true) { jResult.put("success", false); jResult.put("code", "1"); @@ -188,13 +187,14 @@ // 2 发送设置启动位的命令 // 构建打开照明指令 SetZmOnBitCommand setOnCmd = LightCommandService.buildTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { // 解析命令对象为字节数组 byte[] content = finspi.messageToBytes(setOnCmd); // 通过socket接口发送出去 ACUClientUtil.getInstance().sendACUCommand(client, content); - logger.info("[发送打开照明指令]" + ByteUtil.binToHexString(content)); + Logger.getLogger(this.getClass().getName()).info(setOnCmd); } else { jResult.put("success", false); jResult.put("code", "4"); @@ -204,72 +204,27 @@ return null; } - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOnCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOnCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); - - returnToFront(jResult); - return null; - } + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + Thread.sleep(1 * 1000); + setOnCmd = LightCommandService.buildResetTurnOnCommand(sour, dest, zcbh); + if (null != setOnCmd) { + byte[] content = finspi.messageToBytes(setOnCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + Logger.getLogger(this.getClass().getName()).info("[打开照明置1位复位]"); } - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 - setOnCmd = LightCommandService.buildResetTurnOnCommand(sour, dest, zcbh); - if (null != setOnCmd) { - byte[] content = finspi.messageToBytes(setOnCmd); - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); - - returnToFront(jResult); - return null; - } + // 5秒后查询一次照明的状态 + Thread.sleep(5 * 1000); + // 调用远程接口查询照明状态 + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/readZmStatus.action", "zcbh=" + zcbh); + + // 返回成功给界面 + jResult.put("success", true); + jResult.put("code", "0"); + returnToFront(jResult); + + return null; } else { jResult.put("success", false); jResult.put("code", "3"); @@ -335,6 +290,7 @@ // 通过socket接口发送出去 ACUClientUtil.getInstance().sendACUCommand(client, content); + Logger.getLogger(this.getClass().getName()).info(setOffCmd); } else { jResult.put("success", false); jResult.put("code", "4"); @@ -344,72 +300,27 @@ return null; } - // 3将命令存入数据库 - PgAcuCmdDao cmdDao = new PgAcuCmdDaoImpl(); - PgAcuCmd cmd = new PgAcuCmd(); - cmd.setCmd_type(setOffCmd.getCommandType()); - cmd.setDest_acu_code(acucode); - cmd.setTm(setOffCmd.getTime().getTime()); - cmdDao.addCmdRecord(cmd); - - // 4阻塞,循环查找响应消息池,找到对应的响应消息 - boolean flag = false; - int times = 0; - CommandResponse response = null; - while (flag == false && times < 240) { - response = ACUClientUtil.getInstance().responsePool.getResponse(cmd.getId()); - - if (null != response && response.equals("") == false) { - flag = true; - } - - times++; - try { - Thread.sleep(500); - } catch (InterruptedException e) { - // 目前的处理流程为1)记录日志;2)将命令置为超时 - logger.error("在响应池中查找命令的响应消息阻塞线程被异常打断", e); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "5"); - jResult.put("reason", UnicodeConvertor.string2Unicode("查找命令的响应消息时异常")); - - returnToFront(jResult); - return null; - } + // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 + Thread.sleep(1 * 1000); + setOffCmd = LightCommandService.buildResetTurnOffCommand(sour, dest, zcbh); + if (null != setOffCmd) { + byte[] content = finspi.messageToBytes(setOffCmd); + ACUClientUtil.getInstance().sendACUCommand(client, content); + Logger.getLogger(this.getClass().getName()).info("[关闭照明置1位复位]"); } - // 5若未超时,将值存入数据库 - if (null != response) { - // 6根据命令类型的不同将监测值存入对应的数据库 - response.afterAction(); - - // 成功返回 - jResult.put("success", true); - jResult.put("code", "0"); - - // 20190515增加的逻辑,在置1打开位一秒钟后,将该位复位 - setOffCmd = LightCommandService.buildResetTurnOffCommand(sour, dest, zcbh); - if (null != setOffCmd) { - byte[] content = finspi.messageToBytes(setOffCmd); - ACUClientUtil.getInstance().sendACUCommand(client, content); - } - - returnToFront(jResult); - return null; - } else { - // 9超时,将命令的超时标志位置1 - logger.warn("命令超时" + cmd.getId()); - cmdDao.updateCmdRecordTimeout(cmd.getId()); - - jResult.put("success", false); - jResult.put("code", "6"); - jResult.put("reason", UnicodeConvertor.string2Unicode("命令发送超时")); - - returnToFront(jResult); - return null; - } + // 5秒后查询一次照明的状态 + Thread.sleep(5 * 1000); + // 调用远程接口查询照明状态 + String baseURL = Configure.getProperty("sys", "PGDSC_API_URL"); + HttpRequest.sendGet(baseURL + "remote/readZmStatus.action", "zcbh=" + zcbh); + + // 返回成功给界面 + jResult.put("success", true); + jResult.put("code", "0"); + returnToFront(jResult); + + return null; } else { jResult.put("success", false); jResult.put("code", "3"); @@ -434,4 +345,5 @@ ServletActionContext.getResponse().getWriter().write(jResult.toString()); } + } diff --git a/src/struts.xml b/src/struts.xml index d5fcaa9..2da47a8 100644 --- a/src/struts.xml +++ b/src/struts.xml @@ -42,5 +42,9 @@ + + + + diff --git a/src/sys.properties b/src/sys.properties index f960aee..1ef8e9d 100644 --- a/src/sys.properties +++ b/src/sys.properties @@ -1,13 +1,13 @@ #\u6570\u636e\u5e93\u8fde\u63a5\u53c2\u6570 -DB.USERNAME = PG -DB.PASSWORD = PG -DB.HOST = 119.254.103.80 +DB.USERNAME = scott +DB.PASSWORD = scott +DB.HOST = 172.17.0.201 DB.PORT = 1521 -DB.SERVICE = chengdu +DB.SERVICE = szgl #\u672c\u673aIP\u5730\u5740 LOCALHOST.NET = 00 -LOCALHOST.NODE = 52 +LOCALHOST.NODE = 51 LOCALHOST.UNIT = 00 #\u5b9a\u671f\u6e05\u7406\u6570\u636e\u5e93\u4e2d\u8d85\u65f6\u7684\u547d\u4ee4