diff --git a/src/ACUBL.properties b/src/ACUBL.properties index ae086d4..99e858d 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -46,7 +46,7 @@ #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2.START = 0500 #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 -YXL.ACU001.O2.WORDCOUNT = 24 +YXL.ACU001.O2.WORDCOUNT = 4 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2ALM.START = 0036 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -66,3 +66,22 @@ YXL.ACU001.HSALM.WORDCOUNT = 1 #\u786b\u5316\u6c22\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 YXL.ACU001.HSALM.BITCOUNT = 12 + +#\u7206\u7ba1\u6db2\u4f4d\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.YW.COUNT = 2 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.YWALM.START = 0025 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.YWALM.WORDCOUNT = 1 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.YWALM.BITCOUNT = 2 + +#\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.DS.COUNT = 15 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.DSALM.START = 0038 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.DSALM.WORDCOUNT = 3 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.DSALM.BITCOUNT = 45 + diff --git a/src/ACUBL.properties b/src/ACUBL.properties index ae086d4..99e858d 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -46,7 +46,7 @@ #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2.START = 0500 #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 -YXL.ACU001.O2.WORDCOUNT = 24 +YXL.ACU001.O2.WORDCOUNT = 4 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2ALM.START = 0036 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -66,3 +66,22 @@ YXL.ACU001.HSALM.WORDCOUNT = 1 #\u786b\u5316\u6c22\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 YXL.ACU001.HSALM.BITCOUNT = 12 + +#\u7206\u7ba1\u6db2\u4f4d\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.YW.COUNT = 2 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.YWALM.START = 0025 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.YWALM.WORDCOUNT = 1 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.YWALM.BITCOUNT = 2 + +#\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.DS.COUNT = 15 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.DSALM.START = 0038 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.DSALM.WORDCOUNT = 3 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.DSALM.BITCOUNT = 45 + diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 5e6edbc..8d5ab08 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -16,12 +16,14 @@ import com.szpg.task.ReadCH4ValueTask; import com.szpg.task.ReadCOStatusTask; import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; import com.szpg.task.ReadHSStatusTask; import com.szpg.task.ReadHSValueTask; import com.szpg.task.ReadO2StatusTask; import com.szpg.task.ReadO2ValueTask; import com.szpg.task.ReadWSStatusTask; import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -30,11 +32,12 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.103", 6800); + // PLC设备地址和端口 + ACUClient client = new ACUClient("192.168.0.244", 6800); - client.setNet("00"); - client.setNode("6B"); - client.setUnit("00"); + client.setNet("00"); //网络号 + client.setNode("F4"); //节点号 + client.setUnit("00"); //单元号 // 3将ACU的信息加入到map中 ACUClientUtil.getInstance().addClient(client); @@ -44,33 +47,34 @@ // 测试发送查询甲烷参数命令 // dsc.testSendCH4Command(client); - // 测试发送查询甲烷报警状态命令 -// dsc.testSendCH4StatsuCommand(client); +// // 测试发送查询甲烷报警状态命令 +// dsc.testSendCH4StatusCommand(client); // 测试发送查询温湿度监测值命令 // dsc.testSendWSCommand(client); // 测试发送查询温湿度报警状态命令 // dsc.testSendWSStatusCommand(client); - // 测试发送查询一氧化碳参数命令 +// // 测试发送查询一氧化碳参数命令 // dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 +// // 测试发送查询一氧化碳报警状态命令 // dsc.testSendCOStatusCommand(client); - - // 测试发送查询一氧化碳参数命令 -// dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 -// dsc.testSendCOStatusCommand(client); - +// // 测试发送查询氧气参数命令 // dsc.testSendO2Command(client); // 测试发送查询氧气报警状态命令 // dsc.testSendO2StatusCommand(client); +// +// // 测试发送查询硫化氢参数命令 +// dsc.testSendHSCommand(client); +// // 测试发送查询硫化氢报警状态命令 +// dsc.testSendHSStatusCommand(client); - // 测试发送查询硫化氢参数命令 - dsc.testSendHSCommand(client); - // 测试发送查询硫化氢报警状态命令 - dsc.testSendHSStatusCommand(client); + // 测试发送查询爆管液位报警状态命令 + dsc.testSendYWStatusCommand(client); + + // 测试发送查询对射报警状态命令 +// dsc.testSendDSStatusCommand(client); } /** @@ -97,8 +101,9 @@ ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(client, ch4), 10, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -116,7 +121,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); ch4alm.setDestinationId(dest); - ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); @@ -124,8 +129,9 @@ ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4StatusTask(client, ch4alm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -153,8 +159,9 @@ ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSValueTask(client, ws), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -172,7 +179,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); wsalm.setDestinationId(dest); - wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); @@ -180,8 +187,9 @@ wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSStatusTask(client, wsalm), 25, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -208,8 +216,9 @@ co.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOValueTask(client, co), 30, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -227,7 +236,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); coalm.setDestinationId(dest); - coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); coalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.START")), 2)) + "00"); coalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.WORDCOUNT"))); @@ -235,8 +244,9 @@ coalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOStatusTask(client, coalm), 35, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -263,8 +273,9 @@ o2.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2ValueTask(client, o2), 40, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -282,7 +293,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); o2alm.setDestinationId(dest); - o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); o2alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.START")), 2)) + "00"); o2alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.WORDCOUNT"))); @@ -290,8 +301,9 @@ o2alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2StatusTask(client, o2alm), 45, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -318,8 +330,9 @@ hs.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSValueTask(client, hs), 50, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -337,7 +350,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); hsalm.setDestinationId(dest); - hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); hsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.START")), 2)) + "00"); hsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.WORDCOUNT"))); @@ -345,7 +358,65 @@ hsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSStatusTask(client, hsalm), 55, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询爆管液位报警状态命令 + * @param client + */ + public void testSendYWStatusCommand(ACUClient client) { + ReadMemoryCommand ywalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READYWSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ywalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ywalm.setDestinationId(dest); + + ywalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + ywalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.START")), 2)) + "00"); + ywalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.WORDCOUNT"))); + ywalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.BITCOUNT"))); + ywalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YW.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadYWStatusTask(client, ywalm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + + /** + * 发送查询对射报警状态命令 + * @param client + */ + public void testSendDSStatusCommand(ACUClient client) { + ReadMemoryCommand dsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READDSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + dsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + dsalm.setDestinationId(dest); + + dsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + dsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.START")), 2)) + "00"); + dsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.WORDCOUNT"))); + dsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.BITCOUNT"))); + dsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadDSStatusTask(client, dsalm), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/ACUBL.properties b/src/ACUBL.properties index ae086d4..99e858d 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -46,7 +46,7 @@ #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2.START = 0500 #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 -YXL.ACU001.O2.WORDCOUNT = 24 +YXL.ACU001.O2.WORDCOUNT = 4 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2ALM.START = 0036 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -66,3 +66,22 @@ YXL.ACU001.HSALM.WORDCOUNT = 1 #\u786b\u5316\u6c22\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 YXL.ACU001.HSALM.BITCOUNT = 12 + +#\u7206\u7ba1\u6db2\u4f4d\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.YW.COUNT = 2 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.YWALM.START = 0025 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.YWALM.WORDCOUNT = 1 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.YWALM.BITCOUNT = 2 + +#\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.DS.COUNT = 15 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.DSALM.START = 0038 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.DSALM.WORDCOUNT = 3 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.DSALM.BITCOUNT = 45 + diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 5e6edbc..8d5ab08 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -16,12 +16,14 @@ import com.szpg.task.ReadCH4ValueTask; import com.szpg.task.ReadCOStatusTask; import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; import com.szpg.task.ReadHSStatusTask; import com.szpg.task.ReadHSValueTask; import com.szpg.task.ReadO2StatusTask; import com.szpg.task.ReadO2ValueTask; import com.szpg.task.ReadWSStatusTask; import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -30,11 +32,12 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.103", 6800); + // PLC设备地址和端口 + ACUClient client = new ACUClient("192.168.0.244", 6800); - client.setNet("00"); - client.setNode("6B"); - client.setUnit("00"); + client.setNet("00"); //网络号 + client.setNode("F4"); //节点号 + client.setUnit("00"); //单元号 // 3将ACU的信息加入到map中 ACUClientUtil.getInstance().addClient(client); @@ -44,33 +47,34 @@ // 测试发送查询甲烷参数命令 // dsc.testSendCH4Command(client); - // 测试发送查询甲烷报警状态命令 -// dsc.testSendCH4StatsuCommand(client); +// // 测试发送查询甲烷报警状态命令 +// dsc.testSendCH4StatusCommand(client); // 测试发送查询温湿度监测值命令 // dsc.testSendWSCommand(client); // 测试发送查询温湿度报警状态命令 // dsc.testSendWSStatusCommand(client); - // 测试发送查询一氧化碳参数命令 +// // 测试发送查询一氧化碳参数命令 // dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 +// // 测试发送查询一氧化碳报警状态命令 // dsc.testSendCOStatusCommand(client); - - // 测试发送查询一氧化碳参数命令 -// dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 -// dsc.testSendCOStatusCommand(client); - +// // 测试发送查询氧气参数命令 // dsc.testSendO2Command(client); // 测试发送查询氧气报警状态命令 // dsc.testSendO2StatusCommand(client); +// +// // 测试发送查询硫化氢参数命令 +// dsc.testSendHSCommand(client); +// // 测试发送查询硫化氢报警状态命令 +// dsc.testSendHSStatusCommand(client); - // 测试发送查询硫化氢参数命令 - dsc.testSendHSCommand(client); - // 测试发送查询硫化氢报警状态命令 - dsc.testSendHSStatusCommand(client); + // 测试发送查询爆管液位报警状态命令 + dsc.testSendYWStatusCommand(client); + + // 测试发送查询对射报警状态命令 +// dsc.testSendDSStatusCommand(client); } /** @@ -97,8 +101,9 @@ ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(client, ch4), 10, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -116,7 +121,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); ch4alm.setDestinationId(dest); - ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); @@ -124,8 +129,9 @@ ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4StatusTask(client, ch4alm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -153,8 +159,9 @@ ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSValueTask(client, ws), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -172,7 +179,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); wsalm.setDestinationId(dest); - wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); @@ -180,8 +187,9 @@ wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSStatusTask(client, wsalm), 25, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -208,8 +216,9 @@ co.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOValueTask(client, co), 30, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -227,7 +236,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); coalm.setDestinationId(dest); - coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); coalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.START")), 2)) + "00"); coalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.WORDCOUNT"))); @@ -235,8 +244,9 @@ coalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOStatusTask(client, coalm), 35, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -263,8 +273,9 @@ o2.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2ValueTask(client, o2), 40, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -282,7 +293,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); o2alm.setDestinationId(dest); - o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); o2alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.START")), 2)) + "00"); o2alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.WORDCOUNT"))); @@ -290,8 +301,9 @@ o2alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2StatusTask(client, o2alm), 45, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -318,8 +330,9 @@ hs.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSValueTask(client, hs), 50, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -337,7 +350,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); hsalm.setDestinationId(dest); - hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); hsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.START")), 2)) + "00"); hsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.WORDCOUNT"))); @@ -345,7 +358,65 @@ hsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSStatusTask(client, hsalm), 55, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询爆管液位报警状态命令 + * @param client + */ + public void testSendYWStatusCommand(ACUClient client) { + ReadMemoryCommand ywalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READYWSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ywalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ywalm.setDestinationId(dest); + + ywalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + ywalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.START")), 2)) + "00"); + ywalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.WORDCOUNT"))); + ywalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.BITCOUNT"))); + ywalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YW.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadYWStatusTask(client, ywalm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + + /** + * 发送查询对射报警状态命令 + * @param client + */ + public void testSendDSStatusCommand(ACUClient client) { + ReadMemoryCommand dsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READDSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + dsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + dsalm.setDestinationId(dest); + + dsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + dsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.START")), 2)) + "00"); + dsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.WORDCOUNT"))); + dsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.BITCOUNT"))); + dsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadDSStatusTask(client, dsalm), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index 70fb6dc..a9d5686 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -10,6 +10,7 @@ public PgAcuRdcmd findById(String id); public PgAcuRdcmd findLatestCmdByDestAndCount(String dest, int count); + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type); public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); diff --git a/src/ACUBL.properties b/src/ACUBL.properties index ae086d4..99e858d 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -46,7 +46,7 @@ #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2.START = 0500 #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 -YXL.ACU001.O2.WORDCOUNT = 24 +YXL.ACU001.O2.WORDCOUNT = 4 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2ALM.START = 0036 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -66,3 +66,22 @@ YXL.ACU001.HSALM.WORDCOUNT = 1 #\u786b\u5316\u6c22\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 YXL.ACU001.HSALM.BITCOUNT = 12 + +#\u7206\u7ba1\u6db2\u4f4d\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.YW.COUNT = 2 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.YWALM.START = 0025 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.YWALM.WORDCOUNT = 1 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.YWALM.BITCOUNT = 2 + +#\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.DS.COUNT = 15 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.DSALM.START = 0038 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.DSALM.WORDCOUNT = 3 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.DSALM.BITCOUNT = 45 + diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 5e6edbc..8d5ab08 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -16,12 +16,14 @@ import com.szpg.task.ReadCH4ValueTask; import com.szpg.task.ReadCOStatusTask; import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; import com.szpg.task.ReadHSStatusTask; import com.szpg.task.ReadHSValueTask; import com.szpg.task.ReadO2StatusTask; import com.szpg.task.ReadO2ValueTask; import com.szpg.task.ReadWSStatusTask; import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -30,11 +32,12 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.103", 6800); + // PLC设备地址和端口 + ACUClient client = new ACUClient("192.168.0.244", 6800); - client.setNet("00"); - client.setNode("6B"); - client.setUnit("00"); + client.setNet("00"); //网络号 + client.setNode("F4"); //节点号 + client.setUnit("00"); //单元号 // 3将ACU的信息加入到map中 ACUClientUtil.getInstance().addClient(client); @@ -44,33 +47,34 @@ // 测试发送查询甲烷参数命令 // dsc.testSendCH4Command(client); - // 测试发送查询甲烷报警状态命令 -// dsc.testSendCH4StatsuCommand(client); +// // 测试发送查询甲烷报警状态命令 +// dsc.testSendCH4StatusCommand(client); // 测试发送查询温湿度监测值命令 // dsc.testSendWSCommand(client); // 测试发送查询温湿度报警状态命令 // dsc.testSendWSStatusCommand(client); - // 测试发送查询一氧化碳参数命令 +// // 测试发送查询一氧化碳参数命令 // dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 +// // 测试发送查询一氧化碳报警状态命令 // dsc.testSendCOStatusCommand(client); - - // 测试发送查询一氧化碳参数命令 -// dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 -// dsc.testSendCOStatusCommand(client); - +// // 测试发送查询氧气参数命令 // dsc.testSendO2Command(client); // 测试发送查询氧气报警状态命令 // dsc.testSendO2StatusCommand(client); +// +// // 测试发送查询硫化氢参数命令 +// dsc.testSendHSCommand(client); +// // 测试发送查询硫化氢报警状态命令 +// dsc.testSendHSStatusCommand(client); - // 测试发送查询硫化氢参数命令 - dsc.testSendHSCommand(client); - // 测试发送查询硫化氢报警状态命令 - dsc.testSendHSStatusCommand(client); + // 测试发送查询爆管液位报警状态命令 + dsc.testSendYWStatusCommand(client); + + // 测试发送查询对射报警状态命令 +// dsc.testSendDSStatusCommand(client); } /** @@ -97,8 +101,9 @@ ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(client, ch4), 10, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -116,7 +121,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); ch4alm.setDestinationId(dest); - ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); @@ -124,8 +129,9 @@ ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4StatusTask(client, ch4alm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -153,8 +159,9 @@ ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSValueTask(client, ws), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -172,7 +179,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); wsalm.setDestinationId(dest); - wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); @@ -180,8 +187,9 @@ wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSStatusTask(client, wsalm), 25, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -208,8 +216,9 @@ co.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOValueTask(client, co), 30, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -227,7 +236,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); coalm.setDestinationId(dest); - coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); coalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.START")), 2)) + "00"); coalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.WORDCOUNT"))); @@ -235,8 +244,9 @@ coalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOStatusTask(client, coalm), 35, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -263,8 +273,9 @@ o2.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2ValueTask(client, o2), 40, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -282,7 +293,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); o2alm.setDestinationId(dest); - o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); o2alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.START")), 2)) + "00"); o2alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.WORDCOUNT"))); @@ -290,8 +301,9 @@ o2alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2StatusTask(client, o2alm), 45, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -318,8 +330,9 @@ hs.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSValueTask(client, hs), 50, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -337,7 +350,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); hsalm.setDestinationId(dest); - hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); hsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.START")), 2)) + "00"); hsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.WORDCOUNT"))); @@ -345,7 +358,65 @@ hsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSStatusTask(client, hsalm), 55, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询爆管液位报警状态命令 + * @param client + */ + public void testSendYWStatusCommand(ACUClient client) { + ReadMemoryCommand ywalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READYWSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ywalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ywalm.setDestinationId(dest); + + ywalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + ywalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.START")), 2)) + "00"); + ywalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.WORDCOUNT"))); + ywalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.BITCOUNT"))); + ywalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YW.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadYWStatusTask(client, ywalm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + + /** + * 发送查询对射报警状态命令 + * @param client + */ + public void testSendDSStatusCommand(ACUClient client) { + ReadMemoryCommand dsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READDSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + dsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + dsalm.setDestinationId(dest); + + dsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + dsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.START")), 2)) + "00"); + dsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.WORDCOUNT"))); + dsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.BITCOUNT"))); + dsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadDSStatusTask(client, dsalm), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index 70fb6dc..a9d5686 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -10,6 +10,7 @@ public PgAcuRdcmd findById(String id); public PgAcuRdcmd findLatestCmdByDestAndCount(String dest, int count); + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type); public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); diff --git a/src/com/szpg/db/dao/PgDSDao.java b/src/com/szpg/db/dao/PgDSDao.java new file mode 100644 index 0000000..b731af9 --- /dev/null +++ b/src/com/szpg/db/dao/PgDSDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgDSAlm; + +/** + * 对射报警相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgDSDao { + + /******** 对射报警状态 ********/ + public List findAllSbjz(); + public PgDSAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgDSAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index ae086d4..99e858d 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -46,7 +46,7 @@ #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2.START = 0500 #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 -YXL.ACU001.O2.WORDCOUNT = 24 +YXL.ACU001.O2.WORDCOUNT = 4 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2ALM.START = 0036 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -66,3 +66,22 @@ YXL.ACU001.HSALM.WORDCOUNT = 1 #\u786b\u5316\u6c22\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 YXL.ACU001.HSALM.BITCOUNT = 12 + +#\u7206\u7ba1\u6db2\u4f4d\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.YW.COUNT = 2 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.YWALM.START = 0025 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.YWALM.WORDCOUNT = 1 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.YWALM.BITCOUNT = 2 + +#\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.DS.COUNT = 15 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.DSALM.START = 0038 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.DSALM.WORDCOUNT = 3 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.DSALM.BITCOUNT = 45 + diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 5e6edbc..8d5ab08 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -16,12 +16,14 @@ import com.szpg.task.ReadCH4ValueTask; import com.szpg.task.ReadCOStatusTask; import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; import com.szpg.task.ReadHSStatusTask; import com.szpg.task.ReadHSValueTask; import com.szpg.task.ReadO2StatusTask; import com.szpg.task.ReadO2ValueTask; import com.szpg.task.ReadWSStatusTask; import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -30,11 +32,12 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.103", 6800); + // PLC设备地址和端口 + ACUClient client = new ACUClient("192.168.0.244", 6800); - client.setNet("00"); - client.setNode("6B"); - client.setUnit("00"); + client.setNet("00"); //网络号 + client.setNode("F4"); //节点号 + client.setUnit("00"); //单元号 // 3将ACU的信息加入到map中 ACUClientUtil.getInstance().addClient(client); @@ -44,33 +47,34 @@ // 测试发送查询甲烷参数命令 // dsc.testSendCH4Command(client); - // 测试发送查询甲烷报警状态命令 -// dsc.testSendCH4StatsuCommand(client); +// // 测试发送查询甲烷报警状态命令 +// dsc.testSendCH4StatusCommand(client); // 测试发送查询温湿度监测值命令 // dsc.testSendWSCommand(client); // 测试发送查询温湿度报警状态命令 // dsc.testSendWSStatusCommand(client); - // 测试发送查询一氧化碳参数命令 +// // 测试发送查询一氧化碳参数命令 // dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 +// // 测试发送查询一氧化碳报警状态命令 // dsc.testSendCOStatusCommand(client); - - // 测试发送查询一氧化碳参数命令 -// dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 -// dsc.testSendCOStatusCommand(client); - +// // 测试发送查询氧气参数命令 // dsc.testSendO2Command(client); // 测试发送查询氧气报警状态命令 // dsc.testSendO2StatusCommand(client); +// +// // 测试发送查询硫化氢参数命令 +// dsc.testSendHSCommand(client); +// // 测试发送查询硫化氢报警状态命令 +// dsc.testSendHSStatusCommand(client); - // 测试发送查询硫化氢参数命令 - dsc.testSendHSCommand(client); - // 测试发送查询硫化氢报警状态命令 - dsc.testSendHSStatusCommand(client); + // 测试发送查询爆管液位报警状态命令 + dsc.testSendYWStatusCommand(client); + + // 测试发送查询对射报警状态命令 +// dsc.testSendDSStatusCommand(client); } /** @@ -97,8 +101,9 @@ ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(client, ch4), 10, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -116,7 +121,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); ch4alm.setDestinationId(dest); - ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); @@ -124,8 +129,9 @@ ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4StatusTask(client, ch4alm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -153,8 +159,9 @@ ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSValueTask(client, ws), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -172,7 +179,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); wsalm.setDestinationId(dest); - wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); @@ -180,8 +187,9 @@ wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSStatusTask(client, wsalm), 25, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -208,8 +216,9 @@ co.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOValueTask(client, co), 30, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -227,7 +236,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); coalm.setDestinationId(dest); - coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); coalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.START")), 2)) + "00"); coalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.WORDCOUNT"))); @@ -235,8 +244,9 @@ coalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOStatusTask(client, coalm), 35, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -263,8 +273,9 @@ o2.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2ValueTask(client, o2), 40, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -282,7 +293,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); o2alm.setDestinationId(dest); - o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); o2alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.START")), 2)) + "00"); o2alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.WORDCOUNT"))); @@ -290,8 +301,9 @@ o2alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2StatusTask(client, o2alm), 45, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -318,8 +330,9 @@ hs.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSValueTask(client, hs), 50, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -337,7 +350,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); hsalm.setDestinationId(dest); - hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); hsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.START")), 2)) + "00"); hsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.WORDCOUNT"))); @@ -345,7 +358,65 @@ hsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSStatusTask(client, hsalm), 55, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询爆管液位报警状态命令 + * @param client + */ + public void testSendYWStatusCommand(ACUClient client) { + ReadMemoryCommand ywalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READYWSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ywalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ywalm.setDestinationId(dest); + + ywalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + ywalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.START")), 2)) + "00"); + ywalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.WORDCOUNT"))); + ywalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.BITCOUNT"))); + ywalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YW.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadYWStatusTask(client, ywalm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + + /** + * 发送查询对射报警状态命令 + * @param client + */ + public void testSendDSStatusCommand(ACUClient client) { + ReadMemoryCommand dsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READDSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + dsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + dsalm.setDestinationId(dest); + + dsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + dsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.START")), 2)) + "00"); + dsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.WORDCOUNT"))); + dsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.BITCOUNT"))); + dsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadDSStatusTask(client, dsalm), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index 70fb6dc..a9d5686 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -10,6 +10,7 @@ public PgAcuRdcmd findById(String id); public PgAcuRdcmd findLatestCmdByDestAndCount(String dest, int count); + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type); public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); diff --git a/src/com/szpg/db/dao/PgDSDao.java b/src/com/szpg/db/dao/PgDSDao.java new file mode 100644 index 0000000..b731af9 --- /dev/null +++ b/src/com/szpg/db/dao/PgDSDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgDSAlm; + +/** + * 对射报警相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgDSDao { + + /******** 对射报警状态 ********/ + public List findAllSbjz(); + public PgDSAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgDSAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/PgYWDao.java b/src/com/szpg/db/dao/PgYWDao.java new file mode 100644 index 0000000..bb27bbf --- /dev/null +++ b/src/com/szpg/db/dao/PgYWDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgYWAlm; + +/** + * 爆管液位相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgYWDao { + + /******** 爆管液位浓度报警状态 ********/ + public List findAllSbjz(); + public PgYWAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgYWAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index ae086d4..99e858d 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -46,7 +46,7 @@ #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2.START = 0500 #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 -YXL.ACU001.O2.WORDCOUNT = 24 +YXL.ACU001.O2.WORDCOUNT = 4 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2ALM.START = 0036 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -66,3 +66,22 @@ YXL.ACU001.HSALM.WORDCOUNT = 1 #\u786b\u5316\u6c22\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 YXL.ACU001.HSALM.BITCOUNT = 12 + +#\u7206\u7ba1\u6db2\u4f4d\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.YW.COUNT = 2 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.YWALM.START = 0025 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.YWALM.WORDCOUNT = 1 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.YWALM.BITCOUNT = 2 + +#\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.DS.COUNT = 15 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.DSALM.START = 0038 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.DSALM.WORDCOUNT = 3 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.DSALM.BITCOUNT = 45 + diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 5e6edbc..8d5ab08 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -16,12 +16,14 @@ import com.szpg.task.ReadCH4ValueTask; import com.szpg.task.ReadCOStatusTask; import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; import com.szpg.task.ReadHSStatusTask; import com.szpg.task.ReadHSValueTask; import com.szpg.task.ReadO2StatusTask; import com.szpg.task.ReadO2ValueTask; import com.szpg.task.ReadWSStatusTask; import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -30,11 +32,12 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.103", 6800); + // PLC设备地址和端口 + ACUClient client = new ACUClient("192.168.0.244", 6800); - client.setNet("00"); - client.setNode("6B"); - client.setUnit("00"); + client.setNet("00"); //网络号 + client.setNode("F4"); //节点号 + client.setUnit("00"); //单元号 // 3将ACU的信息加入到map中 ACUClientUtil.getInstance().addClient(client); @@ -44,33 +47,34 @@ // 测试发送查询甲烷参数命令 // dsc.testSendCH4Command(client); - // 测试发送查询甲烷报警状态命令 -// dsc.testSendCH4StatsuCommand(client); +// // 测试发送查询甲烷报警状态命令 +// dsc.testSendCH4StatusCommand(client); // 测试发送查询温湿度监测值命令 // dsc.testSendWSCommand(client); // 测试发送查询温湿度报警状态命令 // dsc.testSendWSStatusCommand(client); - // 测试发送查询一氧化碳参数命令 +// // 测试发送查询一氧化碳参数命令 // dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 +// // 测试发送查询一氧化碳报警状态命令 // dsc.testSendCOStatusCommand(client); - - // 测试发送查询一氧化碳参数命令 -// dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 -// dsc.testSendCOStatusCommand(client); - +// // 测试发送查询氧气参数命令 // dsc.testSendO2Command(client); // 测试发送查询氧气报警状态命令 // dsc.testSendO2StatusCommand(client); +// +// // 测试发送查询硫化氢参数命令 +// dsc.testSendHSCommand(client); +// // 测试发送查询硫化氢报警状态命令 +// dsc.testSendHSStatusCommand(client); - // 测试发送查询硫化氢参数命令 - dsc.testSendHSCommand(client); - // 测试发送查询硫化氢报警状态命令 - dsc.testSendHSStatusCommand(client); + // 测试发送查询爆管液位报警状态命令 + dsc.testSendYWStatusCommand(client); + + // 测试发送查询对射报警状态命令 +// dsc.testSendDSStatusCommand(client); } /** @@ -97,8 +101,9 @@ ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(client, ch4), 10, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -116,7 +121,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); ch4alm.setDestinationId(dest); - ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); @@ -124,8 +129,9 @@ ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4StatusTask(client, ch4alm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -153,8 +159,9 @@ ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSValueTask(client, ws), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -172,7 +179,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); wsalm.setDestinationId(dest); - wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); @@ -180,8 +187,9 @@ wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSStatusTask(client, wsalm), 25, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -208,8 +216,9 @@ co.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOValueTask(client, co), 30, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -227,7 +236,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); coalm.setDestinationId(dest); - coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); coalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.START")), 2)) + "00"); coalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.WORDCOUNT"))); @@ -235,8 +244,9 @@ coalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOStatusTask(client, coalm), 35, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -263,8 +273,9 @@ o2.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2ValueTask(client, o2), 40, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -282,7 +293,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); o2alm.setDestinationId(dest); - o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); o2alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.START")), 2)) + "00"); o2alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.WORDCOUNT"))); @@ -290,8 +301,9 @@ o2alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2StatusTask(client, o2alm), 45, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -318,8 +330,9 @@ hs.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSValueTask(client, hs), 50, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -337,7 +350,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); hsalm.setDestinationId(dest); - hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); hsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.START")), 2)) + "00"); hsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.WORDCOUNT"))); @@ -345,7 +358,65 @@ hsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSStatusTask(client, hsalm), 55, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询爆管液位报警状态命令 + * @param client + */ + public void testSendYWStatusCommand(ACUClient client) { + ReadMemoryCommand ywalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READYWSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ywalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ywalm.setDestinationId(dest); + + ywalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + ywalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.START")), 2)) + "00"); + ywalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.WORDCOUNT"))); + ywalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.BITCOUNT"))); + ywalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YW.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadYWStatusTask(client, ywalm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + + /** + * 发送查询对射报警状态命令 + * @param client + */ + public void testSendDSStatusCommand(ACUClient client) { + ReadMemoryCommand dsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READDSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + dsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + dsalm.setDestinationId(dest); + + dsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + dsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.START")), 2)) + "00"); + dsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.WORDCOUNT"))); + dsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.BITCOUNT"))); + dsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadDSStatusTask(client, dsalm), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index 70fb6dc..a9d5686 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -10,6 +10,7 @@ public PgAcuRdcmd findById(String id); public PgAcuRdcmd findLatestCmdByDestAndCount(String dest, int count); + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type); public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); diff --git a/src/com/szpg/db/dao/PgDSDao.java b/src/com/szpg/db/dao/PgDSDao.java new file mode 100644 index 0000000..b731af9 --- /dev/null +++ b/src/com/szpg/db/dao/PgDSDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgDSAlm; + +/** + * 对射报警相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgDSDao { + + /******** 对射报警状态 ********/ + public List findAllSbjz(); + public PgDSAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgDSAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/PgYWDao.java b/src/com/szpg/db/dao/PgYWDao.java new file mode 100644 index 0000000..bb27bbf --- /dev/null +++ b/src/com/szpg/db/dao/PgYWDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgYWAlm; + +/** + * 爆管液位相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgYWDao { + + /******** 爆管液位浓度报警状态 ********/ + public List findAllSbjz(); + public PgYWAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgYWAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index b693939..16b2285 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -114,6 +114,41 @@ } return null; } + + + @Override + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ACU_RDCMD WHERE RESPONSED='0' AND TIMEOUT='0' AND DEST=? AND CMD_TYPE=? ORDER BY TM DESC"; + Object[] params = new Object[2]; + params[0] = dest; + params[1] = type; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAcuRdcmd.class), params); + + if (null != list && list.isEmpty() == false) { + logger.debug("根据目的地址和命令类型查询内存读取命令成功[" + list.size() + "]"); + + return list.get(0); + } else + return null; + } catch (Exception ex) { + logger.error("根据目的地址和命令类型查询内存读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } @Override public int addCmdRecord(PgAcuRdcmd cmd) { diff --git a/src/ACUBL.properties b/src/ACUBL.properties index ae086d4..99e858d 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -46,7 +46,7 @@ #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2.START = 0500 #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 -YXL.ACU001.O2.WORDCOUNT = 24 +YXL.ACU001.O2.WORDCOUNT = 4 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2ALM.START = 0036 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -66,3 +66,22 @@ YXL.ACU001.HSALM.WORDCOUNT = 1 #\u786b\u5316\u6c22\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 YXL.ACU001.HSALM.BITCOUNT = 12 + +#\u7206\u7ba1\u6db2\u4f4d\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.YW.COUNT = 2 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.YWALM.START = 0025 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.YWALM.WORDCOUNT = 1 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.YWALM.BITCOUNT = 2 + +#\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.DS.COUNT = 15 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.DSALM.START = 0038 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.DSALM.WORDCOUNT = 3 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.DSALM.BITCOUNT = 45 + diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 5e6edbc..8d5ab08 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -16,12 +16,14 @@ import com.szpg.task.ReadCH4ValueTask; import com.szpg.task.ReadCOStatusTask; import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; import com.szpg.task.ReadHSStatusTask; import com.szpg.task.ReadHSValueTask; import com.szpg.task.ReadO2StatusTask; import com.szpg.task.ReadO2ValueTask; import com.szpg.task.ReadWSStatusTask; import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -30,11 +32,12 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.103", 6800); + // PLC设备地址和端口 + ACUClient client = new ACUClient("192.168.0.244", 6800); - client.setNet("00"); - client.setNode("6B"); - client.setUnit("00"); + client.setNet("00"); //网络号 + client.setNode("F4"); //节点号 + client.setUnit("00"); //单元号 // 3将ACU的信息加入到map中 ACUClientUtil.getInstance().addClient(client); @@ -44,33 +47,34 @@ // 测试发送查询甲烷参数命令 // dsc.testSendCH4Command(client); - // 测试发送查询甲烷报警状态命令 -// dsc.testSendCH4StatsuCommand(client); +// // 测试发送查询甲烷报警状态命令 +// dsc.testSendCH4StatusCommand(client); // 测试发送查询温湿度监测值命令 // dsc.testSendWSCommand(client); // 测试发送查询温湿度报警状态命令 // dsc.testSendWSStatusCommand(client); - // 测试发送查询一氧化碳参数命令 +// // 测试发送查询一氧化碳参数命令 // dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 +// // 测试发送查询一氧化碳报警状态命令 // dsc.testSendCOStatusCommand(client); - - // 测试发送查询一氧化碳参数命令 -// dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 -// dsc.testSendCOStatusCommand(client); - +// // 测试发送查询氧气参数命令 // dsc.testSendO2Command(client); // 测试发送查询氧气报警状态命令 // dsc.testSendO2StatusCommand(client); +// +// // 测试发送查询硫化氢参数命令 +// dsc.testSendHSCommand(client); +// // 测试发送查询硫化氢报警状态命令 +// dsc.testSendHSStatusCommand(client); - // 测试发送查询硫化氢参数命令 - dsc.testSendHSCommand(client); - // 测试发送查询硫化氢报警状态命令 - dsc.testSendHSStatusCommand(client); + // 测试发送查询爆管液位报警状态命令 + dsc.testSendYWStatusCommand(client); + + // 测试发送查询对射报警状态命令 +// dsc.testSendDSStatusCommand(client); } /** @@ -97,8 +101,9 @@ ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(client, ch4), 10, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -116,7 +121,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); ch4alm.setDestinationId(dest); - ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); @@ -124,8 +129,9 @@ ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4StatusTask(client, ch4alm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -153,8 +159,9 @@ ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSValueTask(client, ws), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -172,7 +179,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); wsalm.setDestinationId(dest); - wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); @@ -180,8 +187,9 @@ wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSStatusTask(client, wsalm), 25, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -208,8 +216,9 @@ co.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOValueTask(client, co), 30, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -227,7 +236,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); coalm.setDestinationId(dest); - coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); coalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.START")), 2)) + "00"); coalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.WORDCOUNT"))); @@ -235,8 +244,9 @@ coalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOStatusTask(client, coalm), 35, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -263,8 +273,9 @@ o2.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2ValueTask(client, o2), 40, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -282,7 +293,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); o2alm.setDestinationId(dest); - o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); o2alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.START")), 2)) + "00"); o2alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.WORDCOUNT"))); @@ -290,8 +301,9 @@ o2alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2StatusTask(client, o2alm), 45, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -318,8 +330,9 @@ hs.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSValueTask(client, hs), 50, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -337,7 +350,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); hsalm.setDestinationId(dest); - hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); hsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.START")), 2)) + "00"); hsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.WORDCOUNT"))); @@ -345,7 +358,65 @@ hsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSStatusTask(client, hsalm), 55, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询爆管液位报警状态命令 + * @param client + */ + public void testSendYWStatusCommand(ACUClient client) { + ReadMemoryCommand ywalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READYWSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ywalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ywalm.setDestinationId(dest); + + ywalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + ywalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.START")), 2)) + "00"); + ywalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.WORDCOUNT"))); + ywalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.BITCOUNT"))); + ywalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YW.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadYWStatusTask(client, ywalm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + + /** + * 发送查询对射报警状态命令 + * @param client + */ + public void testSendDSStatusCommand(ACUClient client) { + ReadMemoryCommand dsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READDSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + dsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + dsalm.setDestinationId(dest); + + dsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + dsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.START")), 2)) + "00"); + dsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.WORDCOUNT"))); + dsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.BITCOUNT"))); + dsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadDSStatusTask(client, dsalm), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index 70fb6dc..a9d5686 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -10,6 +10,7 @@ public PgAcuRdcmd findById(String id); public PgAcuRdcmd findLatestCmdByDestAndCount(String dest, int count); + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type); public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); diff --git a/src/com/szpg/db/dao/PgDSDao.java b/src/com/szpg/db/dao/PgDSDao.java new file mode 100644 index 0000000..b731af9 --- /dev/null +++ b/src/com/szpg/db/dao/PgDSDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgDSAlm; + +/** + * 对射报警相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgDSDao { + + /******** 对射报警状态 ********/ + public List findAllSbjz(); + public PgDSAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgDSAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/PgYWDao.java b/src/com/szpg/db/dao/PgYWDao.java new file mode 100644 index 0000000..bb27bbf --- /dev/null +++ b/src/com/szpg/db/dao/PgYWDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgYWAlm; + +/** + * 爆管液位相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgYWDao { + + /******** 爆管液位浓度报警状态 ********/ + public List findAllSbjz(); + public PgYWAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgYWAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index b693939..16b2285 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -114,6 +114,41 @@ } return null; } + + + @Override + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ACU_RDCMD WHERE RESPONSED='0' AND TIMEOUT='0' AND DEST=? AND CMD_TYPE=? ORDER BY TM DESC"; + Object[] params = new Object[2]; + params[0] = dest; + params[1] = type; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAcuRdcmd.class), params); + + if (null != list && list.isEmpty() == false) { + logger.debug("根据目的地址和命令类型查询内存读取命令成功[" + list.size() + "]"); + + return list.get(0); + } else + return null; + } catch (Exception ex) { + logger.error("根据目的地址和命令类型查询内存读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } @Override public int addCmdRecord(PgAcuRdcmd cmd) { diff --git a/src/com/szpg/db/dao/impl/PgDSDaoImpl.java b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java new file mode 100644 index 0000000..e9d18cd --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.data.PgDSAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgDSDaoImpl implements PgDSDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgDSAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(0); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询对射报警状态成功" + dsalm + "]"); + + return dsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgDSAlm dsalm) { + return addSbjzRecord(dsalm.getDsalm(), dsalm.getTmStr(), dsalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_DS_ALM " + + "(DSALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入对射报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入对射报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index ae086d4..99e858d 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -46,7 +46,7 @@ #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2.START = 0500 #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 -YXL.ACU001.O2.WORDCOUNT = 24 +YXL.ACU001.O2.WORDCOUNT = 4 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2ALM.START = 0036 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -66,3 +66,22 @@ YXL.ACU001.HSALM.WORDCOUNT = 1 #\u786b\u5316\u6c22\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 YXL.ACU001.HSALM.BITCOUNT = 12 + +#\u7206\u7ba1\u6db2\u4f4d\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.YW.COUNT = 2 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.YWALM.START = 0025 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.YWALM.WORDCOUNT = 1 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.YWALM.BITCOUNT = 2 + +#\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.DS.COUNT = 15 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.DSALM.START = 0038 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.DSALM.WORDCOUNT = 3 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.DSALM.BITCOUNT = 45 + diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 5e6edbc..8d5ab08 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -16,12 +16,14 @@ import com.szpg.task.ReadCH4ValueTask; import com.szpg.task.ReadCOStatusTask; import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; import com.szpg.task.ReadHSStatusTask; import com.szpg.task.ReadHSValueTask; import com.szpg.task.ReadO2StatusTask; import com.szpg.task.ReadO2ValueTask; import com.szpg.task.ReadWSStatusTask; import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -30,11 +32,12 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.103", 6800); + // PLC设备地址和端口 + ACUClient client = new ACUClient("192.168.0.244", 6800); - client.setNet("00"); - client.setNode("6B"); - client.setUnit("00"); + client.setNet("00"); //网络号 + client.setNode("F4"); //节点号 + client.setUnit("00"); //单元号 // 3将ACU的信息加入到map中 ACUClientUtil.getInstance().addClient(client); @@ -44,33 +47,34 @@ // 测试发送查询甲烷参数命令 // dsc.testSendCH4Command(client); - // 测试发送查询甲烷报警状态命令 -// dsc.testSendCH4StatsuCommand(client); +// // 测试发送查询甲烷报警状态命令 +// dsc.testSendCH4StatusCommand(client); // 测试发送查询温湿度监测值命令 // dsc.testSendWSCommand(client); // 测试发送查询温湿度报警状态命令 // dsc.testSendWSStatusCommand(client); - // 测试发送查询一氧化碳参数命令 +// // 测试发送查询一氧化碳参数命令 // dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 +// // 测试发送查询一氧化碳报警状态命令 // dsc.testSendCOStatusCommand(client); - - // 测试发送查询一氧化碳参数命令 -// dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 -// dsc.testSendCOStatusCommand(client); - +// // 测试发送查询氧气参数命令 // dsc.testSendO2Command(client); // 测试发送查询氧气报警状态命令 // dsc.testSendO2StatusCommand(client); +// +// // 测试发送查询硫化氢参数命令 +// dsc.testSendHSCommand(client); +// // 测试发送查询硫化氢报警状态命令 +// dsc.testSendHSStatusCommand(client); - // 测试发送查询硫化氢参数命令 - dsc.testSendHSCommand(client); - // 测试发送查询硫化氢报警状态命令 - dsc.testSendHSStatusCommand(client); + // 测试发送查询爆管液位报警状态命令 + dsc.testSendYWStatusCommand(client); + + // 测试发送查询对射报警状态命令 +// dsc.testSendDSStatusCommand(client); } /** @@ -97,8 +101,9 @@ ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(client, ch4), 10, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -116,7 +121,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); ch4alm.setDestinationId(dest); - ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); @@ -124,8 +129,9 @@ ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4StatusTask(client, ch4alm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -153,8 +159,9 @@ ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSValueTask(client, ws), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -172,7 +179,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); wsalm.setDestinationId(dest); - wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); @@ -180,8 +187,9 @@ wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSStatusTask(client, wsalm), 25, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -208,8 +216,9 @@ co.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOValueTask(client, co), 30, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -227,7 +236,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); coalm.setDestinationId(dest); - coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); coalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.START")), 2)) + "00"); coalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.WORDCOUNT"))); @@ -235,8 +244,9 @@ coalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOStatusTask(client, coalm), 35, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -263,8 +273,9 @@ o2.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2ValueTask(client, o2), 40, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -282,7 +293,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); o2alm.setDestinationId(dest); - o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); o2alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.START")), 2)) + "00"); o2alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.WORDCOUNT"))); @@ -290,8 +301,9 @@ o2alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2StatusTask(client, o2alm), 45, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -318,8 +330,9 @@ hs.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSValueTask(client, hs), 50, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -337,7 +350,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); hsalm.setDestinationId(dest); - hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); hsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.START")), 2)) + "00"); hsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.WORDCOUNT"))); @@ -345,7 +358,65 @@ hsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSStatusTask(client, hsalm), 55, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询爆管液位报警状态命令 + * @param client + */ + public void testSendYWStatusCommand(ACUClient client) { + ReadMemoryCommand ywalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READYWSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ywalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ywalm.setDestinationId(dest); + + ywalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + ywalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.START")), 2)) + "00"); + ywalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.WORDCOUNT"))); + ywalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.BITCOUNT"))); + ywalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YW.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadYWStatusTask(client, ywalm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + + /** + * 发送查询对射报警状态命令 + * @param client + */ + public void testSendDSStatusCommand(ACUClient client) { + ReadMemoryCommand dsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READDSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + dsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + dsalm.setDestinationId(dest); + + dsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + dsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.START")), 2)) + "00"); + dsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.WORDCOUNT"))); + dsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.BITCOUNT"))); + dsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadDSStatusTask(client, dsalm), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index 70fb6dc..a9d5686 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -10,6 +10,7 @@ public PgAcuRdcmd findById(String id); public PgAcuRdcmd findLatestCmdByDestAndCount(String dest, int count); + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type); public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); diff --git a/src/com/szpg/db/dao/PgDSDao.java b/src/com/szpg/db/dao/PgDSDao.java new file mode 100644 index 0000000..b731af9 --- /dev/null +++ b/src/com/szpg/db/dao/PgDSDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgDSAlm; + +/** + * 对射报警相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgDSDao { + + /******** 对射报警状态 ********/ + public List findAllSbjz(); + public PgDSAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgDSAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/PgYWDao.java b/src/com/szpg/db/dao/PgYWDao.java new file mode 100644 index 0000000..bb27bbf --- /dev/null +++ b/src/com/szpg/db/dao/PgYWDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgYWAlm; + +/** + * 爆管液位相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgYWDao { + + /******** 爆管液位浓度报警状态 ********/ + public List findAllSbjz(); + public PgYWAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgYWAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index b693939..16b2285 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -114,6 +114,41 @@ } return null; } + + + @Override + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ACU_RDCMD WHERE RESPONSED='0' AND TIMEOUT='0' AND DEST=? AND CMD_TYPE=? ORDER BY TM DESC"; + Object[] params = new Object[2]; + params[0] = dest; + params[1] = type; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAcuRdcmd.class), params); + + if (null != list && list.isEmpty() == false) { + logger.debug("根据目的地址和命令类型查询内存读取命令成功[" + list.size() + "]"); + + return list.get(0); + } else + return null; + } catch (Exception ex) { + logger.error("根据目的地址和命令类型查询内存读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } @Override public int addCmdRecord(PgAcuRdcmd cmd) { diff --git a/src/com/szpg/db/dao/impl/PgDSDaoImpl.java b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java new file mode 100644 index 0000000..e9d18cd --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.data.PgDSAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgDSDaoImpl implements PgDSDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgDSAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(0); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询对射报警状态成功" + dsalm + "]"); + + return dsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgDSAlm dsalm) { + return addSbjzRecord(dsalm.getDsalm(), dsalm.getTmStr(), dsalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_DS_ALM " + + "(DSALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入对射报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入对射报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 657281c..7706852 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -39,6 +39,12 @@ case "HS": key = "%硫化氢%"; break; + case "YW": + key = "%液位%"; + break; + case "DS": + key = "%对射%"; + break; } String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '" + key + "' ORDER BY D.ID"; diff --git a/src/ACUBL.properties b/src/ACUBL.properties index ae086d4..99e858d 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -46,7 +46,7 @@ #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2.START = 0500 #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 -YXL.ACU001.O2.WORDCOUNT = 24 +YXL.ACU001.O2.WORDCOUNT = 4 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2ALM.START = 0036 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -66,3 +66,22 @@ YXL.ACU001.HSALM.WORDCOUNT = 1 #\u786b\u5316\u6c22\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 YXL.ACU001.HSALM.BITCOUNT = 12 + +#\u7206\u7ba1\u6db2\u4f4d\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.YW.COUNT = 2 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.YWALM.START = 0025 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.YWALM.WORDCOUNT = 1 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.YWALM.BITCOUNT = 2 + +#\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.DS.COUNT = 15 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.DSALM.START = 0038 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.DSALM.WORDCOUNT = 3 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.DSALM.BITCOUNT = 45 + diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 5e6edbc..8d5ab08 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -16,12 +16,14 @@ import com.szpg.task.ReadCH4ValueTask; import com.szpg.task.ReadCOStatusTask; import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; import com.szpg.task.ReadHSStatusTask; import com.szpg.task.ReadHSValueTask; import com.szpg.task.ReadO2StatusTask; import com.szpg.task.ReadO2ValueTask; import com.szpg.task.ReadWSStatusTask; import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -30,11 +32,12 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.103", 6800); + // PLC设备地址和端口 + ACUClient client = new ACUClient("192.168.0.244", 6800); - client.setNet("00"); - client.setNode("6B"); - client.setUnit("00"); + client.setNet("00"); //网络号 + client.setNode("F4"); //节点号 + client.setUnit("00"); //单元号 // 3将ACU的信息加入到map中 ACUClientUtil.getInstance().addClient(client); @@ -44,33 +47,34 @@ // 测试发送查询甲烷参数命令 // dsc.testSendCH4Command(client); - // 测试发送查询甲烷报警状态命令 -// dsc.testSendCH4StatsuCommand(client); +// // 测试发送查询甲烷报警状态命令 +// dsc.testSendCH4StatusCommand(client); // 测试发送查询温湿度监测值命令 // dsc.testSendWSCommand(client); // 测试发送查询温湿度报警状态命令 // dsc.testSendWSStatusCommand(client); - // 测试发送查询一氧化碳参数命令 +// // 测试发送查询一氧化碳参数命令 // dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 +// // 测试发送查询一氧化碳报警状态命令 // dsc.testSendCOStatusCommand(client); - - // 测试发送查询一氧化碳参数命令 -// dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 -// dsc.testSendCOStatusCommand(client); - +// // 测试发送查询氧气参数命令 // dsc.testSendO2Command(client); // 测试发送查询氧气报警状态命令 // dsc.testSendO2StatusCommand(client); +// +// // 测试发送查询硫化氢参数命令 +// dsc.testSendHSCommand(client); +// // 测试发送查询硫化氢报警状态命令 +// dsc.testSendHSStatusCommand(client); - // 测试发送查询硫化氢参数命令 - dsc.testSendHSCommand(client); - // 测试发送查询硫化氢报警状态命令 - dsc.testSendHSStatusCommand(client); + // 测试发送查询爆管液位报警状态命令 + dsc.testSendYWStatusCommand(client); + + // 测试发送查询对射报警状态命令 +// dsc.testSendDSStatusCommand(client); } /** @@ -97,8 +101,9 @@ ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(client, ch4), 10, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -116,7 +121,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); ch4alm.setDestinationId(dest); - ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); @@ -124,8 +129,9 @@ ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4StatusTask(client, ch4alm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -153,8 +159,9 @@ ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSValueTask(client, ws), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -172,7 +179,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); wsalm.setDestinationId(dest); - wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); @@ -180,8 +187,9 @@ wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSStatusTask(client, wsalm), 25, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -208,8 +216,9 @@ co.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOValueTask(client, co), 30, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -227,7 +236,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); coalm.setDestinationId(dest); - coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); coalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.START")), 2)) + "00"); coalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.WORDCOUNT"))); @@ -235,8 +244,9 @@ coalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOStatusTask(client, coalm), 35, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -263,8 +273,9 @@ o2.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2ValueTask(client, o2), 40, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -282,7 +293,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); o2alm.setDestinationId(dest); - o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); o2alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.START")), 2)) + "00"); o2alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.WORDCOUNT"))); @@ -290,8 +301,9 @@ o2alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2StatusTask(client, o2alm), 45, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -318,8 +330,9 @@ hs.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSValueTask(client, hs), 50, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -337,7 +350,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); hsalm.setDestinationId(dest); - hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); hsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.START")), 2)) + "00"); hsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.WORDCOUNT"))); @@ -345,7 +358,65 @@ hsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSStatusTask(client, hsalm), 55, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询爆管液位报警状态命令 + * @param client + */ + public void testSendYWStatusCommand(ACUClient client) { + ReadMemoryCommand ywalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READYWSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ywalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ywalm.setDestinationId(dest); + + ywalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + ywalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.START")), 2)) + "00"); + ywalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.WORDCOUNT"))); + ywalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.BITCOUNT"))); + ywalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YW.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadYWStatusTask(client, ywalm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + + /** + * 发送查询对射报警状态命令 + * @param client + */ + public void testSendDSStatusCommand(ACUClient client) { + ReadMemoryCommand dsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READDSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + dsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + dsalm.setDestinationId(dest); + + dsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + dsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.START")), 2)) + "00"); + dsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.WORDCOUNT"))); + dsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.BITCOUNT"))); + dsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadDSStatusTask(client, dsalm), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index 70fb6dc..a9d5686 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -10,6 +10,7 @@ public PgAcuRdcmd findById(String id); public PgAcuRdcmd findLatestCmdByDestAndCount(String dest, int count); + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type); public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); diff --git a/src/com/szpg/db/dao/PgDSDao.java b/src/com/szpg/db/dao/PgDSDao.java new file mode 100644 index 0000000..b731af9 --- /dev/null +++ b/src/com/szpg/db/dao/PgDSDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgDSAlm; + +/** + * 对射报警相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgDSDao { + + /******** 对射报警状态 ********/ + public List findAllSbjz(); + public PgDSAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgDSAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/PgYWDao.java b/src/com/szpg/db/dao/PgYWDao.java new file mode 100644 index 0000000..bb27bbf --- /dev/null +++ b/src/com/szpg/db/dao/PgYWDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgYWAlm; + +/** + * 爆管液位相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgYWDao { + + /******** 爆管液位浓度报警状态 ********/ + public List findAllSbjz(); + public PgYWAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgYWAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index b693939..16b2285 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -114,6 +114,41 @@ } return null; } + + + @Override + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ACU_RDCMD WHERE RESPONSED='0' AND TIMEOUT='0' AND DEST=? AND CMD_TYPE=? ORDER BY TM DESC"; + Object[] params = new Object[2]; + params[0] = dest; + params[1] = type; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAcuRdcmd.class), params); + + if (null != list && list.isEmpty() == false) { + logger.debug("根据目的地址和命令类型查询内存读取命令成功[" + list.size() + "]"); + + return list.get(0); + } else + return null; + } catch (Exception ex) { + logger.error("根据目的地址和命令类型查询内存读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } @Override public int addCmdRecord(PgAcuRdcmd cmd) { diff --git a/src/com/szpg/db/dao/impl/PgDSDaoImpl.java b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java new file mode 100644 index 0000000..e9d18cd --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.data.PgDSAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgDSDaoImpl implements PgDSDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgDSAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(0); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询对射报警状态成功" + dsalm + "]"); + + return dsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgDSAlm dsalm) { + return addSbjzRecord(dsalm.getDsalm(), dsalm.getTmStr(), dsalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_DS_ALM " + + "(DSALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入对射报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入对射报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 657281c..7706852 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -39,6 +39,12 @@ case "HS": key = "%硫化氢%"; break; + case "YW": + key = "%液位%"; + break; + case "DS": + key = "%对射%"; + break; } String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '" + key + "' ORDER BY D.ID"; diff --git a/src/com/szpg/db/dao/impl/PgYWDaoImpl.java b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java new file mode 100644 index 0000000..613c4c0 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.data.PgYWAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgYWDaoImpl implements PgYWDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgYWAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(0); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询爆管液位报警状态成功" + ywalm + "]"); + + return ywalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgYWAlm ywalm) { + return addSbjzRecord(ywalm.getYwalm(), ywalm.getTmStr(), ywalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_YW_ALM " + + "(YWALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入爆管液位报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入爆管液位报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index ae086d4..99e858d 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -46,7 +46,7 @@ #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2.START = 0500 #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 -YXL.ACU001.O2.WORDCOUNT = 24 +YXL.ACU001.O2.WORDCOUNT = 4 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2ALM.START = 0036 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -66,3 +66,22 @@ YXL.ACU001.HSALM.WORDCOUNT = 1 #\u786b\u5316\u6c22\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 YXL.ACU001.HSALM.BITCOUNT = 12 + +#\u7206\u7ba1\u6db2\u4f4d\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.YW.COUNT = 2 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.YWALM.START = 0025 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.YWALM.WORDCOUNT = 1 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.YWALM.BITCOUNT = 2 + +#\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.DS.COUNT = 15 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.DSALM.START = 0038 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.DSALM.WORDCOUNT = 3 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.DSALM.BITCOUNT = 45 + diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 5e6edbc..8d5ab08 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -16,12 +16,14 @@ import com.szpg.task.ReadCH4ValueTask; import com.szpg.task.ReadCOStatusTask; import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; import com.szpg.task.ReadHSStatusTask; import com.szpg.task.ReadHSValueTask; import com.szpg.task.ReadO2StatusTask; import com.szpg.task.ReadO2ValueTask; import com.szpg.task.ReadWSStatusTask; import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -30,11 +32,12 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.103", 6800); + // PLC设备地址和端口 + ACUClient client = new ACUClient("192.168.0.244", 6800); - client.setNet("00"); - client.setNode("6B"); - client.setUnit("00"); + client.setNet("00"); //网络号 + client.setNode("F4"); //节点号 + client.setUnit("00"); //单元号 // 3将ACU的信息加入到map中 ACUClientUtil.getInstance().addClient(client); @@ -44,33 +47,34 @@ // 测试发送查询甲烷参数命令 // dsc.testSendCH4Command(client); - // 测试发送查询甲烷报警状态命令 -// dsc.testSendCH4StatsuCommand(client); +// // 测试发送查询甲烷报警状态命令 +// dsc.testSendCH4StatusCommand(client); // 测试发送查询温湿度监测值命令 // dsc.testSendWSCommand(client); // 测试发送查询温湿度报警状态命令 // dsc.testSendWSStatusCommand(client); - // 测试发送查询一氧化碳参数命令 +// // 测试发送查询一氧化碳参数命令 // dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 +// // 测试发送查询一氧化碳报警状态命令 // dsc.testSendCOStatusCommand(client); - - // 测试发送查询一氧化碳参数命令 -// dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 -// dsc.testSendCOStatusCommand(client); - +// // 测试发送查询氧气参数命令 // dsc.testSendO2Command(client); // 测试发送查询氧气报警状态命令 // dsc.testSendO2StatusCommand(client); +// +// // 测试发送查询硫化氢参数命令 +// dsc.testSendHSCommand(client); +// // 测试发送查询硫化氢报警状态命令 +// dsc.testSendHSStatusCommand(client); - // 测试发送查询硫化氢参数命令 - dsc.testSendHSCommand(client); - // 测试发送查询硫化氢报警状态命令 - dsc.testSendHSStatusCommand(client); + // 测试发送查询爆管液位报警状态命令 + dsc.testSendYWStatusCommand(client); + + // 测试发送查询对射报警状态命令 +// dsc.testSendDSStatusCommand(client); } /** @@ -97,8 +101,9 @@ ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(client, ch4), 10, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -116,7 +121,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); ch4alm.setDestinationId(dest); - ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); @@ -124,8 +129,9 @@ ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4StatusTask(client, ch4alm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -153,8 +159,9 @@ ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSValueTask(client, ws), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -172,7 +179,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); wsalm.setDestinationId(dest); - wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); @@ -180,8 +187,9 @@ wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSStatusTask(client, wsalm), 25, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -208,8 +216,9 @@ co.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOValueTask(client, co), 30, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -227,7 +236,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); coalm.setDestinationId(dest); - coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); coalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.START")), 2)) + "00"); coalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.WORDCOUNT"))); @@ -235,8 +244,9 @@ coalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOStatusTask(client, coalm), 35, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -263,8 +273,9 @@ o2.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2ValueTask(client, o2), 40, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -282,7 +293,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); o2alm.setDestinationId(dest); - o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); o2alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.START")), 2)) + "00"); o2alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.WORDCOUNT"))); @@ -290,8 +301,9 @@ o2alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2StatusTask(client, o2alm), 45, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -318,8 +330,9 @@ hs.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSValueTask(client, hs), 50, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -337,7 +350,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); hsalm.setDestinationId(dest); - hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); hsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.START")), 2)) + "00"); hsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.WORDCOUNT"))); @@ -345,7 +358,65 @@ hsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSStatusTask(client, hsalm), 55, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询爆管液位报警状态命令 + * @param client + */ + public void testSendYWStatusCommand(ACUClient client) { + ReadMemoryCommand ywalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READYWSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ywalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ywalm.setDestinationId(dest); + + ywalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + ywalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.START")), 2)) + "00"); + ywalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.WORDCOUNT"))); + ywalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.BITCOUNT"))); + ywalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YW.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadYWStatusTask(client, ywalm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + + /** + * 发送查询对射报警状态命令 + * @param client + */ + public void testSendDSStatusCommand(ACUClient client) { + ReadMemoryCommand dsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READDSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + dsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + dsalm.setDestinationId(dest); + + dsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + dsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.START")), 2)) + "00"); + dsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.WORDCOUNT"))); + dsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.BITCOUNT"))); + dsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadDSStatusTask(client, dsalm), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index 70fb6dc..a9d5686 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -10,6 +10,7 @@ public PgAcuRdcmd findById(String id); public PgAcuRdcmd findLatestCmdByDestAndCount(String dest, int count); + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type); public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); diff --git a/src/com/szpg/db/dao/PgDSDao.java b/src/com/szpg/db/dao/PgDSDao.java new file mode 100644 index 0000000..b731af9 --- /dev/null +++ b/src/com/szpg/db/dao/PgDSDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgDSAlm; + +/** + * 对射报警相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgDSDao { + + /******** 对射报警状态 ********/ + public List findAllSbjz(); + public PgDSAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgDSAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/PgYWDao.java b/src/com/szpg/db/dao/PgYWDao.java new file mode 100644 index 0000000..bb27bbf --- /dev/null +++ b/src/com/szpg/db/dao/PgYWDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgYWAlm; + +/** + * 爆管液位相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgYWDao { + + /******** 爆管液位浓度报警状态 ********/ + public List findAllSbjz(); + public PgYWAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgYWAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index b693939..16b2285 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -114,6 +114,41 @@ } return null; } + + + @Override + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ACU_RDCMD WHERE RESPONSED='0' AND TIMEOUT='0' AND DEST=? AND CMD_TYPE=? ORDER BY TM DESC"; + Object[] params = new Object[2]; + params[0] = dest; + params[1] = type; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAcuRdcmd.class), params); + + if (null != list && list.isEmpty() == false) { + logger.debug("根据目的地址和命令类型查询内存读取命令成功[" + list.size() + "]"); + + return list.get(0); + } else + return null; + } catch (Exception ex) { + logger.error("根据目的地址和命令类型查询内存读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } @Override public int addCmdRecord(PgAcuRdcmd cmd) { diff --git a/src/com/szpg/db/dao/impl/PgDSDaoImpl.java b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java new file mode 100644 index 0000000..e9d18cd --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.data.PgDSAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgDSDaoImpl implements PgDSDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgDSAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(0); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询对射报警状态成功" + dsalm + "]"); + + return dsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgDSAlm dsalm) { + return addSbjzRecord(dsalm.getDsalm(), dsalm.getTmStr(), dsalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_DS_ALM " + + "(DSALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入对射报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入对射报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 657281c..7706852 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -39,6 +39,12 @@ case "HS": key = "%硫化氢%"; break; + case "YW": + key = "%液位%"; + break; + case "DS": + key = "%对射%"; + break; } String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '" + key + "' ORDER BY D.ID"; diff --git a/src/com/szpg/db/dao/impl/PgYWDaoImpl.java b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java new file mode 100644 index 0000000..613c4c0 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.data.PgYWAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgYWDaoImpl implements PgYWDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgYWAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(0); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询爆管液位报警状态成功" + ywalm + "]"); + + return ywalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgYWAlm ywalm) { + return addSbjzRecord(ywalm.getYwalm(), ywalm.getTmStr(), ywalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_YW_ALM " + + "(YWALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入爆管液位报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入爆管液位报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index f4ecfe5..2d46bfc 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -1,6 +1,8 @@ package com.szpg.db.data; +import java.util.Calendar; import java.util.Date; +import java.util.UUID; import com.szpg.util.TimeFormat; @@ -31,6 +33,11 @@ private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 + public PgAcuRdcmd() { + this.setId(UUID.randomUUID().toString().replace("-", "")); + this.setTm(Calendar.getInstance().getTime()); + } + public String getId() { return id; } diff --git a/src/ACUBL.properties b/src/ACUBL.properties index ae086d4..99e858d 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -46,7 +46,7 @@ #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2.START = 0500 #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 -YXL.ACU001.O2.WORDCOUNT = 24 +YXL.ACU001.O2.WORDCOUNT = 4 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2ALM.START = 0036 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -66,3 +66,22 @@ YXL.ACU001.HSALM.WORDCOUNT = 1 #\u786b\u5316\u6c22\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 YXL.ACU001.HSALM.BITCOUNT = 12 + +#\u7206\u7ba1\u6db2\u4f4d\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.YW.COUNT = 2 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.YWALM.START = 0025 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.YWALM.WORDCOUNT = 1 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.YWALM.BITCOUNT = 2 + +#\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.DS.COUNT = 15 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.DSALM.START = 0038 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.DSALM.WORDCOUNT = 3 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.DSALM.BITCOUNT = 45 + diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 5e6edbc..8d5ab08 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -16,12 +16,14 @@ import com.szpg.task.ReadCH4ValueTask; import com.szpg.task.ReadCOStatusTask; import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; import com.szpg.task.ReadHSStatusTask; import com.szpg.task.ReadHSValueTask; import com.szpg.task.ReadO2StatusTask; import com.szpg.task.ReadO2ValueTask; import com.szpg.task.ReadWSStatusTask; import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -30,11 +32,12 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.103", 6800); + // PLC设备地址和端口 + ACUClient client = new ACUClient("192.168.0.244", 6800); - client.setNet("00"); - client.setNode("6B"); - client.setUnit("00"); + client.setNet("00"); //网络号 + client.setNode("F4"); //节点号 + client.setUnit("00"); //单元号 // 3将ACU的信息加入到map中 ACUClientUtil.getInstance().addClient(client); @@ -44,33 +47,34 @@ // 测试发送查询甲烷参数命令 // dsc.testSendCH4Command(client); - // 测试发送查询甲烷报警状态命令 -// dsc.testSendCH4StatsuCommand(client); +// // 测试发送查询甲烷报警状态命令 +// dsc.testSendCH4StatusCommand(client); // 测试发送查询温湿度监测值命令 // dsc.testSendWSCommand(client); // 测试发送查询温湿度报警状态命令 // dsc.testSendWSStatusCommand(client); - // 测试发送查询一氧化碳参数命令 +// // 测试发送查询一氧化碳参数命令 // dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 +// // 测试发送查询一氧化碳报警状态命令 // dsc.testSendCOStatusCommand(client); - - // 测试发送查询一氧化碳参数命令 -// dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 -// dsc.testSendCOStatusCommand(client); - +// // 测试发送查询氧气参数命令 // dsc.testSendO2Command(client); // 测试发送查询氧气报警状态命令 // dsc.testSendO2StatusCommand(client); +// +// // 测试发送查询硫化氢参数命令 +// dsc.testSendHSCommand(client); +// // 测试发送查询硫化氢报警状态命令 +// dsc.testSendHSStatusCommand(client); - // 测试发送查询硫化氢参数命令 - dsc.testSendHSCommand(client); - // 测试发送查询硫化氢报警状态命令 - dsc.testSendHSStatusCommand(client); + // 测试发送查询爆管液位报警状态命令 + dsc.testSendYWStatusCommand(client); + + // 测试发送查询对射报警状态命令 +// dsc.testSendDSStatusCommand(client); } /** @@ -97,8 +101,9 @@ ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(client, ch4), 10, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -116,7 +121,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); ch4alm.setDestinationId(dest); - ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); @@ -124,8 +129,9 @@ ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4StatusTask(client, ch4alm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -153,8 +159,9 @@ ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSValueTask(client, ws), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -172,7 +179,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); wsalm.setDestinationId(dest); - wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); @@ -180,8 +187,9 @@ wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSStatusTask(client, wsalm), 25, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -208,8 +216,9 @@ co.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOValueTask(client, co), 30, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -227,7 +236,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); coalm.setDestinationId(dest); - coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); coalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.START")), 2)) + "00"); coalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.WORDCOUNT"))); @@ -235,8 +244,9 @@ coalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOStatusTask(client, coalm), 35, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -263,8 +273,9 @@ o2.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2ValueTask(client, o2), 40, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -282,7 +293,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); o2alm.setDestinationId(dest); - o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); o2alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.START")), 2)) + "00"); o2alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.WORDCOUNT"))); @@ -290,8 +301,9 @@ o2alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2StatusTask(client, o2alm), 45, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -318,8 +330,9 @@ hs.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSValueTask(client, hs), 50, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -337,7 +350,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); hsalm.setDestinationId(dest); - hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); hsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.START")), 2)) + "00"); hsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.WORDCOUNT"))); @@ -345,7 +358,65 @@ hsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSStatusTask(client, hsalm), 55, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询爆管液位报警状态命令 + * @param client + */ + public void testSendYWStatusCommand(ACUClient client) { + ReadMemoryCommand ywalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READYWSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ywalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ywalm.setDestinationId(dest); + + ywalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + ywalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.START")), 2)) + "00"); + ywalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.WORDCOUNT"))); + ywalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.BITCOUNT"))); + ywalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YW.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadYWStatusTask(client, ywalm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + + /** + * 发送查询对射报警状态命令 + * @param client + */ + public void testSendDSStatusCommand(ACUClient client) { + ReadMemoryCommand dsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READDSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + dsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + dsalm.setDestinationId(dest); + + dsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + dsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.START")), 2)) + "00"); + dsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.WORDCOUNT"))); + dsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.BITCOUNT"))); + dsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadDSStatusTask(client, dsalm), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index 70fb6dc..a9d5686 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -10,6 +10,7 @@ public PgAcuRdcmd findById(String id); public PgAcuRdcmd findLatestCmdByDestAndCount(String dest, int count); + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type); public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); diff --git a/src/com/szpg/db/dao/PgDSDao.java b/src/com/szpg/db/dao/PgDSDao.java new file mode 100644 index 0000000..b731af9 --- /dev/null +++ b/src/com/szpg/db/dao/PgDSDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgDSAlm; + +/** + * 对射报警相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgDSDao { + + /******** 对射报警状态 ********/ + public List findAllSbjz(); + public PgDSAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgDSAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/PgYWDao.java b/src/com/szpg/db/dao/PgYWDao.java new file mode 100644 index 0000000..bb27bbf --- /dev/null +++ b/src/com/szpg/db/dao/PgYWDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgYWAlm; + +/** + * 爆管液位相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgYWDao { + + /******** 爆管液位浓度报警状态 ********/ + public List findAllSbjz(); + public PgYWAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgYWAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index b693939..16b2285 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -114,6 +114,41 @@ } return null; } + + + @Override + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ACU_RDCMD WHERE RESPONSED='0' AND TIMEOUT='0' AND DEST=? AND CMD_TYPE=? ORDER BY TM DESC"; + Object[] params = new Object[2]; + params[0] = dest; + params[1] = type; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAcuRdcmd.class), params); + + if (null != list && list.isEmpty() == false) { + logger.debug("根据目的地址和命令类型查询内存读取命令成功[" + list.size() + "]"); + + return list.get(0); + } else + return null; + } catch (Exception ex) { + logger.error("根据目的地址和命令类型查询内存读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } @Override public int addCmdRecord(PgAcuRdcmd cmd) { diff --git a/src/com/szpg/db/dao/impl/PgDSDaoImpl.java b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java new file mode 100644 index 0000000..e9d18cd --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.data.PgDSAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgDSDaoImpl implements PgDSDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgDSAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(0); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询对射报警状态成功" + dsalm + "]"); + + return dsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgDSAlm dsalm) { + return addSbjzRecord(dsalm.getDsalm(), dsalm.getTmStr(), dsalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_DS_ALM " + + "(DSALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入对射报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入对射报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 657281c..7706852 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -39,6 +39,12 @@ case "HS": key = "%硫化氢%"; break; + case "YW": + key = "%液位%"; + break; + case "DS": + key = "%对射%"; + break; } String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '" + key + "' ORDER BY D.ID"; diff --git a/src/com/szpg/db/dao/impl/PgYWDaoImpl.java b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java new file mode 100644 index 0000000..613c4c0 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.data.PgYWAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgYWDaoImpl implements PgYWDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgYWAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(0); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询爆管液位报警状态成功" + ywalm + "]"); + + return ywalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgYWAlm ywalm) { + return addSbjzRecord(ywalm.getYwalm(), ywalm.getTmStr(), ywalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_YW_ALM " + + "(YWALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入爆管液位报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入爆管液位报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index f4ecfe5..2d46bfc 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -1,6 +1,8 @@ package com.szpg.db.data; +import java.util.Calendar; import java.util.Date; +import java.util.UUID; import com.szpg.util.TimeFormat; @@ -31,6 +33,11 @@ private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 + public PgAcuRdcmd() { + this.setId(UUID.randomUUID().toString().replace("-", "")); + this.setTm(Calendar.getInstance().getTime()); + } + public String getId() { return id; } diff --git a/src/com/szpg/db/data/PgDSAlm.java b/src/com/szpg/db/data/PgDSAlm.java new file mode 100644 index 0000000..86e28bb --- /dev/null +++ b/src/com/szpg/db/data/PgDSAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 对射报警状态数据表 + * + * @author admin + * + */ +public class PgDSAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = -8336945265752238748L; + + private Integer id; + private Boolean dsalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getDsalm() { + return dsalm; + } + + public void setDsalm(Boolean dsalm) { + this.dsalm = dsalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgDSAlm[dsalm=" + dsalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index ae086d4..99e858d 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -46,7 +46,7 @@ #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2.START = 0500 #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 -YXL.ACU001.O2.WORDCOUNT = 24 +YXL.ACU001.O2.WORDCOUNT = 4 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2ALM.START = 0036 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -66,3 +66,22 @@ YXL.ACU001.HSALM.WORDCOUNT = 1 #\u786b\u5316\u6c22\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 YXL.ACU001.HSALM.BITCOUNT = 12 + +#\u7206\u7ba1\u6db2\u4f4d\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.YW.COUNT = 2 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.YWALM.START = 0025 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.YWALM.WORDCOUNT = 1 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.YWALM.BITCOUNT = 2 + +#\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.DS.COUNT = 15 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.DSALM.START = 0038 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.DSALM.WORDCOUNT = 3 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.DSALM.BITCOUNT = 45 + diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 5e6edbc..8d5ab08 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -16,12 +16,14 @@ import com.szpg.task.ReadCH4ValueTask; import com.szpg.task.ReadCOStatusTask; import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; import com.szpg.task.ReadHSStatusTask; import com.szpg.task.ReadHSValueTask; import com.szpg.task.ReadO2StatusTask; import com.szpg.task.ReadO2ValueTask; import com.szpg.task.ReadWSStatusTask; import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -30,11 +32,12 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.103", 6800); + // PLC设备地址和端口 + ACUClient client = new ACUClient("192.168.0.244", 6800); - client.setNet("00"); - client.setNode("6B"); - client.setUnit("00"); + client.setNet("00"); //网络号 + client.setNode("F4"); //节点号 + client.setUnit("00"); //单元号 // 3将ACU的信息加入到map中 ACUClientUtil.getInstance().addClient(client); @@ -44,33 +47,34 @@ // 测试发送查询甲烷参数命令 // dsc.testSendCH4Command(client); - // 测试发送查询甲烷报警状态命令 -// dsc.testSendCH4StatsuCommand(client); +// // 测试发送查询甲烷报警状态命令 +// dsc.testSendCH4StatusCommand(client); // 测试发送查询温湿度监测值命令 // dsc.testSendWSCommand(client); // 测试发送查询温湿度报警状态命令 // dsc.testSendWSStatusCommand(client); - // 测试发送查询一氧化碳参数命令 +// // 测试发送查询一氧化碳参数命令 // dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 +// // 测试发送查询一氧化碳报警状态命令 // dsc.testSendCOStatusCommand(client); - - // 测试发送查询一氧化碳参数命令 -// dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 -// dsc.testSendCOStatusCommand(client); - +// // 测试发送查询氧气参数命令 // dsc.testSendO2Command(client); // 测试发送查询氧气报警状态命令 // dsc.testSendO2StatusCommand(client); +// +// // 测试发送查询硫化氢参数命令 +// dsc.testSendHSCommand(client); +// // 测试发送查询硫化氢报警状态命令 +// dsc.testSendHSStatusCommand(client); - // 测试发送查询硫化氢参数命令 - dsc.testSendHSCommand(client); - // 测试发送查询硫化氢报警状态命令 - dsc.testSendHSStatusCommand(client); + // 测试发送查询爆管液位报警状态命令 + dsc.testSendYWStatusCommand(client); + + // 测试发送查询对射报警状态命令 +// dsc.testSendDSStatusCommand(client); } /** @@ -97,8 +101,9 @@ ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(client, ch4), 10, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -116,7 +121,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); ch4alm.setDestinationId(dest); - ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); @@ -124,8 +129,9 @@ ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4StatusTask(client, ch4alm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -153,8 +159,9 @@ ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSValueTask(client, ws), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -172,7 +179,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); wsalm.setDestinationId(dest); - wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); @@ -180,8 +187,9 @@ wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSStatusTask(client, wsalm), 25, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -208,8 +216,9 @@ co.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOValueTask(client, co), 30, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -227,7 +236,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); coalm.setDestinationId(dest); - coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); coalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.START")), 2)) + "00"); coalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.WORDCOUNT"))); @@ -235,8 +244,9 @@ coalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOStatusTask(client, coalm), 35, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -263,8 +273,9 @@ o2.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2ValueTask(client, o2), 40, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -282,7 +293,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); o2alm.setDestinationId(dest); - o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); o2alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.START")), 2)) + "00"); o2alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.WORDCOUNT"))); @@ -290,8 +301,9 @@ o2alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2StatusTask(client, o2alm), 45, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -318,8 +330,9 @@ hs.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSValueTask(client, hs), 50, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -337,7 +350,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); hsalm.setDestinationId(dest); - hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); hsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.START")), 2)) + "00"); hsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.WORDCOUNT"))); @@ -345,7 +358,65 @@ hsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSStatusTask(client, hsalm), 55, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询爆管液位报警状态命令 + * @param client + */ + public void testSendYWStatusCommand(ACUClient client) { + ReadMemoryCommand ywalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READYWSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ywalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ywalm.setDestinationId(dest); + + ywalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + ywalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.START")), 2)) + "00"); + ywalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.WORDCOUNT"))); + ywalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.BITCOUNT"))); + ywalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YW.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadYWStatusTask(client, ywalm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + + /** + * 发送查询对射报警状态命令 + * @param client + */ + public void testSendDSStatusCommand(ACUClient client) { + ReadMemoryCommand dsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READDSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + dsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + dsalm.setDestinationId(dest); + + dsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + dsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.START")), 2)) + "00"); + dsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.WORDCOUNT"))); + dsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.BITCOUNT"))); + dsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadDSStatusTask(client, dsalm), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index 70fb6dc..a9d5686 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -10,6 +10,7 @@ public PgAcuRdcmd findById(String id); public PgAcuRdcmd findLatestCmdByDestAndCount(String dest, int count); + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type); public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); diff --git a/src/com/szpg/db/dao/PgDSDao.java b/src/com/szpg/db/dao/PgDSDao.java new file mode 100644 index 0000000..b731af9 --- /dev/null +++ b/src/com/szpg/db/dao/PgDSDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgDSAlm; + +/** + * 对射报警相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgDSDao { + + /******** 对射报警状态 ********/ + public List findAllSbjz(); + public PgDSAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgDSAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/PgYWDao.java b/src/com/szpg/db/dao/PgYWDao.java new file mode 100644 index 0000000..bb27bbf --- /dev/null +++ b/src/com/szpg/db/dao/PgYWDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgYWAlm; + +/** + * 爆管液位相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgYWDao { + + /******** 爆管液位浓度报警状态 ********/ + public List findAllSbjz(); + public PgYWAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgYWAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index b693939..16b2285 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -114,6 +114,41 @@ } return null; } + + + @Override + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ACU_RDCMD WHERE RESPONSED='0' AND TIMEOUT='0' AND DEST=? AND CMD_TYPE=? ORDER BY TM DESC"; + Object[] params = new Object[2]; + params[0] = dest; + params[1] = type; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAcuRdcmd.class), params); + + if (null != list && list.isEmpty() == false) { + logger.debug("根据目的地址和命令类型查询内存读取命令成功[" + list.size() + "]"); + + return list.get(0); + } else + return null; + } catch (Exception ex) { + logger.error("根据目的地址和命令类型查询内存读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } @Override public int addCmdRecord(PgAcuRdcmd cmd) { diff --git a/src/com/szpg/db/dao/impl/PgDSDaoImpl.java b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java new file mode 100644 index 0000000..e9d18cd --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.data.PgDSAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgDSDaoImpl implements PgDSDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgDSAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(0); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询对射报警状态成功" + dsalm + "]"); + + return dsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgDSAlm dsalm) { + return addSbjzRecord(dsalm.getDsalm(), dsalm.getTmStr(), dsalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_DS_ALM " + + "(DSALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入对射报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入对射报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 657281c..7706852 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -39,6 +39,12 @@ case "HS": key = "%硫化氢%"; break; + case "YW": + key = "%液位%"; + break; + case "DS": + key = "%对射%"; + break; } String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '" + key + "' ORDER BY D.ID"; diff --git a/src/com/szpg/db/dao/impl/PgYWDaoImpl.java b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java new file mode 100644 index 0000000..613c4c0 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.data.PgYWAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgYWDaoImpl implements PgYWDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgYWAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(0); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询爆管液位报警状态成功" + ywalm + "]"); + + return ywalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgYWAlm ywalm) { + return addSbjzRecord(ywalm.getYwalm(), ywalm.getTmStr(), ywalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_YW_ALM " + + "(YWALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入爆管液位报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入爆管液位报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index f4ecfe5..2d46bfc 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -1,6 +1,8 @@ package com.szpg.db.data; +import java.util.Calendar; import java.util.Date; +import java.util.UUID; import com.szpg.util.TimeFormat; @@ -31,6 +33,11 @@ private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 + public PgAcuRdcmd() { + this.setId(UUID.randomUUID().toString().replace("-", "")); + this.setTm(Calendar.getInstance().getTime()); + } + public String getId() { return id; } diff --git a/src/com/szpg/db/data/PgDSAlm.java b/src/com/szpg/db/data/PgDSAlm.java new file mode 100644 index 0000000..86e28bb --- /dev/null +++ b/src/com/szpg/db/data/PgDSAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 对射报警状态数据表 + * + * @author admin + * + */ +public class PgDSAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = -8336945265752238748L; + + private Integer id; + private Boolean dsalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getDsalm() { + return dsalm; + } + + public void setDsalm(Boolean dsalm) { + this.dsalm = dsalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgDSAlm[dsalm=" + dsalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/data/PgYWAlm.java b/src/com/szpg/db/data/PgYWAlm.java new file mode 100644 index 0000000..9d9572f --- /dev/null +++ b/src/com/szpg/db/data/PgYWAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 爆管液位浓度报警状态数据表 + * + * @author admin + * + */ +public class PgYWAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 3882791834818808488L; + + private Integer id; + private Boolean ywalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getYwalm() { + return ywalm; + } + + public void setYwalm(Boolean ywalm) { + this.ywalm = ywalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgYWAlm[ywalm=" + ywalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index ae086d4..99e858d 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -46,7 +46,7 @@ #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2.START = 0500 #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 -YXL.ACU001.O2.WORDCOUNT = 24 +YXL.ACU001.O2.WORDCOUNT = 4 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2ALM.START = 0036 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -66,3 +66,22 @@ YXL.ACU001.HSALM.WORDCOUNT = 1 #\u786b\u5316\u6c22\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 YXL.ACU001.HSALM.BITCOUNT = 12 + +#\u7206\u7ba1\u6db2\u4f4d\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.YW.COUNT = 2 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.YWALM.START = 0025 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.YWALM.WORDCOUNT = 1 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.YWALM.BITCOUNT = 2 + +#\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.DS.COUNT = 15 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.DSALM.START = 0038 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.DSALM.WORDCOUNT = 3 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.DSALM.BITCOUNT = 45 + diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 5e6edbc..8d5ab08 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -16,12 +16,14 @@ import com.szpg.task.ReadCH4ValueTask; import com.szpg.task.ReadCOStatusTask; import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; import com.szpg.task.ReadHSStatusTask; import com.szpg.task.ReadHSValueTask; import com.szpg.task.ReadO2StatusTask; import com.szpg.task.ReadO2ValueTask; import com.szpg.task.ReadWSStatusTask; import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -30,11 +32,12 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.103", 6800); + // PLC设备地址和端口 + ACUClient client = new ACUClient("192.168.0.244", 6800); - client.setNet("00"); - client.setNode("6B"); - client.setUnit("00"); + client.setNet("00"); //网络号 + client.setNode("F4"); //节点号 + client.setUnit("00"); //单元号 // 3将ACU的信息加入到map中 ACUClientUtil.getInstance().addClient(client); @@ -44,33 +47,34 @@ // 测试发送查询甲烷参数命令 // dsc.testSendCH4Command(client); - // 测试发送查询甲烷报警状态命令 -// dsc.testSendCH4StatsuCommand(client); +// // 测试发送查询甲烷报警状态命令 +// dsc.testSendCH4StatusCommand(client); // 测试发送查询温湿度监测值命令 // dsc.testSendWSCommand(client); // 测试发送查询温湿度报警状态命令 // dsc.testSendWSStatusCommand(client); - // 测试发送查询一氧化碳参数命令 +// // 测试发送查询一氧化碳参数命令 // dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 +// // 测试发送查询一氧化碳报警状态命令 // dsc.testSendCOStatusCommand(client); - - // 测试发送查询一氧化碳参数命令 -// dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 -// dsc.testSendCOStatusCommand(client); - +// // 测试发送查询氧气参数命令 // dsc.testSendO2Command(client); // 测试发送查询氧气报警状态命令 // dsc.testSendO2StatusCommand(client); +// +// // 测试发送查询硫化氢参数命令 +// dsc.testSendHSCommand(client); +// // 测试发送查询硫化氢报警状态命令 +// dsc.testSendHSStatusCommand(client); - // 测试发送查询硫化氢参数命令 - dsc.testSendHSCommand(client); - // 测试发送查询硫化氢报警状态命令 - dsc.testSendHSStatusCommand(client); + // 测试发送查询爆管液位报警状态命令 + dsc.testSendYWStatusCommand(client); + + // 测试发送查询对射报警状态命令 +// dsc.testSendDSStatusCommand(client); } /** @@ -97,8 +101,9 @@ ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(client, ch4), 10, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -116,7 +121,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); ch4alm.setDestinationId(dest); - ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); @@ -124,8 +129,9 @@ ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4StatusTask(client, ch4alm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -153,8 +159,9 @@ ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSValueTask(client, ws), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -172,7 +179,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); wsalm.setDestinationId(dest); - wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); @@ -180,8 +187,9 @@ wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSStatusTask(client, wsalm), 25, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -208,8 +216,9 @@ co.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOValueTask(client, co), 30, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -227,7 +236,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); coalm.setDestinationId(dest); - coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); coalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.START")), 2)) + "00"); coalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.WORDCOUNT"))); @@ -235,8 +244,9 @@ coalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOStatusTask(client, coalm), 35, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -263,8 +273,9 @@ o2.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2ValueTask(client, o2), 40, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -282,7 +293,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); o2alm.setDestinationId(dest); - o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); o2alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.START")), 2)) + "00"); o2alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.WORDCOUNT"))); @@ -290,8 +301,9 @@ o2alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2StatusTask(client, o2alm), 45, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -318,8 +330,9 @@ hs.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSValueTask(client, hs), 50, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -337,7 +350,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); hsalm.setDestinationId(dest); - hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); hsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.START")), 2)) + "00"); hsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.WORDCOUNT"))); @@ -345,7 +358,65 @@ hsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSStatusTask(client, hsalm), 55, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询爆管液位报警状态命令 + * @param client + */ + public void testSendYWStatusCommand(ACUClient client) { + ReadMemoryCommand ywalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READYWSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ywalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ywalm.setDestinationId(dest); + + ywalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + ywalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.START")), 2)) + "00"); + ywalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.WORDCOUNT"))); + ywalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.BITCOUNT"))); + ywalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YW.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadYWStatusTask(client, ywalm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + + /** + * 发送查询对射报警状态命令 + * @param client + */ + public void testSendDSStatusCommand(ACUClient client) { + ReadMemoryCommand dsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READDSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + dsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + dsalm.setDestinationId(dest); + + dsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + dsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.START")), 2)) + "00"); + dsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.WORDCOUNT"))); + dsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.BITCOUNT"))); + dsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadDSStatusTask(client, dsalm), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index 70fb6dc..a9d5686 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -10,6 +10,7 @@ public PgAcuRdcmd findById(String id); public PgAcuRdcmd findLatestCmdByDestAndCount(String dest, int count); + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type); public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); diff --git a/src/com/szpg/db/dao/PgDSDao.java b/src/com/szpg/db/dao/PgDSDao.java new file mode 100644 index 0000000..b731af9 --- /dev/null +++ b/src/com/szpg/db/dao/PgDSDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgDSAlm; + +/** + * 对射报警相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgDSDao { + + /******** 对射报警状态 ********/ + public List findAllSbjz(); + public PgDSAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgDSAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/PgYWDao.java b/src/com/szpg/db/dao/PgYWDao.java new file mode 100644 index 0000000..bb27bbf --- /dev/null +++ b/src/com/szpg/db/dao/PgYWDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgYWAlm; + +/** + * 爆管液位相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgYWDao { + + /******** 爆管液位浓度报警状态 ********/ + public List findAllSbjz(); + public PgYWAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgYWAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index b693939..16b2285 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -114,6 +114,41 @@ } return null; } + + + @Override + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ACU_RDCMD WHERE RESPONSED='0' AND TIMEOUT='0' AND DEST=? AND CMD_TYPE=? ORDER BY TM DESC"; + Object[] params = new Object[2]; + params[0] = dest; + params[1] = type; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAcuRdcmd.class), params); + + if (null != list && list.isEmpty() == false) { + logger.debug("根据目的地址和命令类型查询内存读取命令成功[" + list.size() + "]"); + + return list.get(0); + } else + return null; + } catch (Exception ex) { + logger.error("根据目的地址和命令类型查询内存读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } @Override public int addCmdRecord(PgAcuRdcmd cmd) { diff --git a/src/com/szpg/db/dao/impl/PgDSDaoImpl.java b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java new file mode 100644 index 0000000..e9d18cd --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.data.PgDSAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgDSDaoImpl implements PgDSDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgDSAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(0); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询对射报警状态成功" + dsalm + "]"); + + return dsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgDSAlm dsalm) { + return addSbjzRecord(dsalm.getDsalm(), dsalm.getTmStr(), dsalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_DS_ALM " + + "(DSALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入对射报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入对射报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 657281c..7706852 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -39,6 +39,12 @@ case "HS": key = "%硫化氢%"; break; + case "YW": + key = "%液位%"; + break; + case "DS": + key = "%对射%"; + break; } String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '" + key + "' ORDER BY D.ID"; diff --git a/src/com/szpg/db/dao/impl/PgYWDaoImpl.java b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java new file mode 100644 index 0000000..613c4c0 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.data.PgYWAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgYWDaoImpl implements PgYWDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgYWAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(0); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询爆管液位报警状态成功" + ywalm + "]"); + + return ywalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgYWAlm ywalm) { + return addSbjzRecord(ywalm.getYwalm(), ywalm.getTmStr(), ywalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_YW_ALM " + + "(YWALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入爆管液位报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入爆管液位报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index f4ecfe5..2d46bfc 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -1,6 +1,8 @@ package com.szpg.db.data; +import java.util.Calendar; import java.util.Date; +import java.util.UUID; import com.szpg.util.TimeFormat; @@ -31,6 +33,11 @@ private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 + public PgAcuRdcmd() { + this.setId(UUID.randomUUID().toString().replace("-", "")); + this.setTm(Calendar.getInstance().getTime()); + } + public String getId() { return id; } diff --git a/src/com/szpg/db/data/PgDSAlm.java b/src/com/szpg/db/data/PgDSAlm.java new file mode 100644 index 0000000..86e28bb --- /dev/null +++ b/src/com/szpg/db/data/PgDSAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 对射报警状态数据表 + * + * @author admin + * + */ +public class PgDSAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = -8336945265752238748L; + + private Integer id; + private Boolean dsalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getDsalm() { + return dsalm; + } + + public void setDsalm(Boolean dsalm) { + this.dsalm = dsalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgDSAlm[dsalm=" + dsalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/data/PgYWAlm.java b/src/com/szpg/db/data/PgYWAlm.java new file mode 100644 index 0000000..9d9572f --- /dev/null +++ b/src/com/szpg/db/data/PgYWAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 爆管液位浓度报警状态数据表 + * + * @author admin + * + */ +public class PgYWAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 3882791834818808488L; + + private Integer id; + private Boolean ywalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getYwalm() { + return ywalm; + } + + public void setYwalm(Boolean ywalm) { + this.ywalm = ywalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgYWAlm[ywalm=" + ywalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/plc/message/AppMessageConstants.java b/src/com/szpg/plc/message/AppMessageConstants.java index 25db6ab..1c84086 100644 --- a/src/com/szpg/plc/message/AppMessageConstants.java +++ b/src/com/szpg/plc/message/AppMessageConstants.java @@ -13,4 +13,7 @@ public final static String CMD_TYPE_READO2STATUS = "17"; //读取氧气报警状态命令 public final static String CMD_TYPE_READHSVALUE = "18"; //读取硫化氢监测值命令 public final static String CMD_TYPE_READHSSTATUS = "19"; //读取硫化氢报警状态命令 + + public final static String CMD_TYPE_READYWSTATUS = "21"; //读取爆管液位报警状态命令 + public final static String CMD_TYPE_READDSSTATUS = "22"; //读取对射报警状态命令 } diff --git a/src/ACUBL.properties b/src/ACUBL.properties index ae086d4..99e858d 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -46,7 +46,7 @@ #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2.START = 0500 #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 -YXL.ACU001.O2.WORDCOUNT = 24 +YXL.ACU001.O2.WORDCOUNT = 4 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2ALM.START = 0036 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -66,3 +66,22 @@ YXL.ACU001.HSALM.WORDCOUNT = 1 #\u786b\u5316\u6c22\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 YXL.ACU001.HSALM.BITCOUNT = 12 + +#\u7206\u7ba1\u6db2\u4f4d\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.YW.COUNT = 2 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.YWALM.START = 0025 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.YWALM.WORDCOUNT = 1 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.YWALM.BITCOUNT = 2 + +#\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.DS.COUNT = 15 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.DSALM.START = 0038 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.DSALM.WORDCOUNT = 3 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.DSALM.BITCOUNT = 45 + diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 5e6edbc..8d5ab08 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -16,12 +16,14 @@ import com.szpg.task.ReadCH4ValueTask; import com.szpg.task.ReadCOStatusTask; import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; import com.szpg.task.ReadHSStatusTask; import com.szpg.task.ReadHSValueTask; import com.szpg.task.ReadO2StatusTask; import com.szpg.task.ReadO2ValueTask; import com.szpg.task.ReadWSStatusTask; import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -30,11 +32,12 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.103", 6800); + // PLC设备地址和端口 + ACUClient client = new ACUClient("192.168.0.244", 6800); - client.setNet("00"); - client.setNode("6B"); - client.setUnit("00"); + client.setNet("00"); //网络号 + client.setNode("F4"); //节点号 + client.setUnit("00"); //单元号 // 3将ACU的信息加入到map中 ACUClientUtil.getInstance().addClient(client); @@ -44,33 +47,34 @@ // 测试发送查询甲烷参数命令 // dsc.testSendCH4Command(client); - // 测试发送查询甲烷报警状态命令 -// dsc.testSendCH4StatsuCommand(client); +// // 测试发送查询甲烷报警状态命令 +// dsc.testSendCH4StatusCommand(client); // 测试发送查询温湿度监测值命令 // dsc.testSendWSCommand(client); // 测试发送查询温湿度报警状态命令 // dsc.testSendWSStatusCommand(client); - // 测试发送查询一氧化碳参数命令 +// // 测试发送查询一氧化碳参数命令 // dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 +// // 测试发送查询一氧化碳报警状态命令 // dsc.testSendCOStatusCommand(client); - - // 测试发送查询一氧化碳参数命令 -// dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 -// dsc.testSendCOStatusCommand(client); - +// // 测试发送查询氧气参数命令 // dsc.testSendO2Command(client); // 测试发送查询氧气报警状态命令 // dsc.testSendO2StatusCommand(client); +// +// // 测试发送查询硫化氢参数命令 +// dsc.testSendHSCommand(client); +// // 测试发送查询硫化氢报警状态命令 +// dsc.testSendHSStatusCommand(client); - // 测试发送查询硫化氢参数命令 - dsc.testSendHSCommand(client); - // 测试发送查询硫化氢报警状态命令 - dsc.testSendHSStatusCommand(client); + // 测试发送查询爆管液位报警状态命令 + dsc.testSendYWStatusCommand(client); + + // 测试发送查询对射报警状态命令 +// dsc.testSendDSStatusCommand(client); } /** @@ -97,8 +101,9 @@ ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(client, ch4), 10, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -116,7 +121,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); ch4alm.setDestinationId(dest); - ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); @@ -124,8 +129,9 @@ ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4StatusTask(client, ch4alm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -153,8 +159,9 @@ ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSValueTask(client, ws), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -172,7 +179,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); wsalm.setDestinationId(dest); - wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); @@ -180,8 +187,9 @@ wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSStatusTask(client, wsalm), 25, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -208,8 +216,9 @@ co.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOValueTask(client, co), 30, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -227,7 +236,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); coalm.setDestinationId(dest); - coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); coalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.START")), 2)) + "00"); coalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.WORDCOUNT"))); @@ -235,8 +244,9 @@ coalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOStatusTask(client, coalm), 35, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -263,8 +273,9 @@ o2.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2ValueTask(client, o2), 40, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -282,7 +293,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); o2alm.setDestinationId(dest); - o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); o2alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.START")), 2)) + "00"); o2alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.WORDCOUNT"))); @@ -290,8 +301,9 @@ o2alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2StatusTask(client, o2alm), 45, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -318,8 +330,9 @@ hs.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSValueTask(client, hs), 50, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -337,7 +350,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); hsalm.setDestinationId(dest); - hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); hsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.START")), 2)) + "00"); hsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.WORDCOUNT"))); @@ -345,7 +358,65 @@ hsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSStatusTask(client, hsalm), 55, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询爆管液位报警状态命令 + * @param client + */ + public void testSendYWStatusCommand(ACUClient client) { + ReadMemoryCommand ywalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READYWSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ywalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ywalm.setDestinationId(dest); + + ywalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + ywalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.START")), 2)) + "00"); + ywalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.WORDCOUNT"))); + ywalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.BITCOUNT"))); + ywalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YW.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadYWStatusTask(client, ywalm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + + /** + * 发送查询对射报警状态命令 + * @param client + */ + public void testSendDSStatusCommand(ACUClient client) { + ReadMemoryCommand dsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READDSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + dsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + dsalm.setDestinationId(dest); + + dsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + dsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.START")), 2)) + "00"); + dsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.WORDCOUNT"))); + dsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.BITCOUNT"))); + dsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadDSStatusTask(client, dsalm), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index 70fb6dc..a9d5686 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -10,6 +10,7 @@ public PgAcuRdcmd findById(String id); public PgAcuRdcmd findLatestCmdByDestAndCount(String dest, int count); + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type); public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); diff --git a/src/com/szpg/db/dao/PgDSDao.java b/src/com/szpg/db/dao/PgDSDao.java new file mode 100644 index 0000000..b731af9 --- /dev/null +++ b/src/com/szpg/db/dao/PgDSDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgDSAlm; + +/** + * 对射报警相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgDSDao { + + /******** 对射报警状态 ********/ + public List findAllSbjz(); + public PgDSAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgDSAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/PgYWDao.java b/src/com/szpg/db/dao/PgYWDao.java new file mode 100644 index 0000000..bb27bbf --- /dev/null +++ b/src/com/szpg/db/dao/PgYWDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgYWAlm; + +/** + * 爆管液位相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgYWDao { + + /******** 爆管液位浓度报警状态 ********/ + public List findAllSbjz(); + public PgYWAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgYWAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index b693939..16b2285 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -114,6 +114,41 @@ } return null; } + + + @Override + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ACU_RDCMD WHERE RESPONSED='0' AND TIMEOUT='0' AND DEST=? AND CMD_TYPE=? ORDER BY TM DESC"; + Object[] params = new Object[2]; + params[0] = dest; + params[1] = type; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAcuRdcmd.class), params); + + if (null != list && list.isEmpty() == false) { + logger.debug("根据目的地址和命令类型查询内存读取命令成功[" + list.size() + "]"); + + return list.get(0); + } else + return null; + } catch (Exception ex) { + logger.error("根据目的地址和命令类型查询内存读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } @Override public int addCmdRecord(PgAcuRdcmd cmd) { diff --git a/src/com/szpg/db/dao/impl/PgDSDaoImpl.java b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java new file mode 100644 index 0000000..e9d18cd --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.data.PgDSAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgDSDaoImpl implements PgDSDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgDSAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(0); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询对射报警状态成功" + dsalm + "]"); + + return dsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgDSAlm dsalm) { + return addSbjzRecord(dsalm.getDsalm(), dsalm.getTmStr(), dsalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_DS_ALM " + + "(DSALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入对射报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入对射报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 657281c..7706852 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -39,6 +39,12 @@ case "HS": key = "%硫化氢%"; break; + case "YW": + key = "%液位%"; + break; + case "DS": + key = "%对射%"; + break; } String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '" + key + "' ORDER BY D.ID"; diff --git a/src/com/szpg/db/dao/impl/PgYWDaoImpl.java b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java new file mode 100644 index 0000000..613c4c0 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.data.PgYWAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgYWDaoImpl implements PgYWDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgYWAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(0); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询爆管液位报警状态成功" + ywalm + "]"); + + return ywalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgYWAlm ywalm) { + return addSbjzRecord(ywalm.getYwalm(), ywalm.getTmStr(), ywalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_YW_ALM " + + "(YWALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入爆管液位报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入爆管液位报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index f4ecfe5..2d46bfc 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -1,6 +1,8 @@ package com.szpg.db.data; +import java.util.Calendar; import java.util.Date; +import java.util.UUID; import com.szpg.util.TimeFormat; @@ -31,6 +33,11 @@ private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 + public PgAcuRdcmd() { + this.setId(UUID.randomUUID().toString().replace("-", "")); + this.setTm(Calendar.getInstance().getTime()); + } + public String getId() { return id; } diff --git a/src/com/szpg/db/data/PgDSAlm.java b/src/com/szpg/db/data/PgDSAlm.java new file mode 100644 index 0000000..86e28bb --- /dev/null +++ b/src/com/szpg/db/data/PgDSAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 对射报警状态数据表 + * + * @author admin + * + */ +public class PgDSAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = -8336945265752238748L; + + private Integer id; + private Boolean dsalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getDsalm() { + return dsalm; + } + + public void setDsalm(Boolean dsalm) { + this.dsalm = dsalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgDSAlm[dsalm=" + dsalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/data/PgYWAlm.java b/src/com/szpg/db/data/PgYWAlm.java new file mode 100644 index 0000000..9d9572f --- /dev/null +++ b/src/com/szpg/db/data/PgYWAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 爆管液位浓度报警状态数据表 + * + * @author admin + * + */ +public class PgYWAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 3882791834818808488L; + + private Integer id; + private Boolean ywalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getYwalm() { + return ywalm; + } + + public void setYwalm(Boolean ywalm) { + this.ywalm = ywalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgYWAlm[ywalm=" + ywalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/plc/message/AppMessageConstants.java b/src/com/szpg/plc/message/AppMessageConstants.java index 25db6ab..1c84086 100644 --- a/src/com/szpg/plc/message/AppMessageConstants.java +++ b/src/com/szpg/plc/message/AppMessageConstants.java @@ -13,4 +13,7 @@ public final static String CMD_TYPE_READO2STATUS = "17"; //读取氧气报警状态命令 public final static String CMD_TYPE_READHSVALUE = "18"; //读取硫化氢监测值命令 public final static String CMD_TYPE_READHSSTATUS = "19"; //读取硫化氢报警状态命令 + + public final static String CMD_TYPE_READYWSTATUS = "21"; //读取爆管液位报警状态命令 + public final static String CMD_TYPE_READDSSTATUS = "22"; //读取对射报警状态命令 } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index acf2859..3678a16 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -5,12 +5,14 @@ import com.szpg.plc.message.command.read.ReadCH4ValueCommand; import com.szpg.plc.message.command.read.ReadCOStatusCommand; import com.szpg.plc.message.command.read.ReadCOValueCommand; +import com.szpg.plc.message.command.read.ReadDSStatusCommand; import com.szpg.plc.message.command.read.ReadHSStatusCommand; import com.szpg.plc.message.command.read.ReadHSValueCommand; import com.szpg.plc.message.command.read.ReadO2StatusCommand; import com.szpg.plc.message.command.read.ReadO2ValueCommand; import com.szpg.plc.message.command.read.ReadWSStatusCommand; import com.szpg.plc.message.command.read.ReadWSValueCommand; +import com.szpg.plc.message.command.read.ReadYWStatusCommand; import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -101,6 +103,12 @@ return new ReadHSValueCommand(); case AppMessageConstants.CMD_TYPE_READHSSTATUS: return new ReadHSStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + return new ReadYWStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + return new ReadDSStatusCommand(); default: return null; diff --git a/src/ACUBL.properties b/src/ACUBL.properties index ae086d4..99e858d 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -46,7 +46,7 @@ #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2.START = 0500 #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 -YXL.ACU001.O2.WORDCOUNT = 24 +YXL.ACU001.O2.WORDCOUNT = 4 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2ALM.START = 0036 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -66,3 +66,22 @@ YXL.ACU001.HSALM.WORDCOUNT = 1 #\u786b\u5316\u6c22\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 YXL.ACU001.HSALM.BITCOUNT = 12 + +#\u7206\u7ba1\u6db2\u4f4d\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.YW.COUNT = 2 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.YWALM.START = 0025 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.YWALM.WORDCOUNT = 1 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.YWALM.BITCOUNT = 2 + +#\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.DS.COUNT = 15 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.DSALM.START = 0038 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.DSALM.WORDCOUNT = 3 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.DSALM.BITCOUNT = 45 + diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 5e6edbc..8d5ab08 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -16,12 +16,14 @@ import com.szpg.task.ReadCH4ValueTask; import com.szpg.task.ReadCOStatusTask; import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; import com.szpg.task.ReadHSStatusTask; import com.szpg.task.ReadHSValueTask; import com.szpg.task.ReadO2StatusTask; import com.szpg.task.ReadO2ValueTask; import com.szpg.task.ReadWSStatusTask; import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -30,11 +32,12 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.103", 6800); + // PLC设备地址和端口 + ACUClient client = new ACUClient("192.168.0.244", 6800); - client.setNet("00"); - client.setNode("6B"); - client.setUnit("00"); + client.setNet("00"); //网络号 + client.setNode("F4"); //节点号 + client.setUnit("00"); //单元号 // 3将ACU的信息加入到map中 ACUClientUtil.getInstance().addClient(client); @@ -44,33 +47,34 @@ // 测试发送查询甲烷参数命令 // dsc.testSendCH4Command(client); - // 测试发送查询甲烷报警状态命令 -// dsc.testSendCH4StatsuCommand(client); +// // 测试发送查询甲烷报警状态命令 +// dsc.testSendCH4StatusCommand(client); // 测试发送查询温湿度监测值命令 // dsc.testSendWSCommand(client); // 测试发送查询温湿度报警状态命令 // dsc.testSendWSStatusCommand(client); - // 测试发送查询一氧化碳参数命令 +// // 测试发送查询一氧化碳参数命令 // dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 +// // 测试发送查询一氧化碳报警状态命令 // dsc.testSendCOStatusCommand(client); - - // 测试发送查询一氧化碳参数命令 -// dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 -// dsc.testSendCOStatusCommand(client); - +// // 测试发送查询氧气参数命令 // dsc.testSendO2Command(client); // 测试发送查询氧气报警状态命令 // dsc.testSendO2StatusCommand(client); +// +// // 测试发送查询硫化氢参数命令 +// dsc.testSendHSCommand(client); +// // 测试发送查询硫化氢报警状态命令 +// dsc.testSendHSStatusCommand(client); - // 测试发送查询硫化氢参数命令 - dsc.testSendHSCommand(client); - // 测试发送查询硫化氢报警状态命令 - dsc.testSendHSStatusCommand(client); + // 测试发送查询爆管液位报警状态命令 + dsc.testSendYWStatusCommand(client); + + // 测试发送查询对射报警状态命令 +// dsc.testSendDSStatusCommand(client); } /** @@ -97,8 +101,9 @@ ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(client, ch4), 10, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -116,7 +121,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); ch4alm.setDestinationId(dest); - ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); @@ -124,8 +129,9 @@ ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4StatusTask(client, ch4alm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -153,8 +159,9 @@ ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSValueTask(client, ws), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -172,7 +179,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); wsalm.setDestinationId(dest); - wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); @@ -180,8 +187,9 @@ wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSStatusTask(client, wsalm), 25, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -208,8 +216,9 @@ co.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOValueTask(client, co), 30, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -227,7 +236,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); coalm.setDestinationId(dest); - coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); coalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.START")), 2)) + "00"); coalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.WORDCOUNT"))); @@ -235,8 +244,9 @@ coalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOStatusTask(client, coalm), 35, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -263,8 +273,9 @@ o2.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2ValueTask(client, o2), 40, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -282,7 +293,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); o2alm.setDestinationId(dest); - o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); o2alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.START")), 2)) + "00"); o2alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.WORDCOUNT"))); @@ -290,8 +301,9 @@ o2alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2StatusTask(client, o2alm), 45, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -318,8 +330,9 @@ hs.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSValueTask(client, hs), 50, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -337,7 +350,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); hsalm.setDestinationId(dest); - hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); hsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.START")), 2)) + "00"); hsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.WORDCOUNT"))); @@ -345,7 +358,65 @@ hsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSStatusTask(client, hsalm), 55, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询爆管液位报警状态命令 + * @param client + */ + public void testSendYWStatusCommand(ACUClient client) { + ReadMemoryCommand ywalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READYWSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ywalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ywalm.setDestinationId(dest); + + ywalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + ywalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.START")), 2)) + "00"); + ywalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.WORDCOUNT"))); + ywalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.BITCOUNT"))); + ywalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YW.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadYWStatusTask(client, ywalm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + + /** + * 发送查询对射报警状态命令 + * @param client + */ + public void testSendDSStatusCommand(ACUClient client) { + ReadMemoryCommand dsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READDSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + dsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + dsalm.setDestinationId(dest); + + dsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + dsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.START")), 2)) + "00"); + dsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.WORDCOUNT"))); + dsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.BITCOUNT"))); + dsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadDSStatusTask(client, dsalm), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index 70fb6dc..a9d5686 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -10,6 +10,7 @@ public PgAcuRdcmd findById(String id); public PgAcuRdcmd findLatestCmdByDestAndCount(String dest, int count); + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type); public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); diff --git a/src/com/szpg/db/dao/PgDSDao.java b/src/com/szpg/db/dao/PgDSDao.java new file mode 100644 index 0000000..b731af9 --- /dev/null +++ b/src/com/szpg/db/dao/PgDSDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgDSAlm; + +/** + * 对射报警相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgDSDao { + + /******** 对射报警状态 ********/ + public List findAllSbjz(); + public PgDSAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgDSAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/PgYWDao.java b/src/com/szpg/db/dao/PgYWDao.java new file mode 100644 index 0000000..bb27bbf --- /dev/null +++ b/src/com/szpg/db/dao/PgYWDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgYWAlm; + +/** + * 爆管液位相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgYWDao { + + /******** 爆管液位浓度报警状态 ********/ + public List findAllSbjz(); + public PgYWAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgYWAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index b693939..16b2285 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -114,6 +114,41 @@ } return null; } + + + @Override + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ACU_RDCMD WHERE RESPONSED='0' AND TIMEOUT='0' AND DEST=? AND CMD_TYPE=? ORDER BY TM DESC"; + Object[] params = new Object[2]; + params[0] = dest; + params[1] = type; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAcuRdcmd.class), params); + + if (null != list && list.isEmpty() == false) { + logger.debug("根据目的地址和命令类型查询内存读取命令成功[" + list.size() + "]"); + + return list.get(0); + } else + return null; + } catch (Exception ex) { + logger.error("根据目的地址和命令类型查询内存读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } @Override public int addCmdRecord(PgAcuRdcmd cmd) { diff --git a/src/com/szpg/db/dao/impl/PgDSDaoImpl.java b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java new file mode 100644 index 0000000..e9d18cd --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.data.PgDSAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgDSDaoImpl implements PgDSDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgDSAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(0); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询对射报警状态成功" + dsalm + "]"); + + return dsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgDSAlm dsalm) { + return addSbjzRecord(dsalm.getDsalm(), dsalm.getTmStr(), dsalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_DS_ALM " + + "(DSALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入对射报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入对射报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 657281c..7706852 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -39,6 +39,12 @@ case "HS": key = "%硫化氢%"; break; + case "YW": + key = "%液位%"; + break; + case "DS": + key = "%对射%"; + break; } String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '" + key + "' ORDER BY D.ID"; diff --git a/src/com/szpg/db/dao/impl/PgYWDaoImpl.java b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java new file mode 100644 index 0000000..613c4c0 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.data.PgYWAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgYWDaoImpl implements PgYWDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgYWAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(0); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询爆管液位报警状态成功" + ywalm + "]"); + + return ywalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgYWAlm ywalm) { + return addSbjzRecord(ywalm.getYwalm(), ywalm.getTmStr(), ywalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_YW_ALM " + + "(YWALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入爆管液位报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入爆管液位报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index f4ecfe5..2d46bfc 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -1,6 +1,8 @@ package com.szpg.db.data; +import java.util.Calendar; import java.util.Date; +import java.util.UUID; import com.szpg.util.TimeFormat; @@ -31,6 +33,11 @@ private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 + public PgAcuRdcmd() { + this.setId(UUID.randomUUID().toString().replace("-", "")); + this.setTm(Calendar.getInstance().getTime()); + } + public String getId() { return id; } diff --git a/src/com/szpg/db/data/PgDSAlm.java b/src/com/szpg/db/data/PgDSAlm.java new file mode 100644 index 0000000..86e28bb --- /dev/null +++ b/src/com/szpg/db/data/PgDSAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 对射报警状态数据表 + * + * @author admin + * + */ +public class PgDSAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = -8336945265752238748L; + + private Integer id; + private Boolean dsalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getDsalm() { + return dsalm; + } + + public void setDsalm(Boolean dsalm) { + this.dsalm = dsalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgDSAlm[dsalm=" + dsalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/data/PgYWAlm.java b/src/com/szpg/db/data/PgYWAlm.java new file mode 100644 index 0000000..9d9572f --- /dev/null +++ b/src/com/szpg/db/data/PgYWAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 爆管液位浓度报警状态数据表 + * + * @author admin + * + */ +public class PgYWAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 3882791834818808488L; + + private Integer id; + private Boolean ywalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getYwalm() { + return ywalm; + } + + public void setYwalm(Boolean ywalm) { + this.ywalm = ywalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgYWAlm[ywalm=" + ywalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/plc/message/AppMessageConstants.java b/src/com/szpg/plc/message/AppMessageConstants.java index 25db6ab..1c84086 100644 --- a/src/com/szpg/plc/message/AppMessageConstants.java +++ b/src/com/szpg/plc/message/AppMessageConstants.java @@ -13,4 +13,7 @@ public final static String CMD_TYPE_READO2STATUS = "17"; //读取氧气报警状态命令 public final static String CMD_TYPE_READHSVALUE = "18"; //读取硫化氢监测值命令 public final static String CMD_TYPE_READHSSTATUS = "19"; //读取硫化氢报警状态命令 + + public final static String CMD_TYPE_READYWSTATUS = "21"; //读取爆管液位报警状态命令 + public final static String CMD_TYPE_READDSSTATUS = "22"; //读取对射报警状态命令 } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index acf2859..3678a16 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -5,12 +5,14 @@ import com.szpg.plc.message.command.read.ReadCH4ValueCommand; import com.szpg.plc.message.command.read.ReadCOStatusCommand; import com.szpg.plc.message.command.read.ReadCOValueCommand; +import com.szpg.plc.message.command.read.ReadDSStatusCommand; import com.szpg.plc.message.command.read.ReadHSStatusCommand; import com.szpg.plc.message.command.read.ReadHSValueCommand; import com.szpg.plc.message.command.read.ReadO2StatusCommand; import com.szpg.plc.message.command.read.ReadO2ValueCommand; import com.szpg.plc.message.command.read.ReadWSStatusCommand; import com.szpg.plc.message.command.read.ReadWSValueCommand; +import com.szpg.plc.message.command.read.ReadYWStatusCommand; import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -101,6 +103,12 @@ return new ReadHSValueCommand(); case AppMessageConstants.CMD_TYPE_READHSSTATUS: return new ReadHSStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + return new ReadYWStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + return new ReadDSStatusCommand(); default: return null; diff --git a/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java new file mode 100644 index 0000000..eda271f --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; + +public class ReadDSStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = -1668388238102375069L; + + @Override + public Class getResponseClass() { + return ReadDSStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询对射报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READDSSTATUS; + } + +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index ae086d4..99e858d 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -46,7 +46,7 @@ #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2.START = 0500 #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 -YXL.ACU001.O2.WORDCOUNT = 24 +YXL.ACU001.O2.WORDCOUNT = 4 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2ALM.START = 0036 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -66,3 +66,22 @@ YXL.ACU001.HSALM.WORDCOUNT = 1 #\u786b\u5316\u6c22\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 YXL.ACU001.HSALM.BITCOUNT = 12 + +#\u7206\u7ba1\u6db2\u4f4d\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.YW.COUNT = 2 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.YWALM.START = 0025 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.YWALM.WORDCOUNT = 1 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.YWALM.BITCOUNT = 2 + +#\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.DS.COUNT = 15 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.DSALM.START = 0038 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.DSALM.WORDCOUNT = 3 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.DSALM.BITCOUNT = 45 + diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 5e6edbc..8d5ab08 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -16,12 +16,14 @@ import com.szpg.task.ReadCH4ValueTask; import com.szpg.task.ReadCOStatusTask; import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; import com.szpg.task.ReadHSStatusTask; import com.szpg.task.ReadHSValueTask; import com.szpg.task.ReadO2StatusTask; import com.szpg.task.ReadO2ValueTask; import com.szpg.task.ReadWSStatusTask; import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -30,11 +32,12 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.103", 6800); + // PLC设备地址和端口 + ACUClient client = new ACUClient("192.168.0.244", 6800); - client.setNet("00"); - client.setNode("6B"); - client.setUnit("00"); + client.setNet("00"); //网络号 + client.setNode("F4"); //节点号 + client.setUnit("00"); //单元号 // 3将ACU的信息加入到map中 ACUClientUtil.getInstance().addClient(client); @@ -44,33 +47,34 @@ // 测试发送查询甲烷参数命令 // dsc.testSendCH4Command(client); - // 测试发送查询甲烷报警状态命令 -// dsc.testSendCH4StatsuCommand(client); +// // 测试发送查询甲烷报警状态命令 +// dsc.testSendCH4StatusCommand(client); // 测试发送查询温湿度监测值命令 // dsc.testSendWSCommand(client); // 测试发送查询温湿度报警状态命令 // dsc.testSendWSStatusCommand(client); - // 测试发送查询一氧化碳参数命令 +// // 测试发送查询一氧化碳参数命令 // dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 +// // 测试发送查询一氧化碳报警状态命令 // dsc.testSendCOStatusCommand(client); - - // 测试发送查询一氧化碳参数命令 -// dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 -// dsc.testSendCOStatusCommand(client); - +// // 测试发送查询氧气参数命令 // dsc.testSendO2Command(client); // 测试发送查询氧气报警状态命令 // dsc.testSendO2StatusCommand(client); +// +// // 测试发送查询硫化氢参数命令 +// dsc.testSendHSCommand(client); +// // 测试发送查询硫化氢报警状态命令 +// dsc.testSendHSStatusCommand(client); - // 测试发送查询硫化氢参数命令 - dsc.testSendHSCommand(client); - // 测试发送查询硫化氢报警状态命令 - dsc.testSendHSStatusCommand(client); + // 测试发送查询爆管液位报警状态命令 + dsc.testSendYWStatusCommand(client); + + // 测试发送查询对射报警状态命令 +// dsc.testSendDSStatusCommand(client); } /** @@ -97,8 +101,9 @@ ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(client, ch4), 10, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -116,7 +121,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); ch4alm.setDestinationId(dest); - ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); @@ -124,8 +129,9 @@ ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4StatusTask(client, ch4alm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -153,8 +159,9 @@ ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSValueTask(client, ws), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -172,7 +179,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); wsalm.setDestinationId(dest); - wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); @@ -180,8 +187,9 @@ wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSStatusTask(client, wsalm), 25, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -208,8 +216,9 @@ co.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOValueTask(client, co), 30, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -227,7 +236,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); coalm.setDestinationId(dest); - coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); coalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.START")), 2)) + "00"); coalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.WORDCOUNT"))); @@ -235,8 +244,9 @@ coalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOStatusTask(client, coalm), 35, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -263,8 +273,9 @@ o2.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2ValueTask(client, o2), 40, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -282,7 +293,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); o2alm.setDestinationId(dest); - o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); o2alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.START")), 2)) + "00"); o2alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.WORDCOUNT"))); @@ -290,8 +301,9 @@ o2alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2StatusTask(client, o2alm), 45, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -318,8 +330,9 @@ hs.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSValueTask(client, hs), 50, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -337,7 +350,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); hsalm.setDestinationId(dest); - hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); hsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.START")), 2)) + "00"); hsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.WORDCOUNT"))); @@ -345,7 +358,65 @@ hsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSStatusTask(client, hsalm), 55, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询爆管液位报警状态命令 + * @param client + */ + public void testSendYWStatusCommand(ACUClient client) { + ReadMemoryCommand ywalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READYWSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ywalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ywalm.setDestinationId(dest); + + ywalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + ywalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.START")), 2)) + "00"); + ywalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.WORDCOUNT"))); + ywalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.BITCOUNT"))); + ywalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YW.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadYWStatusTask(client, ywalm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + + /** + * 发送查询对射报警状态命令 + * @param client + */ + public void testSendDSStatusCommand(ACUClient client) { + ReadMemoryCommand dsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READDSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + dsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + dsalm.setDestinationId(dest); + + dsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + dsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.START")), 2)) + "00"); + dsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.WORDCOUNT"))); + dsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.BITCOUNT"))); + dsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadDSStatusTask(client, dsalm), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index 70fb6dc..a9d5686 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -10,6 +10,7 @@ public PgAcuRdcmd findById(String id); public PgAcuRdcmd findLatestCmdByDestAndCount(String dest, int count); + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type); public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); diff --git a/src/com/szpg/db/dao/PgDSDao.java b/src/com/szpg/db/dao/PgDSDao.java new file mode 100644 index 0000000..b731af9 --- /dev/null +++ b/src/com/szpg/db/dao/PgDSDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgDSAlm; + +/** + * 对射报警相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgDSDao { + + /******** 对射报警状态 ********/ + public List findAllSbjz(); + public PgDSAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgDSAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/PgYWDao.java b/src/com/szpg/db/dao/PgYWDao.java new file mode 100644 index 0000000..bb27bbf --- /dev/null +++ b/src/com/szpg/db/dao/PgYWDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgYWAlm; + +/** + * 爆管液位相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgYWDao { + + /******** 爆管液位浓度报警状态 ********/ + public List findAllSbjz(); + public PgYWAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgYWAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index b693939..16b2285 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -114,6 +114,41 @@ } return null; } + + + @Override + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ACU_RDCMD WHERE RESPONSED='0' AND TIMEOUT='0' AND DEST=? AND CMD_TYPE=? ORDER BY TM DESC"; + Object[] params = new Object[2]; + params[0] = dest; + params[1] = type; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAcuRdcmd.class), params); + + if (null != list && list.isEmpty() == false) { + logger.debug("根据目的地址和命令类型查询内存读取命令成功[" + list.size() + "]"); + + return list.get(0); + } else + return null; + } catch (Exception ex) { + logger.error("根据目的地址和命令类型查询内存读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } @Override public int addCmdRecord(PgAcuRdcmd cmd) { diff --git a/src/com/szpg/db/dao/impl/PgDSDaoImpl.java b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java new file mode 100644 index 0000000..e9d18cd --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.data.PgDSAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgDSDaoImpl implements PgDSDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgDSAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(0); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询对射报警状态成功" + dsalm + "]"); + + return dsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgDSAlm dsalm) { + return addSbjzRecord(dsalm.getDsalm(), dsalm.getTmStr(), dsalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_DS_ALM " + + "(DSALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入对射报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入对射报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 657281c..7706852 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -39,6 +39,12 @@ case "HS": key = "%硫化氢%"; break; + case "YW": + key = "%液位%"; + break; + case "DS": + key = "%对射%"; + break; } String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '" + key + "' ORDER BY D.ID"; diff --git a/src/com/szpg/db/dao/impl/PgYWDaoImpl.java b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java new file mode 100644 index 0000000..613c4c0 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.data.PgYWAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgYWDaoImpl implements PgYWDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgYWAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(0); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询爆管液位报警状态成功" + ywalm + "]"); + + return ywalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgYWAlm ywalm) { + return addSbjzRecord(ywalm.getYwalm(), ywalm.getTmStr(), ywalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_YW_ALM " + + "(YWALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入爆管液位报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入爆管液位报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index f4ecfe5..2d46bfc 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -1,6 +1,8 @@ package com.szpg.db.data; +import java.util.Calendar; import java.util.Date; +import java.util.UUID; import com.szpg.util.TimeFormat; @@ -31,6 +33,11 @@ private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 + public PgAcuRdcmd() { + this.setId(UUID.randomUUID().toString().replace("-", "")); + this.setTm(Calendar.getInstance().getTime()); + } + public String getId() { return id; } diff --git a/src/com/szpg/db/data/PgDSAlm.java b/src/com/szpg/db/data/PgDSAlm.java new file mode 100644 index 0000000..86e28bb --- /dev/null +++ b/src/com/szpg/db/data/PgDSAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 对射报警状态数据表 + * + * @author admin + * + */ +public class PgDSAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = -8336945265752238748L; + + private Integer id; + private Boolean dsalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getDsalm() { + return dsalm; + } + + public void setDsalm(Boolean dsalm) { + this.dsalm = dsalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgDSAlm[dsalm=" + dsalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/data/PgYWAlm.java b/src/com/szpg/db/data/PgYWAlm.java new file mode 100644 index 0000000..9d9572f --- /dev/null +++ b/src/com/szpg/db/data/PgYWAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 爆管液位浓度报警状态数据表 + * + * @author admin + * + */ +public class PgYWAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 3882791834818808488L; + + private Integer id; + private Boolean ywalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getYwalm() { + return ywalm; + } + + public void setYwalm(Boolean ywalm) { + this.ywalm = ywalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgYWAlm[ywalm=" + ywalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/plc/message/AppMessageConstants.java b/src/com/szpg/plc/message/AppMessageConstants.java index 25db6ab..1c84086 100644 --- a/src/com/szpg/plc/message/AppMessageConstants.java +++ b/src/com/szpg/plc/message/AppMessageConstants.java @@ -13,4 +13,7 @@ public final static String CMD_TYPE_READO2STATUS = "17"; //读取氧气报警状态命令 public final static String CMD_TYPE_READHSVALUE = "18"; //读取硫化氢监测值命令 public final static String CMD_TYPE_READHSSTATUS = "19"; //读取硫化氢报警状态命令 + + public final static String CMD_TYPE_READYWSTATUS = "21"; //读取爆管液位报警状态命令 + public final static String CMD_TYPE_READDSSTATUS = "22"; //读取对射报警状态命令 } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index acf2859..3678a16 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -5,12 +5,14 @@ import com.szpg.plc.message.command.read.ReadCH4ValueCommand; import com.szpg.plc.message.command.read.ReadCOStatusCommand; import com.szpg.plc.message.command.read.ReadCOValueCommand; +import com.szpg.plc.message.command.read.ReadDSStatusCommand; import com.szpg.plc.message.command.read.ReadHSStatusCommand; import com.szpg.plc.message.command.read.ReadHSValueCommand; import com.szpg.plc.message.command.read.ReadO2StatusCommand; import com.szpg.plc.message.command.read.ReadO2ValueCommand; import com.szpg.plc.message.command.read.ReadWSStatusCommand; import com.szpg.plc.message.command.read.ReadWSValueCommand; +import com.szpg.plc.message.command.read.ReadYWStatusCommand; import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -101,6 +103,12 @@ return new ReadHSValueCommand(); case AppMessageConstants.CMD_TYPE_READHSSTATUS: return new ReadHSStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + return new ReadYWStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + return new ReadDSStatusCommand(); default: return null; diff --git a/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java new file mode 100644 index 0000000..eda271f --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; + +public class ReadDSStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = -1668388238102375069L; + + @Override + public Class getResponseClass() { + return ReadDSStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询对射报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READDSSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java new file mode 100644 index 0000000..73c54b3 --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; + +public class ReadYWStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 1019982176997717896L; + + @Override + public Class getResponseClass() { + return ReadYWStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询爆管液位报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READYWSTATUS; + } + +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index ae086d4..99e858d 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -46,7 +46,7 @@ #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2.START = 0500 #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 -YXL.ACU001.O2.WORDCOUNT = 24 +YXL.ACU001.O2.WORDCOUNT = 4 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2ALM.START = 0036 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -66,3 +66,22 @@ YXL.ACU001.HSALM.WORDCOUNT = 1 #\u786b\u5316\u6c22\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 YXL.ACU001.HSALM.BITCOUNT = 12 + +#\u7206\u7ba1\u6db2\u4f4d\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.YW.COUNT = 2 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.YWALM.START = 0025 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.YWALM.WORDCOUNT = 1 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.YWALM.BITCOUNT = 2 + +#\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.DS.COUNT = 15 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.DSALM.START = 0038 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.DSALM.WORDCOUNT = 3 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.DSALM.BITCOUNT = 45 + diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 5e6edbc..8d5ab08 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -16,12 +16,14 @@ import com.szpg.task.ReadCH4ValueTask; import com.szpg.task.ReadCOStatusTask; import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; import com.szpg.task.ReadHSStatusTask; import com.szpg.task.ReadHSValueTask; import com.szpg.task.ReadO2StatusTask; import com.szpg.task.ReadO2ValueTask; import com.szpg.task.ReadWSStatusTask; import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -30,11 +32,12 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.103", 6800); + // PLC设备地址和端口 + ACUClient client = new ACUClient("192.168.0.244", 6800); - client.setNet("00"); - client.setNode("6B"); - client.setUnit("00"); + client.setNet("00"); //网络号 + client.setNode("F4"); //节点号 + client.setUnit("00"); //单元号 // 3将ACU的信息加入到map中 ACUClientUtil.getInstance().addClient(client); @@ -44,33 +47,34 @@ // 测试发送查询甲烷参数命令 // dsc.testSendCH4Command(client); - // 测试发送查询甲烷报警状态命令 -// dsc.testSendCH4StatsuCommand(client); +// // 测试发送查询甲烷报警状态命令 +// dsc.testSendCH4StatusCommand(client); // 测试发送查询温湿度监测值命令 // dsc.testSendWSCommand(client); // 测试发送查询温湿度报警状态命令 // dsc.testSendWSStatusCommand(client); - // 测试发送查询一氧化碳参数命令 +// // 测试发送查询一氧化碳参数命令 // dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 +// // 测试发送查询一氧化碳报警状态命令 // dsc.testSendCOStatusCommand(client); - - // 测试发送查询一氧化碳参数命令 -// dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 -// dsc.testSendCOStatusCommand(client); - +// // 测试发送查询氧气参数命令 // dsc.testSendO2Command(client); // 测试发送查询氧气报警状态命令 // dsc.testSendO2StatusCommand(client); +// +// // 测试发送查询硫化氢参数命令 +// dsc.testSendHSCommand(client); +// // 测试发送查询硫化氢报警状态命令 +// dsc.testSendHSStatusCommand(client); - // 测试发送查询硫化氢参数命令 - dsc.testSendHSCommand(client); - // 测试发送查询硫化氢报警状态命令 - dsc.testSendHSStatusCommand(client); + // 测试发送查询爆管液位报警状态命令 + dsc.testSendYWStatusCommand(client); + + // 测试发送查询对射报警状态命令 +// dsc.testSendDSStatusCommand(client); } /** @@ -97,8 +101,9 @@ ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(client, ch4), 10, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -116,7 +121,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); ch4alm.setDestinationId(dest); - ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); @@ -124,8 +129,9 @@ ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4StatusTask(client, ch4alm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -153,8 +159,9 @@ ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSValueTask(client, ws), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -172,7 +179,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); wsalm.setDestinationId(dest); - wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); @@ -180,8 +187,9 @@ wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSStatusTask(client, wsalm), 25, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -208,8 +216,9 @@ co.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOValueTask(client, co), 30, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -227,7 +236,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); coalm.setDestinationId(dest); - coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); coalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.START")), 2)) + "00"); coalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.WORDCOUNT"))); @@ -235,8 +244,9 @@ coalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOStatusTask(client, coalm), 35, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -263,8 +273,9 @@ o2.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2ValueTask(client, o2), 40, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -282,7 +293,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); o2alm.setDestinationId(dest); - o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); o2alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.START")), 2)) + "00"); o2alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.WORDCOUNT"))); @@ -290,8 +301,9 @@ o2alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2StatusTask(client, o2alm), 45, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -318,8 +330,9 @@ hs.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSValueTask(client, hs), 50, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -337,7 +350,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); hsalm.setDestinationId(dest); - hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); hsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.START")), 2)) + "00"); hsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.WORDCOUNT"))); @@ -345,7 +358,65 @@ hsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSStatusTask(client, hsalm), 55, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询爆管液位报警状态命令 + * @param client + */ + public void testSendYWStatusCommand(ACUClient client) { + ReadMemoryCommand ywalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READYWSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ywalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ywalm.setDestinationId(dest); + + ywalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + ywalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.START")), 2)) + "00"); + ywalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.WORDCOUNT"))); + ywalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.BITCOUNT"))); + ywalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YW.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadYWStatusTask(client, ywalm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + + /** + * 发送查询对射报警状态命令 + * @param client + */ + public void testSendDSStatusCommand(ACUClient client) { + ReadMemoryCommand dsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READDSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + dsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + dsalm.setDestinationId(dest); + + dsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + dsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.START")), 2)) + "00"); + dsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.WORDCOUNT"))); + dsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.BITCOUNT"))); + dsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadDSStatusTask(client, dsalm), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index 70fb6dc..a9d5686 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -10,6 +10,7 @@ public PgAcuRdcmd findById(String id); public PgAcuRdcmd findLatestCmdByDestAndCount(String dest, int count); + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type); public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); diff --git a/src/com/szpg/db/dao/PgDSDao.java b/src/com/szpg/db/dao/PgDSDao.java new file mode 100644 index 0000000..b731af9 --- /dev/null +++ b/src/com/szpg/db/dao/PgDSDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgDSAlm; + +/** + * 对射报警相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgDSDao { + + /******** 对射报警状态 ********/ + public List findAllSbjz(); + public PgDSAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgDSAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/PgYWDao.java b/src/com/szpg/db/dao/PgYWDao.java new file mode 100644 index 0000000..bb27bbf --- /dev/null +++ b/src/com/szpg/db/dao/PgYWDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgYWAlm; + +/** + * 爆管液位相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgYWDao { + + /******** 爆管液位浓度报警状态 ********/ + public List findAllSbjz(); + public PgYWAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgYWAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index b693939..16b2285 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -114,6 +114,41 @@ } return null; } + + + @Override + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ACU_RDCMD WHERE RESPONSED='0' AND TIMEOUT='0' AND DEST=? AND CMD_TYPE=? ORDER BY TM DESC"; + Object[] params = new Object[2]; + params[0] = dest; + params[1] = type; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAcuRdcmd.class), params); + + if (null != list && list.isEmpty() == false) { + logger.debug("根据目的地址和命令类型查询内存读取命令成功[" + list.size() + "]"); + + return list.get(0); + } else + return null; + } catch (Exception ex) { + logger.error("根据目的地址和命令类型查询内存读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } @Override public int addCmdRecord(PgAcuRdcmd cmd) { diff --git a/src/com/szpg/db/dao/impl/PgDSDaoImpl.java b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java new file mode 100644 index 0000000..e9d18cd --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.data.PgDSAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgDSDaoImpl implements PgDSDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgDSAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(0); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询对射报警状态成功" + dsalm + "]"); + + return dsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgDSAlm dsalm) { + return addSbjzRecord(dsalm.getDsalm(), dsalm.getTmStr(), dsalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_DS_ALM " + + "(DSALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入对射报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入对射报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 657281c..7706852 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -39,6 +39,12 @@ case "HS": key = "%硫化氢%"; break; + case "YW": + key = "%液位%"; + break; + case "DS": + key = "%对射%"; + break; } String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '" + key + "' ORDER BY D.ID"; diff --git a/src/com/szpg/db/dao/impl/PgYWDaoImpl.java b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java new file mode 100644 index 0000000..613c4c0 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.data.PgYWAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgYWDaoImpl implements PgYWDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgYWAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(0); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询爆管液位报警状态成功" + ywalm + "]"); + + return ywalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgYWAlm ywalm) { + return addSbjzRecord(ywalm.getYwalm(), ywalm.getTmStr(), ywalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_YW_ALM " + + "(YWALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入爆管液位报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入爆管液位报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index f4ecfe5..2d46bfc 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -1,6 +1,8 @@ package com.szpg.db.data; +import java.util.Calendar; import java.util.Date; +import java.util.UUID; import com.szpg.util.TimeFormat; @@ -31,6 +33,11 @@ private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 + public PgAcuRdcmd() { + this.setId(UUID.randomUUID().toString().replace("-", "")); + this.setTm(Calendar.getInstance().getTime()); + } + public String getId() { return id; } diff --git a/src/com/szpg/db/data/PgDSAlm.java b/src/com/szpg/db/data/PgDSAlm.java new file mode 100644 index 0000000..86e28bb --- /dev/null +++ b/src/com/szpg/db/data/PgDSAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 对射报警状态数据表 + * + * @author admin + * + */ +public class PgDSAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = -8336945265752238748L; + + private Integer id; + private Boolean dsalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getDsalm() { + return dsalm; + } + + public void setDsalm(Boolean dsalm) { + this.dsalm = dsalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgDSAlm[dsalm=" + dsalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/data/PgYWAlm.java b/src/com/szpg/db/data/PgYWAlm.java new file mode 100644 index 0000000..9d9572f --- /dev/null +++ b/src/com/szpg/db/data/PgYWAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 爆管液位浓度报警状态数据表 + * + * @author admin + * + */ +public class PgYWAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 3882791834818808488L; + + private Integer id; + private Boolean ywalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getYwalm() { + return ywalm; + } + + public void setYwalm(Boolean ywalm) { + this.ywalm = ywalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgYWAlm[ywalm=" + ywalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/plc/message/AppMessageConstants.java b/src/com/szpg/plc/message/AppMessageConstants.java index 25db6ab..1c84086 100644 --- a/src/com/szpg/plc/message/AppMessageConstants.java +++ b/src/com/szpg/plc/message/AppMessageConstants.java @@ -13,4 +13,7 @@ public final static String CMD_TYPE_READO2STATUS = "17"; //读取氧气报警状态命令 public final static String CMD_TYPE_READHSVALUE = "18"; //读取硫化氢监测值命令 public final static String CMD_TYPE_READHSSTATUS = "19"; //读取硫化氢报警状态命令 + + public final static String CMD_TYPE_READYWSTATUS = "21"; //读取爆管液位报警状态命令 + public final static String CMD_TYPE_READDSSTATUS = "22"; //读取对射报警状态命令 } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index acf2859..3678a16 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -5,12 +5,14 @@ import com.szpg.plc.message.command.read.ReadCH4ValueCommand; import com.szpg.plc.message.command.read.ReadCOStatusCommand; import com.szpg.plc.message.command.read.ReadCOValueCommand; +import com.szpg.plc.message.command.read.ReadDSStatusCommand; import com.szpg.plc.message.command.read.ReadHSStatusCommand; import com.szpg.plc.message.command.read.ReadHSValueCommand; import com.szpg.plc.message.command.read.ReadO2StatusCommand; import com.szpg.plc.message.command.read.ReadO2ValueCommand; import com.szpg.plc.message.command.read.ReadWSStatusCommand; import com.szpg.plc.message.command.read.ReadWSValueCommand; +import com.szpg.plc.message.command.read.ReadYWStatusCommand; import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -101,6 +103,12 @@ return new ReadHSValueCommand(); case AppMessageConstants.CMD_TYPE_READHSSTATUS: return new ReadHSStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + return new ReadYWStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + return new ReadDSStatusCommand(); default: return null; diff --git a/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java new file mode 100644 index 0000000..eda271f --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; + +public class ReadDSStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = -1668388238102375069L; + + @Override + public Class getResponseClass() { + return ReadDSStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询对射报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READDSSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java new file mode 100644 index 0000000..73c54b3 --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; + +public class ReadYWStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 1019982176997717896L; + + @Override + public Class getResponseClass() { + return ReadYWStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询爆管液位报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READYWSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java new file mode 100644 index 0000000..e2b476b --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java @@ -0,0 +1,57 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgDSDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadDSStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 4047613496835657828L; + + private List dsbj; // 对射报警状态 + + public ReadDSStatusCommandResponse() { + dsbj = new ArrayList(); + } + + public List getDsbj() { + return dsbj; + } + + public void setDsbj(List dsbj) { + this.dsbj = dsbj; + } + + @Override + public void afterAction() { + // 1将对射报警数据存入数据库 + PgDSDao dsDao = new PgDSDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findDeviceIdByDestAndType(this.getMessageProducerId(), "DS"); + + for (int i = 0; i < dsbj.size(); i++) { + if (i < ids.size()) { + dsDao.addSbjzRecord(dsbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (dsbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + + } + } + } + } + +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index ae086d4..99e858d 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -46,7 +46,7 @@ #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2.START = 0500 #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 -YXL.ACU001.O2.WORDCOUNT = 24 +YXL.ACU001.O2.WORDCOUNT = 4 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2ALM.START = 0036 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -66,3 +66,22 @@ YXL.ACU001.HSALM.WORDCOUNT = 1 #\u786b\u5316\u6c22\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 YXL.ACU001.HSALM.BITCOUNT = 12 + +#\u7206\u7ba1\u6db2\u4f4d\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.YW.COUNT = 2 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.YWALM.START = 0025 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.YWALM.WORDCOUNT = 1 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.YWALM.BITCOUNT = 2 + +#\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.DS.COUNT = 15 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.DSALM.START = 0038 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.DSALM.WORDCOUNT = 3 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.DSALM.BITCOUNT = 45 + diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 5e6edbc..8d5ab08 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -16,12 +16,14 @@ import com.szpg.task.ReadCH4ValueTask; import com.szpg.task.ReadCOStatusTask; import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; import com.szpg.task.ReadHSStatusTask; import com.szpg.task.ReadHSValueTask; import com.szpg.task.ReadO2StatusTask; import com.szpg.task.ReadO2ValueTask; import com.szpg.task.ReadWSStatusTask; import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -30,11 +32,12 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.103", 6800); + // PLC设备地址和端口 + ACUClient client = new ACUClient("192.168.0.244", 6800); - client.setNet("00"); - client.setNode("6B"); - client.setUnit("00"); + client.setNet("00"); //网络号 + client.setNode("F4"); //节点号 + client.setUnit("00"); //单元号 // 3将ACU的信息加入到map中 ACUClientUtil.getInstance().addClient(client); @@ -44,33 +47,34 @@ // 测试发送查询甲烷参数命令 // dsc.testSendCH4Command(client); - // 测试发送查询甲烷报警状态命令 -// dsc.testSendCH4StatsuCommand(client); +// // 测试发送查询甲烷报警状态命令 +// dsc.testSendCH4StatusCommand(client); // 测试发送查询温湿度监测值命令 // dsc.testSendWSCommand(client); // 测试发送查询温湿度报警状态命令 // dsc.testSendWSStatusCommand(client); - // 测试发送查询一氧化碳参数命令 +// // 测试发送查询一氧化碳参数命令 // dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 +// // 测试发送查询一氧化碳报警状态命令 // dsc.testSendCOStatusCommand(client); - - // 测试发送查询一氧化碳参数命令 -// dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 -// dsc.testSendCOStatusCommand(client); - +// // 测试发送查询氧气参数命令 // dsc.testSendO2Command(client); // 测试发送查询氧气报警状态命令 // dsc.testSendO2StatusCommand(client); +// +// // 测试发送查询硫化氢参数命令 +// dsc.testSendHSCommand(client); +// // 测试发送查询硫化氢报警状态命令 +// dsc.testSendHSStatusCommand(client); - // 测试发送查询硫化氢参数命令 - dsc.testSendHSCommand(client); - // 测试发送查询硫化氢报警状态命令 - dsc.testSendHSStatusCommand(client); + // 测试发送查询爆管液位报警状态命令 + dsc.testSendYWStatusCommand(client); + + // 测试发送查询对射报警状态命令 +// dsc.testSendDSStatusCommand(client); } /** @@ -97,8 +101,9 @@ ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(client, ch4), 10, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -116,7 +121,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); ch4alm.setDestinationId(dest); - ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); @@ -124,8 +129,9 @@ ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4StatusTask(client, ch4alm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -153,8 +159,9 @@ ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSValueTask(client, ws), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -172,7 +179,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); wsalm.setDestinationId(dest); - wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); @@ -180,8 +187,9 @@ wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSStatusTask(client, wsalm), 25, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -208,8 +216,9 @@ co.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOValueTask(client, co), 30, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -227,7 +236,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); coalm.setDestinationId(dest); - coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); coalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.START")), 2)) + "00"); coalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.WORDCOUNT"))); @@ -235,8 +244,9 @@ coalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOStatusTask(client, coalm), 35, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -263,8 +273,9 @@ o2.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2ValueTask(client, o2), 40, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -282,7 +293,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); o2alm.setDestinationId(dest); - o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); o2alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.START")), 2)) + "00"); o2alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.WORDCOUNT"))); @@ -290,8 +301,9 @@ o2alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2StatusTask(client, o2alm), 45, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -318,8 +330,9 @@ hs.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSValueTask(client, hs), 50, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -337,7 +350,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); hsalm.setDestinationId(dest); - hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); hsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.START")), 2)) + "00"); hsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.WORDCOUNT"))); @@ -345,7 +358,65 @@ hsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSStatusTask(client, hsalm), 55, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询爆管液位报警状态命令 + * @param client + */ + public void testSendYWStatusCommand(ACUClient client) { + ReadMemoryCommand ywalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READYWSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ywalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ywalm.setDestinationId(dest); + + ywalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + ywalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.START")), 2)) + "00"); + ywalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.WORDCOUNT"))); + ywalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.BITCOUNT"))); + ywalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YW.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadYWStatusTask(client, ywalm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + + /** + * 发送查询对射报警状态命令 + * @param client + */ + public void testSendDSStatusCommand(ACUClient client) { + ReadMemoryCommand dsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READDSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + dsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + dsalm.setDestinationId(dest); + + dsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + dsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.START")), 2)) + "00"); + dsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.WORDCOUNT"))); + dsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.BITCOUNT"))); + dsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadDSStatusTask(client, dsalm), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index 70fb6dc..a9d5686 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -10,6 +10,7 @@ public PgAcuRdcmd findById(String id); public PgAcuRdcmd findLatestCmdByDestAndCount(String dest, int count); + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type); public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); diff --git a/src/com/szpg/db/dao/PgDSDao.java b/src/com/szpg/db/dao/PgDSDao.java new file mode 100644 index 0000000..b731af9 --- /dev/null +++ b/src/com/szpg/db/dao/PgDSDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgDSAlm; + +/** + * 对射报警相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgDSDao { + + /******** 对射报警状态 ********/ + public List findAllSbjz(); + public PgDSAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgDSAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/PgYWDao.java b/src/com/szpg/db/dao/PgYWDao.java new file mode 100644 index 0000000..bb27bbf --- /dev/null +++ b/src/com/szpg/db/dao/PgYWDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgYWAlm; + +/** + * 爆管液位相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgYWDao { + + /******** 爆管液位浓度报警状态 ********/ + public List findAllSbjz(); + public PgYWAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgYWAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index b693939..16b2285 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -114,6 +114,41 @@ } return null; } + + + @Override + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ACU_RDCMD WHERE RESPONSED='0' AND TIMEOUT='0' AND DEST=? AND CMD_TYPE=? ORDER BY TM DESC"; + Object[] params = new Object[2]; + params[0] = dest; + params[1] = type; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAcuRdcmd.class), params); + + if (null != list && list.isEmpty() == false) { + logger.debug("根据目的地址和命令类型查询内存读取命令成功[" + list.size() + "]"); + + return list.get(0); + } else + return null; + } catch (Exception ex) { + logger.error("根据目的地址和命令类型查询内存读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } @Override public int addCmdRecord(PgAcuRdcmd cmd) { diff --git a/src/com/szpg/db/dao/impl/PgDSDaoImpl.java b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java new file mode 100644 index 0000000..e9d18cd --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.data.PgDSAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgDSDaoImpl implements PgDSDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgDSAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(0); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询对射报警状态成功" + dsalm + "]"); + + return dsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgDSAlm dsalm) { + return addSbjzRecord(dsalm.getDsalm(), dsalm.getTmStr(), dsalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_DS_ALM " + + "(DSALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入对射报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入对射报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 657281c..7706852 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -39,6 +39,12 @@ case "HS": key = "%硫化氢%"; break; + case "YW": + key = "%液位%"; + break; + case "DS": + key = "%对射%"; + break; } String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '" + key + "' ORDER BY D.ID"; diff --git a/src/com/szpg/db/dao/impl/PgYWDaoImpl.java b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java new file mode 100644 index 0000000..613c4c0 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.data.PgYWAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgYWDaoImpl implements PgYWDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgYWAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(0); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询爆管液位报警状态成功" + ywalm + "]"); + + return ywalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgYWAlm ywalm) { + return addSbjzRecord(ywalm.getYwalm(), ywalm.getTmStr(), ywalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_YW_ALM " + + "(YWALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入爆管液位报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入爆管液位报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index f4ecfe5..2d46bfc 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -1,6 +1,8 @@ package com.szpg.db.data; +import java.util.Calendar; import java.util.Date; +import java.util.UUID; import com.szpg.util.TimeFormat; @@ -31,6 +33,11 @@ private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 + public PgAcuRdcmd() { + this.setId(UUID.randomUUID().toString().replace("-", "")); + this.setTm(Calendar.getInstance().getTime()); + } + public String getId() { return id; } diff --git a/src/com/szpg/db/data/PgDSAlm.java b/src/com/szpg/db/data/PgDSAlm.java new file mode 100644 index 0000000..86e28bb --- /dev/null +++ b/src/com/szpg/db/data/PgDSAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 对射报警状态数据表 + * + * @author admin + * + */ +public class PgDSAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = -8336945265752238748L; + + private Integer id; + private Boolean dsalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getDsalm() { + return dsalm; + } + + public void setDsalm(Boolean dsalm) { + this.dsalm = dsalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgDSAlm[dsalm=" + dsalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/data/PgYWAlm.java b/src/com/szpg/db/data/PgYWAlm.java new file mode 100644 index 0000000..9d9572f --- /dev/null +++ b/src/com/szpg/db/data/PgYWAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 爆管液位浓度报警状态数据表 + * + * @author admin + * + */ +public class PgYWAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 3882791834818808488L; + + private Integer id; + private Boolean ywalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getYwalm() { + return ywalm; + } + + public void setYwalm(Boolean ywalm) { + this.ywalm = ywalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgYWAlm[ywalm=" + ywalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/plc/message/AppMessageConstants.java b/src/com/szpg/plc/message/AppMessageConstants.java index 25db6ab..1c84086 100644 --- a/src/com/szpg/plc/message/AppMessageConstants.java +++ b/src/com/szpg/plc/message/AppMessageConstants.java @@ -13,4 +13,7 @@ public final static String CMD_TYPE_READO2STATUS = "17"; //读取氧气报警状态命令 public final static String CMD_TYPE_READHSVALUE = "18"; //读取硫化氢监测值命令 public final static String CMD_TYPE_READHSSTATUS = "19"; //读取硫化氢报警状态命令 + + public final static String CMD_TYPE_READYWSTATUS = "21"; //读取爆管液位报警状态命令 + public final static String CMD_TYPE_READDSSTATUS = "22"; //读取对射报警状态命令 } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index acf2859..3678a16 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -5,12 +5,14 @@ import com.szpg.plc.message.command.read.ReadCH4ValueCommand; import com.szpg.plc.message.command.read.ReadCOStatusCommand; import com.szpg.plc.message.command.read.ReadCOValueCommand; +import com.szpg.plc.message.command.read.ReadDSStatusCommand; import com.szpg.plc.message.command.read.ReadHSStatusCommand; import com.szpg.plc.message.command.read.ReadHSValueCommand; import com.szpg.plc.message.command.read.ReadO2StatusCommand; import com.szpg.plc.message.command.read.ReadO2ValueCommand; import com.szpg.plc.message.command.read.ReadWSStatusCommand; import com.szpg.plc.message.command.read.ReadWSValueCommand; +import com.szpg.plc.message.command.read.ReadYWStatusCommand; import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -101,6 +103,12 @@ return new ReadHSValueCommand(); case AppMessageConstants.CMD_TYPE_READHSSTATUS: return new ReadHSStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + return new ReadYWStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + return new ReadDSStatusCommand(); default: return null; diff --git a/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java new file mode 100644 index 0000000..eda271f --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; + +public class ReadDSStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = -1668388238102375069L; + + @Override + public Class getResponseClass() { + return ReadDSStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询对射报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READDSSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java new file mode 100644 index 0000000..73c54b3 --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; + +public class ReadYWStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 1019982176997717896L; + + @Override + public Class getResponseClass() { + return ReadYWStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询爆管液位报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READYWSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java new file mode 100644 index 0000000..e2b476b --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java @@ -0,0 +1,57 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgDSDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadDSStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 4047613496835657828L; + + private List dsbj; // 对射报警状态 + + public ReadDSStatusCommandResponse() { + dsbj = new ArrayList(); + } + + public List getDsbj() { + return dsbj; + } + + public void setDsbj(List dsbj) { + this.dsbj = dsbj; + } + + @Override + public void afterAction() { + // 1将对射报警数据存入数据库 + PgDSDao dsDao = new PgDSDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findDeviceIdByDestAndType(this.getMessageProducerId(), "DS"); + + for (int i = 0; i < dsbj.size(); i++) { + if (i < ids.size()) { + dsDao.addSbjzRecord(dsbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (dsbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + + } + } + } + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java new file mode 100644 index 0000000..c2674f2 --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java @@ -0,0 +1,57 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgYWDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadYWStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 8088340048416088978L; + + private List ywbj; // 爆管液位报警状态 + + public ReadYWStatusCommandResponse() { + ywbj = new ArrayList(); + } + + public List getYwbj() { + return ywbj; + } + + public void setYwbj(List ywbj) { + this.ywbj = ywbj; + } + + @Override + public void afterAction() { + // 1将爆管液位浓度数据存入数据库 + PgYWDao ywDao = new PgYWDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findDeviceIdByDestAndType(this.getMessageProducerId(), "YW"); + + for (int i = 0; i < ywbj.size(); i++) { + if (i < ids.size()) { + ywDao.addSbjzRecord(ywbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (ywbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + + } + } + } + } + +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index ae086d4..99e858d 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -46,7 +46,7 @@ #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2.START = 0500 #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 -YXL.ACU001.O2.WORDCOUNT = 24 +YXL.ACU001.O2.WORDCOUNT = 4 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2ALM.START = 0036 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -66,3 +66,22 @@ YXL.ACU001.HSALM.WORDCOUNT = 1 #\u786b\u5316\u6c22\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 YXL.ACU001.HSALM.BITCOUNT = 12 + +#\u7206\u7ba1\u6db2\u4f4d\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.YW.COUNT = 2 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.YWALM.START = 0025 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.YWALM.WORDCOUNT = 1 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.YWALM.BITCOUNT = 2 + +#\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.DS.COUNT = 15 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.DSALM.START = 0038 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.DSALM.WORDCOUNT = 3 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.DSALM.BITCOUNT = 45 + diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 5e6edbc..8d5ab08 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -16,12 +16,14 @@ import com.szpg.task.ReadCH4ValueTask; import com.szpg.task.ReadCOStatusTask; import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; import com.szpg.task.ReadHSStatusTask; import com.szpg.task.ReadHSValueTask; import com.szpg.task.ReadO2StatusTask; import com.szpg.task.ReadO2ValueTask; import com.szpg.task.ReadWSStatusTask; import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -30,11 +32,12 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.103", 6800); + // PLC设备地址和端口 + ACUClient client = new ACUClient("192.168.0.244", 6800); - client.setNet("00"); - client.setNode("6B"); - client.setUnit("00"); + client.setNet("00"); //网络号 + client.setNode("F4"); //节点号 + client.setUnit("00"); //单元号 // 3将ACU的信息加入到map中 ACUClientUtil.getInstance().addClient(client); @@ -44,33 +47,34 @@ // 测试发送查询甲烷参数命令 // dsc.testSendCH4Command(client); - // 测试发送查询甲烷报警状态命令 -// dsc.testSendCH4StatsuCommand(client); +// // 测试发送查询甲烷报警状态命令 +// dsc.testSendCH4StatusCommand(client); // 测试发送查询温湿度监测值命令 // dsc.testSendWSCommand(client); // 测试发送查询温湿度报警状态命令 // dsc.testSendWSStatusCommand(client); - // 测试发送查询一氧化碳参数命令 +// // 测试发送查询一氧化碳参数命令 // dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 +// // 测试发送查询一氧化碳报警状态命令 // dsc.testSendCOStatusCommand(client); - - // 测试发送查询一氧化碳参数命令 -// dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 -// dsc.testSendCOStatusCommand(client); - +// // 测试发送查询氧气参数命令 // dsc.testSendO2Command(client); // 测试发送查询氧气报警状态命令 // dsc.testSendO2StatusCommand(client); +// +// // 测试发送查询硫化氢参数命令 +// dsc.testSendHSCommand(client); +// // 测试发送查询硫化氢报警状态命令 +// dsc.testSendHSStatusCommand(client); - // 测试发送查询硫化氢参数命令 - dsc.testSendHSCommand(client); - // 测试发送查询硫化氢报警状态命令 - dsc.testSendHSStatusCommand(client); + // 测试发送查询爆管液位报警状态命令 + dsc.testSendYWStatusCommand(client); + + // 测试发送查询对射报警状态命令 +// dsc.testSendDSStatusCommand(client); } /** @@ -97,8 +101,9 @@ ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(client, ch4), 10, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -116,7 +121,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); ch4alm.setDestinationId(dest); - ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); @@ -124,8 +129,9 @@ ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4StatusTask(client, ch4alm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -153,8 +159,9 @@ ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSValueTask(client, ws), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -172,7 +179,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); wsalm.setDestinationId(dest); - wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); @@ -180,8 +187,9 @@ wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSStatusTask(client, wsalm), 25, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -208,8 +216,9 @@ co.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOValueTask(client, co), 30, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -227,7 +236,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); coalm.setDestinationId(dest); - coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); coalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.START")), 2)) + "00"); coalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.WORDCOUNT"))); @@ -235,8 +244,9 @@ coalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOStatusTask(client, coalm), 35, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -263,8 +273,9 @@ o2.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2ValueTask(client, o2), 40, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -282,7 +293,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); o2alm.setDestinationId(dest); - o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); o2alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.START")), 2)) + "00"); o2alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.WORDCOUNT"))); @@ -290,8 +301,9 @@ o2alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2StatusTask(client, o2alm), 45, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -318,8 +330,9 @@ hs.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSValueTask(client, hs), 50, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -337,7 +350,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); hsalm.setDestinationId(dest); - hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); hsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.START")), 2)) + "00"); hsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.WORDCOUNT"))); @@ -345,7 +358,65 @@ hsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSStatusTask(client, hsalm), 55, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询爆管液位报警状态命令 + * @param client + */ + public void testSendYWStatusCommand(ACUClient client) { + ReadMemoryCommand ywalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READYWSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ywalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ywalm.setDestinationId(dest); + + ywalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + ywalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.START")), 2)) + "00"); + ywalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.WORDCOUNT"))); + ywalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.BITCOUNT"))); + ywalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YW.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadYWStatusTask(client, ywalm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + + /** + * 发送查询对射报警状态命令 + * @param client + */ + public void testSendDSStatusCommand(ACUClient client) { + ReadMemoryCommand dsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READDSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + dsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + dsalm.setDestinationId(dest); + + dsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + dsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.START")), 2)) + "00"); + dsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.WORDCOUNT"))); + dsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.BITCOUNT"))); + dsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadDSStatusTask(client, dsalm), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index 70fb6dc..a9d5686 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -10,6 +10,7 @@ public PgAcuRdcmd findById(String id); public PgAcuRdcmd findLatestCmdByDestAndCount(String dest, int count); + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type); public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); diff --git a/src/com/szpg/db/dao/PgDSDao.java b/src/com/szpg/db/dao/PgDSDao.java new file mode 100644 index 0000000..b731af9 --- /dev/null +++ b/src/com/szpg/db/dao/PgDSDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgDSAlm; + +/** + * 对射报警相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgDSDao { + + /******** 对射报警状态 ********/ + public List findAllSbjz(); + public PgDSAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgDSAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/PgYWDao.java b/src/com/szpg/db/dao/PgYWDao.java new file mode 100644 index 0000000..bb27bbf --- /dev/null +++ b/src/com/szpg/db/dao/PgYWDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgYWAlm; + +/** + * 爆管液位相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgYWDao { + + /******** 爆管液位浓度报警状态 ********/ + public List findAllSbjz(); + public PgYWAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgYWAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index b693939..16b2285 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -114,6 +114,41 @@ } return null; } + + + @Override + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ACU_RDCMD WHERE RESPONSED='0' AND TIMEOUT='0' AND DEST=? AND CMD_TYPE=? ORDER BY TM DESC"; + Object[] params = new Object[2]; + params[0] = dest; + params[1] = type; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAcuRdcmd.class), params); + + if (null != list && list.isEmpty() == false) { + logger.debug("根据目的地址和命令类型查询内存读取命令成功[" + list.size() + "]"); + + return list.get(0); + } else + return null; + } catch (Exception ex) { + logger.error("根据目的地址和命令类型查询内存读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } @Override public int addCmdRecord(PgAcuRdcmd cmd) { diff --git a/src/com/szpg/db/dao/impl/PgDSDaoImpl.java b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java new file mode 100644 index 0000000..e9d18cd --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.data.PgDSAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgDSDaoImpl implements PgDSDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgDSAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(0); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询对射报警状态成功" + dsalm + "]"); + + return dsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgDSAlm dsalm) { + return addSbjzRecord(dsalm.getDsalm(), dsalm.getTmStr(), dsalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_DS_ALM " + + "(DSALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入对射报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入对射报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 657281c..7706852 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -39,6 +39,12 @@ case "HS": key = "%硫化氢%"; break; + case "YW": + key = "%液位%"; + break; + case "DS": + key = "%对射%"; + break; } String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '" + key + "' ORDER BY D.ID"; diff --git a/src/com/szpg/db/dao/impl/PgYWDaoImpl.java b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java new file mode 100644 index 0000000..613c4c0 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.data.PgYWAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgYWDaoImpl implements PgYWDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgYWAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(0); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询爆管液位报警状态成功" + ywalm + "]"); + + return ywalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgYWAlm ywalm) { + return addSbjzRecord(ywalm.getYwalm(), ywalm.getTmStr(), ywalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_YW_ALM " + + "(YWALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入爆管液位报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入爆管液位报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index f4ecfe5..2d46bfc 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -1,6 +1,8 @@ package com.szpg.db.data; +import java.util.Calendar; import java.util.Date; +import java.util.UUID; import com.szpg.util.TimeFormat; @@ -31,6 +33,11 @@ private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 + public PgAcuRdcmd() { + this.setId(UUID.randomUUID().toString().replace("-", "")); + this.setTm(Calendar.getInstance().getTime()); + } + public String getId() { return id; } diff --git a/src/com/szpg/db/data/PgDSAlm.java b/src/com/szpg/db/data/PgDSAlm.java new file mode 100644 index 0000000..86e28bb --- /dev/null +++ b/src/com/szpg/db/data/PgDSAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 对射报警状态数据表 + * + * @author admin + * + */ +public class PgDSAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = -8336945265752238748L; + + private Integer id; + private Boolean dsalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getDsalm() { + return dsalm; + } + + public void setDsalm(Boolean dsalm) { + this.dsalm = dsalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgDSAlm[dsalm=" + dsalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/data/PgYWAlm.java b/src/com/szpg/db/data/PgYWAlm.java new file mode 100644 index 0000000..9d9572f --- /dev/null +++ b/src/com/szpg/db/data/PgYWAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 爆管液位浓度报警状态数据表 + * + * @author admin + * + */ +public class PgYWAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 3882791834818808488L; + + private Integer id; + private Boolean ywalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getYwalm() { + return ywalm; + } + + public void setYwalm(Boolean ywalm) { + this.ywalm = ywalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgYWAlm[ywalm=" + ywalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/plc/message/AppMessageConstants.java b/src/com/szpg/plc/message/AppMessageConstants.java index 25db6ab..1c84086 100644 --- a/src/com/szpg/plc/message/AppMessageConstants.java +++ b/src/com/szpg/plc/message/AppMessageConstants.java @@ -13,4 +13,7 @@ public final static String CMD_TYPE_READO2STATUS = "17"; //读取氧气报警状态命令 public final static String CMD_TYPE_READHSVALUE = "18"; //读取硫化氢监测值命令 public final static String CMD_TYPE_READHSSTATUS = "19"; //读取硫化氢报警状态命令 + + public final static String CMD_TYPE_READYWSTATUS = "21"; //读取爆管液位报警状态命令 + public final static String CMD_TYPE_READDSSTATUS = "22"; //读取对射报警状态命令 } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index acf2859..3678a16 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -5,12 +5,14 @@ import com.szpg.plc.message.command.read.ReadCH4ValueCommand; import com.szpg.plc.message.command.read.ReadCOStatusCommand; import com.szpg.plc.message.command.read.ReadCOValueCommand; +import com.szpg.plc.message.command.read.ReadDSStatusCommand; import com.szpg.plc.message.command.read.ReadHSStatusCommand; import com.szpg.plc.message.command.read.ReadHSValueCommand; import com.szpg.plc.message.command.read.ReadO2StatusCommand; import com.szpg.plc.message.command.read.ReadO2ValueCommand; import com.szpg.plc.message.command.read.ReadWSStatusCommand; import com.szpg.plc.message.command.read.ReadWSValueCommand; +import com.szpg.plc.message.command.read.ReadYWStatusCommand; import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -101,6 +103,12 @@ return new ReadHSValueCommand(); case AppMessageConstants.CMD_TYPE_READHSSTATUS: return new ReadHSStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + return new ReadYWStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + return new ReadDSStatusCommand(); default: return null; diff --git a/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java new file mode 100644 index 0000000..eda271f --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; + +public class ReadDSStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = -1668388238102375069L; + + @Override + public Class getResponseClass() { + return ReadDSStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询对射报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READDSSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java new file mode 100644 index 0000000..73c54b3 --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; + +public class ReadYWStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 1019982176997717896L; + + @Override + public Class getResponseClass() { + return ReadYWStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询爆管液位报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READYWSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java new file mode 100644 index 0000000..e2b476b --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java @@ -0,0 +1,57 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgDSDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadDSStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 4047613496835657828L; + + private List dsbj; // 对射报警状态 + + public ReadDSStatusCommandResponse() { + dsbj = new ArrayList(); + } + + public List getDsbj() { + return dsbj; + } + + public void setDsbj(List dsbj) { + this.dsbj = dsbj; + } + + @Override + public void afterAction() { + // 1将对射报警数据存入数据库 + PgDSDao dsDao = new PgDSDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findDeviceIdByDestAndType(this.getMessageProducerId(), "DS"); + + for (int i = 0; i < dsbj.size(); i++) { + if (i < ids.size()) { + dsDao.addSbjzRecord(dsbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (dsbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + + } + } + } + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java new file mode 100644 index 0000000..c2674f2 --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java @@ -0,0 +1,57 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgYWDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadYWStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 8088340048416088978L; + + private List ywbj; // 爆管液位报警状态 + + public ReadYWStatusCommandResponse() { + ywbj = new ArrayList(); + } + + public List getYwbj() { + return ywbj; + } + + public void setYwbj(List ywbj) { + this.ywbj = ywbj; + } + + @Override + public void afterAction() { + // 1将爆管液位浓度数据存入数据库 + PgYWDao ywDao = new PgYWDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findDeviceIdByDestAndType(this.getMessageProducerId(), "YW"); + + for (int i = 0; i < ywbj.size(); i++) { + if (i < ids.size()) { + ywDao.addSbjzRecord(ywbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (ywbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + + } + } + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSConstants.java b/src/com/szpg/plc/protocol/fins/FINSConstants.java index 2697e74..f565b8b 100644 --- a/src/com/szpg/plc/protocol/fins/FINSConstants.java +++ b/src/com/szpg/plc/protocol/fins/FINSConstants.java @@ -21,7 +21,8 @@ /******** 内存区域代码 ********/ public final static byte MEMORY_DM_AREA = (byte) 0x82; //82内存D区代码 - public final static byte MEMORY_WORK_AREA = 0x31; //31内存W区代码 + public final static byte MEMORY_WORK_AREA_WORD = (byte) 0xB1; //B1内存W区代码(按字操作) + public final static byte MEMORY_WORK_AREA_BIT = 0x31; //31内存W区代码(按位操作) /******** 控制域 ********/ public final static byte ICF_COMMAND = (byte) 0x80; //ICF字节代表命令 diff --git a/src/ACUBL.properties b/src/ACUBL.properties index ae086d4..99e858d 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -46,7 +46,7 @@ #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2.START = 0500 #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 -YXL.ACU001.O2.WORDCOUNT = 24 +YXL.ACU001.O2.WORDCOUNT = 4 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2ALM.START = 0036 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -66,3 +66,22 @@ YXL.ACU001.HSALM.WORDCOUNT = 1 #\u786b\u5316\u6c22\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 YXL.ACU001.HSALM.BITCOUNT = 12 + +#\u7206\u7ba1\u6db2\u4f4d\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.YW.COUNT = 2 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.YWALM.START = 0025 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.YWALM.WORDCOUNT = 1 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.YWALM.BITCOUNT = 2 + +#\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.DS.COUNT = 15 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.DSALM.START = 0038 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.DSALM.WORDCOUNT = 3 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.DSALM.BITCOUNT = 45 + diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 5e6edbc..8d5ab08 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -16,12 +16,14 @@ import com.szpg.task.ReadCH4ValueTask; import com.szpg.task.ReadCOStatusTask; import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; import com.szpg.task.ReadHSStatusTask; import com.szpg.task.ReadHSValueTask; import com.szpg.task.ReadO2StatusTask; import com.szpg.task.ReadO2ValueTask; import com.szpg.task.ReadWSStatusTask; import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -30,11 +32,12 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.103", 6800); + // PLC设备地址和端口 + ACUClient client = new ACUClient("192.168.0.244", 6800); - client.setNet("00"); - client.setNode("6B"); - client.setUnit("00"); + client.setNet("00"); //网络号 + client.setNode("F4"); //节点号 + client.setUnit("00"); //单元号 // 3将ACU的信息加入到map中 ACUClientUtil.getInstance().addClient(client); @@ -44,33 +47,34 @@ // 测试发送查询甲烷参数命令 // dsc.testSendCH4Command(client); - // 测试发送查询甲烷报警状态命令 -// dsc.testSendCH4StatsuCommand(client); +// // 测试发送查询甲烷报警状态命令 +// dsc.testSendCH4StatusCommand(client); // 测试发送查询温湿度监测值命令 // dsc.testSendWSCommand(client); // 测试发送查询温湿度报警状态命令 // dsc.testSendWSStatusCommand(client); - // 测试发送查询一氧化碳参数命令 +// // 测试发送查询一氧化碳参数命令 // dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 +// // 测试发送查询一氧化碳报警状态命令 // dsc.testSendCOStatusCommand(client); - - // 测试发送查询一氧化碳参数命令 -// dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 -// dsc.testSendCOStatusCommand(client); - +// // 测试发送查询氧气参数命令 // dsc.testSendO2Command(client); // 测试发送查询氧气报警状态命令 // dsc.testSendO2StatusCommand(client); +// +// // 测试发送查询硫化氢参数命令 +// dsc.testSendHSCommand(client); +// // 测试发送查询硫化氢报警状态命令 +// dsc.testSendHSStatusCommand(client); - // 测试发送查询硫化氢参数命令 - dsc.testSendHSCommand(client); - // 测试发送查询硫化氢报警状态命令 - dsc.testSendHSStatusCommand(client); + // 测试发送查询爆管液位报警状态命令 + dsc.testSendYWStatusCommand(client); + + // 测试发送查询对射报警状态命令 +// dsc.testSendDSStatusCommand(client); } /** @@ -97,8 +101,9 @@ ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(client, ch4), 10, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -116,7 +121,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); ch4alm.setDestinationId(dest); - ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); @@ -124,8 +129,9 @@ ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4StatusTask(client, ch4alm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -153,8 +159,9 @@ ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSValueTask(client, ws), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -172,7 +179,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); wsalm.setDestinationId(dest); - wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); @@ -180,8 +187,9 @@ wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSStatusTask(client, wsalm), 25, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -208,8 +216,9 @@ co.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOValueTask(client, co), 30, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -227,7 +236,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); coalm.setDestinationId(dest); - coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); coalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.START")), 2)) + "00"); coalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.WORDCOUNT"))); @@ -235,8 +244,9 @@ coalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOStatusTask(client, coalm), 35, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -263,8 +273,9 @@ o2.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2ValueTask(client, o2), 40, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -282,7 +293,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); o2alm.setDestinationId(dest); - o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); o2alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.START")), 2)) + "00"); o2alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.WORDCOUNT"))); @@ -290,8 +301,9 @@ o2alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2StatusTask(client, o2alm), 45, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -318,8 +330,9 @@ hs.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSValueTask(client, hs), 50, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -337,7 +350,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); hsalm.setDestinationId(dest); - hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); hsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.START")), 2)) + "00"); hsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.WORDCOUNT"))); @@ -345,7 +358,65 @@ hsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSStatusTask(client, hsalm), 55, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询爆管液位报警状态命令 + * @param client + */ + public void testSendYWStatusCommand(ACUClient client) { + ReadMemoryCommand ywalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READYWSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ywalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ywalm.setDestinationId(dest); + + ywalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + ywalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.START")), 2)) + "00"); + ywalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.WORDCOUNT"))); + ywalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.BITCOUNT"))); + ywalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YW.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadYWStatusTask(client, ywalm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + + /** + * 发送查询对射报警状态命令 + * @param client + */ + public void testSendDSStatusCommand(ACUClient client) { + ReadMemoryCommand dsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READDSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + dsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + dsalm.setDestinationId(dest); + + dsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + dsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.START")), 2)) + "00"); + dsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.WORDCOUNT"))); + dsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.BITCOUNT"))); + dsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadDSStatusTask(client, dsalm), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index 70fb6dc..a9d5686 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -10,6 +10,7 @@ public PgAcuRdcmd findById(String id); public PgAcuRdcmd findLatestCmdByDestAndCount(String dest, int count); + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type); public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); diff --git a/src/com/szpg/db/dao/PgDSDao.java b/src/com/szpg/db/dao/PgDSDao.java new file mode 100644 index 0000000..b731af9 --- /dev/null +++ b/src/com/szpg/db/dao/PgDSDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgDSAlm; + +/** + * 对射报警相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgDSDao { + + /******** 对射报警状态 ********/ + public List findAllSbjz(); + public PgDSAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgDSAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/PgYWDao.java b/src/com/szpg/db/dao/PgYWDao.java new file mode 100644 index 0000000..bb27bbf --- /dev/null +++ b/src/com/szpg/db/dao/PgYWDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgYWAlm; + +/** + * 爆管液位相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgYWDao { + + /******** 爆管液位浓度报警状态 ********/ + public List findAllSbjz(); + public PgYWAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgYWAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index b693939..16b2285 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -114,6 +114,41 @@ } return null; } + + + @Override + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ACU_RDCMD WHERE RESPONSED='0' AND TIMEOUT='0' AND DEST=? AND CMD_TYPE=? ORDER BY TM DESC"; + Object[] params = new Object[2]; + params[0] = dest; + params[1] = type; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAcuRdcmd.class), params); + + if (null != list && list.isEmpty() == false) { + logger.debug("根据目的地址和命令类型查询内存读取命令成功[" + list.size() + "]"); + + return list.get(0); + } else + return null; + } catch (Exception ex) { + logger.error("根据目的地址和命令类型查询内存读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } @Override public int addCmdRecord(PgAcuRdcmd cmd) { diff --git a/src/com/szpg/db/dao/impl/PgDSDaoImpl.java b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java new file mode 100644 index 0000000..e9d18cd --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.data.PgDSAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgDSDaoImpl implements PgDSDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgDSAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(0); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询对射报警状态成功" + dsalm + "]"); + + return dsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgDSAlm dsalm) { + return addSbjzRecord(dsalm.getDsalm(), dsalm.getTmStr(), dsalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_DS_ALM " + + "(DSALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入对射报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入对射报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 657281c..7706852 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -39,6 +39,12 @@ case "HS": key = "%硫化氢%"; break; + case "YW": + key = "%液位%"; + break; + case "DS": + key = "%对射%"; + break; } String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '" + key + "' ORDER BY D.ID"; diff --git a/src/com/szpg/db/dao/impl/PgYWDaoImpl.java b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java new file mode 100644 index 0000000..613c4c0 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.data.PgYWAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgYWDaoImpl implements PgYWDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgYWAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(0); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询爆管液位报警状态成功" + ywalm + "]"); + + return ywalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgYWAlm ywalm) { + return addSbjzRecord(ywalm.getYwalm(), ywalm.getTmStr(), ywalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_YW_ALM " + + "(YWALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入爆管液位报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入爆管液位报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index f4ecfe5..2d46bfc 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -1,6 +1,8 @@ package com.szpg.db.data; +import java.util.Calendar; import java.util.Date; +import java.util.UUID; import com.szpg.util.TimeFormat; @@ -31,6 +33,11 @@ private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 + public PgAcuRdcmd() { + this.setId(UUID.randomUUID().toString().replace("-", "")); + this.setTm(Calendar.getInstance().getTime()); + } + public String getId() { return id; } diff --git a/src/com/szpg/db/data/PgDSAlm.java b/src/com/szpg/db/data/PgDSAlm.java new file mode 100644 index 0000000..86e28bb --- /dev/null +++ b/src/com/szpg/db/data/PgDSAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 对射报警状态数据表 + * + * @author admin + * + */ +public class PgDSAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = -8336945265752238748L; + + private Integer id; + private Boolean dsalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getDsalm() { + return dsalm; + } + + public void setDsalm(Boolean dsalm) { + this.dsalm = dsalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgDSAlm[dsalm=" + dsalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/data/PgYWAlm.java b/src/com/szpg/db/data/PgYWAlm.java new file mode 100644 index 0000000..9d9572f --- /dev/null +++ b/src/com/szpg/db/data/PgYWAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 爆管液位浓度报警状态数据表 + * + * @author admin + * + */ +public class PgYWAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 3882791834818808488L; + + private Integer id; + private Boolean ywalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getYwalm() { + return ywalm; + } + + public void setYwalm(Boolean ywalm) { + this.ywalm = ywalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgYWAlm[ywalm=" + ywalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/plc/message/AppMessageConstants.java b/src/com/szpg/plc/message/AppMessageConstants.java index 25db6ab..1c84086 100644 --- a/src/com/szpg/plc/message/AppMessageConstants.java +++ b/src/com/szpg/plc/message/AppMessageConstants.java @@ -13,4 +13,7 @@ public final static String CMD_TYPE_READO2STATUS = "17"; //读取氧气报警状态命令 public final static String CMD_TYPE_READHSVALUE = "18"; //读取硫化氢监测值命令 public final static String CMD_TYPE_READHSSTATUS = "19"; //读取硫化氢报警状态命令 + + public final static String CMD_TYPE_READYWSTATUS = "21"; //读取爆管液位报警状态命令 + public final static String CMD_TYPE_READDSSTATUS = "22"; //读取对射报警状态命令 } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index acf2859..3678a16 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -5,12 +5,14 @@ import com.szpg.plc.message.command.read.ReadCH4ValueCommand; import com.szpg.plc.message.command.read.ReadCOStatusCommand; import com.szpg.plc.message.command.read.ReadCOValueCommand; +import com.szpg.plc.message.command.read.ReadDSStatusCommand; import com.szpg.plc.message.command.read.ReadHSStatusCommand; import com.szpg.plc.message.command.read.ReadHSValueCommand; import com.szpg.plc.message.command.read.ReadO2StatusCommand; import com.szpg.plc.message.command.read.ReadO2ValueCommand; import com.szpg.plc.message.command.read.ReadWSStatusCommand; import com.szpg.plc.message.command.read.ReadWSValueCommand; +import com.szpg.plc.message.command.read.ReadYWStatusCommand; import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -101,6 +103,12 @@ return new ReadHSValueCommand(); case AppMessageConstants.CMD_TYPE_READHSSTATUS: return new ReadHSStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + return new ReadYWStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + return new ReadDSStatusCommand(); default: return null; diff --git a/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java new file mode 100644 index 0000000..eda271f --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; + +public class ReadDSStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = -1668388238102375069L; + + @Override + public Class getResponseClass() { + return ReadDSStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询对射报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READDSSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java new file mode 100644 index 0000000..73c54b3 --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; + +public class ReadYWStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 1019982176997717896L; + + @Override + public Class getResponseClass() { + return ReadYWStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询爆管液位报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READYWSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java new file mode 100644 index 0000000..e2b476b --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java @@ -0,0 +1,57 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgDSDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadDSStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 4047613496835657828L; + + private List dsbj; // 对射报警状态 + + public ReadDSStatusCommandResponse() { + dsbj = new ArrayList(); + } + + public List getDsbj() { + return dsbj; + } + + public void setDsbj(List dsbj) { + this.dsbj = dsbj; + } + + @Override + public void afterAction() { + // 1将对射报警数据存入数据库 + PgDSDao dsDao = new PgDSDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findDeviceIdByDestAndType(this.getMessageProducerId(), "DS"); + + for (int i = 0; i < dsbj.size(); i++) { + if (i < ids.size()) { + dsDao.addSbjzRecord(dsbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (dsbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + + } + } + } + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java new file mode 100644 index 0000000..c2674f2 --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java @@ -0,0 +1,57 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgYWDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadYWStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 8088340048416088978L; + + private List ywbj; // 爆管液位报警状态 + + public ReadYWStatusCommandResponse() { + ywbj = new ArrayList(); + } + + public List getYwbj() { + return ywbj; + } + + public void setYwbj(List ywbj) { + this.ywbj = ywbj; + } + + @Override + public void afterAction() { + // 1将爆管液位浓度数据存入数据库 + PgYWDao ywDao = new PgYWDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findDeviceIdByDestAndType(this.getMessageProducerId(), "YW"); + + for (int i = 0; i < ywbj.size(); i++) { + if (i < ids.size()) { + ywDao.addSbjzRecord(ywbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (ywbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + + } + } + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSConstants.java b/src/com/szpg/plc/protocol/fins/FINSConstants.java index 2697e74..f565b8b 100644 --- a/src/com/szpg/plc/protocol/fins/FINSConstants.java +++ b/src/com/szpg/plc/protocol/fins/FINSConstants.java @@ -21,7 +21,8 @@ /******** 内存区域代码 ********/ public final static byte MEMORY_DM_AREA = (byte) 0x82; //82内存D区代码 - public final static byte MEMORY_WORK_AREA = 0x31; //31内存W区代码 + public final static byte MEMORY_WORK_AREA_WORD = (byte) 0xB1; //B1内存W区代码(按字操作) + public final static byte MEMORY_WORK_AREA_BIT = 0x31; //31内存W区代码(按位操作) /******** 控制域 ********/ public final static byte ICF_COMMAND = (byte) 0x80; //ICF字节代表命令 diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index a11ae12..a65488e 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -19,12 +19,14 @@ import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; import com.szpg.plc.protocol.DTProtocolInterface; import com.szpg.plc.protocol.fins.frame.FINSByteFrame; import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; @@ -115,19 +117,18 @@ // 读写命令的响应 if (commandStr.equalsIgnoreCase("00000002")) { String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); + String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 if (commandCode.equalsIgnoreCase("0101")) { // 读内存命令响应的解析 // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - int count = FINSByteFrameTool.getDataWithoutEndCode(byteMessage).length / 2; //1WORD=2BYTE +// int count = FINSByteFrameTool.getDataWithoutEndCode(byteMessage).length / 2; //1WORD=2BYTE // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 PgAcuRdcmdDao readCmdDao = new PgAcuRdcmdDaoImpl(); - PgAcuRdcmd readCmd = readCmdDao.findLatestCmdByDestAndCount(dest, count); + PgAcuRdcmd readCmd = readCmdDao.findLatestCmdByDestAndType(dest, commandType); if (null != readCmd) { - String commandType = readCmd.getCmd_type(); - // 3根据参数类型调用相应的方法进行解析 switch(commandType) { case AppMessageConstants.CMD_TYPE_READCH4VALUE: @@ -164,6 +165,14 @@ case AppMessageConstants.CMD_TYPE_READHSSTATUS: received = bytesToReadHSStatusCommandResponse(finsFrame, readCmd); break; + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + received = bytesToReadYWStatusCommandResponse(finsFrame, readCmd); + break; + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + received = bytesToReadDSStatusCommandResponse(finsFrame, readCmd); + break; } // 4将已响应的命令删除 @@ -260,7 +269,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int chct = cmd.getCount_sensor(); //甲烷监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < chct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -402,7 +417,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int chct = cmd.getCount_sensor(); //一氧化碳监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < chct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -462,7 +483,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int o2ct = cmd.getCount_sensor(); //氧气监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < o2ct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -522,7 +549,12 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int hsct = cmd.getCount_sensor(); //硫化氢监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } for (int i = 0; i < hsct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -534,6 +566,69 @@ return rhscr; } + + /** + * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int ysct = cmd.getCount_sensor(); //爆管液位监测点的数量 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < ysct; i++) { + char bjBit = dataStr.charAt(dataStr.length() - i - 1); + + ryscr.getYwbj().add(bjBit == '1' ? true : false); + } + } + + return ryscr; + } + + /** + * 将查询对射报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int dsct = cmd.getCount_sensor(); //对射监测点的数量 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + + for (int i = 0; i < dsct; i++) { + char bjBit = dataStr.charAt(dataStr.length() - i * 3 - 1); + + rdscr.getDsbj().add(bjBit == '1' ? true : false); + } + } + + return rdscr; + } /** * 将消息对象解析为字节数组 @@ -601,6 +696,7 @@ FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), message.getMessageProducerId(), + message.getCommandType(), message.getMemoryArea(), start, message.getCountWord()); diff --git a/src/ACUBL.properties b/src/ACUBL.properties index ae086d4..99e858d 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -46,7 +46,7 @@ #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2.START = 0500 #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 -YXL.ACU001.O2.WORDCOUNT = 24 +YXL.ACU001.O2.WORDCOUNT = 4 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2ALM.START = 0036 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -66,3 +66,22 @@ YXL.ACU001.HSALM.WORDCOUNT = 1 #\u786b\u5316\u6c22\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 YXL.ACU001.HSALM.BITCOUNT = 12 + +#\u7206\u7ba1\u6db2\u4f4d\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.YW.COUNT = 2 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.YWALM.START = 0025 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.YWALM.WORDCOUNT = 1 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.YWALM.BITCOUNT = 2 + +#\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.DS.COUNT = 15 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.DSALM.START = 0038 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.DSALM.WORDCOUNT = 3 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.DSALM.BITCOUNT = 45 + diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 5e6edbc..8d5ab08 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -16,12 +16,14 @@ import com.szpg.task.ReadCH4ValueTask; import com.szpg.task.ReadCOStatusTask; import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; import com.szpg.task.ReadHSStatusTask; import com.szpg.task.ReadHSValueTask; import com.szpg.task.ReadO2StatusTask; import com.szpg.task.ReadO2ValueTask; import com.szpg.task.ReadWSStatusTask; import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -30,11 +32,12 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.103", 6800); + // PLC设备地址和端口 + ACUClient client = new ACUClient("192.168.0.244", 6800); - client.setNet("00"); - client.setNode("6B"); - client.setUnit("00"); + client.setNet("00"); //网络号 + client.setNode("F4"); //节点号 + client.setUnit("00"); //单元号 // 3将ACU的信息加入到map中 ACUClientUtil.getInstance().addClient(client); @@ -44,33 +47,34 @@ // 测试发送查询甲烷参数命令 // dsc.testSendCH4Command(client); - // 测试发送查询甲烷报警状态命令 -// dsc.testSendCH4StatsuCommand(client); +// // 测试发送查询甲烷报警状态命令 +// dsc.testSendCH4StatusCommand(client); // 测试发送查询温湿度监测值命令 // dsc.testSendWSCommand(client); // 测试发送查询温湿度报警状态命令 // dsc.testSendWSStatusCommand(client); - // 测试发送查询一氧化碳参数命令 +// // 测试发送查询一氧化碳参数命令 // dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 +// // 测试发送查询一氧化碳报警状态命令 // dsc.testSendCOStatusCommand(client); - - // 测试发送查询一氧化碳参数命令 -// dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 -// dsc.testSendCOStatusCommand(client); - +// // 测试发送查询氧气参数命令 // dsc.testSendO2Command(client); // 测试发送查询氧气报警状态命令 // dsc.testSendO2StatusCommand(client); +// +// // 测试发送查询硫化氢参数命令 +// dsc.testSendHSCommand(client); +// // 测试发送查询硫化氢报警状态命令 +// dsc.testSendHSStatusCommand(client); - // 测试发送查询硫化氢参数命令 - dsc.testSendHSCommand(client); - // 测试发送查询硫化氢报警状态命令 - dsc.testSendHSStatusCommand(client); + // 测试发送查询爆管液位报警状态命令 + dsc.testSendYWStatusCommand(client); + + // 测试发送查询对射报警状态命令 +// dsc.testSendDSStatusCommand(client); } /** @@ -97,8 +101,9 @@ ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(client, ch4), 10, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -116,7 +121,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); ch4alm.setDestinationId(dest); - ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); @@ -124,8 +129,9 @@ ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4StatusTask(client, ch4alm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -153,8 +159,9 @@ ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSValueTask(client, ws), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -172,7 +179,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); wsalm.setDestinationId(dest); - wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); @@ -180,8 +187,9 @@ wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSStatusTask(client, wsalm), 25, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -208,8 +216,9 @@ co.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOValueTask(client, co), 30, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -227,7 +236,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); coalm.setDestinationId(dest); - coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); coalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.START")), 2)) + "00"); coalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.WORDCOUNT"))); @@ -235,8 +244,9 @@ coalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOStatusTask(client, coalm), 35, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -263,8 +273,9 @@ o2.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2ValueTask(client, o2), 40, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -282,7 +293,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); o2alm.setDestinationId(dest); - o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); o2alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.START")), 2)) + "00"); o2alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.WORDCOUNT"))); @@ -290,8 +301,9 @@ o2alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2StatusTask(client, o2alm), 45, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -318,8 +330,9 @@ hs.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSValueTask(client, hs), 50, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -337,7 +350,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); hsalm.setDestinationId(dest); - hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); hsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.START")), 2)) + "00"); hsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.WORDCOUNT"))); @@ -345,7 +358,65 @@ hsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSStatusTask(client, hsalm), 55, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询爆管液位报警状态命令 + * @param client + */ + public void testSendYWStatusCommand(ACUClient client) { + ReadMemoryCommand ywalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READYWSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ywalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ywalm.setDestinationId(dest); + + ywalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + ywalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.START")), 2)) + "00"); + ywalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.WORDCOUNT"))); + ywalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.BITCOUNT"))); + ywalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YW.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadYWStatusTask(client, ywalm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + + /** + * 发送查询对射报警状态命令 + * @param client + */ + public void testSendDSStatusCommand(ACUClient client) { + ReadMemoryCommand dsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READDSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + dsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + dsalm.setDestinationId(dest); + + dsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + dsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.START")), 2)) + "00"); + dsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.WORDCOUNT"))); + dsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.BITCOUNT"))); + dsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadDSStatusTask(client, dsalm), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index 70fb6dc..a9d5686 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -10,6 +10,7 @@ public PgAcuRdcmd findById(String id); public PgAcuRdcmd findLatestCmdByDestAndCount(String dest, int count); + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type); public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); diff --git a/src/com/szpg/db/dao/PgDSDao.java b/src/com/szpg/db/dao/PgDSDao.java new file mode 100644 index 0000000..b731af9 --- /dev/null +++ b/src/com/szpg/db/dao/PgDSDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgDSAlm; + +/** + * 对射报警相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgDSDao { + + /******** 对射报警状态 ********/ + public List findAllSbjz(); + public PgDSAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgDSAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/PgYWDao.java b/src/com/szpg/db/dao/PgYWDao.java new file mode 100644 index 0000000..bb27bbf --- /dev/null +++ b/src/com/szpg/db/dao/PgYWDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgYWAlm; + +/** + * 爆管液位相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgYWDao { + + /******** 爆管液位浓度报警状态 ********/ + public List findAllSbjz(); + public PgYWAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgYWAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index b693939..16b2285 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -114,6 +114,41 @@ } return null; } + + + @Override + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ACU_RDCMD WHERE RESPONSED='0' AND TIMEOUT='0' AND DEST=? AND CMD_TYPE=? ORDER BY TM DESC"; + Object[] params = new Object[2]; + params[0] = dest; + params[1] = type; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAcuRdcmd.class), params); + + if (null != list && list.isEmpty() == false) { + logger.debug("根据目的地址和命令类型查询内存读取命令成功[" + list.size() + "]"); + + return list.get(0); + } else + return null; + } catch (Exception ex) { + logger.error("根据目的地址和命令类型查询内存读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } @Override public int addCmdRecord(PgAcuRdcmd cmd) { diff --git a/src/com/szpg/db/dao/impl/PgDSDaoImpl.java b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java new file mode 100644 index 0000000..e9d18cd --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.data.PgDSAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgDSDaoImpl implements PgDSDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgDSAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(0); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询对射报警状态成功" + dsalm + "]"); + + return dsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgDSAlm dsalm) { + return addSbjzRecord(dsalm.getDsalm(), dsalm.getTmStr(), dsalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_DS_ALM " + + "(DSALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入对射报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入对射报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 657281c..7706852 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -39,6 +39,12 @@ case "HS": key = "%硫化氢%"; break; + case "YW": + key = "%液位%"; + break; + case "DS": + key = "%对射%"; + break; } String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '" + key + "' ORDER BY D.ID"; diff --git a/src/com/szpg/db/dao/impl/PgYWDaoImpl.java b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java new file mode 100644 index 0000000..613c4c0 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.data.PgYWAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgYWDaoImpl implements PgYWDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgYWAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(0); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询爆管液位报警状态成功" + ywalm + "]"); + + return ywalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgYWAlm ywalm) { + return addSbjzRecord(ywalm.getYwalm(), ywalm.getTmStr(), ywalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_YW_ALM " + + "(YWALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入爆管液位报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入爆管液位报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index f4ecfe5..2d46bfc 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -1,6 +1,8 @@ package com.szpg.db.data; +import java.util.Calendar; import java.util.Date; +import java.util.UUID; import com.szpg.util.TimeFormat; @@ -31,6 +33,11 @@ private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 + public PgAcuRdcmd() { + this.setId(UUID.randomUUID().toString().replace("-", "")); + this.setTm(Calendar.getInstance().getTime()); + } + public String getId() { return id; } diff --git a/src/com/szpg/db/data/PgDSAlm.java b/src/com/szpg/db/data/PgDSAlm.java new file mode 100644 index 0000000..86e28bb --- /dev/null +++ b/src/com/szpg/db/data/PgDSAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 对射报警状态数据表 + * + * @author admin + * + */ +public class PgDSAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = -8336945265752238748L; + + private Integer id; + private Boolean dsalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getDsalm() { + return dsalm; + } + + public void setDsalm(Boolean dsalm) { + this.dsalm = dsalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgDSAlm[dsalm=" + dsalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/data/PgYWAlm.java b/src/com/szpg/db/data/PgYWAlm.java new file mode 100644 index 0000000..9d9572f --- /dev/null +++ b/src/com/szpg/db/data/PgYWAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 爆管液位浓度报警状态数据表 + * + * @author admin + * + */ +public class PgYWAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 3882791834818808488L; + + private Integer id; + private Boolean ywalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getYwalm() { + return ywalm; + } + + public void setYwalm(Boolean ywalm) { + this.ywalm = ywalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgYWAlm[ywalm=" + ywalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/plc/message/AppMessageConstants.java b/src/com/szpg/plc/message/AppMessageConstants.java index 25db6ab..1c84086 100644 --- a/src/com/szpg/plc/message/AppMessageConstants.java +++ b/src/com/szpg/plc/message/AppMessageConstants.java @@ -13,4 +13,7 @@ public final static String CMD_TYPE_READO2STATUS = "17"; //读取氧气报警状态命令 public final static String CMD_TYPE_READHSVALUE = "18"; //读取硫化氢监测值命令 public final static String CMD_TYPE_READHSSTATUS = "19"; //读取硫化氢报警状态命令 + + public final static String CMD_TYPE_READYWSTATUS = "21"; //读取爆管液位报警状态命令 + public final static String CMD_TYPE_READDSSTATUS = "22"; //读取对射报警状态命令 } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index acf2859..3678a16 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -5,12 +5,14 @@ import com.szpg.plc.message.command.read.ReadCH4ValueCommand; import com.szpg.plc.message.command.read.ReadCOStatusCommand; import com.szpg.plc.message.command.read.ReadCOValueCommand; +import com.szpg.plc.message.command.read.ReadDSStatusCommand; import com.szpg.plc.message.command.read.ReadHSStatusCommand; import com.szpg.plc.message.command.read.ReadHSValueCommand; import com.szpg.plc.message.command.read.ReadO2StatusCommand; import com.szpg.plc.message.command.read.ReadO2ValueCommand; import com.szpg.plc.message.command.read.ReadWSStatusCommand; import com.szpg.plc.message.command.read.ReadWSValueCommand; +import com.szpg.plc.message.command.read.ReadYWStatusCommand; import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -101,6 +103,12 @@ return new ReadHSValueCommand(); case AppMessageConstants.CMD_TYPE_READHSSTATUS: return new ReadHSStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + return new ReadYWStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + return new ReadDSStatusCommand(); default: return null; diff --git a/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java new file mode 100644 index 0000000..eda271f --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; + +public class ReadDSStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = -1668388238102375069L; + + @Override + public Class getResponseClass() { + return ReadDSStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询对射报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READDSSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java new file mode 100644 index 0000000..73c54b3 --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; + +public class ReadYWStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 1019982176997717896L; + + @Override + public Class getResponseClass() { + return ReadYWStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询爆管液位报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READYWSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java new file mode 100644 index 0000000..e2b476b --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java @@ -0,0 +1,57 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgDSDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadDSStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 4047613496835657828L; + + private List dsbj; // 对射报警状态 + + public ReadDSStatusCommandResponse() { + dsbj = new ArrayList(); + } + + public List getDsbj() { + return dsbj; + } + + public void setDsbj(List dsbj) { + this.dsbj = dsbj; + } + + @Override + public void afterAction() { + // 1将对射报警数据存入数据库 + PgDSDao dsDao = new PgDSDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findDeviceIdByDestAndType(this.getMessageProducerId(), "DS"); + + for (int i = 0; i < dsbj.size(); i++) { + if (i < ids.size()) { + dsDao.addSbjzRecord(dsbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (dsbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + + } + } + } + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java new file mode 100644 index 0000000..c2674f2 --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java @@ -0,0 +1,57 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgYWDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadYWStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 8088340048416088978L; + + private List ywbj; // 爆管液位报警状态 + + public ReadYWStatusCommandResponse() { + ywbj = new ArrayList(); + } + + public List getYwbj() { + return ywbj; + } + + public void setYwbj(List ywbj) { + this.ywbj = ywbj; + } + + @Override + public void afterAction() { + // 1将爆管液位浓度数据存入数据库 + PgYWDao ywDao = new PgYWDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findDeviceIdByDestAndType(this.getMessageProducerId(), "YW"); + + for (int i = 0; i < ywbj.size(); i++) { + if (i < ids.size()) { + ywDao.addSbjzRecord(ywbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (ywbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + + } + } + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSConstants.java b/src/com/szpg/plc/protocol/fins/FINSConstants.java index 2697e74..f565b8b 100644 --- a/src/com/szpg/plc/protocol/fins/FINSConstants.java +++ b/src/com/szpg/plc/protocol/fins/FINSConstants.java @@ -21,7 +21,8 @@ /******** 内存区域代码 ********/ public final static byte MEMORY_DM_AREA = (byte) 0x82; //82内存D区代码 - public final static byte MEMORY_WORK_AREA = 0x31; //31内存W区代码 + public final static byte MEMORY_WORK_AREA_WORD = (byte) 0xB1; //B1内存W区代码(按字操作) + public final static byte MEMORY_WORK_AREA_BIT = 0x31; //31内存W区代码(按位操作) /******** 控制域 ********/ public final static byte ICF_COMMAND = (byte) 0x80; //ICF字节代表命令 diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index a11ae12..a65488e 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -19,12 +19,14 @@ import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; import com.szpg.plc.protocol.DTProtocolInterface; import com.szpg.plc.protocol.fins.frame.FINSByteFrame; import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; @@ -115,19 +117,18 @@ // 读写命令的响应 if (commandStr.equalsIgnoreCase("00000002")) { String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); + String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 if (commandCode.equalsIgnoreCase("0101")) { // 读内存命令响应的解析 // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - int count = FINSByteFrameTool.getDataWithoutEndCode(byteMessage).length / 2; //1WORD=2BYTE +// int count = FINSByteFrameTool.getDataWithoutEndCode(byteMessage).length / 2; //1WORD=2BYTE // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 PgAcuRdcmdDao readCmdDao = new PgAcuRdcmdDaoImpl(); - PgAcuRdcmd readCmd = readCmdDao.findLatestCmdByDestAndCount(dest, count); + PgAcuRdcmd readCmd = readCmdDao.findLatestCmdByDestAndType(dest, commandType); if (null != readCmd) { - String commandType = readCmd.getCmd_type(); - // 3根据参数类型调用相应的方法进行解析 switch(commandType) { case AppMessageConstants.CMD_TYPE_READCH4VALUE: @@ -164,6 +165,14 @@ case AppMessageConstants.CMD_TYPE_READHSSTATUS: received = bytesToReadHSStatusCommandResponse(finsFrame, readCmd); break; + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + received = bytesToReadYWStatusCommandResponse(finsFrame, readCmd); + break; + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + received = bytesToReadDSStatusCommandResponse(finsFrame, readCmd); + break; } // 4将已响应的命令删除 @@ -260,7 +269,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int chct = cmd.getCount_sensor(); //甲烷监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < chct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -402,7 +417,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int chct = cmd.getCount_sensor(); //一氧化碳监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < chct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -462,7 +483,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int o2ct = cmd.getCount_sensor(); //氧气监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < o2ct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -522,7 +549,12 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int hsct = cmd.getCount_sensor(); //硫化氢监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } for (int i = 0; i < hsct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -534,6 +566,69 @@ return rhscr; } + + /** + * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int ysct = cmd.getCount_sensor(); //爆管液位监测点的数量 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < ysct; i++) { + char bjBit = dataStr.charAt(dataStr.length() - i - 1); + + ryscr.getYwbj().add(bjBit == '1' ? true : false); + } + } + + return ryscr; + } + + /** + * 将查询对射报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int dsct = cmd.getCount_sensor(); //对射监测点的数量 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + + for (int i = 0; i < dsct; i++) { + char bjBit = dataStr.charAt(dataStr.length() - i * 3 - 1); + + rdscr.getDsbj().add(bjBit == '1' ? true : false); + } + } + + return rdscr; + } /** * 将消息对象解析为字节数组 @@ -601,6 +696,7 @@ FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), message.getMessageProducerId(), + message.getCommandType(), message.getMemoryArea(), start, message.getCountWord()); diff --git a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java index 639359e..94540d4 100644 --- a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java +++ b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java @@ -135,12 +135,13 @@ * * @param dest 目标地址 * @param sour 源地址 + * @param sid 服务号 * @param memArea 内存区域代码 * @param start 读取的起始地址 * @param count 读取的长度(以word计,长度为2个字节) */ - public FINSByteFrame(String dest, String sour, byte memArea, byte[] start, int count) { - this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour); // 构造控制域 + public FINSByteFrame(String dest, String sour, String sid, byte memArea, byte[] start, int count) { + this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour, sid); // 构造控制域 // 设置读取内存命令的发送命令功能码00000002 this.COMMAND = FINSConstants.COMMAND_COMMAND; @@ -168,13 +169,14 @@ * * @param dest * @param sour + * @param sid * @param memArea * @param start * @param count * @param dataBody */ - public FINSByteFrame(String dest, String sour, byte memArea, byte[] start, int count, byte[] dataBody) { - this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour); // 构造控制域 + public FINSByteFrame(String dest, String sour, String sid, byte memArea, byte[] start, int count, byte[] dataBody) { + this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour, sid); // 构造控制域 // 构造用户数据域的内容 Bytes data = new Bytes(); diff --git a/src/ACUBL.properties b/src/ACUBL.properties index ae086d4..99e858d 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -46,7 +46,7 @@ #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2.START = 0500 #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 -YXL.ACU001.O2.WORDCOUNT = 24 +YXL.ACU001.O2.WORDCOUNT = 4 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2ALM.START = 0036 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -66,3 +66,22 @@ YXL.ACU001.HSALM.WORDCOUNT = 1 #\u786b\u5316\u6c22\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 YXL.ACU001.HSALM.BITCOUNT = 12 + +#\u7206\u7ba1\u6db2\u4f4d\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.YW.COUNT = 2 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.YWALM.START = 0025 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.YWALM.WORDCOUNT = 1 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.YWALM.BITCOUNT = 2 + +#\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.DS.COUNT = 15 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.DSALM.START = 0038 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.DSALM.WORDCOUNT = 3 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.DSALM.BITCOUNT = 45 + diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 5e6edbc..8d5ab08 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -16,12 +16,14 @@ import com.szpg.task.ReadCH4ValueTask; import com.szpg.task.ReadCOStatusTask; import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; import com.szpg.task.ReadHSStatusTask; import com.szpg.task.ReadHSValueTask; import com.szpg.task.ReadO2StatusTask; import com.szpg.task.ReadO2ValueTask; import com.szpg.task.ReadWSStatusTask; import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -30,11 +32,12 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.103", 6800); + // PLC设备地址和端口 + ACUClient client = new ACUClient("192.168.0.244", 6800); - client.setNet("00"); - client.setNode("6B"); - client.setUnit("00"); + client.setNet("00"); //网络号 + client.setNode("F4"); //节点号 + client.setUnit("00"); //单元号 // 3将ACU的信息加入到map中 ACUClientUtil.getInstance().addClient(client); @@ -44,33 +47,34 @@ // 测试发送查询甲烷参数命令 // dsc.testSendCH4Command(client); - // 测试发送查询甲烷报警状态命令 -// dsc.testSendCH4StatsuCommand(client); +// // 测试发送查询甲烷报警状态命令 +// dsc.testSendCH4StatusCommand(client); // 测试发送查询温湿度监测值命令 // dsc.testSendWSCommand(client); // 测试发送查询温湿度报警状态命令 // dsc.testSendWSStatusCommand(client); - // 测试发送查询一氧化碳参数命令 +// // 测试发送查询一氧化碳参数命令 // dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 +// // 测试发送查询一氧化碳报警状态命令 // dsc.testSendCOStatusCommand(client); - - // 测试发送查询一氧化碳参数命令 -// dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 -// dsc.testSendCOStatusCommand(client); - +// // 测试发送查询氧气参数命令 // dsc.testSendO2Command(client); // 测试发送查询氧气报警状态命令 // dsc.testSendO2StatusCommand(client); +// +// // 测试发送查询硫化氢参数命令 +// dsc.testSendHSCommand(client); +// // 测试发送查询硫化氢报警状态命令 +// dsc.testSendHSStatusCommand(client); - // 测试发送查询硫化氢参数命令 - dsc.testSendHSCommand(client); - // 测试发送查询硫化氢报警状态命令 - dsc.testSendHSStatusCommand(client); + // 测试发送查询爆管液位报警状态命令 + dsc.testSendYWStatusCommand(client); + + // 测试发送查询对射报警状态命令 +// dsc.testSendDSStatusCommand(client); } /** @@ -97,8 +101,9 @@ ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(client, ch4), 10, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -116,7 +121,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); ch4alm.setDestinationId(dest); - ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); @@ -124,8 +129,9 @@ ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4StatusTask(client, ch4alm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -153,8 +159,9 @@ ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSValueTask(client, ws), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -172,7 +179,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); wsalm.setDestinationId(dest); - wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); @@ -180,8 +187,9 @@ wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSStatusTask(client, wsalm), 25, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -208,8 +216,9 @@ co.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOValueTask(client, co), 30, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -227,7 +236,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); coalm.setDestinationId(dest); - coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); coalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.START")), 2)) + "00"); coalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.WORDCOUNT"))); @@ -235,8 +244,9 @@ coalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOStatusTask(client, coalm), 35, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -263,8 +273,9 @@ o2.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2ValueTask(client, o2), 40, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -282,7 +293,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); o2alm.setDestinationId(dest); - o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); o2alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.START")), 2)) + "00"); o2alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.WORDCOUNT"))); @@ -290,8 +301,9 @@ o2alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2StatusTask(client, o2alm), 45, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -318,8 +330,9 @@ hs.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSValueTask(client, hs), 50, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -337,7 +350,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); hsalm.setDestinationId(dest); - hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); hsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.START")), 2)) + "00"); hsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.WORDCOUNT"))); @@ -345,7 +358,65 @@ hsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSStatusTask(client, hsalm), 55, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询爆管液位报警状态命令 + * @param client + */ + public void testSendYWStatusCommand(ACUClient client) { + ReadMemoryCommand ywalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READYWSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ywalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ywalm.setDestinationId(dest); + + ywalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + ywalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.START")), 2)) + "00"); + ywalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.WORDCOUNT"))); + ywalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.BITCOUNT"))); + ywalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YW.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadYWStatusTask(client, ywalm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + + /** + * 发送查询对射报警状态命令 + * @param client + */ + public void testSendDSStatusCommand(ACUClient client) { + ReadMemoryCommand dsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READDSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + dsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + dsalm.setDestinationId(dest); + + dsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + dsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.START")), 2)) + "00"); + dsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.WORDCOUNT"))); + dsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.BITCOUNT"))); + dsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadDSStatusTask(client, dsalm), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index 70fb6dc..a9d5686 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -10,6 +10,7 @@ public PgAcuRdcmd findById(String id); public PgAcuRdcmd findLatestCmdByDestAndCount(String dest, int count); + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type); public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); diff --git a/src/com/szpg/db/dao/PgDSDao.java b/src/com/szpg/db/dao/PgDSDao.java new file mode 100644 index 0000000..b731af9 --- /dev/null +++ b/src/com/szpg/db/dao/PgDSDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgDSAlm; + +/** + * 对射报警相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgDSDao { + + /******** 对射报警状态 ********/ + public List findAllSbjz(); + public PgDSAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgDSAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/PgYWDao.java b/src/com/szpg/db/dao/PgYWDao.java new file mode 100644 index 0000000..bb27bbf --- /dev/null +++ b/src/com/szpg/db/dao/PgYWDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgYWAlm; + +/** + * 爆管液位相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgYWDao { + + /******** 爆管液位浓度报警状态 ********/ + public List findAllSbjz(); + public PgYWAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgYWAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index b693939..16b2285 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -114,6 +114,41 @@ } return null; } + + + @Override + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ACU_RDCMD WHERE RESPONSED='0' AND TIMEOUT='0' AND DEST=? AND CMD_TYPE=? ORDER BY TM DESC"; + Object[] params = new Object[2]; + params[0] = dest; + params[1] = type; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAcuRdcmd.class), params); + + if (null != list && list.isEmpty() == false) { + logger.debug("根据目的地址和命令类型查询内存读取命令成功[" + list.size() + "]"); + + return list.get(0); + } else + return null; + } catch (Exception ex) { + logger.error("根据目的地址和命令类型查询内存读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } @Override public int addCmdRecord(PgAcuRdcmd cmd) { diff --git a/src/com/szpg/db/dao/impl/PgDSDaoImpl.java b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java new file mode 100644 index 0000000..e9d18cd --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.data.PgDSAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgDSDaoImpl implements PgDSDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgDSAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(0); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询对射报警状态成功" + dsalm + "]"); + + return dsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgDSAlm dsalm) { + return addSbjzRecord(dsalm.getDsalm(), dsalm.getTmStr(), dsalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_DS_ALM " + + "(DSALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入对射报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入对射报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 657281c..7706852 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -39,6 +39,12 @@ case "HS": key = "%硫化氢%"; break; + case "YW": + key = "%液位%"; + break; + case "DS": + key = "%对射%"; + break; } String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '" + key + "' ORDER BY D.ID"; diff --git a/src/com/szpg/db/dao/impl/PgYWDaoImpl.java b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java new file mode 100644 index 0000000..613c4c0 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.data.PgYWAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgYWDaoImpl implements PgYWDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgYWAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(0); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询爆管液位报警状态成功" + ywalm + "]"); + + return ywalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgYWAlm ywalm) { + return addSbjzRecord(ywalm.getYwalm(), ywalm.getTmStr(), ywalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_YW_ALM " + + "(YWALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入爆管液位报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入爆管液位报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index f4ecfe5..2d46bfc 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -1,6 +1,8 @@ package com.szpg.db.data; +import java.util.Calendar; import java.util.Date; +import java.util.UUID; import com.szpg.util.TimeFormat; @@ -31,6 +33,11 @@ private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 + public PgAcuRdcmd() { + this.setId(UUID.randomUUID().toString().replace("-", "")); + this.setTm(Calendar.getInstance().getTime()); + } + public String getId() { return id; } diff --git a/src/com/szpg/db/data/PgDSAlm.java b/src/com/szpg/db/data/PgDSAlm.java new file mode 100644 index 0000000..86e28bb --- /dev/null +++ b/src/com/szpg/db/data/PgDSAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 对射报警状态数据表 + * + * @author admin + * + */ +public class PgDSAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = -8336945265752238748L; + + private Integer id; + private Boolean dsalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getDsalm() { + return dsalm; + } + + public void setDsalm(Boolean dsalm) { + this.dsalm = dsalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgDSAlm[dsalm=" + dsalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/data/PgYWAlm.java b/src/com/szpg/db/data/PgYWAlm.java new file mode 100644 index 0000000..9d9572f --- /dev/null +++ b/src/com/szpg/db/data/PgYWAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 爆管液位浓度报警状态数据表 + * + * @author admin + * + */ +public class PgYWAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 3882791834818808488L; + + private Integer id; + private Boolean ywalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getYwalm() { + return ywalm; + } + + public void setYwalm(Boolean ywalm) { + this.ywalm = ywalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgYWAlm[ywalm=" + ywalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/plc/message/AppMessageConstants.java b/src/com/szpg/plc/message/AppMessageConstants.java index 25db6ab..1c84086 100644 --- a/src/com/szpg/plc/message/AppMessageConstants.java +++ b/src/com/szpg/plc/message/AppMessageConstants.java @@ -13,4 +13,7 @@ public final static String CMD_TYPE_READO2STATUS = "17"; //读取氧气报警状态命令 public final static String CMD_TYPE_READHSVALUE = "18"; //读取硫化氢监测值命令 public final static String CMD_TYPE_READHSSTATUS = "19"; //读取硫化氢报警状态命令 + + public final static String CMD_TYPE_READYWSTATUS = "21"; //读取爆管液位报警状态命令 + public final static String CMD_TYPE_READDSSTATUS = "22"; //读取对射报警状态命令 } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index acf2859..3678a16 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -5,12 +5,14 @@ import com.szpg.plc.message.command.read.ReadCH4ValueCommand; import com.szpg.plc.message.command.read.ReadCOStatusCommand; import com.szpg.plc.message.command.read.ReadCOValueCommand; +import com.szpg.plc.message.command.read.ReadDSStatusCommand; import com.szpg.plc.message.command.read.ReadHSStatusCommand; import com.szpg.plc.message.command.read.ReadHSValueCommand; import com.szpg.plc.message.command.read.ReadO2StatusCommand; import com.szpg.plc.message.command.read.ReadO2ValueCommand; import com.szpg.plc.message.command.read.ReadWSStatusCommand; import com.szpg.plc.message.command.read.ReadWSValueCommand; +import com.szpg.plc.message.command.read.ReadYWStatusCommand; import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -101,6 +103,12 @@ return new ReadHSValueCommand(); case AppMessageConstants.CMD_TYPE_READHSSTATUS: return new ReadHSStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + return new ReadYWStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + return new ReadDSStatusCommand(); default: return null; diff --git a/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java new file mode 100644 index 0000000..eda271f --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; + +public class ReadDSStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = -1668388238102375069L; + + @Override + public Class getResponseClass() { + return ReadDSStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询对射报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READDSSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java new file mode 100644 index 0000000..73c54b3 --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; + +public class ReadYWStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 1019982176997717896L; + + @Override + public Class getResponseClass() { + return ReadYWStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询爆管液位报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READYWSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java new file mode 100644 index 0000000..e2b476b --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java @@ -0,0 +1,57 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgDSDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadDSStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 4047613496835657828L; + + private List dsbj; // 对射报警状态 + + public ReadDSStatusCommandResponse() { + dsbj = new ArrayList(); + } + + public List getDsbj() { + return dsbj; + } + + public void setDsbj(List dsbj) { + this.dsbj = dsbj; + } + + @Override + public void afterAction() { + // 1将对射报警数据存入数据库 + PgDSDao dsDao = new PgDSDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findDeviceIdByDestAndType(this.getMessageProducerId(), "DS"); + + for (int i = 0; i < dsbj.size(); i++) { + if (i < ids.size()) { + dsDao.addSbjzRecord(dsbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (dsbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + + } + } + } + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java new file mode 100644 index 0000000..c2674f2 --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java @@ -0,0 +1,57 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgYWDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadYWStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 8088340048416088978L; + + private List ywbj; // 爆管液位报警状态 + + public ReadYWStatusCommandResponse() { + ywbj = new ArrayList(); + } + + public List getYwbj() { + return ywbj; + } + + public void setYwbj(List ywbj) { + this.ywbj = ywbj; + } + + @Override + public void afterAction() { + // 1将爆管液位浓度数据存入数据库 + PgYWDao ywDao = new PgYWDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findDeviceIdByDestAndType(this.getMessageProducerId(), "YW"); + + for (int i = 0; i < ywbj.size(); i++) { + if (i < ids.size()) { + ywDao.addSbjzRecord(ywbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (ywbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + + } + } + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSConstants.java b/src/com/szpg/plc/protocol/fins/FINSConstants.java index 2697e74..f565b8b 100644 --- a/src/com/szpg/plc/protocol/fins/FINSConstants.java +++ b/src/com/szpg/plc/protocol/fins/FINSConstants.java @@ -21,7 +21,8 @@ /******** 内存区域代码 ********/ public final static byte MEMORY_DM_AREA = (byte) 0x82; //82内存D区代码 - public final static byte MEMORY_WORK_AREA = 0x31; //31内存W区代码 + public final static byte MEMORY_WORK_AREA_WORD = (byte) 0xB1; //B1内存W区代码(按字操作) + public final static byte MEMORY_WORK_AREA_BIT = 0x31; //31内存W区代码(按位操作) /******** 控制域 ********/ public final static byte ICF_COMMAND = (byte) 0x80; //ICF字节代表命令 diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index a11ae12..a65488e 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -19,12 +19,14 @@ import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; import com.szpg.plc.protocol.DTProtocolInterface; import com.szpg.plc.protocol.fins.frame.FINSByteFrame; import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; @@ -115,19 +117,18 @@ // 读写命令的响应 if (commandStr.equalsIgnoreCase("00000002")) { String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); + String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 if (commandCode.equalsIgnoreCase("0101")) { // 读内存命令响应的解析 // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - int count = FINSByteFrameTool.getDataWithoutEndCode(byteMessage).length / 2; //1WORD=2BYTE +// int count = FINSByteFrameTool.getDataWithoutEndCode(byteMessage).length / 2; //1WORD=2BYTE // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 PgAcuRdcmdDao readCmdDao = new PgAcuRdcmdDaoImpl(); - PgAcuRdcmd readCmd = readCmdDao.findLatestCmdByDestAndCount(dest, count); + PgAcuRdcmd readCmd = readCmdDao.findLatestCmdByDestAndType(dest, commandType); if (null != readCmd) { - String commandType = readCmd.getCmd_type(); - // 3根据参数类型调用相应的方法进行解析 switch(commandType) { case AppMessageConstants.CMD_TYPE_READCH4VALUE: @@ -164,6 +165,14 @@ case AppMessageConstants.CMD_TYPE_READHSSTATUS: received = bytesToReadHSStatusCommandResponse(finsFrame, readCmd); break; + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + received = bytesToReadYWStatusCommandResponse(finsFrame, readCmd); + break; + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + received = bytesToReadDSStatusCommandResponse(finsFrame, readCmd); + break; } // 4将已响应的命令删除 @@ -260,7 +269,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int chct = cmd.getCount_sensor(); //甲烷监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < chct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -402,7 +417,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int chct = cmd.getCount_sensor(); //一氧化碳监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < chct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -462,7 +483,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int o2ct = cmd.getCount_sensor(); //氧气监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < o2ct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -522,7 +549,12 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int hsct = cmd.getCount_sensor(); //硫化氢监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } for (int i = 0; i < hsct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -534,6 +566,69 @@ return rhscr; } + + /** + * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int ysct = cmd.getCount_sensor(); //爆管液位监测点的数量 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < ysct; i++) { + char bjBit = dataStr.charAt(dataStr.length() - i - 1); + + ryscr.getYwbj().add(bjBit == '1' ? true : false); + } + } + + return ryscr; + } + + /** + * 将查询对射报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int dsct = cmd.getCount_sensor(); //对射监测点的数量 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + + for (int i = 0; i < dsct; i++) { + char bjBit = dataStr.charAt(dataStr.length() - i * 3 - 1); + + rdscr.getDsbj().add(bjBit == '1' ? true : false); + } + } + + return rdscr; + } /** * 将消息对象解析为字节数组 @@ -601,6 +696,7 @@ FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), message.getMessageProducerId(), + message.getCommandType(), message.getMemoryArea(), start, message.getCountWord()); diff --git a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java index 639359e..94540d4 100644 --- a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java +++ b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java @@ -135,12 +135,13 @@ * * @param dest 目标地址 * @param sour 源地址 + * @param sid 服务号 * @param memArea 内存区域代码 * @param start 读取的起始地址 * @param count 读取的长度(以word计,长度为2个字节) */ - public FINSByteFrame(String dest, String sour, byte memArea, byte[] start, int count) { - this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour); // 构造控制域 + public FINSByteFrame(String dest, String sour, String sid, byte memArea, byte[] start, int count) { + this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour, sid); // 构造控制域 // 设置读取内存命令的发送命令功能码00000002 this.COMMAND = FINSConstants.COMMAND_COMMAND; @@ -168,13 +169,14 @@ * * @param dest * @param sour + * @param sid * @param memArea * @param start * @param count * @param dataBody */ - public FINSByteFrame(String dest, String sour, byte memArea, byte[] start, int count, byte[] dataBody) { - this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour); // 构造控制域 + public FINSByteFrame(String dest, String sour, String sid, byte memArea, byte[] start, int count, byte[] dataBody) { + this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour, sid); // 构造控制域 // 构造用户数据域的内容 Bytes data = new Bytes(); diff --git a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java index 10be9db..c992b06 100644 --- a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java +++ b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java @@ -144,6 +144,20 @@ } /** + * 获取SID号,作为命令类型使用 + * @param finsBytes + * @return + */ + public static String getControlSID(byte[] finsBytes) { + byte[] text = getText(finsBytes); + + if (null != text && text.length > 10) + return ByteUtil.binToHexString(new byte[] {text[9]}); + else + return "00"; + } + + /** * 获取命令代码 * 0x0101=读取内存,0x0102=写内存 * @@ -228,9 +242,10 @@ * * @param dest 目标地址:网络号+节点号+单元号 * @param sour 源地址:网络号+节点号+单元号 + * @param sid 服务号:用于标识命令类型 * @return */ - public static byte[] buildFrameControl(String dest, String sour) { + public static byte[] buildFrameControl(String dest, String sour, String sid) { byte[] control = new byte[10]; // 命令类型位固定为1,需要响应标志位固定为0,表示从上位机发送给PLC端的消息,需要PLC响应 @@ -249,7 +264,8 @@ control[7] = sourByte[1]; //源节点号 control[8] = sourByte[2]; //源单元号 - control[9] = FINSConstants.SID; // SID字节 +// control[9] = FINSConstants.SID; // SID字节 + control[9] = ByteUtil.hexStringToBytes(sid, 1)[0]; return control; } diff --git a/src/ACUBL.properties b/src/ACUBL.properties index ae086d4..99e858d 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -46,7 +46,7 @@ #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2.START = 0500 #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 -YXL.ACU001.O2.WORDCOUNT = 24 +YXL.ACU001.O2.WORDCOUNT = 4 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2ALM.START = 0036 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -66,3 +66,22 @@ YXL.ACU001.HSALM.WORDCOUNT = 1 #\u786b\u5316\u6c22\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 YXL.ACU001.HSALM.BITCOUNT = 12 + +#\u7206\u7ba1\u6db2\u4f4d\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.YW.COUNT = 2 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.YWALM.START = 0025 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.YWALM.WORDCOUNT = 1 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.YWALM.BITCOUNT = 2 + +#\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.DS.COUNT = 15 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.DSALM.START = 0038 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.DSALM.WORDCOUNT = 3 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.DSALM.BITCOUNT = 45 + diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 5e6edbc..8d5ab08 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -16,12 +16,14 @@ import com.szpg.task.ReadCH4ValueTask; import com.szpg.task.ReadCOStatusTask; import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; import com.szpg.task.ReadHSStatusTask; import com.szpg.task.ReadHSValueTask; import com.szpg.task.ReadO2StatusTask; import com.szpg.task.ReadO2ValueTask; import com.szpg.task.ReadWSStatusTask; import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -30,11 +32,12 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.103", 6800); + // PLC设备地址和端口 + ACUClient client = new ACUClient("192.168.0.244", 6800); - client.setNet("00"); - client.setNode("6B"); - client.setUnit("00"); + client.setNet("00"); //网络号 + client.setNode("F4"); //节点号 + client.setUnit("00"); //单元号 // 3将ACU的信息加入到map中 ACUClientUtil.getInstance().addClient(client); @@ -44,33 +47,34 @@ // 测试发送查询甲烷参数命令 // dsc.testSendCH4Command(client); - // 测试发送查询甲烷报警状态命令 -// dsc.testSendCH4StatsuCommand(client); +// // 测试发送查询甲烷报警状态命令 +// dsc.testSendCH4StatusCommand(client); // 测试发送查询温湿度监测值命令 // dsc.testSendWSCommand(client); // 测试发送查询温湿度报警状态命令 // dsc.testSendWSStatusCommand(client); - // 测试发送查询一氧化碳参数命令 +// // 测试发送查询一氧化碳参数命令 // dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 +// // 测试发送查询一氧化碳报警状态命令 // dsc.testSendCOStatusCommand(client); - - // 测试发送查询一氧化碳参数命令 -// dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 -// dsc.testSendCOStatusCommand(client); - +// // 测试发送查询氧气参数命令 // dsc.testSendO2Command(client); // 测试发送查询氧气报警状态命令 // dsc.testSendO2StatusCommand(client); +// +// // 测试发送查询硫化氢参数命令 +// dsc.testSendHSCommand(client); +// // 测试发送查询硫化氢报警状态命令 +// dsc.testSendHSStatusCommand(client); - // 测试发送查询硫化氢参数命令 - dsc.testSendHSCommand(client); - // 测试发送查询硫化氢报警状态命令 - dsc.testSendHSStatusCommand(client); + // 测试发送查询爆管液位报警状态命令 + dsc.testSendYWStatusCommand(client); + + // 测试发送查询对射报警状态命令 +// dsc.testSendDSStatusCommand(client); } /** @@ -97,8 +101,9 @@ ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(client, ch4), 10, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -116,7 +121,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); ch4alm.setDestinationId(dest); - ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); @@ -124,8 +129,9 @@ ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4StatusTask(client, ch4alm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -153,8 +159,9 @@ ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSValueTask(client, ws), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -172,7 +179,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); wsalm.setDestinationId(dest); - wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); @@ -180,8 +187,9 @@ wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSStatusTask(client, wsalm), 25, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -208,8 +216,9 @@ co.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOValueTask(client, co), 30, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -227,7 +236,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); coalm.setDestinationId(dest); - coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); coalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.START")), 2)) + "00"); coalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.WORDCOUNT"))); @@ -235,8 +244,9 @@ coalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOStatusTask(client, coalm), 35, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -263,8 +273,9 @@ o2.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2ValueTask(client, o2), 40, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -282,7 +293,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); o2alm.setDestinationId(dest); - o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); o2alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.START")), 2)) + "00"); o2alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.WORDCOUNT"))); @@ -290,8 +301,9 @@ o2alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2StatusTask(client, o2alm), 45, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -318,8 +330,9 @@ hs.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSValueTask(client, hs), 50, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -337,7 +350,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); hsalm.setDestinationId(dest); - hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); hsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.START")), 2)) + "00"); hsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.WORDCOUNT"))); @@ -345,7 +358,65 @@ hsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSStatusTask(client, hsalm), 55, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询爆管液位报警状态命令 + * @param client + */ + public void testSendYWStatusCommand(ACUClient client) { + ReadMemoryCommand ywalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READYWSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ywalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ywalm.setDestinationId(dest); + + ywalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + ywalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.START")), 2)) + "00"); + ywalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.WORDCOUNT"))); + ywalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.BITCOUNT"))); + ywalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YW.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadYWStatusTask(client, ywalm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + + /** + * 发送查询对射报警状态命令 + * @param client + */ + public void testSendDSStatusCommand(ACUClient client) { + ReadMemoryCommand dsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READDSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + dsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + dsalm.setDestinationId(dest); + + dsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + dsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.START")), 2)) + "00"); + dsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.WORDCOUNT"))); + dsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.BITCOUNT"))); + dsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadDSStatusTask(client, dsalm), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index 70fb6dc..a9d5686 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -10,6 +10,7 @@ public PgAcuRdcmd findById(String id); public PgAcuRdcmd findLatestCmdByDestAndCount(String dest, int count); + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type); public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); diff --git a/src/com/szpg/db/dao/PgDSDao.java b/src/com/szpg/db/dao/PgDSDao.java new file mode 100644 index 0000000..b731af9 --- /dev/null +++ b/src/com/szpg/db/dao/PgDSDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgDSAlm; + +/** + * 对射报警相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgDSDao { + + /******** 对射报警状态 ********/ + public List findAllSbjz(); + public PgDSAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgDSAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/PgYWDao.java b/src/com/szpg/db/dao/PgYWDao.java new file mode 100644 index 0000000..bb27bbf --- /dev/null +++ b/src/com/szpg/db/dao/PgYWDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgYWAlm; + +/** + * 爆管液位相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgYWDao { + + /******** 爆管液位浓度报警状态 ********/ + public List findAllSbjz(); + public PgYWAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgYWAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index b693939..16b2285 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -114,6 +114,41 @@ } return null; } + + + @Override + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ACU_RDCMD WHERE RESPONSED='0' AND TIMEOUT='0' AND DEST=? AND CMD_TYPE=? ORDER BY TM DESC"; + Object[] params = new Object[2]; + params[0] = dest; + params[1] = type; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAcuRdcmd.class), params); + + if (null != list && list.isEmpty() == false) { + logger.debug("根据目的地址和命令类型查询内存读取命令成功[" + list.size() + "]"); + + return list.get(0); + } else + return null; + } catch (Exception ex) { + logger.error("根据目的地址和命令类型查询内存读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } @Override public int addCmdRecord(PgAcuRdcmd cmd) { diff --git a/src/com/szpg/db/dao/impl/PgDSDaoImpl.java b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java new file mode 100644 index 0000000..e9d18cd --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.data.PgDSAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgDSDaoImpl implements PgDSDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgDSAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(0); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询对射报警状态成功" + dsalm + "]"); + + return dsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgDSAlm dsalm) { + return addSbjzRecord(dsalm.getDsalm(), dsalm.getTmStr(), dsalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_DS_ALM " + + "(DSALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入对射报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入对射报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 657281c..7706852 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -39,6 +39,12 @@ case "HS": key = "%硫化氢%"; break; + case "YW": + key = "%液位%"; + break; + case "DS": + key = "%对射%"; + break; } String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '" + key + "' ORDER BY D.ID"; diff --git a/src/com/szpg/db/dao/impl/PgYWDaoImpl.java b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java new file mode 100644 index 0000000..613c4c0 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.data.PgYWAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgYWDaoImpl implements PgYWDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgYWAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(0); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询爆管液位报警状态成功" + ywalm + "]"); + + return ywalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgYWAlm ywalm) { + return addSbjzRecord(ywalm.getYwalm(), ywalm.getTmStr(), ywalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_YW_ALM " + + "(YWALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入爆管液位报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入爆管液位报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index f4ecfe5..2d46bfc 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -1,6 +1,8 @@ package com.szpg.db.data; +import java.util.Calendar; import java.util.Date; +import java.util.UUID; import com.szpg.util.TimeFormat; @@ -31,6 +33,11 @@ private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 + public PgAcuRdcmd() { + this.setId(UUID.randomUUID().toString().replace("-", "")); + this.setTm(Calendar.getInstance().getTime()); + } + public String getId() { return id; } diff --git a/src/com/szpg/db/data/PgDSAlm.java b/src/com/szpg/db/data/PgDSAlm.java new file mode 100644 index 0000000..86e28bb --- /dev/null +++ b/src/com/szpg/db/data/PgDSAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 对射报警状态数据表 + * + * @author admin + * + */ +public class PgDSAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = -8336945265752238748L; + + private Integer id; + private Boolean dsalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getDsalm() { + return dsalm; + } + + public void setDsalm(Boolean dsalm) { + this.dsalm = dsalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgDSAlm[dsalm=" + dsalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/data/PgYWAlm.java b/src/com/szpg/db/data/PgYWAlm.java new file mode 100644 index 0000000..9d9572f --- /dev/null +++ b/src/com/szpg/db/data/PgYWAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 爆管液位浓度报警状态数据表 + * + * @author admin + * + */ +public class PgYWAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 3882791834818808488L; + + private Integer id; + private Boolean ywalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getYwalm() { + return ywalm; + } + + public void setYwalm(Boolean ywalm) { + this.ywalm = ywalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgYWAlm[ywalm=" + ywalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/plc/message/AppMessageConstants.java b/src/com/szpg/plc/message/AppMessageConstants.java index 25db6ab..1c84086 100644 --- a/src/com/szpg/plc/message/AppMessageConstants.java +++ b/src/com/szpg/plc/message/AppMessageConstants.java @@ -13,4 +13,7 @@ public final static String CMD_TYPE_READO2STATUS = "17"; //读取氧气报警状态命令 public final static String CMD_TYPE_READHSVALUE = "18"; //读取硫化氢监测值命令 public final static String CMD_TYPE_READHSSTATUS = "19"; //读取硫化氢报警状态命令 + + public final static String CMD_TYPE_READYWSTATUS = "21"; //读取爆管液位报警状态命令 + public final static String CMD_TYPE_READDSSTATUS = "22"; //读取对射报警状态命令 } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index acf2859..3678a16 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -5,12 +5,14 @@ import com.szpg.plc.message.command.read.ReadCH4ValueCommand; import com.szpg.plc.message.command.read.ReadCOStatusCommand; import com.szpg.plc.message.command.read.ReadCOValueCommand; +import com.szpg.plc.message.command.read.ReadDSStatusCommand; import com.szpg.plc.message.command.read.ReadHSStatusCommand; import com.szpg.plc.message.command.read.ReadHSValueCommand; import com.szpg.plc.message.command.read.ReadO2StatusCommand; import com.szpg.plc.message.command.read.ReadO2ValueCommand; import com.szpg.plc.message.command.read.ReadWSStatusCommand; import com.szpg.plc.message.command.read.ReadWSValueCommand; +import com.szpg.plc.message.command.read.ReadYWStatusCommand; import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -101,6 +103,12 @@ return new ReadHSValueCommand(); case AppMessageConstants.CMD_TYPE_READHSSTATUS: return new ReadHSStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + return new ReadYWStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + return new ReadDSStatusCommand(); default: return null; diff --git a/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java new file mode 100644 index 0000000..eda271f --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; + +public class ReadDSStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = -1668388238102375069L; + + @Override + public Class getResponseClass() { + return ReadDSStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询对射报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READDSSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java new file mode 100644 index 0000000..73c54b3 --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; + +public class ReadYWStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 1019982176997717896L; + + @Override + public Class getResponseClass() { + return ReadYWStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询爆管液位报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READYWSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java new file mode 100644 index 0000000..e2b476b --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java @@ -0,0 +1,57 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgDSDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadDSStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 4047613496835657828L; + + private List dsbj; // 对射报警状态 + + public ReadDSStatusCommandResponse() { + dsbj = new ArrayList(); + } + + public List getDsbj() { + return dsbj; + } + + public void setDsbj(List dsbj) { + this.dsbj = dsbj; + } + + @Override + public void afterAction() { + // 1将对射报警数据存入数据库 + PgDSDao dsDao = new PgDSDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findDeviceIdByDestAndType(this.getMessageProducerId(), "DS"); + + for (int i = 0; i < dsbj.size(); i++) { + if (i < ids.size()) { + dsDao.addSbjzRecord(dsbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (dsbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + + } + } + } + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java new file mode 100644 index 0000000..c2674f2 --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java @@ -0,0 +1,57 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgYWDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadYWStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 8088340048416088978L; + + private List ywbj; // 爆管液位报警状态 + + public ReadYWStatusCommandResponse() { + ywbj = new ArrayList(); + } + + public List getYwbj() { + return ywbj; + } + + public void setYwbj(List ywbj) { + this.ywbj = ywbj; + } + + @Override + public void afterAction() { + // 1将爆管液位浓度数据存入数据库 + PgYWDao ywDao = new PgYWDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findDeviceIdByDestAndType(this.getMessageProducerId(), "YW"); + + for (int i = 0; i < ywbj.size(); i++) { + if (i < ids.size()) { + ywDao.addSbjzRecord(ywbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (ywbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + + } + } + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSConstants.java b/src/com/szpg/plc/protocol/fins/FINSConstants.java index 2697e74..f565b8b 100644 --- a/src/com/szpg/plc/protocol/fins/FINSConstants.java +++ b/src/com/szpg/plc/protocol/fins/FINSConstants.java @@ -21,7 +21,8 @@ /******** 内存区域代码 ********/ public final static byte MEMORY_DM_AREA = (byte) 0x82; //82内存D区代码 - public final static byte MEMORY_WORK_AREA = 0x31; //31内存W区代码 + public final static byte MEMORY_WORK_AREA_WORD = (byte) 0xB1; //B1内存W区代码(按字操作) + public final static byte MEMORY_WORK_AREA_BIT = 0x31; //31内存W区代码(按位操作) /******** 控制域 ********/ public final static byte ICF_COMMAND = (byte) 0x80; //ICF字节代表命令 diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index a11ae12..a65488e 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -19,12 +19,14 @@ import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; import com.szpg.plc.protocol.DTProtocolInterface; import com.szpg.plc.protocol.fins.frame.FINSByteFrame; import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; @@ -115,19 +117,18 @@ // 读写命令的响应 if (commandStr.equalsIgnoreCase("00000002")) { String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); + String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 if (commandCode.equalsIgnoreCase("0101")) { // 读内存命令响应的解析 // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - int count = FINSByteFrameTool.getDataWithoutEndCode(byteMessage).length / 2; //1WORD=2BYTE +// int count = FINSByteFrameTool.getDataWithoutEndCode(byteMessage).length / 2; //1WORD=2BYTE // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 PgAcuRdcmdDao readCmdDao = new PgAcuRdcmdDaoImpl(); - PgAcuRdcmd readCmd = readCmdDao.findLatestCmdByDestAndCount(dest, count); + PgAcuRdcmd readCmd = readCmdDao.findLatestCmdByDestAndType(dest, commandType); if (null != readCmd) { - String commandType = readCmd.getCmd_type(); - // 3根据参数类型调用相应的方法进行解析 switch(commandType) { case AppMessageConstants.CMD_TYPE_READCH4VALUE: @@ -164,6 +165,14 @@ case AppMessageConstants.CMD_TYPE_READHSSTATUS: received = bytesToReadHSStatusCommandResponse(finsFrame, readCmd); break; + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + received = bytesToReadYWStatusCommandResponse(finsFrame, readCmd); + break; + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + received = bytesToReadDSStatusCommandResponse(finsFrame, readCmd); + break; } // 4将已响应的命令删除 @@ -260,7 +269,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int chct = cmd.getCount_sensor(); //甲烷监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < chct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -402,7 +417,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int chct = cmd.getCount_sensor(); //一氧化碳监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < chct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -462,7 +483,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int o2ct = cmd.getCount_sensor(); //氧气监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < o2ct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -522,7 +549,12 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int hsct = cmd.getCount_sensor(); //硫化氢监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } for (int i = 0; i < hsct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -534,6 +566,69 @@ return rhscr; } + + /** + * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int ysct = cmd.getCount_sensor(); //爆管液位监测点的数量 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < ysct; i++) { + char bjBit = dataStr.charAt(dataStr.length() - i - 1); + + ryscr.getYwbj().add(bjBit == '1' ? true : false); + } + } + + return ryscr; + } + + /** + * 将查询对射报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int dsct = cmd.getCount_sensor(); //对射监测点的数量 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + + for (int i = 0; i < dsct; i++) { + char bjBit = dataStr.charAt(dataStr.length() - i * 3 - 1); + + rdscr.getDsbj().add(bjBit == '1' ? true : false); + } + } + + return rdscr; + } /** * 将消息对象解析为字节数组 @@ -601,6 +696,7 @@ FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), message.getMessageProducerId(), + message.getCommandType(), message.getMemoryArea(), start, message.getCountWord()); diff --git a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java index 639359e..94540d4 100644 --- a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java +++ b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java @@ -135,12 +135,13 @@ * * @param dest 目标地址 * @param sour 源地址 + * @param sid 服务号 * @param memArea 内存区域代码 * @param start 读取的起始地址 * @param count 读取的长度(以word计,长度为2个字节) */ - public FINSByteFrame(String dest, String sour, byte memArea, byte[] start, int count) { - this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour); // 构造控制域 + public FINSByteFrame(String dest, String sour, String sid, byte memArea, byte[] start, int count) { + this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour, sid); // 构造控制域 // 设置读取内存命令的发送命令功能码00000002 this.COMMAND = FINSConstants.COMMAND_COMMAND; @@ -168,13 +169,14 @@ * * @param dest * @param sour + * @param sid * @param memArea * @param start * @param count * @param dataBody */ - public FINSByteFrame(String dest, String sour, byte memArea, byte[] start, int count, byte[] dataBody) { - this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour); // 构造控制域 + public FINSByteFrame(String dest, String sour, String sid, byte memArea, byte[] start, int count, byte[] dataBody) { + this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour, sid); // 构造控制域 // 构造用户数据域的内容 Bytes data = new Bytes(); diff --git a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java index 10be9db..c992b06 100644 --- a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java +++ b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java @@ -144,6 +144,20 @@ } /** + * 获取SID号,作为命令类型使用 + * @param finsBytes + * @return + */ + public static String getControlSID(byte[] finsBytes) { + byte[] text = getText(finsBytes); + + if (null != text && text.length > 10) + return ByteUtil.binToHexString(new byte[] {text[9]}); + else + return "00"; + } + + /** * 获取命令代码 * 0x0101=读取内存,0x0102=写内存 * @@ -228,9 +242,10 @@ * * @param dest 目标地址:网络号+节点号+单元号 * @param sour 源地址:网络号+节点号+单元号 + * @param sid 服务号:用于标识命令类型 * @return */ - public static byte[] buildFrameControl(String dest, String sour) { + public static byte[] buildFrameControl(String dest, String sour, String sid) { byte[] control = new byte[10]; // 命令类型位固定为1,需要响应标志位固定为0,表示从上位机发送给PLC端的消息,需要PLC响应 @@ -249,7 +264,8 @@ control[7] = sourByte[1]; //源节点号 control[8] = sourByte[2]; //源单元号 - control[9] = FINSConstants.SID; // SID字节 +// control[9] = FINSConstants.SID; // SID字节 + control[9] = ByteUtil.hexStringToBytes(sid, 1)[0]; return control; } diff --git a/src/com/szpg/plc/server/ACUClientHandler.java b/src/com/szpg/plc/server/ACUClientHandler.java index b3d7bc9..d7649fd 100644 --- a/src/com/szpg/plc/server/ACUClientHandler.java +++ b/src/com/szpg/plc/server/ACUClientHandler.java @@ -13,6 +13,7 @@ import com.szpg.plc.protocol.ProtocolFactory; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACULinkTask; +import com.szpg.util.Configure; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -36,13 +37,14 @@ // 2生成LinkCommand对象并解析成byte数组 LinkCommand lc = new LinkCommand(); - lc.setMessageProducerId(ByteUtil.binToHexString(ByteUtil.hexStringToBytes(client.getNode(), 4))); +// lc.setMessageProducerId(ByteUtil.binToHexString(ByteUtil.hexStringToBytes(client.getNode(), 4))); + lc.setMessageProducerId(ByteUtil.binToHexString(ByteUtil.hexStringToBytes(Configure.getProperty("sys", "LOCALHOST.NODE"), 4))); byte[] lcBytes = finspi.messageToBytes(lc); // 3延迟10秒发送握手命令 ScheduledExecutorService linkSche = new ScheduledThreadPoolExecutor(1); - linkSche.schedule(new ACULinkTask(client, lcBytes), 10, TimeUnit.SECONDS); + linkSche.schedule(new ACULinkTask(client, lcBytes), 5, TimeUnit.SECONDS); linkSche.shutdown(); //执行完任务之后关闭线程 } } @@ -66,9 +68,10 @@ // 解析消息 AppMessage message = finspi.bytesToMessage((byte[]) bytesList.get(i)); - - // 命令解析后处理 - message.afterAction(); + if (null != message) { + // 命令解析后处理 + message.afterAction(); + } } } diff --git a/src/ACUBL.properties b/src/ACUBL.properties index ae086d4..99e858d 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -46,7 +46,7 @@ #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2.START = 0500 #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 -YXL.ACU001.O2.WORDCOUNT = 24 +YXL.ACU001.O2.WORDCOUNT = 4 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2ALM.START = 0036 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -66,3 +66,22 @@ YXL.ACU001.HSALM.WORDCOUNT = 1 #\u786b\u5316\u6c22\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 YXL.ACU001.HSALM.BITCOUNT = 12 + +#\u7206\u7ba1\u6db2\u4f4d\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.YW.COUNT = 2 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.YWALM.START = 0025 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.YWALM.WORDCOUNT = 1 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.YWALM.BITCOUNT = 2 + +#\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.DS.COUNT = 15 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.DSALM.START = 0038 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.DSALM.WORDCOUNT = 3 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.DSALM.BITCOUNT = 45 + diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 5e6edbc..8d5ab08 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -16,12 +16,14 @@ import com.szpg.task.ReadCH4ValueTask; import com.szpg.task.ReadCOStatusTask; import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; import com.szpg.task.ReadHSStatusTask; import com.szpg.task.ReadHSValueTask; import com.szpg.task.ReadO2StatusTask; import com.szpg.task.ReadO2ValueTask; import com.szpg.task.ReadWSStatusTask; import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -30,11 +32,12 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.103", 6800); + // PLC设备地址和端口 + ACUClient client = new ACUClient("192.168.0.244", 6800); - client.setNet("00"); - client.setNode("6B"); - client.setUnit("00"); + client.setNet("00"); //网络号 + client.setNode("F4"); //节点号 + client.setUnit("00"); //单元号 // 3将ACU的信息加入到map中 ACUClientUtil.getInstance().addClient(client); @@ -44,33 +47,34 @@ // 测试发送查询甲烷参数命令 // dsc.testSendCH4Command(client); - // 测试发送查询甲烷报警状态命令 -// dsc.testSendCH4StatsuCommand(client); +// // 测试发送查询甲烷报警状态命令 +// dsc.testSendCH4StatusCommand(client); // 测试发送查询温湿度监测值命令 // dsc.testSendWSCommand(client); // 测试发送查询温湿度报警状态命令 // dsc.testSendWSStatusCommand(client); - // 测试发送查询一氧化碳参数命令 +// // 测试发送查询一氧化碳参数命令 // dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 +// // 测试发送查询一氧化碳报警状态命令 // dsc.testSendCOStatusCommand(client); - - // 测试发送查询一氧化碳参数命令 -// dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 -// dsc.testSendCOStatusCommand(client); - +// // 测试发送查询氧气参数命令 // dsc.testSendO2Command(client); // 测试发送查询氧气报警状态命令 // dsc.testSendO2StatusCommand(client); +// +// // 测试发送查询硫化氢参数命令 +// dsc.testSendHSCommand(client); +// // 测试发送查询硫化氢报警状态命令 +// dsc.testSendHSStatusCommand(client); - // 测试发送查询硫化氢参数命令 - dsc.testSendHSCommand(client); - // 测试发送查询硫化氢报警状态命令 - dsc.testSendHSStatusCommand(client); + // 测试发送查询爆管液位报警状态命令 + dsc.testSendYWStatusCommand(client); + + // 测试发送查询对射报警状态命令 +// dsc.testSendDSStatusCommand(client); } /** @@ -97,8 +101,9 @@ ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(client, ch4), 10, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -116,7 +121,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); ch4alm.setDestinationId(dest); - ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); @@ -124,8 +129,9 @@ ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4StatusTask(client, ch4alm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -153,8 +159,9 @@ ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSValueTask(client, ws), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -172,7 +179,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); wsalm.setDestinationId(dest); - wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); @@ -180,8 +187,9 @@ wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSStatusTask(client, wsalm), 25, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -208,8 +216,9 @@ co.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOValueTask(client, co), 30, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -227,7 +236,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); coalm.setDestinationId(dest); - coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); coalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.START")), 2)) + "00"); coalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.WORDCOUNT"))); @@ -235,8 +244,9 @@ coalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOStatusTask(client, coalm), 35, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -263,8 +273,9 @@ o2.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2ValueTask(client, o2), 40, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -282,7 +293,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); o2alm.setDestinationId(dest); - o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); o2alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.START")), 2)) + "00"); o2alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.WORDCOUNT"))); @@ -290,8 +301,9 @@ o2alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2StatusTask(client, o2alm), 45, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -318,8 +330,9 @@ hs.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSValueTask(client, hs), 50, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -337,7 +350,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); hsalm.setDestinationId(dest); - hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); hsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.START")), 2)) + "00"); hsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.WORDCOUNT"))); @@ -345,7 +358,65 @@ hsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSStatusTask(client, hsalm), 55, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询爆管液位报警状态命令 + * @param client + */ + public void testSendYWStatusCommand(ACUClient client) { + ReadMemoryCommand ywalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READYWSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ywalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ywalm.setDestinationId(dest); + + ywalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + ywalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.START")), 2)) + "00"); + ywalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.WORDCOUNT"))); + ywalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.BITCOUNT"))); + ywalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YW.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadYWStatusTask(client, ywalm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + + /** + * 发送查询对射报警状态命令 + * @param client + */ + public void testSendDSStatusCommand(ACUClient client) { + ReadMemoryCommand dsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READDSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + dsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + dsalm.setDestinationId(dest); + + dsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + dsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.START")), 2)) + "00"); + dsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.WORDCOUNT"))); + dsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.BITCOUNT"))); + dsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadDSStatusTask(client, dsalm), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index 70fb6dc..a9d5686 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -10,6 +10,7 @@ public PgAcuRdcmd findById(String id); public PgAcuRdcmd findLatestCmdByDestAndCount(String dest, int count); + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type); public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); diff --git a/src/com/szpg/db/dao/PgDSDao.java b/src/com/szpg/db/dao/PgDSDao.java new file mode 100644 index 0000000..b731af9 --- /dev/null +++ b/src/com/szpg/db/dao/PgDSDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgDSAlm; + +/** + * 对射报警相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgDSDao { + + /******** 对射报警状态 ********/ + public List findAllSbjz(); + public PgDSAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgDSAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/PgYWDao.java b/src/com/szpg/db/dao/PgYWDao.java new file mode 100644 index 0000000..bb27bbf --- /dev/null +++ b/src/com/szpg/db/dao/PgYWDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgYWAlm; + +/** + * 爆管液位相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgYWDao { + + /******** 爆管液位浓度报警状态 ********/ + public List findAllSbjz(); + public PgYWAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgYWAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index b693939..16b2285 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -114,6 +114,41 @@ } return null; } + + + @Override + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ACU_RDCMD WHERE RESPONSED='0' AND TIMEOUT='0' AND DEST=? AND CMD_TYPE=? ORDER BY TM DESC"; + Object[] params = new Object[2]; + params[0] = dest; + params[1] = type; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAcuRdcmd.class), params); + + if (null != list && list.isEmpty() == false) { + logger.debug("根据目的地址和命令类型查询内存读取命令成功[" + list.size() + "]"); + + return list.get(0); + } else + return null; + } catch (Exception ex) { + logger.error("根据目的地址和命令类型查询内存读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } @Override public int addCmdRecord(PgAcuRdcmd cmd) { diff --git a/src/com/szpg/db/dao/impl/PgDSDaoImpl.java b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java new file mode 100644 index 0000000..e9d18cd --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.data.PgDSAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgDSDaoImpl implements PgDSDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgDSAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(0); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询对射报警状态成功" + dsalm + "]"); + + return dsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgDSAlm dsalm) { + return addSbjzRecord(dsalm.getDsalm(), dsalm.getTmStr(), dsalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_DS_ALM " + + "(DSALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入对射报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入对射报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 657281c..7706852 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -39,6 +39,12 @@ case "HS": key = "%硫化氢%"; break; + case "YW": + key = "%液位%"; + break; + case "DS": + key = "%对射%"; + break; } String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '" + key + "' ORDER BY D.ID"; diff --git a/src/com/szpg/db/dao/impl/PgYWDaoImpl.java b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java new file mode 100644 index 0000000..613c4c0 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.data.PgYWAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgYWDaoImpl implements PgYWDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgYWAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(0); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询爆管液位报警状态成功" + ywalm + "]"); + + return ywalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgYWAlm ywalm) { + return addSbjzRecord(ywalm.getYwalm(), ywalm.getTmStr(), ywalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_YW_ALM " + + "(YWALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入爆管液位报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入爆管液位报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index f4ecfe5..2d46bfc 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -1,6 +1,8 @@ package com.szpg.db.data; +import java.util.Calendar; import java.util.Date; +import java.util.UUID; import com.szpg.util.TimeFormat; @@ -31,6 +33,11 @@ private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 + public PgAcuRdcmd() { + this.setId(UUID.randomUUID().toString().replace("-", "")); + this.setTm(Calendar.getInstance().getTime()); + } + public String getId() { return id; } diff --git a/src/com/szpg/db/data/PgDSAlm.java b/src/com/szpg/db/data/PgDSAlm.java new file mode 100644 index 0000000..86e28bb --- /dev/null +++ b/src/com/szpg/db/data/PgDSAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 对射报警状态数据表 + * + * @author admin + * + */ +public class PgDSAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = -8336945265752238748L; + + private Integer id; + private Boolean dsalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getDsalm() { + return dsalm; + } + + public void setDsalm(Boolean dsalm) { + this.dsalm = dsalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgDSAlm[dsalm=" + dsalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/data/PgYWAlm.java b/src/com/szpg/db/data/PgYWAlm.java new file mode 100644 index 0000000..9d9572f --- /dev/null +++ b/src/com/szpg/db/data/PgYWAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 爆管液位浓度报警状态数据表 + * + * @author admin + * + */ +public class PgYWAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 3882791834818808488L; + + private Integer id; + private Boolean ywalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getYwalm() { + return ywalm; + } + + public void setYwalm(Boolean ywalm) { + this.ywalm = ywalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgYWAlm[ywalm=" + ywalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/plc/message/AppMessageConstants.java b/src/com/szpg/plc/message/AppMessageConstants.java index 25db6ab..1c84086 100644 --- a/src/com/szpg/plc/message/AppMessageConstants.java +++ b/src/com/szpg/plc/message/AppMessageConstants.java @@ -13,4 +13,7 @@ public final static String CMD_TYPE_READO2STATUS = "17"; //读取氧气报警状态命令 public final static String CMD_TYPE_READHSVALUE = "18"; //读取硫化氢监测值命令 public final static String CMD_TYPE_READHSSTATUS = "19"; //读取硫化氢报警状态命令 + + public final static String CMD_TYPE_READYWSTATUS = "21"; //读取爆管液位报警状态命令 + public final static String CMD_TYPE_READDSSTATUS = "22"; //读取对射报警状态命令 } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index acf2859..3678a16 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -5,12 +5,14 @@ import com.szpg.plc.message.command.read.ReadCH4ValueCommand; import com.szpg.plc.message.command.read.ReadCOStatusCommand; import com.szpg.plc.message.command.read.ReadCOValueCommand; +import com.szpg.plc.message.command.read.ReadDSStatusCommand; import com.szpg.plc.message.command.read.ReadHSStatusCommand; import com.szpg.plc.message.command.read.ReadHSValueCommand; import com.szpg.plc.message.command.read.ReadO2StatusCommand; import com.szpg.plc.message.command.read.ReadO2ValueCommand; import com.szpg.plc.message.command.read.ReadWSStatusCommand; import com.szpg.plc.message.command.read.ReadWSValueCommand; +import com.szpg.plc.message.command.read.ReadYWStatusCommand; import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -101,6 +103,12 @@ return new ReadHSValueCommand(); case AppMessageConstants.CMD_TYPE_READHSSTATUS: return new ReadHSStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + return new ReadYWStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + return new ReadDSStatusCommand(); default: return null; diff --git a/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java new file mode 100644 index 0000000..eda271f --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; + +public class ReadDSStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = -1668388238102375069L; + + @Override + public Class getResponseClass() { + return ReadDSStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询对射报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READDSSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java new file mode 100644 index 0000000..73c54b3 --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; + +public class ReadYWStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 1019982176997717896L; + + @Override + public Class getResponseClass() { + return ReadYWStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询爆管液位报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READYWSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java new file mode 100644 index 0000000..e2b476b --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java @@ -0,0 +1,57 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgDSDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadDSStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 4047613496835657828L; + + private List dsbj; // 对射报警状态 + + public ReadDSStatusCommandResponse() { + dsbj = new ArrayList(); + } + + public List getDsbj() { + return dsbj; + } + + public void setDsbj(List dsbj) { + this.dsbj = dsbj; + } + + @Override + public void afterAction() { + // 1将对射报警数据存入数据库 + PgDSDao dsDao = new PgDSDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findDeviceIdByDestAndType(this.getMessageProducerId(), "DS"); + + for (int i = 0; i < dsbj.size(); i++) { + if (i < ids.size()) { + dsDao.addSbjzRecord(dsbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (dsbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + + } + } + } + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java new file mode 100644 index 0000000..c2674f2 --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java @@ -0,0 +1,57 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgYWDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadYWStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 8088340048416088978L; + + private List ywbj; // 爆管液位报警状态 + + public ReadYWStatusCommandResponse() { + ywbj = new ArrayList(); + } + + public List getYwbj() { + return ywbj; + } + + public void setYwbj(List ywbj) { + this.ywbj = ywbj; + } + + @Override + public void afterAction() { + // 1将爆管液位浓度数据存入数据库 + PgYWDao ywDao = new PgYWDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findDeviceIdByDestAndType(this.getMessageProducerId(), "YW"); + + for (int i = 0; i < ywbj.size(); i++) { + if (i < ids.size()) { + ywDao.addSbjzRecord(ywbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (ywbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + + } + } + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSConstants.java b/src/com/szpg/plc/protocol/fins/FINSConstants.java index 2697e74..f565b8b 100644 --- a/src/com/szpg/plc/protocol/fins/FINSConstants.java +++ b/src/com/szpg/plc/protocol/fins/FINSConstants.java @@ -21,7 +21,8 @@ /******** 内存区域代码 ********/ public final static byte MEMORY_DM_AREA = (byte) 0x82; //82内存D区代码 - public final static byte MEMORY_WORK_AREA = 0x31; //31内存W区代码 + public final static byte MEMORY_WORK_AREA_WORD = (byte) 0xB1; //B1内存W区代码(按字操作) + public final static byte MEMORY_WORK_AREA_BIT = 0x31; //31内存W区代码(按位操作) /******** 控制域 ********/ public final static byte ICF_COMMAND = (byte) 0x80; //ICF字节代表命令 diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index a11ae12..a65488e 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -19,12 +19,14 @@ import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; import com.szpg.plc.protocol.DTProtocolInterface; import com.szpg.plc.protocol.fins.frame.FINSByteFrame; import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; @@ -115,19 +117,18 @@ // 读写命令的响应 if (commandStr.equalsIgnoreCase("00000002")) { String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); + String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 if (commandCode.equalsIgnoreCase("0101")) { // 读内存命令响应的解析 // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - int count = FINSByteFrameTool.getDataWithoutEndCode(byteMessage).length / 2; //1WORD=2BYTE +// int count = FINSByteFrameTool.getDataWithoutEndCode(byteMessage).length / 2; //1WORD=2BYTE // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 PgAcuRdcmdDao readCmdDao = new PgAcuRdcmdDaoImpl(); - PgAcuRdcmd readCmd = readCmdDao.findLatestCmdByDestAndCount(dest, count); + PgAcuRdcmd readCmd = readCmdDao.findLatestCmdByDestAndType(dest, commandType); if (null != readCmd) { - String commandType = readCmd.getCmd_type(); - // 3根据参数类型调用相应的方法进行解析 switch(commandType) { case AppMessageConstants.CMD_TYPE_READCH4VALUE: @@ -164,6 +165,14 @@ case AppMessageConstants.CMD_TYPE_READHSSTATUS: received = bytesToReadHSStatusCommandResponse(finsFrame, readCmd); break; + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + received = bytesToReadYWStatusCommandResponse(finsFrame, readCmd); + break; + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + received = bytesToReadDSStatusCommandResponse(finsFrame, readCmd); + break; } // 4将已响应的命令删除 @@ -260,7 +269,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int chct = cmd.getCount_sensor(); //甲烷监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < chct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -402,7 +417,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int chct = cmd.getCount_sensor(); //一氧化碳监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < chct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -462,7 +483,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int o2ct = cmd.getCount_sensor(); //氧气监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < o2ct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -522,7 +549,12 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int hsct = cmd.getCount_sensor(); //硫化氢监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } for (int i = 0; i < hsct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -534,6 +566,69 @@ return rhscr; } + + /** + * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int ysct = cmd.getCount_sensor(); //爆管液位监测点的数量 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < ysct; i++) { + char bjBit = dataStr.charAt(dataStr.length() - i - 1); + + ryscr.getYwbj().add(bjBit == '1' ? true : false); + } + } + + return ryscr; + } + + /** + * 将查询对射报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int dsct = cmd.getCount_sensor(); //对射监测点的数量 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + + for (int i = 0; i < dsct; i++) { + char bjBit = dataStr.charAt(dataStr.length() - i * 3 - 1); + + rdscr.getDsbj().add(bjBit == '1' ? true : false); + } + } + + return rdscr; + } /** * 将消息对象解析为字节数组 @@ -601,6 +696,7 @@ FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), message.getMessageProducerId(), + message.getCommandType(), message.getMemoryArea(), start, message.getCountWord()); diff --git a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java index 639359e..94540d4 100644 --- a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java +++ b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java @@ -135,12 +135,13 @@ * * @param dest 目标地址 * @param sour 源地址 + * @param sid 服务号 * @param memArea 内存区域代码 * @param start 读取的起始地址 * @param count 读取的长度(以word计,长度为2个字节) */ - public FINSByteFrame(String dest, String sour, byte memArea, byte[] start, int count) { - this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour); // 构造控制域 + public FINSByteFrame(String dest, String sour, String sid, byte memArea, byte[] start, int count) { + this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour, sid); // 构造控制域 // 设置读取内存命令的发送命令功能码00000002 this.COMMAND = FINSConstants.COMMAND_COMMAND; @@ -168,13 +169,14 @@ * * @param dest * @param sour + * @param sid * @param memArea * @param start * @param count * @param dataBody */ - public FINSByteFrame(String dest, String sour, byte memArea, byte[] start, int count, byte[] dataBody) { - this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour); // 构造控制域 + public FINSByteFrame(String dest, String sour, String sid, byte memArea, byte[] start, int count, byte[] dataBody) { + this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour, sid); // 构造控制域 // 构造用户数据域的内容 Bytes data = new Bytes(); diff --git a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java index 10be9db..c992b06 100644 --- a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java +++ b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java @@ -144,6 +144,20 @@ } /** + * 获取SID号,作为命令类型使用 + * @param finsBytes + * @return + */ + public static String getControlSID(byte[] finsBytes) { + byte[] text = getText(finsBytes); + + if (null != text && text.length > 10) + return ByteUtil.binToHexString(new byte[] {text[9]}); + else + return "00"; + } + + /** * 获取命令代码 * 0x0101=读取内存,0x0102=写内存 * @@ -228,9 +242,10 @@ * * @param dest 目标地址:网络号+节点号+单元号 * @param sour 源地址:网络号+节点号+单元号 + * @param sid 服务号:用于标识命令类型 * @return */ - public static byte[] buildFrameControl(String dest, String sour) { + public static byte[] buildFrameControl(String dest, String sour, String sid) { byte[] control = new byte[10]; // 命令类型位固定为1,需要响应标志位固定为0,表示从上位机发送给PLC端的消息,需要PLC响应 @@ -249,7 +264,8 @@ control[7] = sourByte[1]; //源节点号 control[8] = sourByte[2]; //源单元号 - control[9] = FINSConstants.SID; // SID字节 +// control[9] = FINSConstants.SID; // SID字节 + control[9] = ByteUtil.hexStringToBytes(sid, 1)[0]; return control; } diff --git a/src/com/szpg/plc/server/ACUClientHandler.java b/src/com/szpg/plc/server/ACUClientHandler.java index b3d7bc9..d7649fd 100644 --- a/src/com/szpg/plc/server/ACUClientHandler.java +++ b/src/com/szpg/plc/server/ACUClientHandler.java @@ -13,6 +13,7 @@ import com.szpg.plc.protocol.ProtocolFactory; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACULinkTask; +import com.szpg.util.Configure; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -36,13 +37,14 @@ // 2生成LinkCommand对象并解析成byte数组 LinkCommand lc = new LinkCommand(); - lc.setMessageProducerId(ByteUtil.binToHexString(ByteUtil.hexStringToBytes(client.getNode(), 4))); +// lc.setMessageProducerId(ByteUtil.binToHexString(ByteUtil.hexStringToBytes(client.getNode(), 4))); + lc.setMessageProducerId(ByteUtil.binToHexString(ByteUtil.hexStringToBytes(Configure.getProperty("sys", "LOCALHOST.NODE"), 4))); byte[] lcBytes = finspi.messageToBytes(lc); // 3延迟10秒发送握手命令 ScheduledExecutorService linkSche = new ScheduledThreadPoolExecutor(1); - linkSche.schedule(new ACULinkTask(client, lcBytes), 10, TimeUnit.SECONDS); + linkSche.schedule(new ACULinkTask(client, lcBytes), 5, TimeUnit.SECONDS); linkSche.shutdown(); //执行完任务之后关闭线程 } } @@ -66,9 +68,10 @@ // 解析消息 AppMessage message = finspi.bytesToMessage((byte[]) bytesList.get(i)); - - // 命令解析后处理 - message.afterAction(); + if (null != message) { + // 命令解析后处理 + message.afterAction(); + } } } diff --git a/src/com/szpg/task/ReadCH4StatusTask.java b/src/com/szpg/task/ReadCH4StatusTask.java index 11b33b4..d861d8b 100644 --- a/src/com/szpg/task/ReadCH4StatusTask.java +++ b/src/com/szpg/task/ReadCH4StatusTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(ch4AlmCmd.getId()); - cmd.setTm(ch4AlmCmd.getTime().getTime()); cmd.setCmd_type(ch4AlmCmd.getCommandType()); cmd.setDest(ch4AlmCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { ch4AlmCmd.getMemoryArea() })); diff --git a/src/ACUBL.properties b/src/ACUBL.properties index ae086d4..99e858d 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -46,7 +46,7 @@ #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2.START = 0500 #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 -YXL.ACU001.O2.WORDCOUNT = 24 +YXL.ACU001.O2.WORDCOUNT = 4 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2ALM.START = 0036 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -66,3 +66,22 @@ YXL.ACU001.HSALM.WORDCOUNT = 1 #\u786b\u5316\u6c22\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 YXL.ACU001.HSALM.BITCOUNT = 12 + +#\u7206\u7ba1\u6db2\u4f4d\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.YW.COUNT = 2 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.YWALM.START = 0025 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.YWALM.WORDCOUNT = 1 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.YWALM.BITCOUNT = 2 + +#\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.DS.COUNT = 15 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.DSALM.START = 0038 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.DSALM.WORDCOUNT = 3 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.DSALM.BITCOUNT = 45 + diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 5e6edbc..8d5ab08 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -16,12 +16,14 @@ import com.szpg.task.ReadCH4ValueTask; import com.szpg.task.ReadCOStatusTask; import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; import com.szpg.task.ReadHSStatusTask; import com.szpg.task.ReadHSValueTask; import com.szpg.task.ReadO2StatusTask; import com.szpg.task.ReadO2ValueTask; import com.szpg.task.ReadWSStatusTask; import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -30,11 +32,12 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.103", 6800); + // PLC设备地址和端口 + ACUClient client = new ACUClient("192.168.0.244", 6800); - client.setNet("00"); - client.setNode("6B"); - client.setUnit("00"); + client.setNet("00"); //网络号 + client.setNode("F4"); //节点号 + client.setUnit("00"); //单元号 // 3将ACU的信息加入到map中 ACUClientUtil.getInstance().addClient(client); @@ -44,33 +47,34 @@ // 测试发送查询甲烷参数命令 // dsc.testSendCH4Command(client); - // 测试发送查询甲烷报警状态命令 -// dsc.testSendCH4StatsuCommand(client); +// // 测试发送查询甲烷报警状态命令 +// dsc.testSendCH4StatusCommand(client); // 测试发送查询温湿度监测值命令 // dsc.testSendWSCommand(client); // 测试发送查询温湿度报警状态命令 // dsc.testSendWSStatusCommand(client); - // 测试发送查询一氧化碳参数命令 +// // 测试发送查询一氧化碳参数命令 // dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 +// // 测试发送查询一氧化碳报警状态命令 // dsc.testSendCOStatusCommand(client); - - // 测试发送查询一氧化碳参数命令 -// dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 -// dsc.testSendCOStatusCommand(client); - +// // 测试发送查询氧气参数命令 // dsc.testSendO2Command(client); // 测试发送查询氧气报警状态命令 // dsc.testSendO2StatusCommand(client); +// +// // 测试发送查询硫化氢参数命令 +// dsc.testSendHSCommand(client); +// // 测试发送查询硫化氢报警状态命令 +// dsc.testSendHSStatusCommand(client); - // 测试发送查询硫化氢参数命令 - dsc.testSendHSCommand(client); - // 测试发送查询硫化氢报警状态命令 - dsc.testSendHSStatusCommand(client); + // 测试发送查询爆管液位报警状态命令 + dsc.testSendYWStatusCommand(client); + + // 测试发送查询对射报警状态命令 +// dsc.testSendDSStatusCommand(client); } /** @@ -97,8 +101,9 @@ ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(client, ch4), 10, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -116,7 +121,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); ch4alm.setDestinationId(dest); - ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); @@ -124,8 +129,9 @@ ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4StatusTask(client, ch4alm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -153,8 +159,9 @@ ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSValueTask(client, ws), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -172,7 +179,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); wsalm.setDestinationId(dest); - wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); @@ -180,8 +187,9 @@ wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSStatusTask(client, wsalm), 25, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -208,8 +216,9 @@ co.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOValueTask(client, co), 30, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -227,7 +236,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); coalm.setDestinationId(dest); - coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); coalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.START")), 2)) + "00"); coalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.WORDCOUNT"))); @@ -235,8 +244,9 @@ coalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOStatusTask(client, coalm), 35, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -263,8 +273,9 @@ o2.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2ValueTask(client, o2), 40, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -282,7 +293,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); o2alm.setDestinationId(dest); - o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); o2alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.START")), 2)) + "00"); o2alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.WORDCOUNT"))); @@ -290,8 +301,9 @@ o2alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2StatusTask(client, o2alm), 45, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -318,8 +330,9 @@ hs.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSValueTask(client, hs), 50, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -337,7 +350,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); hsalm.setDestinationId(dest); - hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); hsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.START")), 2)) + "00"); hsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.WORDCOUNT"))); @@ -345,7 +358,65 @@ hsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSStatusTask(client, hsalm), 55, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询爆管液位报警状态命令 + * @param client + */ + public void testSendYWStatusCommand(ACUClient client) { + ReadMemoryCommand ywalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READYWSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ywalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ywalm.setDestinationId(dest); + + ywalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + ywalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.START")), 2)) + "00"); + ywalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.WORDCOUNT"))); + ywalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.BITCOUNT"))); + ywalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YW.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadYWStatusTask(client, ywalm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + + /** + * 发送查询对射报警状态命令 + * @param client + */ + public void testSendDSStatusCommand(ACUClient client) { + ReadMemoryCommand dsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READDSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + dsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + dsalm.setDestinationId(dest); + + dsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + dsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.START")), 2)) + "00"); + dsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.WORDCOUNT"))); + dsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.BITCOUNT"))); + dsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadDSStatusTask(client, dsalm), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index 70fb6dc..a9d5686 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -10,6 +10,7 @@ public PgAcuRdcmd findById(String id); public PgAcuRdcmd findLatestCmdByDestAndCount(String dest, int count); + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type); public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); diff --git a/src/com/szpg/db/dao/PgDSDao.java b/src/com/szpg/db/dao/PgDSDao.java new file mode 100644 index 0000000..b731af9 --- /dev/null +++ b/src/com/szpg/db/dao/PgDSDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgDSAlm; + +/** + * 对射报警相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgDSDao { + + /******** 对射报警状态 ********/ + public List findAllSbjz(); + public PgDSAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgDSAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/PgYWDao.java b/src/com/szpg/db/dao/PgYWDao.java new file mode 100644 index 0000000..bb27bbf --- /dev/null +++ b/src/com/szpg/db/dao/PgYWDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgYWAlm; + +/** + * 爆管液位相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgYWDao { + + /******** 爆管液位浓度报警状态 ********/ + public List findAllSbjz(); + public PgYWAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgYWAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index b693939..16b2285 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -114,6 +114,41 @@ } return null; } + + + @Override + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ACU_RDCMD WHERE RESPONSED='0' AND TIMEOUT='0' AND DEST=? AND CMD_TYPE=? ORDER BY TM DESC"; + Object[] params = new Object[2]; + params[0] = dest; + params[1] = type; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAcuRdcmd.class), params); + + if (null != list && list.isEmpty() == false) { + logger.debug("根据目的地址和命令类型查询内存读取命令成功[" + list.size() + "]"); + + return list.get(0); + } else + return null; + } catch (Exception ex) { + logger.error("根据目的地址和命令类型查询内存读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } @Override public int addCmdRecord(PgAcuRdcmd cmd) { diff --git a/src/com/szpg/db/dao/impl/PgDSDaoImpl.java b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java new file mode 100644 index 0000000..e9d18cd --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.data.PgDSAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgDSDaoImpl implements PgDSDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgDSAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(0); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询对射报警状态成功" + dsalm + "]"); + + return dsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgDSAlm dsalm) { + return addSbjzRecord(dsalm.getDsalm(), dsalm.getTmStr(), dsalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_DS_ALM " + + "(DSALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入对射报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入对射报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 657281c..7706852 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -39,6 +39,12 @@ case "HS": key = "%硫化氢%"; break; + case "YW": + key = "%液位%"; + break; + case "DS": + key = "%对射%"; + break; } String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '" + key + "' ORDER BY D.ID"; diff --git a/src/com/szpg/db/dao/impl/PgYWDaoImpl.java b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java new file mode 100644 index 0000000..613c4c0 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.data.PgYWAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgYWDaoImpl implements PgYWDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgYWAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(0); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询爆管液位报警状态成功" + ywalm + "]"); + + return ywalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgYWAlm ywalm) { + return addSbjzRecord(ywalm.getYwalm(), ywalm.getTmStr(), ywalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_YW_ALM " + + "(YWALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入爆管液位报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入爆管液位报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index f4ecfe5..2d46bfc 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -1,6 +1,8 @@ package com.szpg.db.data; +import java.util.Calendar; import java.util.Date; +import java.util.UUID; import com.szpg.util.TimeFormat; @@ -31,6 +33,11 @@ private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 + public PgAcuRdcmd() { + this.setId(UUID.randomUUID().toString().replace("-", "")); + this.setTm(Calendar.getInstance().getTime()); + } + public String getId() { return id; } diff --git a/src/com/szpg/db/data/PgDSAlm.java b/src/com/szpg/db/data/PgDSAlm.java new file mode 100644 index 0000000..86e28bb --- /dev/null +++ b/src/com/szpg/db/data/PgDSAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 对射报警状态数据表 + * + * @author admin + * + */ +public class PgDSAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = -8336945265752238748L; + + private Integer id; + private Boolean dsalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getDsalm() { + return dsalm; + } + + public void setDsalm(Boolean dsalm) { + this.dsalm = dsalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgDSAlm[dsalm=" + dsalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/data/PgYWAlm.java b/src/com/szpg/db/data/PgYWAlm.java new file mode 100644 index 0000000..9d9572f --- /dev/null +++ b/src/com/szpg/db/data/PgYWAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 爆管液位浓度报警状态数据表 + * + * @author admin + * + */ +public class PgYWAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 3882791834818808488L; + + private Integer id; + private Boolean ywalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getYwalm() { + return ywalm; + } + + public void setYwalm(Boolean ywalm) { + this.ywalm = ywalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgYWAlm[ywalm=" + ywalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/plc/message/AppMessageConstants.java b/src/com/szpg/plc/message/AppMessageConstants.java index 25db6ab..1c84086 100644 --- a/src/com/szpg/plc/message/AppMessageConstants.java +++ b/src/com/szpg/plc/message/AppMessageConstants.java @@ -13,4 +13,7 @@ public final static String CMD_TYPE_READO2STATUS = "17"; //读取氧气报警状态命令 public final static String CMD_TYPE_READHSVALUE = "18"; //读取硫化氢监测值命令 public final static String CMD_TYPE_READHSSTATUS = "19"; //读取硫化氢报警状态命令 + + public final static String CMD_TYPE_READYWSTATUS = "21"; //读取爆管液位报警状态命令 + public final static String CMD_TYPE_READDSSTATUS = "22"; //读取对射报警状态命令 } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index acf2859..3678a16 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -5,12 +5,14 @@ import com.szpg.plc.message.command.read.ReadCH4ValueCommand; import com.szpg.plc.message.command.read.ReadCOStatusCommand; import com.szpg.plc.message.command.read.ReadCOValueCommand; +import com.szpg.plc.message.command.read.ReadDSStatusCommand; import com.szpg.plc.message.command.read.ReadHSStatusCommand; import com.szpg.plc.message.command.read.ReadHSValueCommand; import com.szpg.plc.message.command.read.ReadO2StatusCommand; import com.szpg.plc.message.command.read.ReadO2ValueCommand; import com.szpg.plc.message.command.read.ReadWSStatusCommand; import com.szpg.plc.message.command.read.ReadWSValueCommand; +import com.szpg.plc.message.command.read.ReadYWStatusCommand; import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -101,6 +103,12 @@ return new ReadHSValueCommand(); case AppMessageConstants.CMD_TYPE_READHSSTATUS: return new ReadHSStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + return new ReadYWStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + return new ReadDSStatusCommand(); default: return null; diff --git a/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java new file mode 100644 index 0000000..eda271f --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; + +public class ReadDSStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = -1668388238102375069L; + + @Override + public Class getResponseClass() { + return ReadDSStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询对射报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READDSSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java new file mode 100644 index 0000000..73c54b3 --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; + +public class ReadYWStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 1019982176997717896L; + + @Override + public Class getResponseClass() { + return ReadYWStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询爆管液位报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READYWSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java new file mode 100644 index 0000000..e2b476b --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java @@ -0,0 +1,57 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgDSDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadDSStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 4047613496835657828L; + + private List dsbj; // 对射报警状态 + + public ReadDSStatusCommandResponse() { + dsbj = new ArrayList(); + } + + public List getDsbj() { + return dsbj; + } + + public void setDsbj(List dsbj) { + this.dsbj = dsbj; + } + + @Override + public void afterAction() { + // 1将对射报警数据存入数据库 + PgDSDao dsDao = new PgDSDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findDeviceIdByDestAndType(this.getMessageProducerId(), "DS"); + + for (int i = 0; i < dsbj.size(); i++) { + if (i < ids.size()) { + dsDao.addSbjzRecord(dsbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (dsbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + + } + } + } + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java new file mode 100644 index 0000000..c2674f2 --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java @@ -0,0 +1,57 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgYWDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadYWStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 8088340048416088978L; + + private List ywbj; // 爆管液位报警状态 + + public ReadYWStatusCommandResponse() { + ywbj = new ArrayList(); + } + + public List getYwbj() { + return ywbj; + } + + public void setYwbj(List ywbj) { + this.ywbj = ywbj; + } + + @Override + public void afterAction() { + // 1将爆管液位浓度数据存入数据库 + PgYWDao ywDao = new PgYWDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findDeviceIdByDestAndType(this.getMessageProducerId(), "YW"); + + for (int i = 0; i < ywbj.size(); i++) { + if (i < ids.size()) { + ywDao.addSbjzRecord(ywbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (ywbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + + } + } + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSConstants.java b/src/com/szpg/plc/protocol/fins/FINSConstants.java index 2697e74..f565b8b 100644 --- a/src/com/szpg/plc/protocol/fins/FINSConstants.java +++ b/src/com/szpg/plc/protocol/fins/FINSConstants.java @@ -21,7 +21,8 @@ /******** 内存区域代码 ********/ public final static byte MEMORY_DM_AREA = (byte) 0x82; //82内存D区代码 - public final static byte MEMORY_WORK_AREA = 0x31; //31内存W区代码 + public final static byte MEMORY_WORK_AREA_WORD = (byte) 0xB1; //B1内存W区代码(按字操作) + public final static byte MEMORY_WORK_AREA_BIT = 0x31; //31内存W区代码(按位操作) /******** 控制域 ********/ public final static byte ICF_COMMAND = (byte) 0x80; //ICF字节代表命令 diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index a11ae12..a65488e 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -19,12 +19,14 @@ import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; import com.szpg.plc.protocol.DTProtocolInterface; import com.szpg.plc.protocol.fins.frame.FINSByteFrame; import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; @@ -115,19 +117,18 @@ // 读写命令的响应 if (commandStr.equalsIgnoreCase("00000002")) { String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); + String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 if (commandCode.equalsIgnoreCase("0101")) { // 读内存命令响应的解析 // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - int count = FINSByteFrameTool.getDataWithoutEndCode(byteMessage).length / 2; //1WORD=2BYTE +// int count = FINSByteFrameTool.getDataWithoutEndCode(byteMessage).length / 2; //1WORD=2BYTE // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 PgAcuRdcmdDao readCmdDao = new PgAcuRdcmdDaoImpl(); - PgAcuRdcmd readCmd = readCmdDao.findLatestCmdByDestAndCount(dest, count); + PgAcuRdcmd readCmd = readCmdDao.findLatestCmdByDestAndType(dest, commandType); if (null != readCmd) { - String commandType = readCmd.getCmd_type(); - // 3根据参数类型调用相应的方法进行解析 switch(commandType) { case AppMessageConstants.CMD_TYPE_READCH4VALUE: @@ -164,6 +165,14 @@ case AppMessageConstants.CMD_TYPE_READHSSTATUS: received = bytesToReadHSStatusCommandResponse(finsFrame, readCmd); break; + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + received = bytesToReadYWStatusCommandResponse(finsFrame, readCmd); + break; + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + received = bytesToReadDSStatusCommandResponse(finsFrame, readCmd); + break; } // 4将已响应的命令删除 @@ -260,7 +269,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int chct = cmd.getCount_sensor(); //甲烷监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < chct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -402,7 +417,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int chct = cmd.getCount_sensor(); //一氧化碳监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < chct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -462,7 +483,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int o2ct = cmd.getCount_sensor(); //氧气监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < o2ct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -522,7 +549,12 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int hsct = cmd.getCount_sensor(); //硫化氢监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } for (int i = 0; i < hsct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -534,6 +566,69 @@ return rhscr; } + + /** + * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int ysct = cmd.getCount_sensor(); //爆管液位监测点的数量 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < ysct; i++) { + char bjBit = dataStr.charAt(dataStr.length() - i - 1); + + ryscr.getYwbj().add(bjBit == '1' ? true : false); + } + } + + return ryscr; + } + + /** + * 将查询对射报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int dsct = cmd.getCount_sensor(); //对射监测点的数量 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + + for (int i = 0; i < dsct; i++) { + char bjBit = dataStr.charAt(dataStr.length() - i * 3 - 1); + + rdscr.getDsbj().add(bjBit == '1' ? true : false); + } + } + + return rdscr; + } /** * 将消息对象解析为字节数组 @@ -601,6 +696,7 @@ FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), message.getMessageProducerId(), + message.getCommandType(), message.getMemoryArea(), start, message.getCountWord()); diff --git a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java index 639359e..94540d4 100644 --- a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java +++ b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java @@ -135,12 +135,13 @@ * * @param dest 目标地址 * @param sour 源地址 + * @param sid 服务号 * @param memArea 内存区域代码 * @param start 读取的起始地址 * @param count 读取的长度(以word计,长度为2个字节) */ - public FINSByteFrame(String dest, String sour, byte memArea, byte[] start, int count) { - this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour); // 构造控制域 + public FINSByteFrame(String dest, String sour, String sid, byte memArea, byte[] start, int count) { + this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour, sid); // 构造控制域 // 设置读取内存命令的发送命令功能码00000002 this.COMMAND = FINSConstants.COMMAND_COMMAND; @@ -168,13 +169,14 @@ * * @param dest * @param sour + * @param sid * @param memArea * @param start * @param count * @param dataBody */ - public FINSByteFrame(String dest, String sour, byte memArea, byte[] start, int count, byte[] dataBody) { - this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour); // 构造控制域 + public FINSByteFrame(String dest, String sour, String sid, byte memArea, byte[] start, int count, byte[] dataBody) { + this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour, sid); // 构造控制域 // 构造用户数据域的内容 Bytes data = new Bytes(); diff --git a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java index 10be9db..c992b06 100644 --- a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java +++ b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java @@ -144,6 +144,20 @@ } /** + * 获取SID号,作为命令类型使用 + * @param finsBytes + * @return + */ + public static String getControlSID(byte[] finsBytes) { + byte[] text = getText(finsBytes); + + if (null != text && text.length > 10) + return ByteUtil.binToHexString(new byte[] {text[9]}); + else + return "00"; + } + + /** * 获取命令代码 * 0x0101=读取内存,0x0102=写内存 * @@ -228,9 +242,10 @@ * * @param dest 目标地址:网络号+节点号+单元号 * @param sour 源地址:网络号+节点号+单元号 + * @param sid 服务号:用于标识命令类型 * @return */ - public static byte[] buildFrameControl(String dest, String sour) { + public static byte[] buildFrameControl(String dest, String sour, String sid) { byte[] control = new byte[10]; // 命令类型位固定为1,需要响应标志位固定为0,表示从上位机发送给PLC端的消息,需要PLC响应 @@ -249,7 +264,8 @@ control[7] = sourByte[1]; //源节点号 control[8] = sourByte[2]; //源单元号 - control[9] = FINSConstants.SID; // SID字节 +// control[9] = FINSConstants.SID; // SID字节 + control[9] = ByteUtil.hexStringToBytes(sid, 1)[0]; return control; } diff --git a/src/com/szpg/plc/server/ACUClientHandler.java b/src/com/szpg/plc/server/ACUClientHandler.java index b3d7bc9..d7649fd 100644 --- a/src/com/szpg/plc/server/ACUClientHandler.java +++ b/src/com/szpg/plc/server/ACUClientHandler.java @@ -13,6 +13,7 @@ import com.szpg.plc.protocol.ProtocolFactory; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACULinkTask; +import com.szpg.util.Configure; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -36,13 +37,14 @@ // 2生成LinkCommand对象并解析成byte数组 LinkCommand lc = new LinkCommand(); - lc.setMessageProducerId(ByteUtil.binToHexString(ByteUtil.hexStringToBytes(client.getNode(), 4))); +// lc.setMessageProducerId(ByteUtil.binToHexString(ByteUtil.hexStringToBytes(client.getNode(), 4))); + lc.setMessageProducerId(ByteUtil.binToHexString(ByteUtil.hexStringToBytes(Configure.getProperty("sys", "LOCALHOST.NODE"), 4))); byte[] lcBytes = finspi.messageToBytes(lc); // 3延迟10秒发送握手命令 ScheduledExecutorService linkSche = new ScheduledThreadPoolExecutor(1); - linkSche.schedule(new ACULinkTask(client, lcBytes), 10, TimeUnit.SECONDS); + linkSche.schedule(new ACULinkTask(client, lcBytes), 5, TimeUnit.SECONDS); linkSche.shutdown(); //执行完任务之后关闭线程 } } @@ -66,9 +68,10 @@ // 解析消息 AppMessage message = finspi.bytesToMessage((byte[]) bytesList.get(i)); - - // 命令解析后处理 - message.afterAction(); + if (null != message) { + // 命令解析后处理 + message.afterAction(); + } } } diff --git a/src/com/szpg/task/ReadCH4StatusTask.java b/src/com/szpg/task/ReadCH4StatusTask.java index 11b33b4..d861d8b 100644 --- a/src/com/szpg/task/ReadCH4StatusTask.java +++ b/src/com/szpg/task/ReadCH4StatusTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(ch4AlmCmd.getId()); - cmd.setTm(ch4AlmCmd.getTime().getTime()); cmd.setCmd_type(ch4AlmCmd.getCommandType()); cmd.setDest(ch4AlmCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { ch4AlmCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadCH4ValueTask.java b/src/com/szpg/task/ReadCH4ValueTask.java index 73d957f..4cb658e 100644 --- a/src/com/szpg/task/ReadCH4ValueTask.java +++ b/src/com/szpg/task/ReadCH4ValueTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(ch4Cmd.getId()); - cmd.setTm(ch4Cmd.getTime().getTime()); cmd.setCmd_type(ch4Cmd.getCommandType()); cmd.setDest(ch4Cmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { ch4Cmd.getMemoryArea() })); diff --git a/src/ACUBL.properties b/src/ACUBL.properties index ae086d4..99e858d 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -46,7 +46,7 @@ #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2.START = 0500 #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 -YXL.ACU001.O2.WORDCOUNT = 24 +YXL.ACU001.O2.WORDCOUNT = 4 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2ALM.START = 0036 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -66,3 +66,22 @@ YXL.ACU001.HSALM.WORDCOUNT = 1 #\u786b\u5316\u6c22\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 YXL.ACU001.HSALM.BITCOUNT = 12 + +#\u7206\u7ba1\u6db2\u4f4d\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.YW.COUNT = 2 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.YWALM.START = 0025 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.YWALM.WORDCOUNT = 1 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.YWALM.BITCOUNT = 2 + +#\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.DS.COUNT = 15 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.DSALM.START = 0038 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.DSALM.WORDCOUNT = 3 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.DSALM.BITCOUNT = 45 + diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 5e6edbc..8d5ab08 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -16,12 +16,14 @@ import com.szpg.task.ReadCH4ValueTask; import com.szpg.task.ReadCOStatusTask; import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; import com.szpg.task.ReadHSStatusTask; import com.szpg.task.ReadHSValueTask; import com.szpg.task.ReadO2StatusTask; import com.szpg.task.ReadO2ValueTask; import com.szpg.task.ReadWSStatusTask; import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -30,11 +32,12 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.103", 6800); + // PLC设备地址和端口 + ACUClient client = new ACUClient("192.168.0.244", 6800); - client.setNet("00"); - client.setNode("6B"); - client.setUnit("00"); + client.setNet("00"); //网络号 + client.setNode("F4"); //节点号 + client.setUnit("00"); //单元号 // 3将ACU的信息加入到map中 ACUClientUtil.getInstance().addClient(client); @@ -44,33 +47,34 @@ // 测试发送查询甲烷参数命令 // dsc.testSendCH4Command(client); - // 测试发送查询甲烷报警状态命令 -// dsc.testSendCH4StatsuCommand(client); +// // 测试发送查询甲烷报警状态命令 +// dsc.testSendCH4StatusCommand(client); // 测试发送查询温湿度监测值命令 // dsc.testSendWSCommand(client); // 测试发送查询温湿度报警状态命令 // dsc.testSendWSStatusCommand(client); - // 测试发送查询一氧化碳参数命令 +// // 测试发送查询一氧化碳参数命令 // dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 +// // 测试发送查询一氧化碳报警状态命令 // dsc.testSendCOStatusCommand(client); - - // 测试发送查询一氧化碳参数命令 -// dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 -// dsc.testSendCOStatusCommand(client); - +// // 测试发送查询氧气参数命令 // dsc.testSendO2Command(client); // 测试发送查询氧气报警状态命令 // dsc.testSendO2StatusCommand(client); +// +// // 测试发送查询硫化氢参数命令 +// dsc.testSendHSCommand(client); +// // 测试发送查询硫化氢报警状态命令 +// dsc.testSendHSStatusCommand(client); - // 测试发送查询硫化氢参数命令 - dsc.testSendHSCommand(client); - // 测试发送查询硫化氢报警状态命令 - dsc.testSendHSStatusCommand(client); + // 测试发送查询爆管液位报警状态命令 + dsc.testSendYWStatusCommand(client); + + // 测试发送查询对射报警状态命令 +// dsc.testSendDSStatusCommand(client); } /** @@ -97,8 +101,9 @@ ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(client, ch4), 10, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -116,7 +121,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); ch4alm.setDestinationId(dest); - ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); @@ -124,8 +129,9 @@ ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4StatusTask(client, ch4alm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -153,8 +159,9 @@ ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSValueTask(client, ws), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -172,7 +179,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); wsalm.setDestinationId(dest); - wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); @@ -180,8 +187,9 @@ wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSStatusTask(client, wsalm), 25, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -208,8 +216,9 @@ co.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOValueTask(client, co), 30, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -227,7 +236,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); coalm.setDestinationId(dest); - coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); coalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.START")), 2)) + "00"); coalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.WORDCOUNT"))); @@ -235,8 +244,9 @@ coalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOStatusTask(client, coalm), 35, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -263,8 +273,9 @@ o2.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2ValueTask(client, o2), 40, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -282,7 +293,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); o2alm.setDestinationId(dest); - o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); o2alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.START")), 2)) + "00"); o2alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.WORDCOUNT"))); @@ -290,8 +301,9 @@ o2alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2StatusTask(client, o2alm), 45, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -318,8 +330,9 @@ hs.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSValueTask(client, hs), 50, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -337,7 +350,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); hsalm.setDestinationId(dest); - hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); hsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.START")), 2)) + "00"); hsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.WORDCOUNT"))); @@ -345,7 +358,65 @@ hsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSStatusTask(client, hsalm), 55, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询爆管液位报警状态命令 + * @param client + */ + public void testSendYWStatusCommand(ACUClient client) { + ReadMemoryCommand ywalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READYWSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ywalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ywalm.setDestinationId(dest); + + ywalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + ywalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.START")), 2)) + "00"); + ywalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.WORDCOUNT"))); + ywalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.BITCOUNT"))); + ywalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YW.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadYWStatusTask(client, ywalm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + + /** + * 发送查询对射报警状态命令 + * @param client + */ + public void testSendDSStatusCommand(ACUClient client) { + ReadMemoryCommand dsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READDSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + dsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + dsalm.setDestinationId(dest); + + dsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + dsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.START")), 2)) + "00"); + dsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.WORDCOUNT"))); + dsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.BITCOUNT"))); + dsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadDSStatusTask(client, dsalm), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index 70fb6dc..a9d5686 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -10,6 +10,7 @@ public PgAcuRdcmd findById(String id); public PgAcuRdcmd findLatestCmdByDestAndCount(String dest, int count); + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type); public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); diff --git a/src/com/szpg/db/dao/PgDSDao.java b/src/com/szpg/db/dao/PgDSDao.java new file mode 100644 index 0000000..b731af9 --- /dev/null +++ b/src/com/szpg/db/dao/PgDSDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgDSAlm; + +/** + * 对射报警相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgDSDao { + + /******** 对射报警状态 ********/ + public List findAllSbjz(); + public PgDSAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgDSAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/PgYWDao.java b/src/com/szpg/db/dao/PgYWDao.java new file mode 100644 index 0000000..bb27bbf --- /dev/null +++ b/src/com/szpg/db/dao/PgYWDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgYWAlm; + +/** + * 爆管液位相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgYWDao { + + /******** 爆管液位浓度报警状态 ********/ + public List findAllSbjz(); + public PgYWAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgYWAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index b693939..16b2285 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -114,6 +114,41 @@ } return null; } + + + @Override + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ACU_RDCMD WHERE RESPONSED='0' AND TIMEOUT='0' AND DEST=? AND CMD_TYPE=? ORDER BY TM DESC"; + Object[] params = new Object[2]; + params[0] = dest; + params[1] = type; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAcuRdcmd.class), params); + + if (null != list && list.isEmpty() == false) { + logger.debug("根据目的地址和命令类型查询内存读取命令成功[" + list.size() + "]"); + + return list.get(0); + } else + return null; + } catch (Exception ex) { + logger.error("根据目的地址和命令类型查询内存读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } @Override public int addCmdRecord(PgAcuRdcmd cmd) { diff --git a/src/com/szpg/db/dao/impl/PgDSDaoImpl.java b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java new file mode 100644 index 0000000..e9d18cd --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.data.PgDSAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgDSDaoImpl implements PgDSDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgDSAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(0); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询对射报警状态成功" + dsalm + "]"); + + return dsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgDSAlm dsalm) { + return addSbjzRecord(dsalm.getDsalm(), dsalm.getTmStr(), dsalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_DS_ALM " + + "(DSALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入对射报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入对射报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 657281c..7706852 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -39,6 +39,12 @@ case "HS": key = "%硫化氢%"; break; + case "YW": + key = "%液位%"; + break; + case "DS": + key = "%对射%"; + break; } String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '" + key + "' ORDER BY D.ID"; diff --git a/src/com/szpg/db/dao/impl/PgYWDaoImpl.java b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java new file mode 100644 index 0000000..613c4c0 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.data.PgYWAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgYWDaoImpl implements PgYWDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgYWAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(0); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询爆管液位报警状态成功" + ywalm + "]"); + + return ywalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgYWAlm ywalm) { + return addSbjzRecord(ywalm.getYwalm(), ywalm.getTmStr(), ywalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_YW_ALM " + + "(YWALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入爆管液位报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入爆管液位报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index f4ecfe5..2d46bfc 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -1,6 +1,8 @@ package com.szpg.db.data; +import java.util.Calendar; import java.util.Date; +import java.util.UUID; import com.szpg.util.TimeFormat; @@ -31,6 +33,11 @@ private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 + public PgAcuRdcmd() { + this.setId(UUID.randomUUID().toString().replace("-", "")); + this.setTm(Calendar.getInstance().getTime()); + } + public String getId() { return id; } diff --git a/src/com/szpg/db/data/PgDSAlm.java b/src/com/szpg/db/data/PgDSAlm.java new file mode 100644 index 0000000..86e28bb --- /dev/null +++ b/src/com/szpg/db/data/PgDSAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 对射报警状态数据表 + * + * @author admin + * + */ +public class PgDSAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = -8336945265752238748L; + + private Integer id; + private Boolean dsalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getDsalm() { + return dsalm; + } + + public void setDsalm(Boolean dsalm) { + this.dsalm = dsalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgDSAlm[dsalm=" + dsalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/data/PgYWAlm.java b/src/com/szpg/db/data/PgYWAlm.java new file mode 100644 index 0000000..9d9572f --- /dev/null +++ b/src/com/szpg/db/data/PgYWAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 爆管液位浓度报警状态数据表 + * + * @author admin + * + */ +public class PgYWAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 3882791834818808488L; + + private Integer id; + private Boolean ywalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getYwalm() { + return ywalm; + } + + public void setYwalm(Boolean ywalm) { + this.ywalm = ywalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgYWAlm[ywalm=" + ywalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/plc/message/AppMessageConstants.java b/src/com/szpg/plc/message/AppMessageConstants.java index 25db6ab..1c84086 100644 --- a/src/com/szpg/plc/message/AppMessageConstants.java +++ b/src/com/szpg/plc/message/AppMessageConstants.java @@ -13,4 +13,7 @@ public final static String CMD_TYPE_READO2STATUS = "17"; //读取氧气报警状态命令 public final static String CMD_TYPE_READHSVALUE = "18"; //读取硫化氢监测值命令 public final static String CMD_TYPE_READHSSTATUS = "19"; //读取硫化氢报警状态命令 + + public final static String CMD_TYPE_READYWSTATUS = "21"; //读取爆管液位报警状态命令 + public final static String CMD_TYPE_READDSSTATUS = "22"; //读取对射报警状态命令 } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index acf2859..3678a16 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -5,12 +5,14 @@ import com.szpg.plc.message.command.read.ReadCH4ValueCommand; import com.szpg.plc.message.command.read.ReadCOStatusCommand; import com.szpg.plc.message.command.read.ReadCOValueCommand; +import com.szpg.plc.message.command.read.ReadDSStatusCommand; import com.szpg.plc.message.command.read.ReadHSStatusCommand; import com.szpg.plc.message.command.read.ReadHSValueCommand; import com.szpg.plc.message.command.read.ReadO2StatusCommand; import com.szpg.plc.message.command.read.ReadO2ValueCommand; import com.szpg.plc.message.command.read.ReadWSStatusCommand; import com.szpg.plc.message.command.read.ReadWSValueCommand; +import com.szpg.plc.message.command.read.ReadYWStatusCommand; import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -101,6 +103,12 @@ return new ReadHSValueCommand(); case AppMessageConstants.CMD_TYPE_READHSSTATUS: return new ReadHSStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + return new ReadYWStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + return new ReadDSStatusCommand(); default: return null; diff --git a/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java new file mode 100644 index 0000000..eda271f --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; + +public class ReadDSStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = -1668388238102375069L; + + @Override + public Class getResponseClass() { + return ReadDSStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询对射报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READDSSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java new file mode 100644 index 0000000..73c54b3 --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; + +public class ReadYWStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 1019982176997717896L; + + @Override + public Class getResponseClass() { + return ReadYWStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询爆管液位报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READYWSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java new file mode 100644 index 0000000..e2b476b --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java @@ -0,0 +1,57 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgDSDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadDSStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 4047613496835657828L; + + private List dsbj; // 对射报警状态 + + public ReadDSStatusCommandResponse() { + dsbj = new ArrayList(); + } + + public List getDsbj() { + return dsbj; + } + + public void setDsbj(List dsbj) { + this.dsbj = dsbj; + } + + @Override + public void afterAction() { + // 1将对射报警数据存入数据库 + PgDSDao dsDao = new PgDSDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findDeviceIdByDestAndType(this.getMessageProducerId(), "DS"); + + for (int i = 0; i < dsbj.size(); i++) { + if (i < ids.size()) { + dsDao.addSbjzRecord(dsbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (dsbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + + } + } + } + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java new file mode 100644 index 0000000..c2674f2 --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java @@ -0,0 +1,57 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgYWDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadYWStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 8088340048416088978L; + + private List ywbj; // 爆管液位报警状态 + + public ReadYWStatusCommandResponse() { + ywbj = new ArrayList(); + } + + public List getYwbj() { + return ywbj; + } + + public void setYwbj(List ywbj) { + this.ywbj = ywbj; + } + + @Override + public void afterAction() { + // 1将爆管液位浓度数据存入数据库 + PgYWDao ywDao = new PgYWDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findDeviceIdByDestAndType(this.getMessageProducerId(), "YW"); + + for (int i = 0; i < ywbj.size(); i++) { + if (i < ids.size()) { + ywDao.addSbjzRecord(ywbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (ywbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + + } + } + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSConstants.java b/src/com/szpg/plc/protocol/fins/FINSConstants.java index 2697e74..f565b8b 100644 --- a/src/com/szpg/plc/protocol/fins/FINSConstants.java +++ b/src/com/szpg/plc/protocol/fins/FINSConstants.java @@ -21,7 +21,8 @@ /******** 内存区域代码 ********/ public final static byte MEMORY_DM_AREA = (byte) 0x82; //82内存D区代码 - public final static byte MEMORY_WORK_AREA = 0x31; //31内存W区代码 + public final static byte MEMORY_WORK_AREA_WORD = (byte) 0xB1; //B1内存W区代码(按字操作) + public final static byte MEMORY_WORK_AREA_BIT = 0x31; //31内存W区代码(按位操作) /******** 控制域 ********/ public final static byte ICF_COMMAND = (byte) 0x80; //ICF字节代表命令 diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index a11ae12..a65488e 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -19,12 +19,14 @@ import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; import com.szpg.plc.protocol.DTProtocolInterface; import com.szpg.plc.protocol.fins.frame.FINSByteFrame; import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; @@ -115,19 +117,18 @@ // 读写命令的响应 if (commandStr.equalsIgnoreCase("00000002")) { String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); + String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 if (commandCode.equalsIgnoreCase("0101")) { // 读内存命令响应的解析 // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - int count = FINSByteFrameTool.getDataWithoutEndCode(byteMessage).length / 2; //1WORD=2BYTE +// int count = FINSByteFrameTool.getDataWithoutEndCode(byteMessage).length / 2; //1WORD=2BYTE // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 PgAcuRdcmdDao readCmdDao = new PgAcuRdcmdDaoImpl(); - PgAcuRdcmd readCmd = readCmdDao.findLatestCmdByDestAndCount(dest, count); + PgAcuRdcmd readCmd = readCmdDao.findLatestCmdByDestAndType(dest, commandType); if (null != readCmd) { - String commandType = readCmd.getCmd_type(); - // 3根据参数类型调用相应的方法进行解析 switch(commandType) { case AppMessageConstants.CMD_TYPE_READCH4VALUE: @@ -164,6 +165,14 @@ case AppMessageConstants.CMD_TYPE_READHSSTATUS: received = bytesToReadHSStatusCommandResponse(finsFrame, readCmd); break; + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + received = bytesToReadYWStatusCommandResponse(finsFrame, readCmd); + break; + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + received = bytesToReadDSStatusCommandResponse(finsFrame, readCmd); + break; } // 4将已响应的命令删除 @@ -260,7 +269,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int chct = cmd.getCount_sensor(); //甲烷监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < chct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -402,7 +417,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int chct = cmd.getCount_sensor(); //一氧化碳监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < chct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -462,7 +483,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int o2ct = cmd.getCount_sensor(); //氧气监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < o2ct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -522,7 +549,12 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int hsct = cmd.getCount_sensor(); //硫化氢监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } for (int i = 0; i < hsct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -534,6 +566,69 @@ return rhscr; } + + /** + * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int ysct = cmd.getCount_sensor(); //爆管液位监测点的数量 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < ysct; i++) { + char bjBit = dataStr.charAt(dataStr.length() - i - 1); + + ryscr.getYwbj().add(bjBit == '1' ? true : false); + } + } + + return ryscr; + } + + /** + * 将查询对射报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int dsct = cmd.getCount_sensor(); //对射监测点的数量 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + + for (int i = 0; i < dsct; i++) { + char bjBit = dataStr.charAt(dataStr.length() - i * 3 - 1); + + rdscr.getDsbj().add(bjBit == '1' ? true : false); + } + } + + return rdscr; + } /** * 将消息对象解析为字节数组 @@ -601,6 +696,7 @@ FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), message.getMessageProducerId(), + message.getCommandType(), message.getMemoryArea(), start, message.getCountWord()); diff --git a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java index 639359e..94540d4 100644 --- a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java +++ b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java @@ -135,12 +135,13 @@ * * @param dest 目标地址 * @param sour 源地址 + * @param sid 服务号 * @param memArea 内存区域代码 * @param start 读取的起始地址 * @param count 读取的长度(以word计,长度为2个字节) */ - public FINSByteFrame(String dest, String sour, byte memArea, byte[] start, int count) { - this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour); // 构造控制域 + public FINSByteFrame(String dest, String sour, String sid, byte memArea, byte[] start, int count) { + this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour, sid); // 构造控制域 // 设置读取内存命令的发送命令功能码00000002 this.COMMAND = FINSConstants.COMMAND_COMMAND; @@ -168,13 +169,14 @@ * * @param dest * @param sour + * @param sid * @param memArea * @param start * @param count * @param dataBody */ - public FINSByteFrame(String dest, String sour, byte memArea, byte[] start, int count, byte[] dataBody) { - this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour); // 构造控制域 + public FINSByteFrame(String dest, String sour, String sid, byte memArea, byte[] start, int count, byte[] dataBody) { + this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour, sid); // 构造控制域 // 构造用户数据域的内容 Bytes data = new Bytes(); diff --git a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java index 10be9db..c992b06 100644 --- a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java +++ b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java @@ -144,6 +144,20 @@ } /** + * 获取SID号,作为命令类型使用 + * @param finsBytes + * @return + */ + public static String getControlSID(byte[] finsBytes) { + byte[] text = getText(finsBytes); + + if (null != text && text.length > 10) + return ByteUtil.binToHexString(new byte[] {text[9]}); + else + return "00"; + } + + /** * 获取命令代码 * 0x0101=读取内存,0x0102=写内存 * @@ -228,9 +242,10 @@ * * @param dest 目标地址:网络号+节点号+单元号 * @param sour 源地址:网络号+节点号+单元号 + * @param sid 服务号:用于标识命令类型 * @return */ - public static byte[] buildFrameControl(String dest, String sour) { + public static byte[] buildFrameControl(String dest, String sour, String sid) { byte[] control = new byte[10]; // 命令类型位固定为1,需要响应标志位固定为0,表示从上位机发送给PLC端的消息,需要PLC响应 @@ -249,7 +264,8 @@ control[7] = sourByte[1]; //源节点号 control[8] = sourByte[2]; //源单元号 - control[9] = FINSConstants.SID; // SID字节 +// control[9] = FINSConstants.SID; // SID字节 + control[9] = ByteUtil.hexStringToBytes(sid, 1)[0]; return control; } diff --git a/src/com/szpg/plc/server/ACUClientHandler.java b/src/com/szpg/plc/server/ACUClientHandler.java index b3d7bc9..d7649fd 100644 --- a/src/com/szpg/plc/server/ACUClientHandler.java +++ b/src/com/szpg/plc/server/ACUClientHandler.java @@ -13,6 +13,7 @@ import com.szpg.plc.protocol.ProtocolFactory; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACULinkTask; +import com.szpg.util.Configure; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -36,13 +37,14 @@ // 2生成LinkCommand对象并解析成byte数组 LinkCommand lc = new LinkCommand(); - lc.setMessageProducerId(ByteUtil.binToHexString(ByteUtil.hexStringToBytes(client.getNode(), 4))); +// lc.setMessageProducerId(ByteUtil.binToHexString(ByteUtil.hexStringToBytes(client.getNode(), 4))); + lc.setMessageProducerId(ByteUtil.binToHexString(ByteUtil.hexStringToBytes(Configure.getProperty("sys", "LOCALHOST.NODE"), 4))); byte[] lcBytes = finspi.messageToBytes(lc); // 3延迟10秒发送握手命令 ScheduledExecutorService linkSche = new ScheduledThreadPoolExecutor(1); - linkSche.schedule(new ACULinkTask(client, lcBytes), 10, TimeUnit.SECONDS); + linkSche.schedule(new ACULinkTask(client, lcBytes), 5, TimeUnit.SECONDS); linkSche.shutdown(); //执行完任务之后关闭线程 } } @@ -66,9 +68,10 @@ // 解析消息 AppMessage message = finspi.bytesToMessage((byte[]) bytesList.get(i)); - - // 命令解析后处理 - message.afterAction(); + if (null != message) { + // 命令解析后处理 + message.afterAction(); + } } } diff --git a/src/com/szpg/task/ReadCH4StatusTask.java b/src/com/szpg/task/ReadCH4StatusTask.java index 11b33b4..d861d8b 100644 --- a/src/com/szpg/task/ReadCH4StatusTask.java +++ b/src/com/szpg/task/ReadCH4StatusTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(ch4AlmCmd.getId()); - cmd.setTm(ch4AlmCmd.getTime().getTime()); cmd.setCmd_type(ch4AlmCmd.getCommandType()); cmd.setDest(ch4AlmCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { ch4AlmCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadCH4ValueTask.java b/src/com/szpg/task/ReadCH4ValueTask.java index 73d957f..4cb658e 100644 --- a/src/com/szpg/task/ReadCH4ValueTask.java +++ b/src/com/szpg/task/ReadCH4ValueTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(ch4Cmd.getId()); - cmd.setTm(ch4Cmd.getTime().getTime()); cmd.setCmd_type(ch4Cmd.getCommandType()); cmd.setDest(ch4Cmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { ch4Cmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadCOStatusTask.java b/src/com/szpg/task/ReadCOStatusTask.java index 11eca56..c01765c 100644 --- a/src/com/szpg/task/ReadCOStatusTask.java +++ b/src/com/szpg/task/ReadCOStatusTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(coAlmCmd.getId()); - cmd.setTm(coAlmCmd.getTime().getTime()); cmd.setCmd_type(coAlmCmd.getCommandType()); cmd.setDest(coAlmCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { coAlmCmd.getMemoryArea() })); diff --git a/src/ACUBL.properties b/src/ACUBL.properties index ae086d4..99e858d 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -46,7 +46,7 @@ #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2.START = 0500 #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 -YXL.ACU001.O2.WORDCOUNT = 24 +YXL.ACU001.O2.WORDCOUNT = 4 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2ALM.START = 0036 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -66,3 +66,22 @@ YXL.ACU001.HSALM.WORDCOUNT = 1 #\u786b\u5316\u6c22\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 YXL.ACU001.HSALM.BITCOUNT = 12 + +#\u7206\u7ba1\u6db2\u4f4d\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.YW.COUNT = 2 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.YWALM.START = 0025 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.YWALM.WORDCOUNT = 1 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.YWALM.BITCOUNT = 2 + +#\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.DS.COUNT = 15 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.DSALM.START = 0038 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.DSALM.WORDCOUNT = 3 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.DSALM.BITCOUNT = 45 + diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 5e6edbc..8d5ab08 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -16,12 +16,14 @@ import com.szpg.task.ReadCH4ValueTask; import com.szpg.task.ReadCOStatusTask; import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; import com.szpg.task.ReadHSStatusTask; import com.szpg.task.ReadHSValueTask; import com.szpg.task.ReadO2StatusTask; import com.szpg.task.ReadO2ValueTask; import com.szpg.task.ReadWSStatusTask; import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -30,11 +32,12 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.103", 6800); + // PLC设备地址和端口 + ACUClient client = new ACUClient("192.168.0.244", 6800); - client.setNet("00"); - client.setNode("6B"); - client.setUnit("00"); + client.setNet("00"); //网络号 + client.setNode("F4"); //节点号 + client.setUnit("00"); //单元号 // 3将ACU的信息加入到map中 ACUClientUtil.getInstance().addClient(client); @@ -44,33 +47,34 @@ // 测试发送查询甲烷参数命令 // dsc.testSendCH4Command(client); - // 测试发送查询甲烷报警状态命令 -// dsc.testSendCH4StatsuCommand(client); +// // 测试发送查询甲烷报警状态命令 +// dsc.testSendCH4StatusCommand(client); // 测试发送查询温湿度监测值命令 // dsc.testSendWSCommand(client); // 测试发送查询温湿度报警状态命令 // dsc.testSendWSStatusCommand(client); - // 测试发送查询一氧化碳参数命令 +// // 测试发送查询一氧化碳参数命令 // dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 +// // 测试发送查询一氧化碳报警状态命令 // dsc.testSendCOStatusCommand(client); - - // 测试发送查询一氧化碳参数命令 -// dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 -// dsc.testSendCOStatusCommand(client); - +// // 测试发送查询氧气参数命令 // dsc.testSendO2Command(client); // 测试发送查询氧气报警状态命令 // dsc.testSendO2StatusCommand(client); +// +// // 测试发送查询硫化氢参数命令 +// dsc.testSendHSCommand(client); +// // 测试发送查询硫化氢报警状态命令 +// dsc.testSendHSStatusCommand(client); - // 测试发送查询硫化氢参数命令 - dsc.testSendHSCommand(client); - // 测试发送查询硫化氢报警状态命令 - dsc.testSendHSStatusCommand(client); + // 测试发送查询爆管液位报警状态命令 + dsc.testSendYWStatusCommand(client); + + // 测试发送查询对射报警状态命令 +// dsc.testSendDSStatusCommand(client); } /** @@ -97,8 +101,9 @@ ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(client, ch4), 10, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -116,7 +121,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); ch4alm.setDestinationId(dest); - ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); @@ -124,8 +129,9 @@ ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4StatusTask(client, ch4alm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -153,8 +159,9 @@ ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSValueTask(client, ws), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -172,7 +179,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); wsalm.setDestinationId(dest); - wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); @@ -180,8 +187,9 @@ wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSStatusTask(client, wsalm), 25, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -208,8 +216,9 @@ co.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOValueTask(client, co), 30, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -227,7 +236,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); coalm.setDestinationId(dest); - coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); coalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.START")), 2)) + "00"); coalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.WORDCOUNT"))); @@ -235,8 +244,9 @@ coalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOStatusTask(client, coalm), 35, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -263,8 +273,9 @@ o2.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2ValueTask(client, o2), 40, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -282,7 +293,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); o2alm.setDestinationId(dest); - o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); o2alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.START")), 2)) + "00"); o2alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.WORDCOUNT"))); @@ -290,8 +301,9 @@ o2alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2StatusTask(client, o2alm), 45, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -318,8 +330,9 @@ hs.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSValueTask(client, hs), 50, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -337,7 +350,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); hsalm.setDestinationId(dest); - hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); hsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.START")), 2)) + "00"); hsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.WORDCOUNT"))); @@ -345,7 +358,65 @@ hsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSStatusTask(client, hsalm), 55, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询爆管液位报警状态命令 + * @param client + */ + public void testSendYWStatusCommand(ACUClient client) { + ReadMemoryCommand ywalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READYWSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ywalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ywalm.setDestinationId(dest); + + ywalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + ywalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.START")), 2)) + "00"); + ywalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.WORDCOUNT"))); + ywalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.BITCOUNT"))); + ywalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YW.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadYWStatusTask(client, ywalm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + + /** + * 发送查询对射报警状态命令 + * @param client + */ + public void testSendDSStatusCommand(ACUClient client) { + ReadMemoryCommand dsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READDSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + dsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + dsalm.setDestinationId(dest); + + dsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + dsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.START")), 2)) + "00"); + dsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.WORDCOUNT"))); + dsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.BITCOUNT"))); + dsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadDSStatusTask(client, dsalm), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index 70fb6dc..a9d5686 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -10,6 +10,7 @@ public PgAcuRdcmd findById(String id); public PgAcuRdcmd findLatestCmdByDestAndCount(String dest, int count); + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type); public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); diff --git a/src/com/szpg/db/dao/PgDSDao.java b/src/com/szpg/db/dao/PgDSDao.java new file mode 100644 index 0000000..b731af9 --- /dev/null +++ b/src/com/szpg/db/dao/PgDSDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgDSAlm; + +/** + * 对射报警相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgDSDao { + + /******** 对射报警状态 ********/ + public List findAllSbjz(); + public PgDSAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgDSAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/PgYWDao.java b/src/com/szpg/db/dao/PgYWDao.java new file mode 100644 index 0000000..bb27bbf --- /dev/null +++ b/src/com/szpg/db/dao/PgYWDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgYWAlm; + +/** + * 爆管液位相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgYWDao { + + /******** 爆管液位浓度报警状态 ********/ + public List findAllSbjz(); + public PgYWAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgYWAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index b693939..16b2285 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -114,6 +114,41 @@ } return null; } + + + @Override + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ACU_RDCMD WHERE RESPONSED='0' AND TIMEOUT='0' AND DEST=? AND CMD_TYPE=? ORDER BY TM DESC"; + Object[] params = new Object[2]; + params[0] = dest; + params[1] = type; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAcuRdcmd.class), params); + + if (null != list && list.isEmpty() == false) { + logger.debug("根据目的地址和命令类型查询内存读取命令成功[" + list.size() + "]"); + + return list.get(0); + } else + return null; + } catch (Exception ex) { + logger.error("根据目的地址和命令类型查询内存读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } @Override public int addCmdRecord(PgAcuRdcmd cmd) { diff --git a/src/com/szpg/db/dao/impl/PgDSDaoImpl.java b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java new file mode 100644 index 0000000..e9d18cd --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.data.PgDSAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgDSDaoImpl implements PgDSDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgDSAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(0); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询对射报警状态成功" + dsalm + "]"); + + return dsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgDSAlm dsalm) { + return addSbjzRecord(dsalm.getDsalm(), dsalm.getTmStr(), dsalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_DS_ALM " + + "(DSALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入对射报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入对射报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 657281c..7706852 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -39,6 +39,12 @@ case "HS": key = "%硫化氢%"; break; + case "YW": + key = "%液位%"; + break; + case "DS": + key = "%对射%"; + break; } String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '" + key + "' ORDER BY D.ID"; diff --git a/src/com/szpg/db/dao/impl/PgYWDaoImpl.java b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java new file mode 100644 index 0000000..613c4c0 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.data.PgYWAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgYWDaoImpl implements PgYWDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgYWAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(0); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询爆管液位报警状态成功" + ywalm + "]"); + + return ywalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgYWAlm ywalm) { + return addSbjzRecord(ywalm.getYwalm(), ywalm.getTmStr(), ywalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_YW_ALM " + + "(YWALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入爆管液位报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入爆管液位报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index f4ecfe5..2d46bfc 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -1,6 +1,8 @@ package com.szpg.db.data; +import java.util.Calendar; import java.util.Date; +import java.util.UUID; import com.szpg.util.TimeFormat; @@ -31,6 +33,11 @@ private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 + public PgAcuRdcmd() { + this.setId(UUID.randomUUID().toString().replace("-", "")); + this.setTm(Calendar.getInstance().getTime()); + } + public String getId() { return id; } diff --git a/src/com/szpg/db/data/PgDSAlm.java b/src/com/szpg/db/data/PgDSAlm.java new file mode 100644 index 0000000..86e28bb --- /dev/null +++ b/src/com/szpg/db/data/PgDSAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 对射报警状态数据表 + * + * @author admin + * + */ +public class PgDSAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = -8336945265752238748L; + + private Integer id; + private Boolean dsalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getDsalm() { + return dsalm; + } + + public void setDsalm(Boolean dsalm) { + this.dsalm = dsalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgDSAlm[dsalm=" + dsalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/data/PgYWAlm.java b/src/com/szpg/db/data/PgYWAlm.java new file mode 100644 index 0000000..9d9572f --- /dev/null +++ b/src/com/szpg/db/data/PgYWAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 爆管液位浓度报警状态数据表 + * + * @author admin + * + */ +public class PgYWAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 3882791834818808488L; + + private Integer id; + private Boolean ywalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getYwalm() { + return ywalm; + } + + public void setYwalm(Boolean ywalm) { + this.ywalm = ywalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgYWAlm[ywalm=" + ywalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/plc/message/AppMessageConstants.java b/src/com/szpg/plc/message/AppMessageConstants.java index 25db6ab..1c84086 100644 --- a/src/com/szpg/plc/message/AppMessageConstants.java +++ b/src/com/szpg/plc/message/AppMessageConstants.java @@ -13,4 +13,7 @@ public final static String CMD_TYPE_READO2STATUS = "17"; //读取氧气报警状态命令 public final static String CMD_TYPE_READHSVALUE = "18"; //读取硫化氢监测值命令 public final static String CMD_TYPE_READHSSTATUS = "19"; //读取硫化氢报警状态命令 + + public final static String CMD_TYPE_READYWSTATUS = "21"; //读取爆管液位报警状态命令 + public final static String CMD_TYPE_READDSSTATUS = "22"; //读取对射报警状态命令 } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index acf2859..3678a16 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -5,12 +5,14 @@ import com.szpg.plc.message.command.read.ReadCH4ValueCommand; import com.szpg.plc.message.command.read.ReadCOStatusCommand; import com.szpg.plc.message.command.read.ReadCOValueCommand; +import com.szpg.plc.message.command.read.ReadDSStatusCommand; import com.szpg.plc.message.command.read.ReadHSStatusCommand; import com.szpg.plc.message.command.read.ReadHSValueCommand; import com.szpg.plc.message.command.read.ReadO2StatusCommand; import com.szpg.plc.message.command.read.ReadO2ValueCommand; import com.szpg.plc.message.command.read.ReadWSStatusCommand; import com.szpg.plc.message.command.read.ReadWSValueCommand; +import com.szpg.plc.message.command.read.ReadYWStatusCommand; import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -101,6 +103,12 @@ return new ReadHSValueCommand(); case AppMessageConstants.CMD_TYPE_READHSSTATUS: return new ReadHSStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + return new ReadYWStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + return new ReadDSStatusCommand(); default: return null; diff --git a/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java new file mode 100644 index 0000000..eda271f --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; + +public class ReadDSStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = -1668388238102375069L; + + @Override + public Class getResponseClass() { + return ReadDSStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询对射报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READDSSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java new file mode 100644 index 0000000..73c54b3 --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; + +public class ReadYWStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 1019982176997717896L; + + @Override + public Class getResponseClass() { + return ReadYWStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询爆管液位报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READYWSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java new file mode 100644 index 0000000..e2b476b --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java @@ -0,0 +1,57 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgDSDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadDSStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 4047613496835657828L; + + private List dsbj; // 对射报警状态 + + public ReadDSStatusCommandResponse() { + dsbj = new ArrayList(); + } + + public List getDsbj() { + return dsbj; + } + + public void setDsbj(List dsbj) { + this.dsbj = dsbj; + } + + @Override + public void afterAction() { + // 1将对射报警数据存入数据库 + PgDSDao dsDao = new PgDSDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findDeviceIdByDestAndType(this.getMessageProducerId(), "DS"); + + for (int i = 0; i < dsbj.size(); i++) { + if (i < ids.size()) { + dsDao.addSbjzRecord(dsbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (dsbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + + } + } + } + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java new file mode 100644 index 0000000..c2674f2 --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java @@ -0,0 +1,57 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgYWDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadYWStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 8088340048416088978L; + + private List ywbj; // 爆管液位报警状态 + + public ReadYWStatusCommandResponse() { + ywbj = new ArrayList(); + } + + public List getYwbj() { + return ywbj; + } + + public void setYwbj(List ywbj) { + this.ywbj = ywbj; + } + + @Override + public void afterAction() { + // 1将爆管液位浓度数据存入数据库 + PgYWDao ywDao = new PgYWDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findDeviceIdByDestAndType(this.getMessageProducerId(), "YW"); + + for (int i = 0; i < ywbj.size(); i++) { + if (i < ids.size()) { + ywDao.addSbjzRecord(ywbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (ywbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + + } + } + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSConstants.java b/src/com/szpg/plc/protocol/fins/FINSConstants.java index 2697e74..f565b8b 100644 --- a/src/com/szpg/plc/protocol/fins/FINSConstants.java +++ b/src/com/szpg/plc/protocol/fins/FINSConstants.java @@ -21,7 +21,8 @@ /******** 内存区域代码 ********/ public final static byte MEMORY_DM_AREA = (byte) 0x82; //82内存D区代码 - public final static byte MEMORY_WORK_AREA = 0x31; //31内存W区代码 + public final static byte MEMORY_WORK_AREA_WORD = (byte) 0xB1; //B1内存W区代码(按字操作) + public final static byte MEMORY_WORK_AREA_BIT = 0x31; //31内存W区代码(按位操作) /******** 控制域 ********/ public final static byte ICF_COMMAND = (byte) 0x80; //ICF字节代表命令 diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index a11ae12..a65488e 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -19,12 +19,14 @@ import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; import com.szpg.plc.protocol.DTProtocolInterface; import com.szpg.plc.protocol.fins.frame.FINSByteFrame; import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; @@ -115,19 +117,18 @@ // 读写命令的响应 if (commandStr.equalsIgnoreCase("00000002")) { String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); + String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 if (commandCode.equalsIgnoreCase("0101")) { // 读内存命令响应的解析 // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - int count = FINSByteFrameTool.getDataWithoutEndCode(byteMessage).length / 2; //1WORD=2BYTE +// int count = FINSByteFrameTool.getDataWithoutEndCode(byteMessage).length / 2; //1WORD=2BYTE // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 PgAcuRdcmdDao readCmdDao = new PgAcuRdcmdDaoImpl(); - PgAcuRdcmd readCmd = readCmdDao.findLatestCmdByDestAndCount(dest, count); + PgAcuRdcmd readCmd = readCmdDao.findLatestCmdByDestAndType(dest, commandType); if (null != readCmd) { - String commandType = readCmd.getCmd_type(); - // 3根据参数类型调用相应的方法进行解析 switch(commandType) { case AppMessageConstants.CMD_TYPE_READCH4VALUE: @@ -164,6 +165,14 @@ case AppMessageConstants.CMD_TYPE_READHSSTATUS: received = bytesToReadHSStatusCommandResponse(finsFrame, readCmd); break; + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + received = bytesToReadYWStatusCommandResponse(finsFrame, readCmd); + break; + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + received = bytesToReadDSStatusCommandResponse(finsFrame, readCmd); + break; } // 4将已响应的命令删除 @@ -260,7 +269,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int chct = cmd.getCount_sensor(); //甲烷监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < chct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -402,7 +417,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int chct = cmd.getCount_sensor(); //一氧化碳监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < chct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -462,7 +483,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int o2ct = cmd.getCount_sensor(); //氧气监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < o2ct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -522,7 +549,12 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int hsct = cmd.getCount_sensor(); //硫化氢监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } for (int i = 0; i < hsct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -534,6 +566,69 @@ return rhscr; } + + /** + * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int ysct = cmd.getCount_sensor(); //爆管液位监测点的数量 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < ysct; i++) { + char bjBit = dataStr.charAt(dataStr.length() - i - 1); + + ryscr.getYwbj().add(bjBit == '1' ? true : false); + } + } + + return ryscr; + } + + /** + * 将查询对射报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int dsct = cmd.getCount_sensor(); //对射监测点的数量 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + + for (int i = 0; i < dsct; i++) { + char bjBit = dataStr.charAt(dataStr.length() - i * 3 - 1); + + rdscr.getDsbj().add(bjBit == '1' ? true : false); + } + } + + return rdscr; + } /** * 将消息对象解析为字节数组 @@ -601,6 +696,7 @@ FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), message.getMessageProducerId(), + message.getCommandType(), message.getMemoryArea(), start, message.getCountWord()); diff --git a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java index 639359e..94540d4 100644 --- a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java +++ b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java @@ -135,12 +135,13 @@ * * @param dest 目标地址 * @param sour 源地址 + * @param sid 服务号 * @param memArea 内存区域代码 * @param start 读取的起始地址 * @param count 读取的长度(以word计,长度为2个字节) */ - public FINSByteFrame(String dest, String sour, byte memArea, byte[] start, int count) { - this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour); // 构造控制域 + public FINSByteFrame(String dest, String sour, String sid, byte memArea, byte[] start, int count) { + this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour, sid); // 构造控制域 // 设置读取内存命令的发送命令功能码00000002 this.COMMAND = FINSConstants.COMMAND_COMMAND; @@ -168,13 +169,14 @@ * * @param dest * @param sour + * @param sid * @param memArea * @param start * @param count * @param dataBody */ - public FINSByteFrame(String dest, String sour, byte memArea, byte[] start, int count, byte[] dataBody) { - this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour); // 构造控制域 + public FINSByteFrame(String dest, String sour, String sid, byte memArea, byte[] start, int count, byte[] dataBody) { + this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour, sid); // 构造控制域 // 构造用户数据域的内容 Bytes data = new Bytes(); diff --git a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java index 10be9db..c992b06 100644 --- a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java +++ b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java @@ -144,6 +144,20 @@ } /** + * 获取SID号,作为命令类型使用 + * @param finsBytes + * @return + */ + public static String getControlSID(byte[] finsBytes) { + byte[] text = getText(finsBytes); + + if (null != text && text.length > 10) + return ByteUtil.binToHexString(new byte[] {text[9]}); + else + return "00"; + } + + /** * 获取命令代码 * 0x0101=读取内存,0x0102=写内存 * @@ -228,9 +242,10 @@ * * @param dest 目标地址:网络号+节点号+单元号 * @param sour 源地址:网络号+节点号+单元号 + * @param sid 服务号:用于标识命令类型 * @return */ - public static byte[] buildFrameControl(String dest, String sour) { + public static byte[] buildFrameControl(String dest, String sour, String sid) { byte[] control = new byte[10]; // 命令类型位固定为1,需要响应标志位固定为0,表示从上位机发送给PLC端的消息,需要PLC响应 @@ -249,7 +264,8 @@ control[7] = sourByte[1]; //源节点号 control[8] = sourByte[2]; //源单元号 - control[9] = FINSConstants.SID; // SID字节 +// control[9] = FINSConstants.SID; // SID字节 + control[9] = ByteUtil.hexStringToBytes(sid, 1)[0]; return control; } diff --git a/src/com/szpg/plc/server/ACUClientHandler.java b/src/com/szpg/plc/server/ACUClientHandler.java index b3d7bc9..d7649fd 100644 --- a/src/com/szpg/plc/server/ACUClientHandler.java +++ b/src/com/szpg/plc/server/ACUClientHandler.java @@ -13,6 +13,7 @@ import com.szpg.plc.protocol.ProtocolFactory; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACULinkTask; +import com.szpg.util.Configure; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -36,13 +37,14 @@ // 2生成LinkCommand对象并解析成byte数组 LinkCommand lc = new LinkCommand(); - lc.setMessageProducerId(ByteUtil.binToHexString(ByteUtil.hexStringToBytes(client.getNode(), 4))); +// lc.setMessageProducerId(ByteUtil.binToHexString(ByteUtil.hexStringToBytes(client.getNode(), 4))); + lc.setMessageProducerId(ByteUtil.binToHexString(ByteUtil.hexStringToBytes(Configure.getProperty("sys", "LOCALHOST.NODE"), 4))); byte[] lcBytes = finspi.messageToBytes(lc); // 3延迟10秒发送握手命令 ScheduledExecutorService linkSche = new ScheduledThreadPoolExecutor(1); - linkSche.schedule(new ACULinkTask(client, lcBytes), 10, TimeUnit.SECONDS); + linkSche.schedule(new ACULinkTask(client, lcBytes), 5, TimeUnit.SECONDS); linkSche.shutdown(); //执行完任务之后关闭线程 } } @@ -66,9 +68,10 @@ // 解析消息 AppMessage message = finspi.bytesToMessage((byte[]) bytesList.get(i)); - - // 命令解析后处理 - message.afterAction(); + if (null != message) { + // 命令解析后处理 + message.afterAction(); + } } } diff --git a/src/com/szpg/task/ReadCH4StatusTask.java b/src/com/szpg/task/ReadCH4StatusTask.java index 11b33b4..d861d8b 100644 --- a/src/com/szpg/task/ReadCH4StatusTask.java +++ b/src/com/szpg/task/ReadCH4StatusTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(ch4AlmCmd.getId()); - cmd.setTm(ch4AlmCmd.getTime().getTime()); cmd.setCmd_type(ch4AlmCmd.getCommandType()); cmd.setDest(ch4AlmCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { ch4AlmCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadCH4ValueTask.java b/src/com/szpg/task/ReadCH4ValueTask.java index 73d957f..4cb658e 100644 --- a/src/com/szpg/task/ReadCH4ValueTask.java +++ b/src/com/szpg/task/ReadCH4ValueTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(ch4Cmd.getId()); - cmd.setTm(ch4Cmd.getTime().getTime()); cmd.setCmd_type(ch4Cmd.getCommandType()); cmd.setDest(ch4Cmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { ch4Cmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadCOStatusTask.java b/src/com/szpg/task/ReadCOStatusTask.java index 11eca56..c01765c 100644 --- a/src/com/szpg/task/ReadCOStatusTask.java +++ b/src/com/szpg/task/ReadCOStatusTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(coAlmCmd.getId()); - cmd.setTm(coAlmCmd.getTime().getTime()); cmd.setCmd_type(coAlmCmd.getCommandType()); cmd.setDest(coAlmCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { coAlmCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadCOValueTask.java b/src/com/szpg/task/ReadCOValueTask.java index 6ff413e..76b9a1b 100644 --- a/src/com/szpg/task/ReadCOValueTask.java +++ b/src/com/szpg/task/ReadCOValueTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(coCmd.getId()); - cmd.setTm(coCmd.getTime().getTime()); cmd.setCmd_type(coCmd.getCommandType()); cmd.setDest(coCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { coCmd.getMemoryArea() })); diff --git a/src/ACUBL.properties b/src/ACUBL.properties index ae086d4..99e858d 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -46,7 +46,7 @@ #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2.START = 0500 #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 -YXL.ACU001.O2.WORDCOUNT = 24 +YXL.ACU001.O2.WORDCOUNT = 4 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2ALM.START = 0036 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -66,3 +66,22 @@ YXL.ACU001.HSALM.WORDCOUNT = 1 #\u786b\u5316\u6c22\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 YXL.ACU001.HSALM.BITCOUNT = 12 + +#\u7206\u7ba1\u6db2\u4f4d\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.YW.COUNT = 2 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.YWALM.START = 0025 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.YWALM.WORDCOUNT = 1 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.YWALM.BITCOUNT = 2 + +#\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.DS.COUNT = 15 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.DSALM.START = 0038 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.DSALM.WORDCOUNT = 3 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.DSALM.BITCOUNT = 45 + diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 5e6edbc..8d5ab08 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -16,12 +16,14 @@ import com.szpg.task.ReadCH4ValueTask; import com.szpg.task.ReadCOStatusTask; import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; import com.szpg.task.ReadHSStatusTask; import com.szpg.task.ReadHSValueTask; import com.szpg.task.ReadO2StatusTask; import com.szpg.task.ReadO2ValueTask; import com.szpg.task.ReadWSStatusTask; import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -30,11 +32,12 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.103", 6800); + // PLC设备地址和端口 + ACUClient client = new ACUClient("192.168.0.244", 6800); - client.setNet("00"); - client.setNode("6B"); - client.setUnit("00"); + client.setNet("00"); //网络号 + client.setNode("F4"); //节点号 + client.setUnit("00"); //单元号 // 3将ACU的信息加入到map中 ACUClientUtil.getInstance().addClient(client); @@ -44,33 +47,34 @@ // 测试发送查询甲烷参数命令 // dsc.testSendCH4Command(client); - // 测试发送查询甲烷报警状态命令 -// dsc.testSendCH4StatsuCommand(client); +// // 测试发送查询甲烷报警状态命令 +// dsc.testSendCH4StatusCommand(client); // 测试发送查询温湿度监测值命令 // dsc.testSendWSCommand(client); // 测试发送查询温湿度报警状态命令 // dsc.testSendWSStatusCommand(client); - // 测试发送查询一氧化碳参数命令 +// // 测试发送查询一氧化碳参数命令 // dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 +// // 测试发送查询一氧化碳报警状态命令 // dsc.testSendCOStatusCommand(client); - - // 测试发送查询一氧化碳参数命令 -// dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 -// dsc.testSendCOStatusCommand(client); - +// // 测试发送查询氧气参数命令 // dsc.testSendO2Command(client); // 测试发送查询氧气报警状态命令 // dsc.testSendO2StatusCommand(client); +// +// // 测试发送查询硫化氢参数命令 +// dsc.testSendHSCommand(client); +// // 测试发送查询硫化氢报警状态命令 +// dsc.testSendHSStatusCommand(client); - // 测试发送查询硫化氢参数命令 - dsc.testSendHSCommand(client); - // 测试发送查询硫化氢报警状态命令 - dsc.testSendHSStatusCommand(client); + // 测试发送查询爆管液位报警状态命令 + dsc.testSendYWStatusCommand(client); + + // 测试发送查询对射报警状态命令 +// dsc.testSendDSStatusCommand(client); } /** @@ -97,8 +101,9 @@ ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(client, ch4), 10, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -116,7 +121,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); ch4alm.setDestinationId(dest); - ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); @@ -124,8 +129,9 @@ ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4StatusTask(client, ch4alm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -153,8 +159,9 @@ ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSValueTask(client, ws), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -172,7 +179,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); wsalm.setDestinationId(dest); - wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); @@ -180,8 +187,9 @@ wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSStatusTask(client, wsalm), 25, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -208,8 +216,9 @@ co.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOValueTask(client, co), 30, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -227,7 +236,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); coalm.setDestinationId(dest); - coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); coalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.START")), 2)) + "00"); coalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.WORDCOUNT"))); @@ -235,8 +244,9 @@ coalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOStatusTask(client, coalm), 35, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -263,8 +273,9 @@ o2.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2ValueTask(client, o2), 40, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -282,7 +293,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); o2alm.setDestinationId(dest); - o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); o2alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.START")), 2)) + "00"); o2alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.WORDCOUNT"))); @@ -290,8 +301,9 @@ o2alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2StatusTask(client, o2alm), 45, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -318,8 +330,9 @@ hs.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSValueTask(client, hs), 50, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -337,7 +350,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); hsalm.setDestinationId(dest); - hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); hsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.START")), 2)) + "00"); hsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.WORDCOUNT"))); @@ -345,7 +358,65 @@ hsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSStatusTask(client, hsalm), 55, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询爆管液位报警状态命令 + * @param client + */ + public void testSendYWStatusCommand(ACUClient client) { + ReadMemoryCommand ywalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READYWSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ywalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ywalm.setDestinationId(dest); + + ywalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + ywalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.START")), 2)) + "00"); + ywalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.WORDCOUNT"))); + ywalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.BITCOUNT"))); + ywalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YW.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadYWStatusTask(client, ywalm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + + /** + * 发送查询对射报警状态命令 + * @param client + */ + public void testSendDSStatusCommand(ACUClient client) { + ReadMemoryCommand dsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READDSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + dsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + dsalm.setDestinationId(dest); + + dsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + dsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.START")), 2)) + "00"); + dsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.WORDCOUNT"))); + dsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.BITCOUNT"))); + dsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadDSStatusTask(client, dsalm), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index 70fb6dc..a9d5686 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -10,6 +10,7 @@ public PgAcuRdcmd findById(String id); public PgAcuRdcmd findLatestCmdByDestAndCount(String dest, int count); + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type); public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); diff --git a/src/com/szpg/db/dao/PgDSDao.java b/src/com/szpg/db/dao/PgDSDao.java new file mode 100644 index 0000000..b731af9 --- /dev/null +++ b/src/com/szpg/db/dao/PgDSDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgDSAlm; + +/** + * 对射报警相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgDSDao { + + /******** 对射报警状态 ********/ + public List findAllSbjz(); + public PgDSAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgDSAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/PgYWDao.java b/src/com/szpg/db/dao/PgYWDao.java new file mode 100644 index 0000000..bb27bbf --- /dev/null +++ b/src/com/szpg/db/dao/PgYWDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgYWAlm; + +/** + * 爆管液位相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgYWDao { + + /******** 爆管液位浓度报警状态 ********/ + public List findAllSbjz(); + public PgYWAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgYWAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index b693939..16b2285 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -114,6 +114,41 @@ } return null; } + + + @Override + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ACU_RDCMD WHERE RESPONSED='0' AND TIMEOUT='0' AND DEST=? AND CMD_TYPE=? ORDER BY TM DESC"; + Object[] params = new Object[2]; + params[0] = dest; + params[1] = type; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAcuRdcmd.class), params); + + if (null != list && list.isEmpty() == false) { + logger.debug("根据目的地址和命令类型查询内存读取命令成功[" + list.size() + "]"); + + return list.get(0); + } else + return null; + } catch (Exception ex) { + logger.error("根据目的地址和命令类型查询内存读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } @Override public int addCmdRecord(PgAcuRdcmd cmd) { diff --git a/src/com/szpg/db/dao/impl/PgDSDaoImpl.java b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java new file mode 100644 index 0000000..e9d18cd --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.data.PgDSAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgDSDaoImpl implements PgDSDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgDSAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(0); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询对射报警状态成功" + dsalm + "]"); + + return dsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgDSAlm dsalm) { + return addSbjzRecord(dsalm.getDsalm(), dsalm.getTmStr(), dsalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_DS_ALM " + + "(DSALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入对射报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入对射报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 657281c..7706852 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -39,6 +39,12 @@ case "HS": key = "%硫化氢%"; break; + case "YW": + key = "%液位%"; + break; + case "DS": + key = "%对射%"; + break; } String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '" + key + "' ORDER BY D.ID"; diff --git a/src/com/szpg/db/dao/impl/PgYWDaoImpl.java b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java new file mode 100644 index 0000000..613c4c0 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.data.PgYWAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgYWDaoImpl implements PgYWDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgYWAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(0); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询爆管液位报警状态成功" + ywalm + "]"); + + return ywalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgYWAlm ywalm) { + return addSbjzRecord(ywalm.getYwalm(), ywalm.getTmStr(), ywalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_YW_ALM " + + "(YWALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入爆管液位报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入爆管液位报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index f4ecfe5..2d46bfc 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -1,6 +1,8 @@ package com.szpg.db.data; +import java.util.Calendar; import java.util.Date; +import java.util.UUID; import com.szpg.util.TimeFormat; @@ -31,6 +33,11 @@ private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 + public PgAcuRdcmd() { + this.setId(UUID.randomUUID().toString().replace("-", "")); + this.setTm(Calendar.getInstance().getTime()); + } + public String getId() { return id; } diff --git a/src/com/szpg/db/data/PgDSAlm.java b/src/com/szpg/db/data/PgDSAlm.java new file mode 100644 index 0000000..86e28bb --- /dev/null +++ b/src/com/szpg/db/data/PgDSAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 对射报警状态数据表 + * + * @author admin + * + */ +public class PgDSAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = -8336945265752238748L; + + private Integer id; + private Boolean dsalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getDsalm() { + return dsalm; + } + + public void setDsalm(Boolean dsalm) { + this.dsalm = dsalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgDSAlm[dsalm=" + dsalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/data/PgYWAlm.java b/src/com/szpg/db/data/PgYWAlm.java new file mode 100644 index 0000000..9d9572f --- /dev/null +++ b/src/com/szpg/db/data/PgYWAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 爆管液位浓度报警状态数据表 + * + * @author admin + * + */ +public class PgYWAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 3882791834818808488L; + + private Integer id; + private Boolean ywalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getYwalm() { + return ywalm; + } + + public void setYwalm(Boolean ywalm) { + this.ywalm = ywalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgYWAlm[ywalm=" + ywalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/plc/message/AppMessageConstants.java b/src/com/szpg/plc/message/AppMessageConstants.java index 25db6ab..1c84086 100644 --- a/src/com/szpg/plc/message/AppMessageConstants.java +++ b/src/com/szpg/plc/message/AppMessageConstants.java @@ -13,4 +13,7 @@ public final static String CMD_TYPE_READO2STATUS = "17"; //读取氧气报警状态命令 public final static String CMD_TYPE_READHSVALUE = "18"; //读取硫化氢监测值命令 public final static String CMD_TYPE_READHSSTATUS = "19"; //读取硫化氢报警状态命令 + + public final static String CMD_TYPE_READYWSTATUS = "21"; //读取爆管液位报警状态命令 + public final static String CMD_TYPE_READDSSTATUS = "22"; //读取对射报警状态命令 } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index acf2859..3678a16 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -5,12 +5,14 @@ import com.szpg.plc.message.command.read.ReadCH4ValueCommand; import com.szpg.plc.message.command.read.ReadCOStatusCommand; import com.szpg.plc.message.command.read.ReadCOValueCommand; +import com.szpg.plc.message.command.read.ReadDSStatusCommand; import com.szpg.plc.message.command.read.ReadHSStatusCommand; import com.szpg.plc.message.command.read.ReadHSValueCommand; import com.szpg.plc.message.command.read.ReadO2StatusCommand; import com.szpg.plc.message.command.read.ReadO2ValueCommand; import com.szpg.plc.message.command.read.ReadWSStatusCommand; import com.szpg.plc.message.command.read.ReadWSValueCommand; +import com.szpg.plc.message.command.read.ReadYWStatusCommand; import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -101,6 +103,12 @@ return new ReadHSValueCommand(); case AppMessageConstants.CMD_TYPE_READHSSTATUS: return new ReadHSStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + return new ReadYWStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + return new ReadDSStatusCommand(); default: return null; diff --git a/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java new file mode 100644 index 0000000..eda271f --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; + +public class ReadDSStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = -1668388238102375069L; + + @Override + public Class getResponseClass() { + return ReadDSStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询对射报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READDSSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java new file mode 100644 index 0000000..73c54b3 --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; + +public class ReadYWStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 1019982176997717896L; + + @Override + public Class getResponseClass() { + return ReadYWStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询爆管液位报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READYWSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java new file mode 100644 index 0000000..e2b476b --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java @@ -0,0 +1,57 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgDSDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadDSStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 4047613496835657828L; + + private List dsbj; // 对射报警状态 + + public ReadDSStatusCommandResponse() { + dsbj = new ArrayList(); + } + + public List getDsbj() { + return dsbj; + } + + public void setDsbj(List dsbj) { + this.dsbj = dsbj; + } + + @Override + public void afterAction() { + // 1将对射报警数据存入数据库 + PgDSDao dsDao = new PgDSDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findDeviceIdByDestAndType(this.getMessageProducerId(), "DS"); + + for (int i = 0; i < dsbj.size(); i++) { + if (i < ids.size()) { + dsDao.addSbjzRecord(dsbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (dsbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + + } + } + } + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java new file mode 100644 index 0000000..c2674f2 --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java @@ -0,0 +1,57 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgYWDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadYWStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 8088340048416088978L; + + private List ywbj; // 爆管液位报警状态 + + public ReadYWStatusCommandResponse() { + ywbj = new ArrayList(); + } + + public List getYwbj() { + return ywbj; + } + + public void setYwbj(List ywbj) { + this.ywbj = ywbj; + } + + @Override + public void afterAction() { + // 1将爆管液位浓度数据存入数据库 + PgYWDao ywDao = new PgYWDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findDeviceIdByDestAndType(this.getMessageProducerId(), "YW"); + + for (int i = 0; i < ywbj.size(); i++) { + if (i < ids.size()) { + ywDao.addSbjzRecord(ywbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (ywbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + + } + } + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSConstants.java b/src/com/szpg/plc/protocol/fins/FINSConstants.java index 2697e74..f565b8b 100644 --- a/src/com/szpg/plc/protocol/fins/FINSConstants.java +++ b/src/com/szpg/plc/protocol/fins/FINSConstants.java @@ -21,7 +21,8 @@ /******** 内存区域代码 ********/ public final static byte MEMORY_DM_AREA = (byte) 0x82; //82内存D区代码 - public final static byte MEMORY_WORK_AREA = 0x31; //31内存W区代码 + public final static byte MEMORY_WORK_AREA_WORD = (byte) 0xB1; //B1内存W区代码(按字操作) + public final static byte MEMORY_WORK_AREA_BIT = 0x31; //31内存W区代码(按位操作) /******** 控制域 ********/ public final static byte ICF_COMMAND = (byte) 0x80; //ICF字节代表命令 diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index a11ae12..a65488e 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -19,12 +19,14 @@ import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; import com.szpg.plc.protocol.DTProtocolInterface; import com.szpg.plc.protocol.fins.frame.FINSByteFrame; import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; @@ -115,19 +117,18 @@ // 读写命令的响应 if (commandStr.equalsIgnoreCase("00000002")) { String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); + String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 if (commandCode.equalsIgnoreCase("0101")) { // 读内存命令响应的解析 // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - int count = FINSByteFrameTool.getDataWithoutEndCode(byteMessage).length / 2; //1WORD=2BYTE +// int count = FINSByteFrameTool.getDataWithoutEndCode(byteMessage).length / 2; //1WORD=2BYTE // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 PgAcuRdcmdDao readCmdDao = new PgAcuRdcmdDaoImpl(); - PgAcuRdcmd readCmd = readCmdDao.findLatestCmdByDestAndCount(dest, count); + PgAcuRdcmd readCmd = readCmdDao.findLatestCmdByDestAndType(dest, commandType); if (null != readCmd) { - String commandType = readCmd.getCmd_type(); - // 3根据参数类型调用相应的方法进行解析 switch(commandType) { case AppMessageConstants.CMD_TYPE_READCH4VALUE: @@ -164,6 +165,14 @@ case AppMessageConstants.CMD_TYPE_READHSSTATUS: received = bytesToReadHSStatusCommandResponse(finsFrame, readCmd); break; + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + received = bytesToReadYWStatusCommandResponse(finsFrame, readCmd); + break; + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + received = bytesToReadDSStatusCommandResponse(finsFrame, readCmd); + break; } // 4将已响应的命令删除 @@ -260,7 +269,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int chct = cmd.getCount_sensor(); //甲烷监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < chct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -402,7 +417,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int chct = cmd.getCount_sensor(); //一氧化碳监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < chct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -462,7 +483,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int o2ct = cmd.getCount_sensor(); //氧气监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < o2ct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -522,7 +549,12 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int hsct = cmd.getCount_sensor(); //硫化氢监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } for (int i = 0; i < hsct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -534,6 +566,69 @@ return rhscr; } + + /** + * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int ysct = cmd.getCount_sensor(); //爆管液位监测点的数量 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < ysct; i++) { + char bjBit = dataStr.charAt(dataStr.length() - i - 1); + + ryscr.getYwbj().add(bjBit == '1' ? true : false); + } + } + + return ryscr; + } + + /** + * 将查询对射报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int dsct = cmd.getCount_sensor(); //对射监测点的数量 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + + for (int i = 0; i < dsct; i++) { + char bjBit = dataStr.charAt(dataStr.length() - i * 3 - 1); + + rdscr.getDsbj().add(bjBit == '1' ? true : false); + } + } + + return rdscr; + } /** * 将消息对象解析为字节数组 @@ -601,6 +696,7 @@ FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), message.getMessageProducerId(), + message.getCommandType(), message.getMemoryArea(), start, message.getCountWord()); diff --git a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java index 639359e..94540d4 100644 --- a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java +++ b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java @@ -135,12 +135,13 @@ * * @param dest 目标地址 * @param sour 源地址 + * @param sid 服务号 * @param memArea 内存区域代码 * @param start 读取的起始地址 * @param count 读取的长度(以word计,长度为2个字节) */ - public FINSByteFrame(String dest, String sour, byte memArea, byte[] start, int count) { - this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour); // 构造控制域 + public FINSByteFrame(String dest, String sour, String sid, byte memArea, byte[] start, int count) { + this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour, sid); // 构造控制域 // 设置读取内存命令的发送命令功能码00000002 this.COMMAND = FINSConstants.COMMAND_COMMAND; @@ -168,13 +169,14 @@ * * @param dest * @param sour + * @param sid * @param memArea * @param start * @param count * @param dataBody */ - public FINSByteFrame(String dest, String sour, byte memArea, byte[] start, int count, byte[] dataBody) { - this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour); // 构造控制域 + public FINSByteFrame(String dest, String sour, String sid, byte memArea, byte[] start, int count, byte[] dataBody) { + this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour, sid); // 构造控制域 // 构造用户数据域的内容 Bytes data = new Bytes(); diff --git a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java index 10be9db..c992b06 100644 --- a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java +++ b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java @@ -144,6 +144,20 @@ } /** + * 获取SID号,作为命令类型使用 + * @param finsBytes + * @return + */ + public static String getControlSID(byte[] finsBytes) { + byte[] text = getText(finsBytes); + + if (null != text && text.length > 10) + return ByteUtil.binToHexString(new byte[] {text[9]}); + else + return "00"; + } + + /** * 获取命令代码 * 0x0101=读取内存,0x0102=写内存 * @@ -228,9 +242,10 @@ * * @param dest 目标地址:网络号+节点号+单元号 * @param sour 源地址:网络号+节点号+单元号 + * @param sid 服务号:用于标识命令类型 * @return */ - public static byte[] buildFrameControl(String dest, String sour) { + public static byte[] buildFrameControl(String dest, String sour, String sid) { byte[] control = new byte[10]; // 命令类型位固定为1,需要响应标志位固定为0,表示从上位机发送给PLC端的消息,需要PLC响应 @@ -249,7 +264,8 @@ control[7] = sourByte[1]; //源节点号 control[8] = sourByte[2]; //源单元号 - control[9] = FINSConstants.SID; // SID字节 +// control[9] = FINSConstants.SID; // SID字节 + control[9] = ByteUtil.hexStringToBytes(sid, 1)[0]; return control; } diff --git a/src/com/szpg/plc/server/ACUClientHandler.java b/src/com/szpg/plc/server/ACUClientHandler.java index b3d7bc9..d7649fd 100644 --- a/src/com/szpg/plc/server/ACUClientHandler.java +++ b/src/com/szpg/plc/server/ACUClientHandler.java @@ -13,6 +13,7 @@ import com.szpg.plc.protocol.ProtocolFactory; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACULinkTask; +import com.szpg.util.Configure; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -36,13 +37,14 @@ // 2生成LinkCommand对象并解析成byte数组 LinkCommand lc = new LinkCommand(); - lc.setMessageProducerId(ByteUtil.binToHexString(ByteUtil.hexStringToBytes(client.getNode(), 4))); +// lc.setMessageProducerId(ByteUtil.binToHexString(ByteUtil.hexStringToBytes(client.getNode(), 4))); + lc.setMessageProducerId(ByteUtil.binToHexString(ByteUtil.hexStringToBytes(Configure.getProperty("sys", "LOCALHOST.NODE"), 4))); byte[] lcBytes = finspi.messageToBytes(lc); // 3延迟10秒发送握手命令 ScheduledExecutorService linkSche = new ScheduledThreadPoolExecutor(1); - linkSche.schedule(new ACULinkTask(client, lcBytes), 10, TimeUnit.SECONDS); + linkSche.schedule(new ACULinkTask(client, lcBytes), 5, TimeUnit.SECONDS); linkSche.shutdown(); //执行完任务之后关闭线程 } } @@ -66,9 +68,10 @@ // 解析消息 AppMessage message = finspi.bytesToMessage((byte[]) bytesList.get(i)); - - // 命令解析后处理 - message.afterAction(); + if (null != message) { + // 命令解析后处理 + message.afterAction(); + } } } diff --git a/src/com/szpg/task/ReadCH4StatusTask.java b/src/com/szpg/task/ReadCH4StatusTask.java index 11b33b4..d861d8b 100644 --- a/src/com/szpg/task/ReadCH4StatusTask.java +++ b/src/com/szpg/task/ReadCH4StatusTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(ch4AlmCmd.getId()); - cmd.setTm(ch4AlmCmd.getTime().getTime()); cmd.setCmd_type(ch4AlmCmd.getCommandType()); cmd.setDest(ch4AlmCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { ch4AlmCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadCH4ValueTask.java b/src/com/szpg/task/ReadCH4ValueTask.java index 73d957f..4cb658e 100644 --- a/src/com/szpg/task/ReadCH4ValueTask.java +++ b/src/com/szpg/task/ReadCH4ValueTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(ch4Cmd.getId()); - cmd.setTm(ch4Cmd.getTime().getTime()); cmd.setCmd_type(ch4Cmd.getCommandType()); cmd.setDest(ch4Cmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { ch4Cmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadCOStatusTask.java b/src/com/szpg/task/ReadCOStatusTask.java index 11eca56..c01765c 100644 --- a/src/com/szpg/task/ReadCOStatusTask.java +++ b/src/com/szpg/task/ReadCOStatusTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(coAlmCmd.getId()); - cmd.setTm(coAlmCmd.getTime().getTime()); cmd.setCmd_type(coAlmCmd.getCommandType()); cmd.setDest(coAlmCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { coAlmCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadCOValueTask.java b/src/com/szpg/task/ReadCOValueTask.java index 6ff413e..76b9a1b 100644 --- a/src/com/szpg/task/ReadCOValueTask.java +++ b/src/com/szpg/task/ReadCOValueTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(coCmd.getId()); - cmd.setTm(coCmd.getTime().getTime()); cmd.setCmd_type(coCmd.getCommandType()); cmd.setDest(coCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { coCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadDSStatusTask.java b/src/com/szpg/task/ReadDSStatusTask.java new file mode 100644 index 0000000..2437096 --- /dev/null +++ b/src/com/szpg/task/ReadDSStatusTask.java @@ -0,0 +1,47 @@ +package com.szpg.task; + +import com.szpg.db.dao.impl.PgAcuRdcmdDaoImpl; +import com.szpg.db.data.PgAcuRdcmd; +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.command.read.ReadDSStatusCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; + +public class ReadDSStatusTask implements Runnable { + + private ACUClient client; + private AppCommand appCommand; + + public ReadDSStatusTask(ACUClient client, AppCommand command) { + this.client = client; + this.appCommand = command; + } + + @Override + public void run() { + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(appCommand); + + // 发送读取对射报警状态内存命令 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + ReadDSStatusCommand dsAlmCmd = (ReadDSStatusCommand) appCommand; + + // 发送完成之后将命令保存在数据库中 + PgAcuRdcmd cmd = new PgAcuRdcmd(); + cmd.setCmd_type(dsAlmCmd.getCommandType()); + cmd.setDest(dsAlmCmd.getDestinationId()); + cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { dsAlmCmd.getMemoryArea() })); + cmd.setStart_mem_word(dsAlmCmd.getStartAddress().substring(0, 4)); + cmd.setStart_mem_bit(dsAlmCmd.getStartAddress().substring(4)); + cmd.setCount_word(dsAlmCmd.getCountWord()); + cmd.setCount_bit(dsAlmCmd.getCountBit()); + cmd.setCount_sensor(dsAlmCmd.getCountSensor()); + + new PgAcuRdcmdDaoImpl().addCmdRecord(cmd); + } + +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index ae086d4..99e858d 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -46,7 +46,7 @@ #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2.START = 0500 #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 -YXL.ACU001.O2.WORDCOUNT = 24 +YXL.ACU001.O2.WORDCOUNT = 4 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2ALM.START = 0036 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -66,3 +66,22 @@ YXL.ACU001.HSALM.WORDCOUNT = 1 #\u786b\u5316\u6c22\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 YXL.ACU001.HSALM.BITCOUNT = 12 + +#\u7206\u7ba1\u6db2\u4f4d\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.YW.COUNT = 2 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.YWALM.START = 0025 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.YWALM.WORDCOUNT = 1 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.YWALM.BITCOUNT = 2 + +#\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.DS.COUNT = 15 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.DSALM.START = 0038 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.DSALM.WORDCOUNT = 3 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.DSALM.BITCOUNT = 45 + diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 5e6edbc..8d5ab08 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -16,12 +16,14 @@ import com.szpg.task.ReadCH4ValueTask; import com.szpg.task.ReadCOStatusTask; import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; import com.szpg.task.ReadHSStatusTask; import com.szpg.task.ReadHSValueTask; import com.szpg.task.ReadO2StatusTask; import com.szpg.task.ReadO2ValueTask; import com.szpg.task.ReadWSStatusTask; import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -30,11 +32,12 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.103", 6800); + // PLC设备地址和端口 + ACUClient client = new ACUClient("192.168.0.244", 6800); - client.setNet("00"); - client.setNode("6B"); - client.setUnit("00"); + client.setNet("00"); //网络号 + client.setNode("F4"); //节点号 + client.setUnit("00"); //单元号 // 3将ACU的信息加入到map中 ACUClientUtil.getInstance().addClient(client); @@ -44,33 +47,34 @@ // 测试发送查询甲烷参数命令 // dsc.testSendCH4Command(client); - // 测试发送查询甲烷报警状态命令 -// dsc.testSendCH4StatsuCommand(client); +// // 测试发送查询甲烷报警状态命令 +// dsc.testSendCH4StatusCommand(client); // 测试发送查询温湿度监测值命令 // dsc.testSendWSCommand(client); // 测试发送查询温湿度报警状态命令 // dsc.testSendWSStatusCommand(client); - // 测试发送查询一氧化碳参数命令 +// // 测试发送查询一氧化碳参数命令 // dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 +// // 测试发送查询一氧化碳报警状态命令 // dsc.testSendCOStatusCommand(client); - - // 测试发送查询一氧化碳参数命令 -// dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 -// dsc.testSendCOStatusCommand(client); - +// // 测试发送查询氧气参数命令 // dsc.testSendO2Command(client); // 测试发送查询氧气报警状态命令 // dsc.testSendO2StatusCommand(client); +// +// // 测试发送查询硫化氢参数命令 +// dsc.testSendHSCommand(client); +// // 测试发送查询硫化氢报警状态命令 +// dsc.testSendHSStatusCommand(client); - // 测试发送查询硫化氢参数命令 - dsc.testSendHSCommand(client); - // 测试发送查询硫化氢报警状态命令 - dsc.testSendHSStatusCommand(client); + // 测试发送查询爆管液位报警状态命令 + dsc.testSendYWStatusCommand(client); + + // 测试发送查询对射报警状态命令 +// dsc.testSendDSStatusCommand(client); } /** @@ -97,8 +101,9 @@ ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(client, ch4), 10, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -116,7 +121,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); ch4alm.setDestinationId(dest); - ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); @@ -124,8 +129,9 @@ ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4StatusTask(client, ch4alm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -153,8 +159,9 @@ ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSValueTask(client, ws), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -172,7 +179,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); wsalm.setDestinationId(dest); - wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); @@ -180,8 +187,9 @@ wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSStatusTask(client, wsalm), 25, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -208,8 +216,9 @@ co.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOValueTask(client, co), 30, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -227,7 +236,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); coalm.setDestinationId(dest); - coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); coalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.START")), 2)) + "00"); coalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.WORDCOUNT"))); @@ -235,8 +244,9 @@ coalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOStatusTask(client, coalm), 35, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -263,8 +273,9 @@ o2.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2ValueTask(client, o2), 40, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -282,7 +293,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); o2alm.setDestinationId(dest); - o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); o2alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.START")), 2)) + "00"); o2alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.WORDCOUNT"))); @@ -290,8 +301,9 @@ o2alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2StatusTask(client, o2alm), 45, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -318,8 +330,9 @@ hs.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSValueTask(client, hs), 50, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -337,7 +350,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); hsalm.setDestinationId(dest); - hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); hsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.START")), 2)) + "00"); hsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.WORDCOUNT"))); @@ -345,7 +358,65 @@ hsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSStatusTask(client, hsalm), 55, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询爆管液位报警状态命令 + * @param client + */ + public void testSendYWStatusCommand(ACUClient client) { + ReadMemoryCommand ywalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READYWSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ywalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ywalm.setDestinationId(dest); + + ywalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + ywalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.START")), 2)) + "00"); + ywalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.WORDCOUNT"))); + ywalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.BITCOUNT"))); + ywalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YW.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadYWStatusTask(client, ywalm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + + /** + * 发送查询对射报警状态命令 + * @param client + */ + public void testSendDSStatusCommand(ACUClient client) { + ReadMemoryCommand dsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READDSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + dsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + dsalm.setDestinationId(dest); + + dsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + dsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.START")), 2)) + "00"); + dsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.WORDCOUNT"))); + dsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.BITCOUNT"))); + dsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadDSStatusTask(client, dsalm), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index 70fb6dc..a9d5686 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -10,6 +10,7 @@ public PgAcuRdcmd findById(String id); public PgAcuRdcmd findLatestCmdByDestAndCount(String dest, int count); + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type); public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); diff --git a/src/com/szpg/db/dao/PgDSDao.java b/src/com/szpg/db/dao/PgDSDao.java new file mode 100644 index 0000000..b731af9 --- /dev/null +++ b/src/com/szpg/db/dao/PgDSDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgDSAlm; + +/** + * 对射报警相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgDSDao { + + /******** 对射报警状态 ********/ + public List findAllSbjz(); + public PgDSAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgDSAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/PgYWDao.java b/src/com/szpg/db/dao/PgYWDao.java new file mode 100644 index 0000000..bb27bbf --- /dev/null +++ b/src/com/szpg/db/dao/PgYWDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgYWAlm; + +/** + * 爆管液位相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgYWDao { + + /******** 爆管液位浓度报警状态 ********/ + public List findAllSbjz(); + public PgYWAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgYWAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index b693939..16b2285 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -114,6 +114,41 @@ } return null; } + + + @Override + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ACU_RDCMD WHERE RESPONSED='0' AND TIMEOUT='0' AND DEST=? AND CMD_TYPE=? ORDER BY TM DESC"; + Object[] params = new Object[2]; + params[0] = dest; + params[1] = type; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAcuRdcmd.class), params); + + if (null != list && list.isEmpty() == false) { + logger.debug("根据目的地址和命令类型查询内存读取命令成功[" + list.size() + "]"); + + return list.get(0); + } else + return null; + } catch (Exception ex) { + logger.error("根据目的地址和命令类型查询内存读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } @Override public int addCmdRecord(PgAcuRdcmd cmd) { diff --git a/src/com/szpg/db/dao/impl/PgDSDaoImpl.java b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java new file mode 100644 index 0000000..e9d18cd --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.data.PgDSAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgDSDaoImpl implements PgDSDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgDSAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(0); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询对射报警状态成功" + dsalm + "]"); + + return dsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgDSAlm dsalm) { + return addSbjzRecord(dsalm.getDsalm(), dsalm.getTmStr(), dsalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_DS_ALM " + + "(DSALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入对射报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入对射报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 657281c..7706852 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -39,6 +39,12 @@ case "HS": key = "%硫化氢%"; break; + case "YW": + key = "%液位%"; + break; + case "DS": + key = "%对射%"; + break; } String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '" + key + "' ORDER BY D.ID"; diff --git a/src/com/szpg/db/dao/impl/PgYWDaoImpl.java b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java new file mode 100644 index 0000000..613c4c0 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.data.PgYWAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgYWDaoImpl implements PgYWDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgYWAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(0); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询爆管液位报警状态成功" + ywalm + "]"); + + return ywalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgYWAlm ywalm) { + return addSbjzRecord(ywalm.getYwalm(), ywalm.getTmStr(), ywalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_YW_ALM " + + "(YWALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入爆管液位报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入爆管液位报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index f4ecfe5..2d46bfc 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -1,6 +1,8 @@ package com.szpg.db.data; +import java.util.Calendar; import java.util.Date; +import java.util.UUID; import com.szpg.util.TimeFormat; @@ -31,6 +33,11 @@ private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 + public PgAcuRdcmd() { + this.setId(UUID.randomUUID().toString().replace("-", "")); + this.setTm(Calendar.getInstance().getTime()); + } + public String getId() { return id; } diff --git a/src/com/szpg/db/data/PgDSAlm.java b/src/com/szpg/db/data/PgDSAlm.java new file mode 100644 index 0000000..86e28bb --- /dev/null +++ b/src/com/szpg/db/data/PgDSAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 对射报警状态数据表 + * + * @author admin + * + */ +public class PgDSAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = -8336945265752238748L; + + private Integer id; + private Boolean dsalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getDsalm() { + return dsalm; + } + + public void setDsalm(Boolean dsalm) { + this.dsalm = dsalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgDSAlm[dsalm=" + dsalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/data/PgYWAlm.java b/src/com/szpg/db/data/PgYWAlm.java new file mode 100644 index 0000000..9d9572f --- /dev/null +++ b/src/com/szpg/db/data/PgYWAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 爆管液位浓度报警状态数据表 + * + * @author admin + * + */ +public class PgYWAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 3882791834818808488L; + + private Integer id; + private Boolean ywalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getYwalm() { + return ywalm; + } + + public void setYwalm(Boolean ywalm) { + this.ywalm = ywalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgYWAlm[ywalm=" + ywalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/plc/message/AppMessageConstants.java b/src/com/szpg/plc/message/AppMessageConstants.java index 25db6ab..1c84086 100644 --- a/src/com/szpg/plc/message/AppMessageConstants.java +++ b/src/com/szpg/plc/message/AppMessageConstants.java @@ -13,4 +13,7 @@ public final static String CMD_TYPE_READO2STATUS = "17"; //读取氧气报警状态命令 public final static String CMD_TYPE_READHSVALUE = "18"; //读取硫化氢监测值命令 public final static String CMD_TYPE_READHSSTATUS = "19"; //读取硫化氢报警状态命令 + + public final static String CMD_TYPE_READYWSTATUS = "21"; //读取爆管液位报警状态命令 + public final static String CMD_TYPE_READDSSTATUS = "22"; //读取对射报警状态命令 } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index acf2859..3678a16 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -5,12 +5,14 @@ import com.szpg.plc.message.command.read.ReadCH4ValueCommand; import com.szpg.plc.message.command.read.ReadCOStatusCommand; import com.szpg.plc.message.command.read.ReadCOValueCommand; +import com.szpg.plc.message.command.read.ReadDSStatusCommand; import com.szpg.plc.message.command.read.ReadHSStatusCommand; import com.szpg.plc.message.command.read.ReadHSValueCommand; import com.szpg.plc.message.command.read.ReadO2StatusCommand; import com.szpg.plc.message.command.read.ReadO2ValueCommand; import com.szpg.plc.message.command.read.ReadWSStatusCommand; import com.szpg.plc.message.command.read.ReadWSValueCommand; +import com.szpg.plc.message.command.read.ReadYWStatusCommand; import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -101,6 +103,12 @@ return new ReadHSValueCommand(); case AppMessageConstants.CMD_TYPE_READHSSTATUS: return new ReadHSStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + return new ReadYWStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + return new ReadDSStatusCommand(); default: return null; diff --git a/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java new file mode 100644 index 0000000..eda271f --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; + +public class ReadDSStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = -1668388238102375069L; + + @Override + public Class getResponseClass() { + return ReadDSStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询对射报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READDSSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java new file mode 100644 index 0000000..73c54b3 --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; + +public class ReadYWStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 1019982176997717896L; + + @Override + public Class getResponseClass() { + return ReadYWStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询爆管液位报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READYWSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java new file mode 100644 index 0000000..e2b476b --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java @@ -0,0 +1,57 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgDSDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadDSStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 4047613496835657828L; + + private List dsbj; // 对射报警状态 + + public ReadDSStatusCommandResponse() { + dsbj = new ArrayList(); + } + + public List getDsbj() { + return dsbj; + } + + public void setDsbj(List dsbj) { + this.dsbj = dsbj; + } + + @Override + public void afterAction() { + // 1将对射报警数据存入数据库 + PgDSDao dsDao = new PgDSDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findDeviceIdByDestAndType(this.getMessageProducerId(), "DS"); + + for (int i = 0; i < dsbj.size(); i++) { + if (i < ids.size()) { + dsDao.addSbjzRecord(dsbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (dsbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + + } + } + } + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java new file mode 100644 index 0000000..c2674f2 --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java @@ -0,0 +1,57 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgYWDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadYWStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 8088340048416088978L; + + private List ywbj; // 爆管液位报警状态 + + public ReadYWStatusCommandResponse() { + ywbj = new ArrayList(); + } + + public List getYwbj() { + return ywbj; + } + + public void setYwbj(List ywbj) { + this.ywbj = ywbj; + } + + @Override + public void afterAction() { + // 1将爆管液位浓度数据存入数据库 + PgYWDao ywDao = new PgYWDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findDeviceIdByDestAndType(this.getMessageProducerId(), "YW"); + + for (int i = 0; i < ywbj.size(); i++) { + if (i < ids.size()) { + ywDao.addSbjzRecord(ywbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (ywbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + + } + } + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSConstants.java b/src/com/szpg/plc/protocol/fins/FINSConstants.java index 2697e74..f565b8b 100644 --- a/src/com/szpg/plc/protocol/fins/FINSConstants.java +++ b/src/com/szpg/plc/protocol/fins/FINSConstants.java @@ -21,7 +21,8 @@ /******** 内存区域代码 ********/ public final static byte MEMORY_DM_AREA = (byte) 0x82; //82内存D区代码 - public final static byte MEMORY_WORK_AREA = 0x31; //31内存W区代码 + public final static byte MEMORY_WORK_AREA_WORD = (byte) 0xB1; //B1内存W区代码(按字操作) + public final static byte MEMORY_WORK_AREA_BIT = 0x31; //31内存W区代码(按位操作) /******** 控制域 ********/ public final static byte ICF_COMMAND = (byte) 0x80; //ICF字节代表命令 diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index a11ae12..a65488e 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -19,12 +19,14 @@ import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; import com.szpg.plc.protocol.DTProtocolInterface; import com.szpg.plc.protocol.fins.frame.FINSByteFrame; import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; @@ -115,19 +117,18 @@ // 读写命令的响应 if (commandStr.equalsIgnoreCase("00000002")) { String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); + String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 if (commandCode.equalsIgnoreCase("0101")) { // 读内存命令响应的解析 // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - int count = FINSByteFrameTool.getDataWithoutEndCode(byteMessage).length / 2; //1WORD=2BYTE +// int count = FINSByteFrameTool.getDataWithoutEndCode(byteMessage).length / 2; //1WORD=2BYTE // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 PgAcuRdcmdDao readCmdDao = new PgAcuRdcmdDaoImpl(); - PgAcuRdcmd readCmd = readCmdDao.findLatestCmdByDestAndCount(dest, count); + PgAcuRdcmd readCmd = readCmdDao.findLatestCmdByDestAndType(dest, commandType); if (null != readCmd) { - String commandType = readCmd.getCmd_type(); - // 3根据参数类型调用相应的方法进行解析 switch(commandType) { case AppMessageConstants.CMD_TYPE_READCH4VALUE: @@ -164,6 +165,14 @@ case AppMessageConstants.CMD_TYPE_READHSSTATUS: received = bytesToReadHSStatusCommandResponse(finsFrame, readCmd); break; + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + received = bytesToReadYWStatusCommandResponse(finsFrame, readCmd); + break; + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + received = bytesToReadDSStatusCommandResponse(finsFrame, readCmd); + break; } // 4将已响应的命令删除 @@ -260,7 +269,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int chct = cmd.getCount_sensor(); //甲烷监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < chct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -402,7 +417,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int chct = cmd.getCount_sensor(); //一氧化碳监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < chct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -462,7 +483,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int o2ct = cmd.getCount_sensor(); //氧气监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < o2ct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -522,7 +549,12 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int hsct = cmd.getCount_sensor(); //硫化氢监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } for (int i = 0; i < hsct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -534,6 +566,69 @@ return rhscr; } + + /** + * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int ysct = cmd.getCount_sensor(); //爆管液位监测点的数量 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < ysct; i++) { + char bjBit = dataStr.charAt(dataStr.length() - i - 1); + + ryscr.getYwbj().add(bjBit == '1' ? true : false); + } + } + + return ryscr; + } + + /** + * 将查询对射报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int dsct = cmd.getCount_sensor(); //对射监测点的数量 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + + for (int i = 0; i < dsct; i++) { + char bjBit = dataStr.charAt(dataStr.length() - i * 3 - 1); + + rdscr.getDsbj().add(bjBit == '1' ? true : false); + } + } + + return rdscr; + } /** * 将消息对象解析为字节数组 @@ -601,6 +696,7 @@ FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), message.getMessageProducerId(), + message.getCommandType(), message.getMemoryArea(), start, message.getCountWord()); diff --git a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java index 639359e..94540d4 100644 --- a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java +++ b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java @@ -135,12 +135,13 @@ * * @param dest 目标地址 * @param sour 源地址 + * @param sid 服务号 * @param memArea 内存区域代码 * @param start 读取的起始地址 * @param count 读取的长度(以word计,长度为2个字节) */ - public FINSByteFrame(String dest, String sour, byte memArea, byte[] start, int count) { - this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour); // 构造控制域 + public FINSByteFrame(String dest, String sour, String sid, byte memArea, byte[] start, int count) { + this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour, sid); // 构造控制域 // 设置读取内存命令的发送命令功能码00000002 this.COMMAND = FINSConstants.COMMAND_COMMAND; @@ -168,13 +169,14 @@ * * @param dest * @param sour + * @param sid * @param memArea * @param start * @param count * @param dataBody */ - public FINSByteFrame(String dest, String sour, byte memArea, byte[] start, int count, byte[] dataBody) { - this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour); // 构造控制域 + public FINSByteFrame(String dest, String sour, String sid, byte memArea, byte[] start, int count, byte[] dataBody) { + this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour, sid); // 构造控制域 // 构造用户数据域的内容 Bytes data = new Bytes(); diff --git a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java index 10be9db..c992b06 100644 --- a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java +++ b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java @@ -144,6 +144,20 @@ } /** + * 获取SID号,作为命令类型使用 + * @param finsBytes + * @return + */ + public static String getControlSID(byte[] finsBytes) { + byte[] text = getText(finsBytes); + + if (null != text && text.length > 10) + return ByteUtil.binToHexString(new byte[] {text[9]}); + else + return "00"; + } + + /** * 获取命令代码 * 0x0101=读取内存,0x0102=写内存 * @@ -228,9 +242,10 @@ * * @param dest 目标地址:网络号+节点号+单元号 * @param sour 源地址:网络号+节点号+单元号 + * @param sid 服务号:用于标识命令类型 * @return */ - public static byte[] buildFrameControl(String dest, String sour) { + public static byte[] buildFrameControl(String dest, String sour, String sid) { byte[] control = new byte[10]; // 命令类型位固定为1,需要响应标志位固定为0,表示从上位机发送给PLC端的消息,需要PLC响应 @@ -249,7 +264,8 @@ control[7] = sourByte[1]; //源节点号 control[8] = sourByte[2]; //源单元号 - control[9] = FINSConstants.SID; // SID字节 +// control[9] = FINSConstants.SID; // SID字节 + control[9] = ByteUtil.hexStringToBytes(sid, 1)[0]; return control; } diff --git a/src/com/szpg/plc/server/ACUClientHandler.java b/src/com/szpg/plc/server/ACUClientHandler.java index b3d7bc9..d7649fd 100644 --- a/src/com/szpg/plc/server/ACUClientHandler.java +++ b/src/com/szpg/plc/server/ACUClientHandler.java @@ -13,6 +13,7 @@ import com.szpg.plc.protocol.ProtocolFactory; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACULinkTask; +import com.szpg.util.Configure; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -36,13 +37,14 @@ // 2生成LinkCommand对象并解析成byte数组 LinkCommand lc = new LinkCommand(); - lc.setMessageProducerId(ByteUtil.binToHexString(ByteUtil.hexStringToBytes(client.getNode(), 4))); +// lc.setMessageProducerId(ByteUtil.binToHexString(ByteUtil.hexStringToBytes(client.getNode(), 4))); + lc.setMessageProducerId(ByteUtil.binToHexString(ByteUtil.hexStringToBytes(Configure.getProperty("sys", "LOCALHOST.NODE"), 4))); byte[] lcBytes = finspi.messageToBytes(lc); // 3延迟10秒发送握手命令 ScheduledExecutorService linkSche = new ScheduledThreadPoolExecutor(1); - linkSche.schedule(new ACULinkTask(client, lcBytes), 10, TimeUnit.SECONDS); + linkSche.schedule(new ACULinkTask(client, lcBytes), 5, TimeUnit.SECONDS); linkSche.shutdown(); //执行完任务之后关闭线程 } } @@ -66,9 +68,10 @@ // 解析消息 AppMessage message = finspi.bytesToMessage((byte[]) bytesList.get(i)); - - // 命令解析后处理 - message.afterAction(); + if (null != message) { + // 命令解析后处理 + message.afterAction(); + } } } diff --git a/src/com/szpg/task/ReadCH4StatusTask.java b/src/com/szpg/task/ReadCH4StatusTask.java index 11b33b4..d861d8b 100644 --- a/src/com/szpg/task/ReadCH4StatusTask.java +++ b/src/com/szpg/task/ReadCH4StatusTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(ch4AlmCmd.getId()); - cmd.setTm(ch4AlmCmd.getTime().getTime()); cmd.setCmd_type(ch4AlmCmd.getCommandType()); cmd.setDest(ch4AlmCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { ch4AlmCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadCH4ValueTask.java b/src/com/szpg/task/ReadCH4ValueTask.java index 73d957f..4cb658e 100644 --- a/src/com/szpg/task/ReadCH4ValueTask.java +++ b/src/com/szpg/task/ReadCH4ValueTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(ch4Cmd.getId()); - cmd.setTm(ch4Cmd.getTime().getTime()); cmd.setCmd_type(ch4Cmd.getCommandType()); cmd.setDest(ch4Cmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { ch4Cmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadCOStatusTask.java b/src/com/szpg/task/ReadCOStatusTask.java index 11eca56..c01765c 100644 --- a/src/com/szpg/task/ReadCOStatusTask.java +++ b/src/com/szpg/task/ReadCOStatusTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(coAlmCmd.getId()); - cmd.setTm(coAlmCmd.getTime().getTime()); cmd.setCmd_type(coAlmCmd.getCommandType()); cmd.setDest(coAlmCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { coAlmCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadCOValueTask.java b/src/com/szpg/task/ReadCOValueTask.java index 6ff413e..76b9a1b 100644 --- a/src/com/szpg/task/ReadCOValueTask.java +++ b/src/com/szpg/task/ReadCOValueTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(coCmd.getId()); - cmd.setTm(coCmd.getTime().getTime()); cmd.setCmd_type(coCmd.getCommandType()); cmd.setDest(coCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { coCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadDSStatusTask.java b/src/com/szpg/task/ReadDSStatusTask.java new file mode 100644 index 0000000..2437096 --- /dev/null +++ b/src/com/szpg/task/ReadDSStatusTask.java @@ -0,0 +1,47 @@ +package com.szpg.task; + +import com.szpg.db.dao.impl.PgAcuRdcmdDaoImpl; +import com.szpg.db.data.PgAcuRdcmd; +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.command.read.ReadDSStatusCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; + +public class ReadDSStatusTask implements Runnable { + + private ACUClient client; + private AppCommand appCommand; + + public ReadDSStatusTask(ACUClient client, AppCommand command) { + this.client = client; + this.appCommand = command; + } + + @Override + public void run() { + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(appCommand); + + // 发送读取对射报警状态内存命令 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + ReadDSStatusCommand dsAlmCmd = (ReadDSStatusCommand) appCommand; + + // 发送完成之后将命令保存在数据库中 + PgAcuRdcmd cmd = new PgAcuRdcmd(); + cmd.setCmd_type(dsAlmCmd.getCommandType()); + cmd.setDest(dsAlmCmd.getDestinationId()); + cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { dsAlmCmd.getMemoryArea() })); + cmd.setStart_mem_word(dsAlmCmd.getStartAddress().substring(0, 4)); + cmd.setStart_mem_bit(dsAlmCmd.getStartAddress().substring(4)); + cmd.setCount_word(dsAlmCmd.getCountWord()); + cmd.setCount_bit(dsAlmCmd.getCountBit()); + cmd.setCount_sensor(dsAlmCmd.getCountSensor()); + + new PgAcuRdcmdDaoImpl().addCmdRecord(cmd); + } + +} diff --git a/src/com/szpg/task/ReadHSStatusTask.java b/src/com/szpg/task/ReadHSStatusTask.java index 5fc4528..3771f2f 100644 --- a/src/com/szpg/task/ReadHSStatusTask.java +++ b/src/com/szpg/task/ReadHSStatusTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(hsAlmCmd.getId()); - cmd.setTm(hsAlmCmd.getTime().getTime()); cmd.setCmd_type(hsAlmCmd.getCommandType()); cmd.setDest(hsAlmCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { hsAlmCmd.getMemoryArea() })); diff --git a/src/ACUBL.properties b/src/ACUBL.properties index ae086d4..99e858d 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -46,7 +46,7 @@ #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2.START = 0500 #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 -YXL.ACU001.O2.WORDCOUNT = 24 +YXL.ACU001.O2.WORDCOUNT = 4 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2ALM.START = 0036 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -66,3 +66,22 @@ YXL.ACU001.HSALM.WORDCOUNT = 1 #\u786b\u5316\u6c22\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 YXL.ACU001.HSALM.BITCOUNT = 12 + +#\u7206\u7ba1\u6db2\u4f4d\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.YW.COUNT = 2 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.YWALM.START = 0025 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.YWALM.WORDCOUNT = 1 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.YWALM.BITCOUNT = 2 + +#\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.DS.COUNT = 15 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.DSALM.START = 0038 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.DSALM.WORDCOUNT = 3 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.DSALM.BITCOUNT = 45 + diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 5e6edbc..8d5ab08 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -16,12 +16,14 @@ import com.szpg.task.ReadCH4ValueTask; import com.szpg.task.ReadCOStatusTask; import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; import com.szpg.task.ReadHSStatusTask; import com.szpg.task.ReadHSValueTask; import com.szpg.task.ReadO2StatusTask; import com.szpg.task.ReadO2ValueTask; import com.szpg.task.ReadWSStatusTask; import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -30,11 +32,12 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.103", 6800); + // PLC设备地址和端口 + ACUClient client = new ACUClient("192.168.0.244", 6800); - client.setNet("00"); - client.setNode("6B"); - client.setUnit("00"); + client.setNet("00"); //网络号 + client.setNode("F4"); //节点号 + client.setUnit("00"); //单元号 // 3将ACU的信息加入到map中 ACUClientUtil.getInstance().addClient(client); @@ -44,33 +47,34 @@ // 测试发送查询甲烷参数命令 // dsc.testSendCH4Command(client); - // 测试发送查询甲烷报警状态命令 -// dsc.testSendCH4StatsuCommand(client); +// // 测试发送查询甲烷报警状态命令 +// dsc.testSendCH4StatusCommand(client); // 测试发送查询温湿度监测值命令 // dsc.testSendWSCommand(client); // 测试发送查询温湿度报警状态命令 // dsc.testSendWSStatusCommand(client); - // 测试发送查询一氧化碳参数命令 +// // 测试发送查询一氧化碳参数命令 // dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 +// // 测试发送查询一氧化碳报警状态命令 // dsc.testSendCOStatusCommand(client); - - // 测试发送查询一氧化碳参数命令 -// dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 -// dsc.testSendCOStatusCommand(client); - +// // 测试发送查询氧气参数命令 // dsc.testSendO2Command(client); // 测试发送查询氧气报警状态命令 // dsc.testSendO2StatusCommand(client); +// +// // 测试发送查询硫化氢参数命令 +// dsc.testSendHSCommand(client); +// // 测试发送查询硫化氢报警状态命令 +// dsc.testSendHSStatusCommand(client); - // 测试发送查询硫化氢参数命令 - dsc.testSendHSCommand(client); - // 测试发送查询硫化氢报警状态命令 - dsc.testSendHSStatusCommand(client); + // 测试发送查询爆管液位报警状态命令 + dsc.testSendYWStatusCommand(client); + + // 测试发送查询对射报警状态命令 +// dsc.testSendDSStatusCommand(client); } /** @@ -97,8 +101,9 @@ ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(client, ch4), 10, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -116,7 +121,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); ch4alm.setDestinationId(dest); - ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); @@ -124,8 +129,9 @@ ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4StatusTask(client, ch4alm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -153,8 +159,9 @@ ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSValueTask(client, ws), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -172,7 +179,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); wsalm.setDestinationId(dest); - wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); @@ -180,8 +187,9 @@ wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSStatusTask(client, wsalm), 25, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -208,8 +216,9 @@ co.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOValueTask(client, co), 30, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -227,7 +236,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); coalm.setDestinationId(dest); - coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); coalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.START")), 2)) + "00"); coalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.WORDCOUNT"))); @@ -235,8 +244,9 @@ coalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOStatusTask(client, coalm), 35, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -263,8 +273,9 @@ o2.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2ValueTask(client, o2), 40, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -282,7 +293,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); o2alm.setDestinationId(dest); - o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); o2alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.START")), 2)) + "00"); o2alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.WORDCOUNT"))); @@ -290,8 +301,9 @@ o2alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2StatusTask(client, o2alm), 45, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -318,8 +330,9 @@ hs.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSValueTask(client, hs), 50, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -337,7 +350,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); hsalm.setDestinationId(dest); - hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); hsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.START")), 2)) + "00"); hsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.WORDCOUNT"))); @@ -345,7 +358,65 @@ hsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSStatusTask(client, hsalm), 55, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询爆管液位报警状态命令 + * @param client + */ + public void testSendYWStatusCommand(ACUClient client) { + ReadMemoryCommand ywalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READYWSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ywalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ywalm.setDestinationId(dest); + + ywalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + ywalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.START")), 2)) + "00"); + ywalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.WORDCOUNT"))); + ywalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.BITCOUNT"))); + ywalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YW.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadYWStatusTask(client, ywalm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + + /** + * 发送查询对射报警状态命令 + * @param client + */ + public void testSendDSStatusCommand(ACUClient client) { + ReadMemoryCommand dsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READDSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + dsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + dsalm.setDestinationId(dest); + + dsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + dsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.START")), 2)) + "00"); + dsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.WORDCOUNT"))); + dsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.BITCOUNT"))); + dsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadDSStatusTask(client, dsalm), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index 70fb6dc..a9d5686 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -10,6 +10,7 @@ public PgAcuRdcmd findById(String id); public PgAcuRdcmd findLatestCmdByDestAndCount(String dest, int count); + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type); public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); diff --git a/src/com/szpg/db/dao/PgDSDao.java b/src/com/szpg/db/dao/PgDSDao.java new file mode 100644 index 0000000..b731af9 --- /dev/null +++ b/src/com/szpg/db/dao/PgDSDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgDSAlm; + +/** + * 对射报警相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgDSDao { + + /******** 对射报警状态 ********/ + public List findAllSbjz(); + public PgDSAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgDSAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/PgYWDao.java b/src/com/szpg/db/dao/PgYWDao.java new file mode 100644 index 0000000..bb27bbf --- /dev/null +++ b/src/com/szpg/db/dao/PgYWDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgYWAlm; + +/** + * 爆管液位相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgYWDao { + + /******** 爆管液位浓度报警状态 ********/ + public List findAllSbjz(); + public PgYWAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgYWAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index b693939..16b2285 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -114,6 +114,41 @@ } return null; } + + + @Override + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ACU_RDCMD WHERE RESPONSED='0' AND TIMEOUT='0' AND DEST=? AND CMD_TYPE=? ORDER BY TM DESC"; + Object[] params = new Object[2]; + params[0] = dest; + params[1] = type; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAcuRdcmd.class), params); + + if (null != list && list.isEmpty() == false) { + logger.debug("根据目的地址和命令类型查询内存读取命令成功[" + list.size() + "]"); + + return list.get(0); + } else + return null; + } catch (Exception ex) { + logger.error("根据目的地址和命令类型查询内存读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } @Override public int addCmdRecord(PgAcuRdcmd cmd) { diff --git a/src/com/szpg/db/dao/impl/PgDSDaoImpl.java b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java new file mode 100644 index 0000000..e9d18cd --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.data.PgDSAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgDSDaoImpl implements PgDSDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgDSAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(0); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询对射报警状态成功" + dsalm + "]"); + + return dsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgDSAlm dsalm) { + return addSbjzRecord(dsalm.getDsalm(), dsalm.getTmStr(), dsalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_DS_ALM " + + "(DSALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入对射报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入对射报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 657281c..7706852 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -39,6 +39,12 @@ case "HS": key = "%硫化氢%"; break; + case "YW": + key = "%液位%"; + break; + case "DS": + key = "%对射%"; + break; } String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '" + key + "' ORDER BY D.ID"; diff --git a/src/com/szpg/db/dao/impl/PgYWDaoImpl.java b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java new file mode 100644 index 0000000..613c4c0 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.data.PgYWAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgYWDaoImpl implements PgYWDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgYWAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(0); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询爆管液位报警状态成功" + ywalm + "]"); + + return ywalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgYWAlm ywalm) { + return addSbjzRecord(ywalm.getYwalm(), ywalm.getTmStr(), ywalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_YW_ALM " + + "(YWALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入爆管液位报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入爆管液位报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index f4ecfe5..2d46bfc 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -1,6 +1,8 @@ package com.szpg.db.data; +import java.util.Calendar; import java.util.Date; +import java.util.UUID; import com.szpg.util.TimeFormat; @@ -31,6 +33,11 @@ private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 + public PgAcuRdcmd() { + this.setId(UUID.randomUUID().toString().replace("-", "")); + this.setTm(Calendar.getInstance().getTime()); + } + public String getId() { return id; } diff --git a/src/com/szpg/db/data/PgDSAlm.java b/src/com/szpg/db/data/PgDSAlm.java new file mode 100644 index 0000000..86e28bb --- /dev/null +++ b/src/com/szpg/db/data/PgDSAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 对射报警状态数据表 + * + * @author admin + * + */ +public class PgDSAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = -8336945265752238748L; + + private Integer id; + private Boolean dsalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getDsalm() { + return dsalm; + } + + public void setDsalm(Boolean dsalm) { + this.dsalm = dsalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgDSAlm[dsalm=" + dsalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/data/PgYWAlm.java b/src/com/szpg/db/data/PgYWAlm.java new file mode 100644 index 0000000..9d9572f --- /dev/null +++ b/src/com/szpg/db/data/PgYWAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 爆管液位浓度报警状态数据表 + * + * @author admin + * + */ +public class PgYWAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 3882791834818808488L; + + private Integer id; + private Boolean ywalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getYwalm() { + return ywalm; + } + + public void setYwalm(Boolean ywalm) { + this.ywalm = ywalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgYWAlm[ywalm=" + ywalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/plc/message/AppMessageConstants.java b/src/com/szpg/plc/message/AppMessageConstants.java index 25db6ab..1c84086 100644 --- a/src/com/szpg/plc/message/AppMessageConstants.java +++ b/src/com/szpg/plc/message/AppMessageConstants.java @@ -13,4 +13,7 @@ public final static String CMD_TYPE_READO2STATUS = "17"; //读取氧气报警状态命令 public final static String CMD_TYPE_READHSVALUE = "18"; //读取硫化氢监测值命令 public final static String CMD_TYPE_READHSSTATUS = "19"; //读取硫化氢报警状态命令 + + public final static String CMD_TYPE_READYWSTATUS = "21"; //读取爆管液位报警状态命令 + public final static String CMD_TYPE_READDSSTATUS = "22"; //读取对射报警状态命令 } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index acf2859..3678a16 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -5,12 +5,14 @@ import com.szpg.plc.message.command.read.ReadCH4ValueCommand; import com.szpg.plc.message.command.read.ReadCOStatusCommand; import com.szpg.plc.message.command.read.ReadCOValueCommand; +import com.szpg.plc.message.command.read.ReadDSStatusCommand; import com.szpg.plc.message.command.read.ReadHSStatusCommand; import com.szpg.plc.message.command.read.ReadHSValueCommand; import com.szpg.plc.message.command.read.ReadO2StatusCommand; import com.szpg.plc.message.command.read.ReadO2ValueCommand; import com.szpg.plc.message.command.read.ReadWSStatusCommand; import com.szpg.plc.message.command.read.ReadWSValueCommand; +import com.szpg.plc.message.command.read.ReadYWStatusCommand; import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -101,6 +103,12 @@ return new ReadHSValueCommand(); case AppMessageConstants.CMD_TYPE_READHSSTATUS: return new ReadHSStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + return new ReadYWStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + return new ReadDSStatusCommand(); default: return null; diff --git a/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java new file mode 100644 index 0000000..eda271f --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; + +public class ReadDSStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = -1668388238102375069L; + + @Override + public Class getResponseClass() { + return ReadDSStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询对射报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READDSSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java new file mode 100644 index 0000000..73c54b3 --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; + +public class ReadYWStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 1019982176997717896L; + + @Override + public Class getResponseClass() { + return ReadYWStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询爆管液位报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READYWSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java new file mode 100644 index 0000000..e2b476b --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java @@ -0,0 +1,57 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgDSDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadDSStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 4047613496835657828L; + + private List dsbj; // 对射报警状态 + + public ReadDSStatusCommandResponse() { + dsbj = new ArrayList(); + } + + public List getDsbj() { + return dsbj; + } + + public void setDsbj(List dsbj) { + this.dsbj = dsbj; + } + + @Override + public void afterAction() { + // 1将对射报警数据存入数据库 + PgDSDao dsDao = new PgDSDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findDeviceIdByDestAndType(this.getMessageProducerId(), "DS"); + + for (int i = 0; i < dsbj.size(); i++) { + if (i < ids.size()) { + dsDao.addSbjzRecord(dsbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (dsbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + + } + } + } + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java new file mode 100644 index 0000000..c2674f2 --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java @@ -0,0 +1,57 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgYWDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadYWStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 8088340048416088978L; + + private List ywbj; // 爆管液位报警状态 + + public ReadYWStatusCommandResponse() { + ywbj = new ArrayList(); + } + + public List getYwbj() { + return ywbj; + } + + public void setYwbj(List ywbj) { + this.ywbj = ywbj; + } + + @Override + public void afterAction() { + // 1将爆管液位浓度数据存入数据库 + PgYWDao ywDao = new PgYWDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findDeviceIdByDestAndType(this.getMessageProducerId(), "YW"); + + for (int i = 0; i < ywbj.size(); i++) { + if (i < ids.size()) { + ywDao.addSbjzRecord(ywbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (ywbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + + } + } + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSConstants.java b/src/com/szpg/plc/protocol/fins/FINSConstants.java index 2697e74..f565b8b 100644 --- a/src/com/szpg/plc/protocol/fins/FINSConstants.java +++ b/src/com/szpg/plc/protocol/fins/FINSConstants.java @@ -21,7 +21,8 @@ /******** 内存区域代码 ********/ public final static byte MEMORY_DM_AREA = (byte) 0x82; //82内存D区代码 - public final static byte MEMORY_WORK_AREA = 0x31; //31内存W区代码 + public final static byte MEMORY_WORK_AREA_WORD = (byte) 0xB1; //B1内存W区代码(按字操作) + public final static byte MEMORY_WORK_AREA_BIT = 0x31; //31内存W区代码(按位操作) /******** 控制域 ********/ public final static byte ICF_COMMAND = (byte) 0x80; //ICF字节代表命令 diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index a11ae12..a65488e 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -19,12 +19,14 @@ import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; import com.szpg.plc.protocol.DTProtocolInterface; import com.szpg.plc.protocol.fins.frame.FINSByteFrame; import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; @@ -115,19 +117,18 @@ // 读写命令的响应 if (commandStr.equalsIgnoreCase("00000002")) { String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); + String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 if (commandCode.equalsIgnoreCase("0101")) { // 读内存命令响应的解析 // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - int count = FINSByteFrameTool.getDataWithoutEndCode(byteMessage).length / 2; //1WORD=2BYTE +// int count = FINSByteFrameTool.getDataWithoutEndCode(byteMessage).length / 2; //1WORD=2BYTE // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 PgAcuRdcmdDao readCmdDao = new PgAcuRdcmdDaoImpl(); - PgAcuRdcmd readCmd = readCmdDao.findLatestCmdByDestAndCount(dest, count); + PgAcuRdcmd readCmd = readCmdDao.findLatestCmdByDestAndType(dest, commandType); if (null != readCmd) { - String commandType = readCmd.getCmd_type(); - // 3根据参数类型调用相应的方法进行解析 switch(commandType) { case AppMessageConstants.CMD_TYPE_READCH4VALUE: @@ -164,6 +165,14 @@ case AppMessageConstants.CMD_TYPE_READHSSTATUS: received = bytesToReadHSStatusCommandResponse(finsFrame, readCmd); break; + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + received = bytesToReadYWStatusCommandResponse(finsFrame, readCmd); + break; + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + received = bytesToReadDSStatusCommandResponse(finsFrame, readCmd); + break; } // 4将已响应的命令删除 @@ -260,7 +269,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int chct = cmd.getCount_sensor(); //甲烷监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < chct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -402,7 +417,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int chct = cmd.getCount_sensor(); //一氧化碳监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < chct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -462,7 +483,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int o2ct = cmd.getCount_sensor(); //氧气监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < o2ct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -522,7 +549,12 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int hsct = cmd.getCount_sensor(); //硫化氢监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } for (int i = 0; i < hsct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -534,6 +566,69 @@ return rhscr; } + + /** + * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int ysct = cmd.getCount_sensor(); //爆管液位监测点的数量 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < ysct; i++) { + char bjBit = dataStr.charAt(dataStr.length() - i - 1); + + ryscr.getYwbj().add(bjBit == '1' ? true : false); + } + } + + return ryscr; + } + + /** + * 将查询对射报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int dsct = cmd.getCount_sensor(); //对射监测点的数量 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + + for (int i = 0; i < dsct; i++) { + char bjBit = dataStr.charAt(dataStr.length() - i * 3 - 1); + + rdscr.getDsbj().add(bjBit == '1' ? true : false); + } + } + + return rdscr; + } /** * 将消息对象解析为字节数组 @@ -601,6 +696,7 @@ FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), message.getMessageProducerId(), + message.getCommandType(), message.getMemoryArea(), start, message.getCountWord()); diff --git a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java index 639359e..94540d4 100644 --- a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java +++ b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java @@ -135,12 +135,13 @@ * * @param dest 目标地址 * @param sour 源地址 + * @param sid 服务号 * @param memArea 内存区域代码 * @param start 读取的起始地址 * @param count 读取的长度(以word计,长度为2个字节) */ - public FINSByteFrame(String dest, String sour, byte memArea, byte[] start, int count) { - this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour); // 构造控制域 + public FINSByteFrame(String dest, String sour, String sid, byte memArea, byte[] start, int count) { + this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour, sid); // 构造控制域 // 设置读取内存命令的发送命令功能码00000002 this.COMMAND = FINSConstants.COMMAND_COMMAND; @@ -168,13 +169,14 @@ * * @param dest * @param sour + * @param sid * @param memArea * @param start * @param count * @param dataBody */ - public FINSByteFrame(String dest, String sour, byte memArea, byte[] start, int count, byte[] dataBody) { - this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour); // 构造控制域 + public FINSByteFrame(String dest, String sour, String sid, byte memArea, byte[] start, int count, byte[] dataBody) { + this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour, sid); // 构造控制域 // 构造用户数据域的内容 Bytes data = new Bytes(); diff --git a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java index 10be9db..c992b06 100644 --- a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java +++ b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java @@ -144,6 +144,20 @@ } /** + * 获取SID号,作为命令类型使用 + * @param finsBytes + * @return + */ + public static String getControlSID(byte[] finsBytes) { + byte[] text = getText(finsBytes); + + if (null != text && text.length > 10) + return ByteUtil.binToHexString(new byte[] {text[9]}); + else + return "00"; + } + + /** * 获取命令代码 * 0x0101=读取内存,0x0102=写内存 * @@ -228,9 +242,10 @@ * * @param dest 目标地址:网络号+节点号+单元号 * @param sour 源地址:网络号+节点号+单元号 + * @param sid 服务号:用于标识命令类型 * @return */ - public static byte[] buildFrameControl(String dest, String sour) { + public static byte[] buildFrameControl(String dest, String sour, String sid) { byte[] control = new byte[10]; // 命令类型位固定为1,需要响应标志位固定为0,表示从上位机发送给PLC端的消息,需要PLC响应 @@ -249,7 +264,8 @@ control[7] = sourByte[1]; //源节点号 control[8] = sourByte[2]; //源单元号 - control[9] = FINSConstants.SID; // SID字节 +// control[9] = FINSConstants.SID; // SID字节 + control[9] = ByteUtil.hexStringToBytes(sid, 1)[0]; return control; } diff --git a/src/com/szpg/plc/server/ACUClientHandler.java b/src/com/szpg/plc/server/ACUClientHandler.java index b3d7bc9..d7649fd 100644 --- a/src/com/szpg/plc/server/ACUClientHandler.java +++ b/src/com/szpg/plc/server/ACUClientHandler.java @@ -13,6 +13,7 @@ import com.szpg.plc.protocol.ProtocolFactory; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACULinkTask; +import com.szpg.util.Configure; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -36,13 +37,14 @@ // 2生成LinkCommand对象并解析成byte数组 LinkCommand lc = new LinkCommand(); - lc.setMessageProducerId(ByteUtil.binToHexString(ByteUtil.hexStringToBytes(client.getNode(), 4))); +// lc.setMessageProducerId(ByteUtil.binToHexString(ByteUtil.hexStringToBytes(client.getNode(), 4))); + lc.setMessageProducerId(ByteUtil.binToHexString(ByteUtil.hexStringToBytes(Configure.getProperty("sys", "LOCALHOST.NODE"), 4))); byte[] lcBytes = finspi.messageToBytes(lc); // 3延迟10秒发送握手命令 ScheduledExecutorService linkSche = new ScheduledThreadPoolExecutor(1); - linkSche.schedule(new ACULinkTask(client, lcBytes), 10, TimeUnit.SECONDS); + linkSche.schedule(new ACULinkTask(client, lcBytes), 5, TimeUnit.SECONDS); linkSche.shutdown(); //执行完任务之后关闭线程 } } @@ -66,9 +68,10 @@ // 解析消息 AppMessage message = finspi.bytesToMessage((byte[]) bytesList.get(i)); - - // 命令解析后处理 - message.afterAction(); + if (null != message) { + // 命令解析后处理 + message.afterAction(); + } } } diff --git a/src/com/szpg/task/ReadCH4StatusTask.java b/src/com/szpg/task/ReadCH4StatusTask.java index 11b33b4..d861d8b 100644 --- a/src/com/szpg/task/ReadCH4StatusTask.java +++ b/src/com/szpg/task/ReadCH4StatusTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(ch4AlmCmd.getId()); - cmd.setTm(ch4AlmCmd.getTime().getTime()); cmd.setCmd_type(ch4AlmCmd.getCommandType()); cmd.setDest(ch4AlmCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { ch4AlmCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadCH4ValueTask.java b/src/com/szpg/task/ReadCH4ValueTask.java index 73d957f..4cb658e 100644 --- a/src/com/szpg/task/ReadCH4ValueTask.java +++ b/src/com/szpg/task/ReadCH4ValueTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(ch4Cmd.getId()); - cmd.setTm(ch4Cmd.getTime().getTime()); cmd.setCmd_type(ch4Cmd.getCommandType()); cmd.setDest(ch4Cmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { ch4Cmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadCOStatusTask.java b/src/com/szpg/task/ReadCOStatusTask.java index 11eca56..c01765c 100644 --- a/src/com/szpg/task/ReadCOStatusTask.java +++ b/src/com/szpg/task/ReadCOStatusTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(coAlmCmd.getId()); - cmd.setTm(coAlmCmd.getTime().getTime()); cmd.setCmd_type(coAlmCmd.getCommandType()); cmd.setDest(coAlmCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { coAlmCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadCOValueTask.java b/src/com/szpg/task/ReadCOValueTask.java index 6ff413e..76b9a1b 100644 --- a/src/com/szpg/task/ReadCOValueTask.java +++ b/src/com/szpg/task/ReadCOValueTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(coCmd.getId()); - cmd.setTm(coCmd.getTime().getTime()); cmd.setCmd_type(coCmd.getCommandType()); cmd.setDest(coCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { coCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadDSStatusTask.java b/src/com/szpg/task/ReadDSStatusTask.java new file mode 100644 index 0000000..2437096 --- /dev/null +++ b/src/com/szpg/task/ReadDSStatusTask.java @@ -0,0 +1,47 @@ +package com.szpg.task; + +import com.szpg.db.dao.impl.PgAcuRdcmdDaoImpl; +import com.szpg.db.data.PgAcuRdcmd; +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.command.read.ReadDSStatusCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; + +public class ReadDSStatusTask implements Runnable { + + private ACUClient client; + private AppCommand appCommand; + + public ReadDSStatusTask(ACUClient client, AppCommand command) { + this.client = client; + this.appCommand = command; + } + + @Override + public void run() { + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(appCommand); + + // 发送读取对射报警状态内存命令 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + ReadDSStatusCommand dsAlmCmd = (ReadDSStatusCommand) appCommand; + + // 发送完成之后将命令保存在数据库中 + PgAcuRdcmd cmd = new PgAcuRdcmd(); + cmd.setCmd_type(dsAlmCmd.getCommandType()); + cmd.setDest(dsAlmCmd.getDestinationId()); + cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { dsAlmCmd.getMemoryArea() })); + cmd.setStart_mem_word(dsAlmCmd.getStartAddress().substring(0, 4)); + cmd.setStart_mem_bit(dsAlmCmd.getStartAddress().substring(4)); + cmd.setCount_word(dsAlmCmd.getCountWord()); + cmd.setCount_bit(dsAlmCmd.getCountBit()); + cmd.setCount_sensor(dsAlmCmd.getCountSensor()); + + new PgAcuRdcmdDaoImpl().addCmdRecord(cmd); + } + +} diff --git a/src/com/szpg/task/ReadHSStatusTask.java b/src/com/szpg/task/ReadHSStatusTask.java index 5fc4528..3771f2f 100644 --- a/src/com/szpg/task/ReadHSStatusTask.java +++ b/src/com/szpg/task/ReadHSStatusTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(hsAlmCmd.getId()); - cmd.setTm(hsAlmCmd.getTime().getTime()); cmd.setCmd_type(hsAlmCmd.getCommandType()); cmd.setDest(hsAlmCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { hsAlmCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadHSValueTask.java b/src/com/szpg/task/ReadHSValueTask.java index 2b7591f..bd7b72d 100644 --- a/src/com/szpg/task/ReadHSValueTask.java +++ b/src/com/szpg/task/ReadHSValueTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(hsCmd.getId()); - cmd.setTm(hsCmd.getTime().getTime()); cmd.setCmd_type(hsCmd.getCommandType()); cmd.setDest(hsCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { hsCmd.getMemoryArea() })); diff --git a/src/ACUBL.properties b/src/ACUBL.properties index ae086d4..99e858d 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -46,7 +46,7 @@ #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2.START = 0500 #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 -YXL.ACU001.O2.WORDCOUNT = 24 +YXL.ACU001.O2.WORDCOUNT = 4 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2ALM.START = 0036 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -66,3 +66,22 @@ YXL.ACU001.HSALM.WORDCOUNT = 1 #\u786b\u5316\u6c22\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 YXL.ACU001.HSALM.BITCOUNT = 12 + +#\u7206\u7ba1\u6db2\u4f4d\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.YW.COUNT = 2 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.YWALM.START = 0025 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.YWALM.WORDCOUNT = 1 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.YWALM.BITCOUNT = 2 + +#\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.DS.COUNT = 15 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.DSALM.START = 0038 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.DSALM.WORDCOUNT = 3 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.DSALM.BITCOUNT = 45 + diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 5e6edbc..8d5ab08 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -16,12 +16,14 @@ import com.szpg.task.ReadCH4ValueTask; import com.szpg.task.ReadCOStatusTask; import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; import com.szpg.task.ReadHSStatusTask; import com.szpg.task.ReadHSValueTask; import com.szpg.task.ReadO2StatusTask; import com.szpg.task.ReadO2ValueTask; import com.szpg.task.ReadWSStatusTask; import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -30,11 +32,12 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.103", 6800); + // PLC设备地址和端口 + ACUClient client = new ACUClient("192.168.0.244", 6800); - client.setNet("00"); - client.setNode("6B"); - client.setUnit("00"); + client.setNet("00"); //网络号 + client.setNode("F4"); //节点号 + client.setUnit("00"); //单元号 // 3将ACU的信息加入到map中 ACUClientUtil.getInstance().addClient(client); @@ -44,33 +47,34 @@ // 测试发送查询甲烷参数命令 // dsc.testSendCH4Command(client); - // 测试发送查询甲烷报警状态命令 -// dsc.testSendCH4StatsuCommand(client); +// // 测试发送查询甲烷报警状态命令 +// dsc.testSendCH4StatusCommand(client); // 测试发送查询温湿度监测值命令 // dsc.testSendWSCommand(client); // 测试发送查询温湿度报警状态命令 // dsc.testSendWSStatusCommand(client); - // 测试发送查询一氧化碳参数命令 +// // 测试发送查询一氧化碳参数命令 // dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 +// // 测试发送查询一氧化碳报警状态命令 // dsc.testSendCOStatusCommand(client); - - // 测试发送查询一氧化碳参数命令 -// dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 -// dsc.testSendCOStatusCommand(client); - +// // 测试发送查询氧气参数命令 // dsc.testSendO2Command(client); // 测试发送查询氧气报警状态命令 // dsc.testSendO2StatusCommand(client); +// +// // 测试发送查询硫化氢参数命令 +// dsc.testSendHSCommand(client); +// // 测试发送查询硫化氢报警状态命令 +// dsc.testSendHSStatusCommand(client); - // 测试发送查询硫化氢参数命令 - dsc.testSendHSCommand(client); - // 测试发送查询硫化氢报警状态命令 - dsc.testSendHSStatusCommand(client); + // 测试发送查询爆管液位报警状态命令 + dsc.testSendYWStatusCommand(client); + + // 测试发送查询对射报警状态命令 +// dsc.testSendDSStatusCommand(client); } /** @@ -97,8 +101,9 @@ ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(client, ch4), 10, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -116,7 +121,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); ch4alm.setDestinationId(dest); - ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); @@ -124,8 +129,9 @@ ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4StatusTask(client, ch4alm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -153,8 +159,9 @@ ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSValueTask(client, ws), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -172,7 +179,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); wsalm.setDestinationId(dest); - wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); @@ -180,8 +187,9 @@ wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSStatusTask(client, wsalm), 25, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -208,8 +216,9 @@ co.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOValueTask(client, co), 30, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -227,7 +236,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); coalm.setDestinationId(dest); - coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); coalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.START")), 2)) + "00"); coalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.WORDCOUNT"))); @@ -235,8 +244,9 @@ coalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOStatusTask(client, coalm), 35, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -263,8 +273,9 @@ o2.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2ValueTask(client, o2), 40, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -282,7 +293,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); o2alm.setDestinationId(dest); - o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); o2alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.START")), 2)) + "00"); o2alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.WORDCOUNT"))); @@ -290,8 +301,9 @@ o2alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2StatusTask(client, o2alm), 45, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -318,8 +330,9 @@ hs.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSValueTask(client, hs), 50, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -337,7 +350,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); hsalm.setDestinationId(dest); - hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); hsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.START")), 2)) + "00"); hsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.WORDCOUNT"))); @@ -345,7 +358,65 @@ hsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSStatusTask(client, hsalm), 55, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询爆管液位报警状态命令 + * @param client + */ + public void testSendYWStatusCommand(ACUClient client) { + ReadMemoryCommand ywalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READYWSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ywalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ywalm.setDestinationId(dest); + + ywalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + ywalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.START")), 2)) + "00"); + ywalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.WORDCOUNT"))); + ywalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.BITCOUNT"))); + ywalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YW.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadYWStatusTask(client, ywalm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + + /** + * 发送查询对射报警状态命令 + * @param client + */ + public void testSendDSStatusCommand(ACUClient client) { + ReadMemoryCommand dsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READDSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + dsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + dsalm.setDestinationId(dest); + + dsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + dsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.START")), 2)) + "00"); + dsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.WORDCOUNT"))); + dsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.BITCOUNT"))); + dsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadDSStatusTask(client, dsalm), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index 70fb6dc..a9d5686 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -10,6 +10,7 @@ public PgAcuRdcmd findById(String id); public PgAcuRdcmd findLatestCmdByDestAndCount(String dest, int count); + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type); public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); diff --git a/src/com/szpg/db/dao/PgDSDao.java b/src/com/szpg/db/dao/PgDSDao.java new file mode 100644 index 0000000..b731af9 --- /dev/null +++ b/src/com/szpg/db/dao/PgDSDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgDSAlm; + +/** + * 对射报警相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgDSDao { + + /******** 对射报警状态 ********/ + public List findAllSbjz(); + public PgDSAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgDSAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/PgYWDao.java b/src/com/szpg/db/dao/PgYWDao.java new file mode 100644 index 0000000..bb27bbf --- /dev/null +++ b/src/com/szpg/db/dao/PgYWDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgYWAlm; + +/** + * 爆管液位相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgYWDao { + + /******** 爆管液位浓度报警状态 ********/ + public List findAllSbjz(); + public PgYWAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgYWAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index b693939..16b2285 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -114,6 +114,41 @@ } return null; } + + + @Override + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ACU_RDCMD WHERE RESPONSED='0' AND TIMEOUT='0' AND DEST=? AND CMD_TYPE=? ORDER BY TM DESC"; + Object[] params = new Object[2]; + params[0] = dest; + params[1] = type; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAcuRdcmd.class), params); + + if (null != list && list.isEmpty() == false) { + logger.debug("根据目的地址和命令类型查询内存读取命令成功[" + list.size() + "]"); + + return list.get(0); + } else + return null; + } catch (Exception ex) { + logger.error("根据目的地址和命令类型查询内存读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } @Override public int addCmdRecord(PgAcuRdcmd cmd) { diff --git a/src/com/szpg/db/dao/impl/PgDSDaoImpl.java b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java new file mode 100644 index 0000000..e9d18cd --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.data.PgDSAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgDSDaoImpl implements PgDSDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgDSAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(0); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询对射报警状态成功" + dsalm + "]"); + + return dsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgDSAlm dsalm) { + return addSbjzRecord(dsalm.getDsalm(), dsalm.getTmStr(), dsalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_DS_ALM " + + "(DSALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入对射报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入对射报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 657281c..7706852 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -39,6 +39,12 @@ case "HS": key = "%硫化氢%"; break; + case "YW": + key = "%液位%"; + break; + case "DS": + key = "%对射%"; + break; } String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '" + key + "' ORDER BY D.ID"; diff --git a/src/com/szpg/db/dao/impl/PgYWDaoImpl.java b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java new file mode 100644 index 0000000..613c4c0 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.data.PgYWAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgYWDaoImpl implements PgYWDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgYWAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(0); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询爆管液位报警状态成功" + ywalm + "]"); + + return ywalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgYWAlm ywalm) { + return addSbjzRecord(ywalm.getYwalm(), ywalm.getTmStr(), ywalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_YW_ALM " + + "(YWALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入爆管液位报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入爆管液位报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index f4ecfe5..2d46bfc 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -1,6 +1,8 @@ package com.szpg.db.data; +import java.util.Calendar; import java.util.Date; +import java.util.UUID; import com.szpg.util.TimeFormat; @@ -31,6 +33,11 @@ private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 + public PgAcuRdcmd() { + this.setId(UUID.randomUUID().toString().replace("-", "")); + this.setTm(Calendar.getInstance().getTime()); + } + public String getId() { return id; } diff --git a/src/com/szpg/db/data/PgDSAlm.java b/src/com/szpg/db/data/PgDSAlm.java new file mode 100644 index 0000000..86e28bb --- /dev/null +++ b/src/com/szpg/db/data/PgDSAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 对射报警状态数据表 + * + * @author admin + * + */ +public class PgDSAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = -8336945265752238748L; + + private Integer id; + private Boolean dsalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getDsalm() { + return dsalm; + } + + public void setDsalm(Boolean dsalm) { + this.dsalm = dsalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgDSAlm[dsalm=" + dsalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/data/PgYWAlm.java b/src/com/szpg/db/data/PgYWAlm.java new file mode 100644 index 0000000..9d9572f --- /dev/null +++ b/src/com/szpg/db/data/PgYWAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 爆管液位浓度报警状态数据表 + * + * @author admin + * + */ +public class PgYWAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 3882791834818808488L; + + private Integer id; + private Boolean ywalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getYwalm() { + return ywalm; + } + + public void setYwalm(Boolean ywalm) { + this.ywalm = ywalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgYWAlm[ywalm=" + ywalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/plc/message/AppMessageConstants.java b/src/com/szpg/plc/message/AppMessageConstants.java index 25db6ab..1c84086 100644 --- a/src/com/szpg/plc/message/AppMessageConstants.java +++ b/src/com/szpg/plc/message/AppMessageConstants.java @@ -13,4 +13,7 @@ public final static String CMD_TYPE_READO2STATUS = "17"; //读取氧气报警状态命令 public final static String CMD_TYPE_READHSVALUE = "18"; //读取硫化氢监测值命令 public final static String CMD_TYPE_READHSSTATUS = "19"; //读取硫化氢报警状态命令 + + public final static String CMD_TYPE_READYWSTATUS = "21"; //读取爆管液位报警状态命令 + public final static String CMD_TYPE_READDSSTATUS = "22"; //读取对射报警状态命令 } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index acf2859..3678a16 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -5,12 +5,14 @@ import com.szpg.plc.message.command.read.ReadCH4ValueCommand; import com.szpg.plc.message.command.read.ReadCOStatusCommand; import com.szpg.plc.message.command.read.ReadCOValueCommand; +import com.szpg.plc.message.command.read.ReadDSStatusCommand; import com.szpg.plc.message.command.read.ReadHSStatusCommand; import com.szpg.plc.message.command.read.ReadHSValueCommand; import com.szpg.plc.message.command.read.ReadO2StatusCommand; import com.szpg.plc.message.command.read.ReadO2ValueCommand; import com.szpg.plc.message.command.read.ReadWSStatusCommand; import com.szpg.plc.message.command.read.ReadWSValueCommand; +import com.szpg.plc.message.command.read.ReadYWStatusCommand; import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -101,6 +103,12 @@ return new ReadHSValueCommand(); case AppMessageConstants.CMD_TYPE_READHSSTATUS: return new ReadHSStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + return new ReadYWStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + return new ReadDSStatusCommand(); default: return null; diff --git a/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java new file mode 100644 index 0000000..eda271f --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; + +public class ReadDSStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = -1668388238102375069L; + + @Override + public Class getResponseClass() { + return ReadDSStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询对射报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READDSSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java new file mode 100644 index 0000000..73c54b3 --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; + +public class ReadYWStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 1019982176997717896L; + + @Override + public Class getResponseClass() { + return ReadYWStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询爆管液位报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READYWSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java new file mode 100644 index 0000000..e2b476b --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java @@ -0,0 +1,57 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgDSDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadDSStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 4047613496835657828L; + + private List dsbj; // 对射报警状态 + + public ReadDSStatusCommandResponse() { + dsbj = new ArrayList(); + } + + public List getDsbj() { + return dsbj; + } + + public void setDsbj(List dsbj) { + this.dsbj = dsbj; + } + + @Override + public void afterAction() { + // 1将对射报警数据存入数据库 + PgDSDao dsDao = new PgDSDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findDeviceIdByDestAndType(this.getMessageProducerId(), "DS"); + + for (int i = 0; i < dsbj.size(); i++) { + if (i < ids.size()) { + dsDao.addSbjzRecord(dsbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (dsbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + + } + } + } + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java new file mode 100644 index 0000000..c2674f2 --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java @@ -0,0 +1,57 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgYWDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadYWStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 8088340048416088978L; + + private List ywbj; // 爆管液位报警状态 + + public ReadYWStatusCommandResponse() { + ywbj = new ArrayList(); + } + + public List getYwbj() { + return ywbj; + } + + public void setYwbj(List ywbj) { + this.ywbj = ywbj; + } + + @Override + public void afterAction() { + // 1将爆管液位浓度数据存入数据库 + PgYWDao ywDao = new PgYWDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findDeviceIdByDestAndType(this.getMessageProducerId(), "YW"); + + for (int i = 0; i < ywbj.size(); i++) { + if (i < ids.size()) { + ywDao.addSbjzRecord(ywbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (ywbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + + } + } + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSConstants.java b/src/com/szpg/plc/protocol/fins/FINSConstants.java index 2697e74..f565b8b 100644 --- a/src/com/szpg/plc/protocol/fins/FINSConstants.java +++ b/src/com/szpg/plc/protocol/fins/FINSConstants.java @@ -21,7 +21,8 @@ /******** 内存区域代码 ********/ public final static byte MEMORY_DM_AREA = (byte) 0x82; //82内存D区代码 - public final static byte MEMORY_WORK_AREA = 0x31; //31内存W区代码 + public final static byte MEMORY_WORK_AREA_WORD = (byte) 0xB1; //B1内存W区代码(按字操作) + public final static byte MEMORY_WORK_AREA_BIT = 0x31; //31内存W区代码(按位操作) /******** 控制域 ********/ public final static byte ICF_COMMAND = (byte) 0x80; //ICF字节代表命令 diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index a11ae12..a65488e 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -19,12 +19,14 @@ import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; import com.szpg.plc.protocol.DTProtocolInterface; import com.szpg.plc.protocol.fins.frame.FINSByteFrame; import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; @@ -115,19 +117,18 @@ // 读写命令的响应 if (commandStr.equalsIgnoreCase("00000002")) { String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); + String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 if (commandCode.equalsIgnoreCase("0101")) { // 读内存命令响应的解析 // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - int count = FINSByteFrameTool.getDataWithoutEndCode(byteMessage).length / 2; //1WORD=2BYTE +// int count = FINSByteFrameTool.getDataWithoutEndCode(byteMessage).length / 2; //1WORD=2BYTE // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 PgAcuRdcmdDao readCmdDao = new PgAcuRdcmdDaoImpl(); - PgAcuRdcmd readCmd = readCmdDao.findLatestCmdByDestAndCount(dest, count); + PgAcuRdcmd readCmd = readCmdDao.findLatestCmdByDestAndType(dest, commandType); if (null != readCmd) { - String commandType = readCmd.getCmd_type(); - // 3根据参数类型调用相应的方法进行解析 switch(commandType) { case AppMessageConstants.CMD_TYPE_READCH4VALUE: @@ -164,6 +165,14 @@ case AppMessageConstants.CMD_TYPE_READHSSTATUS: received = bytesToReadHSStatusCommandResponse(finsFrame, readCmd); break; + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + received = bytesToReadYWStatusCommandResponse(finsFrame, readCmd); + break; + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + received = bytesToReadDSStatusCommandResponse(finsFrame, readCmd); + break; } // 4将已响应的命令删除 @@ -260,7 +269,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int chct = cmd.getCount_sensor(); //甲烷监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < chct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -402,7 +417,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int chct = cmd.getCount_sensor(); //一氧化碳监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < chct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -462,7 +483,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int o2ct = cmd.getCount_sensor(); //氧气监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < o2ct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -522,7 +549,12 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int hsct = cmd.getCount_sensor(); //硫化氢监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } for (int i = 0; i < hsct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -534,6 +566,69 @@ return rhscr; } + + /** + * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int ysct = cmd.getCount_sensor(); //爆管液位监测点的数量 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < ysct; i++) { + char bjBit = dataStr.charAt(dataStr.length() - i - 1); + + ryscr.getYwbj().add(bjBit == '1' ? true : false); + } + } + + return ryscr; + } + + /** + * 将查询对射报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int dsct = cmd.getCount_sensor(); //对射监测点的数量 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + + for (int i = 0; i < dsct; i++) { + char bjBit = dataStr.charAt(dataStr.length() - i * 3 - 1); + + rdscr.getDsbj().add(bjBit == '1' ? true : false); + } + } + + return rdscr; + } /** * 将消息对象解析为字节数组 @@ -601,6 +696,7 @@ FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), message.getMessageProducerId(), + message.getCommandType(), message.getMemoryArea(), start, message.getCountWord()); diff --git a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java index 639359e..94540d4 100644 --- a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java +++ b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java @@ -135,12 +135,13 @@ * * @param dest 目标地址 * @param sour 源地址 + * @param sid 服务号 * @param memArea 内存区域代码 * @param start 读取的起始地址 * @param count 读取的长度(以word计,长度为2个字节) */ - public FINSByteFrame(String dest, String sour, byte memArea, byte[] start, int count) { - this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour); // 构造控制域 + public FINSByteFrame(String dest, String sour, String sid, byte memArea, byte[] start, int count) { + this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour, sid); // 构造控制域 // 设置读取内存命令的发送命令功能码00000002 this.COMMAND = FINSConstants.COMMAND_COMMAND; @@ -168,13 +169,14 @@ * * @param dest * @param sour + * @param sid * @param memArea * @param start * @param count * @param dataBody */ - public FINSByteFrame(String dest, String sour, byte memArea, byte[] start, int count, byte[] dataBody) { - this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour); // 构造控制域 + public FINSByteFrame(String dest, String sour, String sid, byte memArea, byte[] start, int count, byte[] dataBody) { + this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour, sid); // 构造控制域 // 构造用户数据域的内容 Bytes data = new Bytes(); diff --git a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java index 10be9db..c992b06 100644 --- a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java +++ b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java @@ -144,6 +144,20 @@ } /** + * 获取SID号,作为命令类型使用 + * @param finsBytes + * @return + */ + public static String getControlSID(byte[] finsBytes) { + byte[] text = getText(finsBytes); + + if (null != text && text.length > 10) + return ByteUtil.binToHexString(new byte[] {text[9]}); + else + return "00"; + } + + /** * 获取命令代码 * 0x0101=读取内存,0x0102=写内存 * @@ -228,9 +242,10 @@ * * @param dest 目标地址:网络号+节点号+单元号 * @param sour 源地址:网络号+节点号+单元号 + * @param sid 服务号:用于标识命令类型 * @return */ - public static byte[] buildFrameControl(String dest, String sour) { + public static byte[] buildFrameControl(String dest, String sour, String sid) { byte[] control = new byte[10]; // 命令类型位固定为1,需要响应标志位固定为0,表示从上位机发送给PLC端的消息,需要PLC响应 @@ -249,7 +264,8 @@ control[7] = sourByte[1]; //源节点号 control[8] = sourByte[2]; //源单元号 - control[9] = FINSConstants.SID; // SID字节 +// control[9] = FINSConstants.SID; // SID字节 + control[9] = ByteUtil.hexStringToBytes(sid, 1)[0]; return control; } diff --git a/src/com/szpg/plc/server/ACUClientHandler.java b/src/com/szpg/plc/server/ACUClientHandler.java index b3d7bc9..d7649fd 100644 --- a/src/com/szpg/plc/server/ACUClientHandler.java +++ b/src/com/szpg/plc/server/ACUClientHandler.java @@ -13,6 +13,7 @@ import com.szpg.plc.protocol.ProtocolFactory; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACULinkTask; +import com.szpg.util.Configure; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -36,13 +37,14 @@ // 2生成LinkCommand对象并解析成byte数组 LinkCommand lc = new LinkCommand(); - lc.setMessageProducerId(ByteUtil.binToHexString(ByteUtil.hexStringToBytes(client.getNode(), 4))); +// lc.setMessageProducerId(ByteUtil.binToHexString(ByteUtil.hexStringToBytes(client.getNode(), 4))); + lc.setMessageProducerId(ByteUtil.binToHexString(ByteUtil.hexStringToBytes(Configure.getProperty("sys", "LOCALHOST.NODE"), 4))); byte[] lcBytes = finspi.messageToBytes(lc); // 3延迟10秒发送握手命令 ScheduledExecutorService linkSche = new ScheduledThreadPoolExecutor(1); - linkSche.schedule(new ACULinkTask(client, lcBytes), 10, TimeUnit.SECONDS); + linkSche.schedule(new ACULinkTask(client, lcBytes), 5, TimeUnit.SECONDS); linkSche.shutdown(); //执行完任务之后关闭线程 } } @@ -66,9 +68,10 @@ // 解析消息 AppMessage message = finspi.bytesToMessage((byte[]) bytesList.get(i)); - - // 命令解析后处理 - message.afterAction(); + if (null != message) { + // 命令解析后处理 + message.afterAction(); + } } } diff --git a/src/com/szpg/task/ReadCH4StatusTask.java b/src/com/szpg/task/ReadCH4StatusTask.java index 11b33b4..d861d8b 100644 --- a/src/com/szpg/task/ReadCH4StatusTask.java +++ b/src/com/szpg/task/ReadCH4StatusTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(ch4AlmCmd.getId()); - cmd.setTm(ch4AlmCmd.getTime().getTime()); cmd.setCmd_type(ch4AlmCmd.getCommandType()); cmd.setDest(ch4AlmCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { ch4AlmCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadCH4ValueTask.java b/src/com/szpg/task/ReadCH4ValueTask.java index 73d957f..4cb658e 100644 --- a/src/com/szpg/task/ReadCH4ValueTask.java +++ b/src/com/szpg/task/ReadCH4ValueTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(ch4Cmd.getId()); - cmd.setTm(ch4Cmd.getTime().getTime()); cmd.setCmd_type(ch4Cmd.getCommandType()); cmd.setDest(ch4Cmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { ch4Cmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadCOStatusTask.java b/src/com/szpg/task/ReadCOStatusTask.java index 11eca56..c01765c 100644 --- a/src/com/szpg/task/ReadCOStatusTask.java +++ b/src/com/szpg/task/ReadCOStatusTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(coAlmCmd.getId()); - cmd.setTm(coAlmCmd.getTime().getTime()); cmd.setCmd_type(coAlmCmd.getCommandType()); cmd.setDest(coAlmCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { coAlmCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadCOValueTask.java b/src/com/szpg/task/ReadCOValueTask.java index 6ff413e..76b9a1b 100644 --- a/src/com/szpg/task/ReadCOValueTask.java +++ b/src/com/szpg/task/ReadCOValueTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(coCmd.getId()); - cmd.setTm(coCmd.getTime().getTime()); cmd.setCmd_type(coCmd.getCommandType()); cmd.setDest(coCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { coCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadDSStatusTask.java b/src/com/szpg/task/ReadDSStatusTask.java new file mode 100644 index 0000000..2437096 --- /dev/null +++ b/src/com/szpg/task/ReadDSStatusTask.java @@ -0,0 +1,47 @@ +package com.szpg.task; + +import com.szpg.db.dao.impl.PgAcuRdcmdDaoImpl; +import com.szpg.db.data.PgAcuRdcmd; +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.command.read.ReadDSStatusCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; + +public class ReadDSStatusTask implements Runnable { + + private ACUClient client; + private AppCommand appCommand; + + public ReadDSStatusTask(ACUClient client, AppCommand command) { + this.client = client; + this.appCommand = command; + } + + @Override + public void run() { + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(appCommand); + + // 发送读取对射报警状态内存命令 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + ReadDSStatusCommand dsAlmCmd = (ReadDSStatusCommand) appCommand; + + // 发送完成之后将命令保存在数据库中 + PgAcuRdcmd cmd = new PgAcuRdcmd(); + cmd.setCmd_type(dsAlmCmd.getCommandType()); + cmd.setDest(dsAlmCmd.getDestinationId()); + cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { dsAlmCmd.getMemoryArea() })); + cmd.setStart_mem_word(dsAlmCmd.getStartAddress().substring(0, 4)); + cmd.setStart_mem_bit(dsAlmCmd.getStartAddress().substring(4)); + cmd.setCount_word(dsAlmCmd.getCountWord()); + cmd.setCount_bit(dsAlmCmd.getCountBit()); + cmd.setCount_sensor(dsAlmCmd.getCountSensor()); + + new PgAcuRdcmdDaoImpl().addCmdRecord(cmd); + } + +} diff --git a/src/com/szpg/task/ReadHSStatusTask.java b/src/com/szpg/task/ReadHSStatusTask.java index 5fc4528..3771f2f 100644 --- a/src/com/szpg/task/ReadHSStatusTask.java +++ b/src/com/szpg/task/ReadHSStatusTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(hsAlmCmd.getId()); - cmd.setTm(hsAlmCmd.getTime().getTime()); cmd.setCmd_type(hsAlmCmd.getCommandType()); cmd.setDest(hsAlmCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { hsAlmCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadHSValueTask.java b/src/com/szpg/task/ReadHSValueTask.java index 2b7591f..bd7b72d 100644 --- a/src/com/szpg/task/ReadHSValueTask.java +++ b/src/com/szpg/task/ReadHSValueTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(hsCmd.getId()); - cmd.setTm(hsCmd.getTime().getTime()); cmd.setCmd_type(hsCmd.getCommandType()); cmd.setDest(hsCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { hsCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadO2StatusTask.java b/src/com/szpg/task/ReadO2StatusTask.java index d947bda..ece2f4c 100644 --- a/src/com/szpg/task/ReadO2StatusTask.java +++ b/src/com/szpg/task/ReadO2StatusTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(coAlmCmd.getId()); - cmd.setTm(coAlmCmd.getTime().getTime()); cmd.setCmd_type(coAlmCmd.getCommandType()); cmd.setDest(coAlmCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { coAlmCmd.getMemoryArea() })); diff --git a/src/ACUBL.properties b/src/ACUBL.properties index ae086d4..99e858d 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -46,7 +46,7 @@ #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2.START = 0500 #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 -YXL.ACU001.O2.WORDCOUNT = 24 +YXL.ACU001.O2.WORDCOUNT = 4 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2ALM.START = 0036 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -66,3 +66,22 @@ YXL.ACU001.HSALM.WORDCOUNT = 1 #\u786b\u5316\u6c22\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 YXL.ACU001.HSALM.BITCOUNT = 12 + +#\u7206\u7ba1\u6db2\u4f4d\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.YW.COUNT = 2 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.YWALM.START = 0025 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.YWALM.WORDCOUNT = 1 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.YWALM.BITCOUNT = 2 + +#\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.DS.COUNT = 15 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.DSALM.START = 0038 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.DSALM.WORDCOUNT = 3 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.DSALM.BITCOUNT = 45 + diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 5e6edbc..8d5ab08 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -16,12 +16,14 @@ import com.szpg.task.ReadCH4ValueTask; import com.szpg.task.ReadCOStatusTask; import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; import com.szpg.task.ReadHSStatusTask; import com.szpg.task.ReadHSValueTask; import com.szpg.task.ReadO2StatusTask; import com.szpg.task.ReadO2ValueTask; import com.szpg.task.ReadWSStatusTask; import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -30,11 +32,12 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.103", 6800); + // PLC设备地址和端口 + ACUClient client = new ACUClient("192.168.0.244", 6800); - client.setNet("00"); - client.setNode("6B"); - client.setUnit("00"); + client.setNet("00"); //网络号 + client.setNode("F4"); //节点号 + client.setUnit("00"); //单元号 // 3将ACU的信息加入到map中 ACUClientUtil.getInstance().addClient(client); @@ -44,33 +47,34 @@ // 测试发送查询甲烷参数命令 // dsc.testSendCH4Command(client); - // 测试发送查询甲烷报警状态命令 -// dsc.testSendCH4StatsuCommand(client); +// // 测试发送查询甲烷报警状态命令 +// dsc.testSendCH4StatusCommand(client); // 测试发送查询温湿度监测值命令 // dsc.testSendWSCommand(client); // 测试发送查询温湿度报警状态命令 // dsc.testSendWSStatusCommand(client); - // 测试发送查询一氧化碳参数命令 +// // 测试发送查询一氧化碳参数命令 // dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 +// // 测试发送查询一氧化碳报警状态命令 // dsc.testSendCOStatusCommand(client); - - // 测试发送查询一氧化碳参数命令 -// dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 -// dsc.testSendCOStatusCommand(client); - +// // 测试发送查询氧气参数命令 // dsc.testSendO2Command(client); // 测试发送查询氧气报警状态命令 // dsc.testSendO2StatusCommand(client); +// +// // 测试发送查询硫化氢参数命令 +// dsc.testSendHSCommand(client); +// // 测试发送查询硫化氢报警状态命令 +// dsc.testSendHSStatusCommand(client); - // 测试发送查询硫化氢参数命令 - dsc.testSendHSCommand(client); - // 测试发送查询硫化氢报警状态命令 - dsc.testSendHSStatusCommand(client); + // 测试发送查询爆管液位报警状态命令 + dsc.testSendYWStatusCommand(client); + + // 测试发送查询对射报警状态命令 +// dsc.testSendDSStatusCommand(client); } /** @@ -97,8 +101,9 @@ ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(client, ch4), 10, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -116,7 +121,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); ch4alm.setDestinationId(dest); - ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); @@ -124,8 +129,9 @@ ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4StatusTask(client, ch4alm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -153,8 +159,9 @@ ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSValueTask(client, ws), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -172,7 +179,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); wsalm.setDestinationId(dest); - wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); @@ -180,8 +187,9 @@ wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSStatusTask(client, wsalm), 25, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -208,8 +216,9 @@ co.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOValueTask(client, co), 30, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -227,7 +236,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); coalm.setDestinationId(dest); - coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); coalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.START")), 2)) + "00"); coalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.WORDCOUNT"))); @@ -235,8 +244,9 @@ coalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOStatusTask(client, coalm), 35, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -263,8 +273,9 @@ o2.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2ValueTask(client, o2), 40, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -282,7 +293,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); o2alm.setDestinationId(dest); - o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); o2alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.START")), 2)) + "00"); o2alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.WORDCOUNT"))); @@ -290,8 +301,9 @@ o2alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2StatusTask(client, o2alm), 45, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -318,8 +330,9 @@ hs.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSValueTask(client, hs), 50, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -337,7 +350,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); hsalm.setDestinationId(dest); - hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); hsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.START")), 2)) + "00"); hsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.WORDCOUNT"))); @@ -345,7 +358,65 @@ hsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSStatusTask(client, hsalm), 55, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询爆管液位报警状态命令 + * @param client + */ + public void testSendYWStatusCommand(ACUClient client) { + ReadMemoryCommand ywalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READYWSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ywalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ywalm.setDestinationId(dest); + + ywalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + ywalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.START")), 2)) + "00"); + ywalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.WORDCOUNT"))); + ywalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.BITCOUNT"))); + ywalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YW.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadYWStatusTask(client, ywalm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + + /** + * 发送查询对射报警状态命令 + * @param client + */ + public void testSendDSStatusCommand(ACUClient client) { + ReadMemoryCommand dsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READDSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + dsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + dsalm.setDestinationId(dest); + + dsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + dsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.START")), 2)) + "00"); + dsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.WORDCOUNT"))); + dsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.BITCOUNT"))); + dsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadDSStatusTask(client, dsalm), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index 70fb6dc..a9d5686 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -10,6 +10,7 @@ public PgAcuRdcmd findById(String id); public PgAcuRdcmd findLatestCmdByDestAndCount(String dest, int count); + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type); public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); diff --git a/src/com/szpg/db/dao/PgDSDao.java b/src/com/szpg/db/dao/PgDSDao.java new file mode 100644 index 0000000..b731af9 --- /dev/null +++ b/src/com/szpg/db/dao/PgDSDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgDSAlm; + +/** + * 对射报警相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgDSDao { + + /******** 对射报警状态 ********/ + public List findAllSbjz(); + public PgDSAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgDSAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/PgYWDao.java b/src/com/szpg/db/dao/PgYWDao.java new file mode 100644 index 0000000..bb27bbf --- /dev/null +++ b/src/com/szpg/db/dao/PgYWDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgYWAlm; + +/** + * 爆管液位相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgYWDao { + + /******** 爆管液位浓度报警状态 ********/ + public List findAllSbjz(); + public PgYWAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgYWAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index b693939..16b2285 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -114,6 +114,41 @@ } return null; } + + + @Override + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ACU_RDCMD WHERE RESPONSED='0' AND TIMEOUT='0' AND DEST=? AND CMD_TYPE=? ORDER BY TM DESC"; + Object[] params = new Object[2]; + params[0] = dest; + params[1] = type; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAcuRdcmd.class), params); + + if (null != list && list.isEmpty() == false) { + logger.debug("根据目的地址和命令类型查询内存读取命令成功[" + list.size() + "]"); + + return list.get(0); + } else + return null; + } catch (Exception ex) { + logger.error("根据目的地址和命令类型查询内存读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } @Override public int addCmdRecord(PgAcuRdcmd cmd) { diff --git a/src/com/szpg/db/dao/impl/PgDSDaoImpl.java b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java new file mode 100644 index 0000000..e9d18cd --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.data.PgDSAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgDSDaoImpl implements PgDSDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgDSAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(0); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询对射报警状态成功" + dsalm + "]"); + + return dsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgDSAlm dsalm) { + return addSbjzRecord(dsalm.getDsalm(), dsalm.getTmStr(), dsalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_DS_ALM " + + "(DSALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入对射报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入对射报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 657281c..7706852 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -39,6 +39,12 @@ case "HS": key = "%硫化氢%"; break; + case "YW": + key = "%液位%"; + break; + case "DS": + key = "%对射%"; + break; } String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '" + key + "' ORDER BY D.ID"; diff --git a/src/com/szpg/db/dao/impl/PgYWDaoImpl.java b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java new file mode 100644 index 0000000..613c4c0 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.data.PgYWAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgYWDaoImpl implements PgYWDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgYWAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(0); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询爆管液位报警状态成功" + ywalm + "]"); + + return ywalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgYWAlm ywalm) { + return addSbjzRecord(ywalm.getYwalm(), ywalm.getTmStr(), ywalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_YW_ALM " + + "(YWALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入爆管液位报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入爆管液位报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index f4ecfe5..2d46bfc 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -1,6 +1,8 @@ package com.szpg.db.data; +import java.util.Calendar; import java.util.Date; +import java.util.UUID; import com.szpg.util.TimeFormat; @@ -31,6 +33,11 @@ private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 + public PgAcuRdcmd() { + this.setId(UUID.randomUUID().toString().replace("-", "")); + this.setTm(Calendar.getInstance().getTime()); + } + public String getId() { return id; } diff --git a/src/com/szpg/db/data/PgDSAlm.java b/src/com/szpg/db/data/PgDSAlm.java new file mode 100644 index 0000000..86e28bb --- /dev/null +++ b/src/com/szpg/db/data/PgDSAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 对射报警状态数据表 + * + * @author admin + * + */ +public class PgDSAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = -8336945265752238748L; + + private Integer id; + private Boolean dsalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getDsalm() { + return dsalm; + } + + public void setDsalm(Boolean dsalm) { + this.dsalm = dsalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgDSAlm[dsalm=" + dsalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/data/PgYWAlm.java b/src/com/szpg/db/data/PgYWAlm.java new file mode 100644 index 0000000..9d9572f --- /dev/null +++ b/src/com/szpg/db/data/PgYWAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 爆管液位浓度报警状态数据表 + * + * @author admin + * + */ +public class PgYWAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 3882791834818808488L; + + private Integer id; + private Boolean ywalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getYwalm() { + return ywalm; + } + + public void setYwalm(Boolean ywalm) { + this.ywalm = ywalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgYWAlm[ywalm=" + ywalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/plc/message/AppMessageConstants.java b/src/com/szpg/plc/message/AppMessageConstants.java index 25db6ab..1c84086 100644 --- a/src/com/szpg/plc/message/AppMessageConstants.java +++ b/src/com/szpg/plc/message/AppMessageConstants.java @@ -13,4 +13,7 @@ public final static String CMD_TYPE_READO2STATUS = "17"; //读取氧气报警状态命令 public final static String CMD_TYPE_READHSVALUE = "18"; //读取硫化氢监测值命令 public final static String CMD_TYPE_READHSSTATUS = "19"; //读取硫化氢报警状态命令 + + public final static String CMD_TYPE_READYWSTATUS = "21"; //读取爆管液位报警状态命令 + public final static String CMD_TYPE_READDSSTATUS = "22"; //读取对射报警状态命令 } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index acf2859..3678a16 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -5,12 +5,14 @@ import com.szpg.plc.message.command.read.ReadCH4ValueCommand; import com.szpg.plc.message.command.read.ReadCOStatusCommand; import com.szpg.plc.message.command.read.ReadCOValueCommand; +import com.szpg.plc.message.command.read.ReadDSStatusCommand; import com.szpg.plc.message.command.read.ReadHSStatusCommand; import com.szpg.plc.message.command.read.ReadHSValueCommand; import com.szpg.plc.message.command.read.ReadO2StatusCommand; import com.szpg.plc.message.command.read.ReadO2ValueCommand; import com.szpg.plc.message.command.read.ReadWSStatusCommand; import com.szpg.plc.message.command.read.ReadWSValueCommand; +import com.szpg.plc.message.command.read.ReadYWStatusCommand; import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -101,6 +103,12 @@ return new ReadHSValueCommand(); case AppMessageConstants.CMD_TYPE_READHSSTATUS: return new ReadHSStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + return new ReadYWStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + return new ReadDSStatusCommand(); default: return null; diff --git a/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java new file mode 100644 index 0000000..eda271f --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; + +public class ReadDSStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = -1668388238102375069L; + + @Override + public Class getResponseClass() { + return ReadDSStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询对射报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READDSSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java new file mode 100644 index 0000000..73c54b3 --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; + +public class ReadYWStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 1019982176997717896L; + + @Override + public Class getResponseClass() { + return ReadYWStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询爆管液位报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READYWSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java new file mode 100644 index 0000000..e2b476b --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java @@ -0,0 +1,57 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgDSDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadDSStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 4047613496835657828L; + + private List dsbj; // 对射报警状态 + + public ReadDSStatusCommandResponse() { + dsbj = new ArrayList(); + } + + public List getDsbj() { + return dsbj; + } + + public void setDsbj(List dsbj) { + this.dsbj = dsbj; + } + + @Override + public void afterAction() { + // 1将对射报警数据存入数据库 + PgDSDao dsDao = new PgDSDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findDeviceIdByDestAndType(this.getMessageProducerId(), "DS"); + + for (int i = 0; i < dsbj.size(); i++) { + if (i < ids.size()) { + dsDao.addSbjzRecord(dsbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (dsbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + + } + } + } + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java new file mode 100644 index 0000000..c2674f2 --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java @@ -0,0 +1,57 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgYWDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadYWStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 8088340048416088978L; + + private List ywbj; // 爆管液位报警状态 + + public ReadYWStatusCommandResponse() { + ywbj = new ArrayList(); + } + + public List getYwbj() { + return ywbj; + } + + public void setYwbj(List ywbj) { + this.ywbj = ywbj; + } + + @Override + public void afterAction() { + // 1将爆管液位浓度数据存入数据库 + PgYWDao ywDao = new PgYWDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findDeviceIdByDestAndType(this.getMessageProducerId(), "YW"); + + for (int i = 0; i < ywbj.size(); i++) { + if (i < ids.size()) { + ywDao.addSbjzRecord(ywbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (ywbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + + } + } + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSConstants.java b/src/com/szpg/plc/protocol/fins/FINSConstants.java index 2697e74..f565b8b 100644 --- a/src/com/szpg/plc/protocol/fins/FINSConstants.java +++ b/src/com/szpg/plc/protocol/fins/FINSConstants.java @@ -21,7 +21,8 @@ /******** 内存区域代码 ********/ public final static byte MEMORY_DM_AREA = (byte) 0x82; //82内存D区代码 - public final static byte MEMORY_WORK_AREA = 0x31; //31内存W区代码 + public final static byte MEMORY_WORK_AREA_WORD = (byte) 0xB1; //B1内存W区代码(按字操作) + public final static byte MEMORY_WORK_AREA_BIT = 0x31; //31内存W区代码(按位操作) /******** 控制域 ********/ public final static byte ICF_COMMAND = (byte) 0x80; //ICF字节代表命令 diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index a11ae12..a65488e 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -19,12 +19,14 @@ import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; import com.szpg.plc.protocol.DTProtocolInterface; import com.szpg.plc.protocol.fins.frame.FINSByteFrame; import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; @@ -115,19 +117,18 @@ // 读写命令的响应 if (commandStr.equalsIgnoreCase("00000002")) { String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); + String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 if (commandCode.equalsIgnoreCase("0101")) { // 读内存命令响应的解析 // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - int count = FINSByteFrameTool.getDataWithoutEndCode(byteMessage).length / 2; //1WORD=2BYTE +// int count = FINSByteFrameTool.getDataWithoutEndCode(byteMessage).length / 2; //1WORD=2BYTE // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 PgAcuRdcmdDao readCmdDao = new PgAcuRdcmdDaoImpl(); - PgAcuRdcmd readCmd = readCmdDao.findLatestCmdByDestAndCount(dest, count); + PgAcuRdcmd readCmd = readCmdDao.findLatestCmdByDestAndType(dest, commandType); if (null != readCmd) { - String commandType = readCmd.getCmd_type(); - // 3根据参数类型调用相应的方法进行解析 switch(commandType) { case AppMessageConstants.CMD_TYPE_READCH4VALUE: @@ -164,6 +165,14 @@ case AppMessageConstants.CMD_TYPE_READHSSTATUS: received = bytesToReadHSStatusCommandResponse(finsFrame, readCmd); break; + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + received = bytesToReadYWStatusCommandResponse(finsFrame, readCmd); + break; + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + received = bytesToReadDSStatusCommandResponse(finsFrame, readCmd); + break; } // 4将已响应的命令删除 @@ -260,7 +269,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int chct = cmd.getCount_sensor(); //甲烷监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < chct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -402,7 +417,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int chct = cmd.getCount_sensor(); //一氧化碳监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < chct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -462,7 +483,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int o2ct = cmd.getCount_sensor(); //氧气监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < o2ct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -522,7 +549,12 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int hsct = cmd.getCount_sensor(); //硫化氢监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } for (int i = 0; i < hsct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -534,6 +566,69 @@ return rhscr; } + + /** + * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int ysct = cmd.getCount_sensor(); //爆管液位监测点的数量 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < ysct; i++) { + char bjBit = dataStr.charAt(dataStr.length() - i - 1); + + ryscr.getYwbj().add(bjBit == '1' ? true : false); + } + } + + return ryscr; + } + + /** + * 将查询对射报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int dsct = cmd.getCount_sensor(); //对射监测点的数量 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + + for (int i = 0; i < dsct; i++) { + char bjBit = dataStr.charAt(dataStr.length() - i * 3 - 1); + + rdscr.getDsbj().add(bjBit == '1' ? true : false); + } + } + + return rdscr; + } /** * 将消息对象解析为字节数组 @@ -601,6 +696,7 @@ FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), message.getMessageProducerId(), + message.getCommandType(), message.getMemoryArea(), start, message.getCountWord()); diff --git a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java index 639359e..94540d4 100644 --- a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java +++ b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java @@ -135,12 +135,13 @@ * * @param dest 目标地址 * @param sour 源地址 + * @param sid 服务号 * @param memArea 内存区域代码 * @param start 读取的起始地址 * @param count 读取的长度(以word计,长度为2个字节) */ - public FINSByteFrame(String dest, String sour, byte memArea, byte[] start, int count) { - this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour); // 构造控制域 + public FINSByteFrame(String dest, String sour, String sid, byte memArea, byte[] start, int count) { + this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour, sid); // 构造控制域 // 设置读取内存命令的发送命令功能码00000002 this.COMMAND = FINSConstants.COMMAND_COMMAND; @@ -168,13 +169,14 @@ * * @param dest * @param sour + * @param sid * @param memArea * @param start * @param count * @param dataBody */ - public FINSByteFrame(String dest, String sour, byte memArea, byte[] start, int count, byte[] dataBody) { - this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour); // 构造控制域 + public FINSByteFrame(String dest, String sour, String sid, byte memArea, byte[] start, int count, byte[] dataBody) { + this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour, sid); // 构造控制域 // 构造用户数据域的内容 Bytes data = new Bytes(); diff --git a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java index 10be9db..c992b06 100644 --- a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java +++ b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java @@ -144,6 +144,20 @@ } /** + * 获取SID号,作为命令类型使用 + * @param finsBytes + * @return + */ + public static String getControlSID(byte[] finsBytes) { + byte[] text = getText(finsBytes); + + if (null != text && text.length > 10) + return ByteUtil.binToHexString(new byte[] {text[9]}); + else + return "00"; + } + + /** * 获取命令代码 * 0x0101=读取内存,0x0102=写内存 * @@ -228,9 +242,10 @@ * * @param dest 目标地址:网络号+节点号+单元号 * @param sour 源地址:网络号+节点号+单元号 + * @param sid 服务号:用于标识命令类型 * @return */ - public static byte[] buildFrameControl(String dest, String sour) { + public static byte[] buildFrameControl(String dest, String sour, String sid) { byte[] control = new byte[10]; // 命令类型位固定为1,需要响应标志位固定为0,表示从上位机发送给PLC端的消息,需要PLC响应 @@ -249,7 +264,8 @@ control[7] = sourByte[1]; //源节点号 control[8] = sourByte[2]; //源单元号 - control[9] = FINSConstants.SID; // SID字节 +// control[9] = FINSConstants.SID; // SID字节 + control[9] = ByteUtil.hexStringToBytes(sid, 1)[0]; return control; } diff --git a/src/com/szpg/plc/server/ACUClientHandler.java b/src/com/szpg/plc/server/ACUClientHandler.java index b3d7bc9..d7649fd 100644 --- a/src/com/szpg/plc/server/ACUClientHandler.java +++ b/src/com/szpg/plc/server/ACUClientHandler.java @@ -13,6 +13,7 @@ import com.szpg.plc.protocol.ProtocolFactory; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACULinkTask; +import com.szpg.util.Configure; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -36,13 +37,14 @@ // 2生成LinkCommand对象并解析成byte数组 LinkCommand lc = new LinkCommand(); - lc.setMessageProducerId(ByteUtil.binToHexString(ByteUtil.hexStringToBytes(client.getNode(), 4))); +// lc.setMessageProducerId(ByteUtil.binToHexString(ByteUtil.hexStringToBytes(client.getNode(), 4))); + lc.setMessageProducerId(ByteUtil.binToHexString(ByteUtil.hexStringToBytes(Configure.getProperty("sys", "LOCALHOST.NODE"), 4))); byte[] lcBytes = finspi.messageToBytes(lc); // 3延迟10秒发送握手命令 ScheduledExecutorService linkSche = new ScheduledThreadPoolExecutor(1); - linkSche.schedule(new ACULinkTask(client, lcBytes), 10, TimeUnit.SECONDS); + linkSche.schedule(new ACULinkTask(client, lcBytes), 5, TimeUnit.SECONDS); linkSche.shutdown(); //执行完任务之后关闭线程 } } @@ -66,9 +68,10 @@ // 解析消息 AppMessage message = finspi.bytesToMessage((byte[]) bytesList.get(i)); - - // 命令解析后处理 - message.afterAction(); + if (null != message) { + // 命令解析后处理 + message.afterAction(); + } } } diff --git a/src/com/szpg/task/ReadCH4StatusTask.java b/src/com/szpg/task/ReadCH4StatusTask.java index 11b33b4..d861d8b 100644 --- a/src/com/szpg/task/ReadCH4StatusTask.java +++ b/src/com/szpg/task/ReadCH4StatusTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(ch4AlmCmd.getId()); - cmd.setTm(ch4AlmCmd.getTime().getTime()); cmd.setCmd_type(ch4AlmCmd.getCommandType()); cmd.setDest(ch4AlmCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { ch4AlmCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadCH4ValueTask.java b/src/com/szpg/task/ReadCH4ValueTask.java index 73d957f..4cb658e 100644 --- a/src/com/szpg/task/ReadCH4ValueTask.java +++ b/src/com/szpg/task/ReadCH4ValueTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(ch4Cmd.getId()); - cmd.setTm(ch4Cmd.getTime().getTime()); cmd.setCmd_type(ch4Cmd.getCommandType()); cmd.setDest(ch4Cmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { ch4Cmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadCOStatusTask.java b/src/com/szpg/task/ReadCOStatusTask.java index 11eca56..c01765c 100644 --- a/src/com/szpg/task/ReadCOStatusTask.java +++ b/src/com/szpg/task/ReadCOStatusTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(coAlmCmd.getId()); - cmd.setTm(coAlmCmd.getTime().getTime()); cmd.setCmd_type(coAlmCmd.getCommandType()); cmd.setDest(coAlmCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { coAlmCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadCOValueTask.java b/src/com/szpg/task/ReadCOValueTask.java index 6ff413e..76b9a1b 100644 --- a/src/com/szpg/task/ReadCOValueTask.java +++ b/src/com/szpg/task/ReadCOValueTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(coCmd.getId()); - cmd.setTm(coCmd.getTime().getTime()); cmd.setCmd_type(coCmd.getCommandType()); cmd.setDest(coCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { coCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadDSStatusTask.java b/src/com/szpg/task/ReadDSStatusTask.java new file mode 100644 index 0000000..2437096 --- /dev/null +++ b/src/com/szpg/task/ReadDSStatusTask.java @@ -0,0 +1,47 @@ +package com.szpg.task; + +import com.szpg.db.dao.impl.PgAcuRdcmdDaoImpl; +import com.szpg.db.data.PgAcuRdcmd; +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.command.read.ReadDSStatusCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; + +public class ReadDSStatusTask implements Runnable { + + private ACUClient client; + private AppCommand appCommand; + + public ReadDSStatusTask(ACUClient client, AppCommand command) { + this.client = client; + this.appCommand = command; + } + + @Override + public void run() { + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(appCommand); + + // 发送读取对射报警状态内存命令 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + ReadDSStatusCommand dsAlmCmd = (ReadDSStatusCommand) appCommand; + + // 发送完成之后将命令保存在数据库中 + PgAcuRdcmd cmd = new PgAcuRdcmd(); + cmd.setCmd_type(dsAlmCmd.getCommandType()); + cmd.setDest(dsAlmCmd.getDestinationId()); + cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { dsAlmCmd.getMemoryArea() })); + cmd.setStart_mem_word(dsAlmCmd.getStartAddress().substring(0, 4)); + cmd.setStart_mem_bit(dsAlmCmd.getStartAddress().substring(4)); + cmd.setCount_word(dsAlmCmd.getCountWord()); + cmd.setCount_bit(dsAlmCmd.getCountBit()); + cmd.setCount_sensor(dsAlmCmd.getCountSensor()); + + new PgAcuRdcmdDaoImpl().addCmdRecord(cmd); + } + +} diff --git a/src/com/szpg/task/ReadHSStatusTask.java b/src/com/szpg/task/ReadHSStatusTask.java index 5fc4528..3771f2f 100644 --- a/src/com/szpg/task/ReadHSStatusTask.java +++ b/src/com/szpg/task/ReadHSStatusTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(hsAlmCmd.getId()); - cmd.setTm(hsAlmCmd.getTime().getTime()); cmd.setCmd_type(hsAlmCmd.getCommandType()); cmd.setDest(hsAlmCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { hsAlmCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadHSValueTask.java b/src/com/szpg/task/ReadHSValueTask.java index 2b7591f..bd7b72d 100644 --- a/src/com/szpg/task/ReadHSValueTask.java +++ b/src/com/szpg/task/ReadHSValueTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(hsCmd.getId()); - cmd.setTm(hsCmd.getTime().getTime()); cmd.setCmd_type(hsCmd.getCommandType()); cmd.setDest(hsCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { hsCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadO2StatusTask.java b/src/com/szpg/task/ReadO2StatusTask.java index d947bda..ece2f4c 100644 --- a/src/com/szpg/task/ReadO2StatusTask.java +++ b/src/com/szpg/task/ReadO2StatusTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(coAlmCmd.getId()); - cmd.setTm(coAlmCmd.getTime().getTime()); cmd.setCmd_type(coAlmCmd.getCommandType()); cmd.setDest(coAlmCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { coAlmCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadO2ValueTask.java b/src/com/szpg/task/ReadO2ValueTask.java index 8591dbe..c8aa1a4 100644 --- a/src/com/szpg/task/ReadO2ValueTask.java +++ b/src/com/szpg/task/ReadO2ValueTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(coCmd.getId()); - cmd.setTm(coCmd.getTime().getTime()); cmd.setCmd_type(coCmd.getCommandType()); cmd.setDest(coCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { coCmd.getMemoryArea() })); diff --git a/src/ACUBL.properties b/src/ACUBL.properties index ae086d4..99e858d 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -46,7 +46,7 @@ #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2.START = 0500 #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 -YXL.ACU001.O2.WORDCOUNT = 24 +YXL.ACU001.O2.WORDCOUNT = 4 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2ALM.START = 0036 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -66,3 +66,22 @@ YXL.ACU001.HSALM.WORDCOUNT = 1 #\u786b\u5316\u6c22\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 YXL.ACU001.HSALM.BITCOUNT = 12 + +#\u7206\u7ba1\u6db2\u4f4d\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.YW.COUNT = 2 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.YWALM.START = 0025 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.YWALM.WORDCOUNT = 1 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.YWALM.BITCOUNT = 2 + +#\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.DS.COUNT = 15 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.DSALM.START = 0038 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.DSALM.WORDCOUNT = 3 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.DSALM.BITCOUNT = 45 + diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 5e6edbc..8d5ab08 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -16,12 +16,14 @@ import com.szpg.task.ReadCH4ValueTask; import com.szpg.task.ReadCOStatusTask; import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; import com.szpg.task.ReadHSStatusTask; import com.szpg.task.ReadHSValueTask; import com.szpg.task.ReadO2StatusTask; import com.szpg.task.ReadO2ValueTask; import com.szpg.task.ReadWSStatusTask; import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -30,11 +32,12 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.103", 6800); + // PLC设备地址和端口 + ACUClient client = new ACUClient("192.168.0.244", 6800); - client.setNet("00"); - client.setNode("6B"); - client.setUnit("00"); + client.setNet("00"); //网络号 + client.setNode("F4"); //节点号 + client.setUnit("00"); //单元号 // 3将ACU的信息加入到map中 ACUClientUtil.getInstance().addClient(client); @@ -44,33 +47,34 @@ // 测试发送查询甲烷参数命令 // dsc.testSendCH4Command(client); - // 测试发送查询甲烷报警状态命令 -// dsc.testSendCH4StatsuCommand(client); +// // 测试发送查询甲烷报警状态命令 +// dsc.testSendCH4StatusCommand(client); // 测试发送查询温湿度监测值命令 // dsc.testSendWSCommand(client); // 测试发送查询温湿度报警状态命令 // dsc.testSendWSStatusCommand(client); - // 测试发送查询一氧化碳参数命令 +// // 测试发送查询一氧化碳参数命令 // dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 +// // 测试发送查询一氧化碳报警状态命令 // dsc.testSendCOStatusCommand(client); - - // 测试发送查询一氧化碳参数命令 -// dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 -// dsc.testSendCOStatusCommand(client); - +// // 测试发送查询氧气参数命令 // dsc.testSendO2Command(client); // 测试发送查询氧气报警状态命令 // dsc.testSendO2StatusCommand(client); +// +// // 测试发送查询硫化氢参数命令 +// dsc.testSendHSCommand(client); +// // 测试发送查询硫化氢报警状态命令 +// dsc.testSendHSStatusCommand(client); - // 测试发送查询硫化氢参数命令 - dsc.testSendHSCommand(client); - // 测试发送查询硫化氢报警状态命令 - dsc.testSendHSStatusCommand(client); + // 测试发送查询爆管液位报警状态命令 + dsc.testSendYWStatusCommand(client); + + // 测试发送查询对射报警状态命令 +// dsc.testSendDSStatusCommand(client); } /** @@ -97,8 +101,9 @@ ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(client, ch4), 10, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -116,7 +121,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); ch4alm.setDestinationId(dest); - ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); @@ -124,8 +129,9 @@ ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4StatusTask(client, ch4alm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -153,8 +159,9 @@ ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSValueTask(client, ws), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -172,7 +179,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); wsalm.setDestinationId(dest); - wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); @@ -180,8 +187,9 @@ wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSStatusTask(client, wsalm), 25, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -208,8 +216,9 @@ co.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOValueTask(client, co), 30, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -227,7 +236,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); coalm.setDestinationId(dest); - coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); coalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.START")), 2)) + "00"); coalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.WORDCOUNT"))); @@ -235,8 +244,9 @@ coalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOStatusTask(client, coalm), 35, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -263,8 +273,9 @@ o2.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2ValueTask(client, o2), 40, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -282,7 +293,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); o2alm.setDestinationId(dest); - o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); o2alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.START")), 2)) + "00"); o2alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.WORDCOUNT"))); @@ -290,8 +301,9 @@ o2alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2StatusTask(client, o2alm), 45, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -318,8 +330,9 @@ hs.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSValueTask(client, hs), 50, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -337,7 +350,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); hsalm.setDestinationId(dest); - hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); hsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.START")), 2)) + "00"); hsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.WORDCOUNT"))); @@ -345,7 +358,65 @@ hsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSStatusTask(client, hsalm), 55, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询爆管液位报警状态命令 + * @param client + */ + public void testSendYWStatusCommand(ACUClient client) { + ReadMemoryCommand ywalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READYWSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ywalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ywalm.setDestinationId(dest); + + ywalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + ywalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.START")), 2)) + "00"); + ywalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.WORDCOUNT"))); + ywalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.BITCOUNT"))); + ywalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YW.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadYWStatusTask(client, ywalm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + + /** + * 发送查询对射报警状态命令 + * @param client + */ + public void testSendDSStatusCommand(ACUClient client) { + ReadMemoryCommand dsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READDSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + dsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + dsalm.setDestinationId(dest); + + dsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + dsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.START")), 2)) + "00"); + dsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.WORDCOUNT"))); + dsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.BITCOUNT"))); + dsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadDSStatusTask(client, dsalm), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index 70fb6dc..a9d5686 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -10,6 +10,7 @@ public PgAcuRdcmd findById(String id); public PgAcuRdcmd findLatestCmdByDestAndCount(String dest, int count); + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type); public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); diff --git a/src/com/szpg/db/dao/PgDSDao.java b/src/com/szpg/db/dao/PgDSDao.java new file mode 100644 index 0000000..b731af9 --- /dev/null +++ b/src/com/szpg/db/dao/PgDSDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgDSAlm; + +/** + * 对射报警相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgDSDao { + + /******** 对射报警状态 ********/ + public List findAllSbjz(); + public PgDSAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgDSAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/PgYWDao.java b/src/com/szpg/db/dao/PgYWDao.java new file mode 100644 index 0000000..bb27bbf --- /dev/null +++ b/src/com/szpg/db/dao/PgYWDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgYWAlm; + +/** + * 爆管液位相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgYWDao { + + /******** 爆管液位浓度报警状态 ********/ + public List findAllSbjz(); + public PgYWAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgYWAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index b693939..16b2285 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -114,6 +114,41 @@ } return null; } + + + @Override + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ACU_RDCMD WHERE RESPONSED='0' AND TIMEOUT='0' AND DEST=? AND CMD_TYPE=? ORDER BY TM DESC"; + Object[] params = new Object[2]; + params[0] = dest; + params[1] = type; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAcuRdcmd.class), params); + + if (null != list && list.isEmpty() == false) { + logger.debug("根据目的地址和命令类型查询内存读取命令成功[" + list.size() + "]"); + + return list.get(0); + } else + return null; + } catch (Exception ex) { + logger.error("根据目的地址和命令类型查询内存读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } @Override public int addCmdRecord(PgAcuRdcmd cmd) { diff --git a/src/com/szpg/db/dao/impl/PgDSDaoImpl.java b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java new file mode 100644 index 0000000..e9d18cd --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.data.PgDSAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgDSDaoImpl implements PgDSDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgDSAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(0); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询对射报警状态成功" + dsalm + "]"); + + return dsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgDSAlm dsalm) { + return addSbjzRecord(dsalm.getDsalm(), dsalm.getTmStr(), dsalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_DS_ALM " + + "(DSALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入对射报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入对射报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 657281c..7706852 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -39,6 +39,12 @@ case "HS": key = "%硫化氢%"; break; + case "YW": + key = "%液位%"; + break; + case "DS": + key = "%对射%"; + break; } String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '" + key + "' ORDER BY D.ID"; diff --git a/src/com/szpg/db/dao/impl/PgYWDaoImpl.java b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java new file mode 100644 index 0000000..613c4c0 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.data.PgYWAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgYWDaoImpl implements PgYWDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgYWAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(0); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询爆管液位报警状态成功" + ywalm + "]"); + + return ywalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgYWAlm ywalm) { + return addSbjzRecord(ywalm.getYwalm(), ywalm.getTmStr(), ywalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_YW_ALM " + + "(YWALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入爆管液位报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入爆管液位报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index f4ecfe5..2d46bfc 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -1,6 +1,8 @@ package com.szpg.db.data; +import java.util.Calendar; import java.util.Date; +import java.util.UUID; import com.szpg.util.TimeFormat; @@ -31,6 +33,11 @@ private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 + public PgAcuRdcmd() { + this.setId(UUID.randomUUID().toString().replace("-", "")); + this.setTm(Calendar.getInstance().getTime()); + } + public String getId() { return id; } diff --git a/src/com/szpg/db/data/PgDSAlm.java b/src/com/szpg/db/data/PgDSAlm.java new file mode 100644 index 0000000..86e28bb --- /dev/null +++ b/src/com/szpg/db/data/PgDSAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 对射报警状态数据表 + * + * @author admin + * + */ +public class PgDSAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = -8336945265752238748L; + + private Integer id; + private Boolean dsalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getDsalm() { + return dsalm; + } + + public void setDsalm(Boolean dsalm) { + this.dsalm = dsalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgDSAlm[dsalm=" + dsalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/data/PgYWAlm.java b/src/com/szpg/db/data/PgYWAlm.java new file mode 100644 index 0000000..9d9572f --- /dev/null +++ b/src/com/szpg/db/data/PgYWAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 爆管液位浓度报警状态数据表 + * + * @author admin + * + */ +public class PgYWAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 3882791834818808488L; + + private Integer id; + private Boolean ywalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getYwalm() { + return ywalm; + } + + public void setYwalm(Boolean ywalm) { + this.ywalm = ywalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgYWAlm[ywalm=" + ywalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/plc/message/AppMessageConstants.java b/src/com/szpg/plc/message/AppMessageConstants.java index 25db6ab..1c84086 100644 --- a/src/com/szpg/plc/message/AppMessageConstants.java +++ b/src/com/szpg/plc/message/AppMessageConstants.java @@ -13,4 +13,7 @@ public final static String CMD_TYPE_READO2STATUS = "17"; //读取氧气报警状态命令 public final static String CMD_TYPE_READHSVALUE = "18"; //读取硫化氢监测值命令 public final static String CMD_TYPE_READHSSTATUS = "19"; //读取硫化氢报警状态命令 + + public final static String CMD_TYPE_READYWSTATUS = "21"; //读取爆管液位报警状态命令 + public final static String CMD_TYPE_READDSSTATUS = "22"; //读取对射报警状态命令 } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index acf2859..3678a16 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -5,12 +5,14 @@ import com.szpg.plc.message.command.read.ReadCH4ValueCommand; import com.szpg.plc.message.command.read.ReadCOStatusCommand; import com.szpg.plc.message.command.read.ReadCOValueCommand; +import com.szpg.plc.message.command.read.ReadDSStatusCommand; import com.szpg.plc.message.command.read.ReadHSStatusCommand; import com.szpg.plc.message.command.read.ReadHSValueCommand; import com.szpg.plc.message.command.read.ReadO2StatusCommand; import com.szpg.plc.message.command.read.ReadO2ValueCommand; import com.szpg.plc.message.command.read.ReadWSStatusCommand; import com.szpg.plc.message.command.read.ReadWSValueCommand; +import com.szpg.plc.message.command.read.ReadYWStatusCommand; import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -101,6 +103,12 @@ return new ReadHSValueCommand(); case AppMessageConstants.CMD_TYPE_READHSSTATUS: return new ReadHSStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + return new ReadYWStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + return new ReadDSStatusCommand(); default: return null; diff --git a/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java new file mode 100644 index 0000000..eda271f --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; + +public class ReadDSStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = -1668388238102375069L; + + @Override + public Class getResponseClass() { + return ReadDSStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询对射报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READDSSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java new file mode 100644 index 0000000..73c54b3 --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; + +public class ReadYWStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 1019982176997717896L; + + @Override + public Class getResponseClass() { + return ReadYWStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询爆管液位报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READYWSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java new file mode 100644 index 0000000..e2b476b --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java @@ -0,0 +1,57 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgDSDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadDSStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 4047613496835657828L; + + private List dsbj; // 对射报警状态 + + public ReadDSStatusCommandResponse() { + dsbj = new ArrayList(); + } + + public List getDsbj() { + return dsbj; + } + + public void setDsbj(List dsbj) { + this.dsbj = dsbj; + } + + @Override + public void afterAction() { + // 1将对射报警数据存入数据库 + PgDSDao dsDao = new PgDSDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findDeviceIdByDestAndType(this.getMessageProducerId(), "DS"); + + for (int i = 0; i < dsbj.size(); i++) { + if (i < ids.size()) { + dsDao.addSbjzRecord(dsbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (dsbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + + } + } + } + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java new file mode 100644 index 0000000..c2674f2 --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java @@ -0,0 +1,57 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgYWDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadYWStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 8088340048416088978L; + + private List ywbj; // 爆管液位报警状态 + + public ReadYWStatusCommandResponse() { + ywbj = new ArrayList(); + } + + public List getYwbj() { + return ywbj; + } + + public void setYwbj(List ywbj) { + this.ywbj = ywbj; + } + + @Override + public void afterAction() { + // 1将爆管液位浓度数据存入数据库 + PgYWDao ywDao = new PgYWDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findDeviceIdByDestAndType(this.getMessageProducerId(), "YW"); + + for (int i = 0; i < ywbj.size(); i++) { + if (i < ids.size()) { + ywDao.addSbjzRecord(ywbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (ywbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + + } + } + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSConstants.java b/src/com/szpg/plc/protocol/fins/FINSConstants.java index 2697e74..f565b8b 100644 --- a/src/com/szpg/plc/protocol/fins/FINSConstants.java +++ b/src/com/szpg/plc/protocol/fins/FINSConstants.java @@ -21,7 +21,8 @@ /******** 内存区域代码 ********/ public final static byte MEMORY_DM_AREA = (byte) 0x82; //82内存D区代码 - public final static byte MEMORY_WORK_AREA = 0x31; //31内存W区代码 + public final static byte MEMORY_WORK_AREA_WORD = (byte) 0xB1; //B1内存W区代码(按字操作) + public final static byte MEMORY_WORK_AREA_BIT = 0x31; //31内存W区代码(按位操作) /******** 控制域 ********/ public final static byte ICF_COMMAND = (byte) 0x80; //ICF字节代表命令 diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index a11ae12..a65488e 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -19,12 +19,14 @@ import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; import com.szpg.plc.protocol.DTProtocolInterface; import com.szpg.plc.protocol.fins.frame.FINSByteFrame; import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; @@ -115,19 +117,18 @@ // 读写命令的响应 if (commandStr.equalsIgnoreCase("00000002")) { String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); + String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 if (commandCode.equalsIgnoreCase("0101")) { // 读内存命令响应的解析 // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - int count = FINSByteFrameTool.getDataWithoutEndCode(byteMessage).length / 2; //1WORD=2BYTE +// int count = FINSByteFrameTool.getDataWithoutEndCode(byteMessage).length / 2; //1WORD=2BYTE // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 PgAcuRdcmdDao readCmdDao = new PgAcuRdcmdDaoImpl(); - PgAcuRdcmd readCmd = readCmdDao.findLatestCmdByDestAndCount(dest, count); + PgAcuRdcmd readCmd = readCmdDao.findLatestCmdByDestAndType(dest, commandType); if (null != readCmd) { - String commandType = readCmd.getCmd_type(); - // 3根据参数类型调用相应的方法进行解析 switch(commandType) { case AppMessageConstants.CMD_TYPE_READCH4VALUE: @@ -164,6 +165,14 @@ case AppMessageConstants.CMD_TYPE_READHSSTATUS: received = bytesToReadHSStatusCommandResponse(finsFrame, readCmd); break; + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + received = bytesToReadYWStatusCommandResponse(finsFrame, readCmd); + break; + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + received = bytesToReadDSStatusCommandResponse(finsFrame, readCmd); + break; } // 4将已响应的命令删除 @@ -260,7 +269,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int chct = cmd.getCount_sensor(); //甲烷监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < chct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -402,7 +417,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int chct = cmd.getCount_sensor(); //一氧化碳监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < chct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -462,7 +483,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int o2ct = cmd.getCount_sensor(); //氧气监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < o2ct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -522,7 +549,12 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int hsct = cmd.getCount_sensor(); //硫化氢监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } for (int i = 0; i < hsct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -534,6 +566,69 @@ return rhscr; } + + /** + * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int ysct = cmd.getCount_sensor(); //爆管液位监测点的数量 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < ysct; i++) { + char bjBit = dataStr.charAt(dataStr.length() - i - 1); + + ryscr.getYwbj().add(bjBit == '1' ? true : false); + } + } + + return ryscr; + } + + /** + * 将查询对射报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int dsct = cmd.getCount_sensor(); //对射监测点的数量 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + + for (int i = 0; i < dsct; i++) { + char bjBit = dataStr.charAt(dataStr.length() - i * 3 - 1); + + rdscr.getDsbj().add(bjBit == '1' ? true : false); + } + } + + return rdscr; + } /** * 将消息对象解析为字节数组 @@ -601,6 +696,7 @@ FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), message.getMessageProducerId(), + message.getCommandType(), message.getMemoryArea(), start, message.getCountWord()); diff --git a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java index 639359e..94540d4 100644 --- a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java +++ b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java @@ -135,12 +135,13 @@ * * @param dest 目标地址 * @param sour 源地址 + * @param sid 服务号 * @param memArea 内存区域代码 * @param start 读取的起始地址 * @param count 读取的长度(以word计,长度为2个字节) */ - public FINSByteFrame(String dest, String sour, byte memArea, byte[] start, int count) { - this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour); // 构造控制域 + public FINSByteFrame(String dest, String sour, String sid, byte memArea, byte[] start, int count) { + this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour, sid); // 构造控制域 // 设置读取内存命令的发送命令功能码00000002 this.COMMAND = FINSConstants.COMMAND_COMMAND; @@ -168,13 +169,14 @@ * * @param dest * @param sour + * @param sid * @param memArea * @param start * @param count * @param dataBody */ - public FINSByteFrame(String dest, String sour, byte memArea, byte[] start, int count, byte[] dataBody) { - this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour); // 构造控制域 + public FINSByteFrame(String dest, String sour, String sid, byte memArea, byte[] start, int count, byte[] dataBody) { + this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour, sid); // 构造控制域 // 构造用户数据域的内容 Bytes data = new Bytes(); diff --git a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java index 10be9db..c992b06 100644 --- a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java +++ b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java @@ -144,6 +144,20 @@ } /** + * 获取SID号,作为命令类型使用 + * @param finsBytes + * @return + */ + public static String getControlSID(byte[] finsBytes) { + byte[] text = getText(finsBytes); + + if (null != text && text.length > 10) + return ByteUtil.binToHexString(new byte[] {text[9]}); + else + return "00"; + } + + /** * 获取命令代码 * 0x0101=读取内存,0x0102=写内存 * @@ -228,9 +242,10 @@ * * @param dest 目标地址:网络号+节点号+单元号 * @param sour 源地址:网络号+节点号+单元号 + * @param sid 服务号:用于标识命令类型 * @return */ - public static byte[] buildFrameControl(String dest, String sour) { + public static byte[] buildFrameControl(String dest, String sour, String sid) { byte[] control = new byte[10]; // 命令类型位固定为1,需要响应标志位固定为0,表示从上位机发送给PLC端的消息,需要PLC响应 @@ -249,7 +264,8 @@ control[7] = sourByte[1]; //源节点号 control[8] = sourByte[2]; //源单元号 - control[9] = FINSConstants.SID; // SID字节 +// control[9] = FINSConstants.SID; // SID字节 + control[9] = ByteUtil.hexStringToBytes(sid, 1)[0]; return control; } diff --git a/src/com/szpg/plc/server/ACUClientHandler.java b/src/com/szpg/plc/server/ACUClientHandler.java index b3d7bc9..d7649fd 100644 --- a/src/com/szpg/plc/server/ACUClientHandler.java +++ b/src/com/szpg/plc/server/ACUClientHandler.java @@ -13,6 +13,7 @@ import com.szpg.plc.protocol.ProtocolFactory; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACULinkTask; +import com.szpg.util.Configure; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -36,13 +37,14 @@ // 2生成LinkCommand对象并解析成byte数组 LinkCommand lc = new LinkCommand(); - lc.setMessageProducerId(ByteUtil.binToHexString(ByteUtil.hexStringToBytes(client.getNode(), 4))); +// lc.setMessageProducerId(ByteUtil.binToHexString(ByteUtil.hexStringToBytes(client.getNode(), 4))); + lc.setMessageProducerId(ByteUtil.binToHexString(ByteUtil.hexStringToBytes(Configure.getProperty("sys", "LOCALHOST.NODE"), 4))); byte[] lcBytes = finspi.messageToBytes(lc); // 3延迟10秒发送握手命令 ScheduledExecutorService linkSche = new ScheduledThreadPoolExecutor(1); - linkSche.schedule(new ACULinkTask(client, lcBytes), 10, TimeUnit.SECONDS); + linkSche.schedule(new ACULinkTask(client, lcBytes), 5, TimeUnit.SECONDS); linkSche.shutdown(); //执行完任务之后关闭线程 } } @@ -66,9 +68,10 @@ // 解析消息 AppMessage message = finspi.bytesToMessage((byte[]) bytesList.get(i)); - - // 命令解析后处理 - message.afterAction(); + if (null != message) { + // 命令解析后处理 + message.afterAction(); + } } } diff --git a/src/com/szpg/task/ReadCH4StatusTask.java b/src/com/szpg/task/ReadCH4StatusTask.java index 11b33b4..d861d8b 100644 --- a/src/com/szpg/task/ReadCH4StatusTask.java +++ b/src/com/szpg/task/ReadCH4StatusTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(ch4AlmCmd.getId()); - cmd.setTm(ch4AlmCmd.getTime().getTime()); cmd.setCmd_type(ch4AlmCmd.getCommandType()); cmd.setDest(ch4AlmCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { ch4AlmCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadCH4ValueTask.java b/src/com/szpg/task/ReadCH4ValueTask.java index 73d957f..4cb658e 100644 --- a/src/com/szpg/task/ReadCH4ValueTask.java +++ b/src/com/szpg/task/ReadCH4ValueTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(ch4Cmd.getId()); - cmd.setTm(ch4Cmd.getTime().getTime()); cmd.setCmd_type(ch4Cmd.getCommandType()); cmd.setDest(ch4Cmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { ch4Cmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadCOStatusTask.java b/src/com/szpg/task/ReadCOStatusTask.java index 11eca56..c01765c 100644 --- a/src/com/szpg/task/ReadCOStatusTask.java +++ b/src/com/szpg/task/ReadCOStatusTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(coAlmCmd.getId()); - cmd.setTm(coAlmCmd.getTime().getTime()); cmd.setCmd_type(coAlmCmd.getCommandType()); cmd.setDest(coAlmCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { coAlmCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadCOValueTask.java b/src/com/szpg/task/ReadCOValueTask.java index 6ff413e..76b9a1b 100644 --- a/src/com/szpg/task/ReadCOValueTask.java +++ b/src/com/szpg/task/ReadCOValueTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(coCmd.getId()); - cmd.setTm(coCmd.getTime().getTime()); cmd.setCmd_type(coCmd.getCommandType()); cmd.setDest(coCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { coCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadDSStatusTask.java b/src/com/szpg/task/ReadDSStatusTask.java new file mode 100644 index 0000000..2437096 --- /dev/null +++ b/src/com/szpg/task/ReadDSStatusTask.java @@ -0,0 +1,47 @@ +package com.szpg.task; + +import com.szpg.db.dao.impl.PgAcuRdcmdDaoImpl; +import com.szpg.db.data.PgAcuRdcmd; +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.command.read.ReadDSStatusCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; + +public class ReadDSStatusTask implements Runnable { + + private ACUClient client; + private AppCommand appCommand; + + public ReadDSStatusTask(ACUClient client, AppCommand command) { + this.client = client; + this.appCommand = command; + } + + @Override + public void run() { + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(appCommand); + + // 发送读取对射报警状态内存命令 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + ReadDSStatusCommand dsAlmCmd = (ReadDSStatusCommand) appCommand; + + // 发送完成之后将命令保存在数据库中 + PgAcuRdcmd cmd = new PgAcuRdcmd(); + cmd.setCmd_type(dsAlmCmd.getCommandType()); + cmd.setDest(dsAlmCmd.getDestinationId()); + cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { dsAlmCmd.getMemoryArea() })); + cmd.setStart_mem_word(dsAlmCmd.getStartAddress().substring(0, 4)); + cmd.setStart_mem_bit(dsAlmCmd.getStartAddress().substring(4)); + cmd.setCount_word(dsAlmCmd.getCountWord()); + cmd.setCount_bit(dsAlmCmd.getCountBit()); + cmd.setCount_sensor(dsAlmCmd.getCountSensor()); + + new PgAcuRdcmdDaoImpl().addCmdRecord(cmd); + } + +} diff --git a/src/com/szpg/task/ReadHSStatusTask.java b/src/com/szpg/task/ReadHSStatusTask.java index 5fc4528..3771f2f 100644 --- a/src/com/szpg/task/ReadHSStatusTask.java +++ b/src/com/szpg/task/ReadHSStatusTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(hsAlmCmd.getId()); - cmd.setTm(hsAlmCmd.getTime().getTime()); cmd.setCmd_type(hsAlmCmd.getCommandType()); cmd.setDest(hsAlmCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { hsAlmCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadHSValueTask.java b/src/com/szpg/task/ReadHSValueTask.java index 2b7591f..bd7b72d 100644 --- a/src/com/szpg/task/ReadHSValueTask.java +++ b/src/com/szpg/task/ReadHSValueTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(hsCmd.getId()); - cmd.setTm(hsCmd.getTime().getTime()); cmd.setCmd_type(hsCmd.getCommandType()); cmd.setDest(hsCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { hsCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadO2StatusTask.java b/src/com/szpg/task/ReadO2StatusTask.java index d947bda..ece2f4c 100644 --- a/src/com/szpg/task/ReadO2StatusTask.java +++ b/src/com/szpg/task/ReadO2StatusTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(coAlmCmd.getId()); - cmd.setTm(coAlmCmd.getTime().getTime()); cmd.setCmd_type(coAlmCmd.getCommandType()); cmd.setDest(coAlmCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { coAlmCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadO2ValueTask.java b/src/com/szpg/task/ReadO2ValueTask.java index 8591dbe..c8aa1a4 100644 --- a/src/com/szpg/task/ReadO2ValueTask.java +++ b/src/com/szpg/task/ReadO2ValueTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(coCmd.getId()); - cmd.setTm(coCmd.getTime().getTime()); cmd.setCmd_type(coCmd.getCommandType()); cmd.setDest(coCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { coCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadWSStatusTask.java b/src/com/szpg/task/ReadWSStatusTask.java index 94506d4..4c33e98 100644 --- a/src/com/szpg/task/ReadWSStatusTask.java +++ b/src/com/szpg/task/ReadWSStatusTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(wsAlmCmd.getId()); - cmd.setTm(wsAlmCmd.getTime().getTime()); cmd.setCmd_type(wsAlmCmd.getCommandType()); cmd.setDest(wsAlmCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { wsAlmCmd.getMemoryArea() })); diff --git a/src/ACUBL.properties b/src/ACUBL.properties index ae086d4..99e858d 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -46,7 +46,7 @@ #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2.START = 0500 #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 -YXL.ACU001.O2.WORDCOUNT = 24 +YXL.ACU001.O2.WORDCOUNT = 4 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2ALM.START = 0036 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -66,3 +66,22 @@ YXL.ACU001.HSALM.WORDCOUNT = 1 #\u786b\u5316\u6c22\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 YXL.ACU001.HSALM.BITCOUNT = 12 + +#\u7206\u7ba1\u6db2\u4f4d\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.YW.COUNT = 2 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.YWALM.START = 0025 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.YWALM.WORDCOUNT = 1 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.YWALM.BITCOUNT = 2 + +#\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.DS.COUNT = 15 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.DSALM.START = 0038 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.DSALM.WORDCOUNT = 3 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.DSALM.BITCOUNT = 45 + diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 5e6edbc..8d5ab08 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -16,12 +16,14 @@ import com.szpg.task.ReadCH4ValueTask; import com.szpg.task.ReadCOStatusTask; import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; import com.szpg.task.ReadHSStatusTask; import com.szpg.task.ReadHSValueTask; import com.szpg.task.ReadO2StatusTask; import com.szpg.task.ReadO2ValueTask; import com.szpg.task.ReadWSStatusTask; import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -30,11 +32,12 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.103", 6800); + // PLC设备地址和端口 + ACUClient client = new ACUClient("192.168.0.244", 6800); - client.setNet("00"); - client.setNode("6B"); - client.setUnit("00"); + client.setNet("00"); //网络号 + client.setNode("F4"); //节点号 + client.setUnit("00"); //单元号 // 3将ACU的信息加入到map中 ACUClientUtil.getInstance().addClient(client); @@ -44,33 +47,34 @@ // 测试发送查询甲烷参数命令 // dsc.testSendCH4Command(client); - // 测试发送查询甲烷报警状态命令 -// dsc.testSendCH4StatsuCommand(client); +// // 测试发送查询甲烷报警状态命令 +// dsc.testSendCH4StatusCommand(client); // 测试发送查询温湿度监测值命令 // dsc.testSendWSCommand(client); // 测试发送查询温湿度报警状态命令 // dsc.testSendWSStatusCommand(client); - // 测试发送查询一氧化碳参数命令 +// // 测试发送查询一氧化碳参数命令 // dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 +// // 测试发送查询一氧化碳报警状态命令 // dsc.testSendCOStatusCommand(client); - - // 测试发送查询一氧化碳参数命令 -// dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 -// dsc.testSendCOStatusCommand(client); - +// // 测试发送查询氧气参数命令 // dsc.testSendO2Command(client); // 测试发送查询氧气报警状态命令 // dsc.testSendO2StatusCommand(client); +// +// // 测试发送查询硫化氢参数命令 +// dsc.testSendHSCommand(client); +// // 测试发送查询硫化氢报警状态命令 +// dsc.testSendHSStatusCommand(client); - // 测试发送查询硫化氢参数命令 - dsc.testSendHSCommand(client); - // 测试发送查询硫化氢报警状态命令 - dsc.testSendHSStatusCommand(client); + // 测试发送查询爆管液位报警状态命令 + dsc.testSendYWStatusCommand(client); + + // 测试发送查询对射报警状态命令 +// dsc.testSendDSStatusCommand(client); } /** @@ -97,8 +101,9 @@ ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(client, ch4), 10, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -116,7 +121,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); ch4alm.setDestinationId(dest); - ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); @@ -124,8 +129,9 @@ ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4StatusTask(client, ch4alm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -153,8 +159,9 @@ ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSValueTask(client, ws), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -172,7 +179,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); wsalm.setDestinationId(dest); - wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); @@ -180,8 +187,9 @@ wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSStatusTask(client, wsalm), 25, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -208,8 +216,9 @@ co.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOValueTask(client, co), 30, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -227,7 +236,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); coalm.setDestinationId(dest); - coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); coalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.START")), 2)) + "00"); coalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.WORDCOUNT"))); @@ -235,8 +244,9 @@ coalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOStatusTask(client, coalm), 35, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -263,8 +273,9 @@ o2.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2ValueTask(client, o2), 40, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -282,7 +293,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); o2alm.setDestinationId(dest); - o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); o2alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.START")), 2)) + "00"); o2alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.WORDCOUNT"))); @@ -290,8 +301,9 @@ o2alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2StatusTask(client, o2alm), 45, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -318,8 +330,9 @@ hs.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSValueTask(client, hs), 50, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -337,7 +350,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); hsalm.setDestinationId(dest); - hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); hsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.START")), 2)) + "00"); hsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.WORDCOUNT"))); @@ -345,7 +358,65 @@ hsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSStatusTask(client, hsalm), 55, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询爆管液位报警状态命令 + * @param client + */ + public void testSendYWStatusCommand(ACUClient client) { + ReadMemoryCommand ywalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READYWSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ywalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ywalm.setDestinationId(dest); + + ywalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + ywalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.START")), 2)) + "00"); + ywalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.WORDCOUNT"))); + ywalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.BITCOUNT"))); + ywalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YW.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadYWStatusTask(client, ywalm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + + /** + * 发送查询对射报警状态命令 + * @param client + */ + public void testSendDSStatusCommand(ACUClient client) { + ReadMemoryCommand dsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READDSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + dsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + dsalm.setDestinationId(dest); + + dsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + dsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.START")), 2)) + "00"); + dsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.WORDCOUNT"))); + dsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.BITCOUNT"))); + dsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadDSStatusTask(client, dsalm), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index 70fb6dc..a9d5686 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -10,6 +10,7 @@ public PgAcuRdcmd findById(String id); public PgAcuRdcmd findLatestCmdByDestAndCount(String dest, int count); + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type); public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); diff --git a/src/com/szpg/db/dao/PgDSDao.java b/src/com/szpg/db/dao/PgDSDao.java new file mode 100644 index 0000000..b731af9 --- /dev/null +++ b/src/com/szpg/db/dao/PgDSDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgDSAlm; + +/** + * 对射报警相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgDSDao { + + /******** 对射报警状态 ********/ + public List findAllSbjz(); + public PgDSAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgDSAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/PgYWDao.java b/src/com/szpg/db/dao/PgYWDao.java new file mode 100644 index 0000000..bb27bbf --- /dev/null +++ b/src/com/szpg/db/dao/PgYWDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgYWAlm; + +/** + * 爆管液位相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgYWDao { + + /******** 爆管液位浓度报警状态 ********/ + public List findAllSbjz(); + public PgYWAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgYWAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index b693939..16b2285 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -114,6 +114,41 @@ } return null; } + + + @Override + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ACU_RDCMD WHERE RESPONSED='0' AND TIMEOUT='0' AND DEST=? AND CMD_TYPE=? ORDER BY TM DESC"; + Object[] params = new Object[2]; + params[0] = dest; + params[1] = type; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAcuRdcmd.class), params); + + if (null != list && list.isEmpty() == false) { + logger.debug("根据目的地址和命令类型查询内存读取命令成功[" + list.size() + "]"); + + return list.get(0); + } else + return null; + } catch (Exception ex) { + logger.error("根据目的地址和命令类型查询内存读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } @Override public int addCmdRecord(PgAcuRdcmd cmd) { diff --git a/src/com/szpg/db/dao/impl/PgDSDaoImpl.java b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java new file mode 100644 index 0000000..e9d18cd --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.data.PgDSAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgDSDaoImpl implements PgDSDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgDSAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(0); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询对射报警状态成功" + dsalm + "]"); + + return dsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgDSAlm dsalm) { + return addSbjzRecord(dsalm.getDsalm(), dsalm.getTmStr(), dsalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_DS_ALM " + + "(DSALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入对射报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入对射报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 657281c..7706852 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -39,6 +39,12 @@ case "HS": key = "%硫化氢%"; break; + case "YW": + key = "%液位%"; + break; + case "DS": + key = "%对射%"; + break; } String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '" + key + "' ORDER BY D.ID"; diff --git a/src/com/szpg/db/dao/impl/PgYWDaoImpl.java b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java new file mode 100644 index 0000000..613c4c0 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.data.PgYWAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgYWDaoImpl implements PgYWDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgYWAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(0); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询爆管液位报警状态成功" + ywalm + "]"); + + return ywalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgYWAlm ywalm) { + return addSbjzRecord(ywalm.getYwalm(), ywalm.getTmStr(), ywalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_YW_ALM " + + "(YWALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入爆管液位报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入爆管液位报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index f4ecfe5..2d46bfc 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -1,6 +1,8 @@ package com.szpg.db.data; +import java.util.Calendar; import java.util.Date; +import java.util.UUID; import com.szpg.util.TimeFormat; @@ -31,6 +33,11 @@ private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 + public PgAcuRdcmd() { + this.setId(UUID.randomUUID().toString().replace("-", "")); + this.setTm(Calendar.getInstance().getTime()); + } + public String getId() { return id; } diff --git a/src/com/szpg/db/data/PgDSAlm.java b/src/com/szpg/db/data/PgDSAlm.java new file mode 100644 index 0000000..86e28bb --- /dev/null +++ b/src/com/szpg/db/data/PgDSAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 对射报警状态数据表 + * + * @author admin + * + */ +public class PgDSAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = -8336945265752238748L; + + private Integer id; + private Boolean dsalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getDsalm() { + return dsalm; + } + + public void setDsalm(Boolean dsalm) { + this.dsalm = dsalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgDSAlm[dsalm=" + dsalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/data/PgYWAlm.java b/src/com/szpg/db/data/PgYWAlm.java new file mode 100644 index 0000000..9d9572f --- /dev/null +++ b/src/com/szpg/db/data/PgYWAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 爆管液位浓度报警状态数据表 + * + * @author admin + * + */ +public class PgYWAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 3882791834818808488L; + + private Integer id; + private Boolean ywalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getYwalm() { + return ywalm; + } + + public void setYwalm(Boolean ywalm) { + this.ywalm = ywalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgYWAlm[ywalm=" + ywalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/plc/message/AppMessageConstants.java b/src/com/szpg/plc/message/AppMessageConstants.java index 25db6ab..1c84086 100644 --- a/src/com/szpg/plc/message/AppMessageConstants.java +++ b/src/com/szpg/plc/message/AppMessageConstants.java @@ -13,4 +13,7 @@ public final static String CMD_TYPE_READO2STATUS = "17"; //读取氧气报警状态命令 public final static String CMD_TYPE_READHSVALUE = "18"; //读取硫化氢监测值命令 public final static String CMD_TYPE_READHSSTATUS = "19"; //读取硫化氢报警状态命令 + + public final static String CMD_TYPE_READYWSTATUS = "21"; //读取爆管液位报警状态命令 + public final static String CMD_TYPE_READDSSTATUS = "22"; //读取对射报警状态命令 } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index acf2859..3678a16 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -5,12 +5,14 @@ import com.szpg.plc.message.command.read.ReadCH4ValueCommand; import com.szpg.plc.message.command.read.ReadCOStatusCommand; import com.szpg.plc.message.command.read.ReadCOValueCommand; +import com.szpg.plc.message.command.read.ReadDSStatusCommand; import com.szpg.plc.message.command.read.ReadHSStatusCommand; import com.szpg.plc.message.command.read.ReadHSValueCommand; import com.szpg.plc.message.command.read.ReadO2StatusCommand; import com.szpg.plc.message.command.read.ReadO2ValueCommand; import com.szpg.plc.message.command.read.ReadWSStatusCommand; import com.szpg.plc.message.command.read.ReadWSValueCommand; +import com.szpg.plc.message.command.read.ReadYWStatusCommand; import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -101,6 +103,12 @@ return new ReadHSValueCommand(); case AppMessageConstants.CMD_TYPE_READHSSTATUS: return new ReadHSStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + return new ReadYWStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + return new ReadDSStatusCommand(); default: return null; diff --git a/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java new file mode 100644 index 0000000..eda271f --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; + +public class ReadDSStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = -1668388238102375069L; + + @Override + public Class getResponseClass() { + return ReadDSStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询对射报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READDSSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java new file mode 100644 index 0000000..73c54b3 --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; + +public class ReadYWStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 1019982176997717896L; + + @Override + public Class getResponseClass() { + return ReadYWStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询爆管液位报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READYWSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java new file mode 100644 index 0000000..e2b476b --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java @@ -0,0 +1,57 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgDSDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadDSStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 4047613496835657828L; + + private List dsbj; // 对射报警状态 + + public ReadDSStatusCommandResponse() { + dsbj = new ArrayList(); + } + + public List getDsbj() { + return dsbj; + } + + public void setDsbj(List dsbj) { + this.dsbj = dsbj; + } + + @Override + public void afterAction() { + // 1将对射报警数据存入数据库 + PgDSDao dsDao = new PgDSDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findDeviceIdByDestAndType(this.getMessageProducerId(), "DS"); + + for (int i = 0; i < dsbj.size(); i++) { + if (i < ids.size()) { + dsDao.addSbjzRecord(dsbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (dsbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + + } + } + } + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java new file mode 100644 index 0000000..c2674f2 --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java @@ -0,0 +1,57 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgYWDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadYWStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 8088340048416088978L; + + private List ywbj; // 爆管液位报警状态 + + public ReadYWStatusCommandResponse() { + ywbj = new ArrayList(); + } + + public List getYwbj() { + return ywbj; + } + + public void setYwbj(List ywbj) { + this.ywbj = ywbj; + } + + @Override + public void afterAction() { + // 1将爆管液位浓度数据存入数据库 + PgYWDao ywDao = new PgYWDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findDeviceIdByDestAndType(this.getMessageProducerId(), "YW"); + + for (int i = 0; i < ywbj.size(); i++) { + if (i < ids.size()) { + ywDao.addSbjzRecord(ywbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (ywbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + + } + } + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSConstants.java b/src/com/szpg/plc/protocol/fins/FINSConstants.java index 2697e74..f565b8b 100644 --- a/src/com/szpg/plc/protocol/fins/FINSConstants.java +++ b/src/com/szpg/plc/protocol/fins/FINSConstants.java @@ -21,7 +21,8 @@ /******** 内存区域代码 ********/ public final static byte MEMORY_DM_AREA = (byte) 0x82; //82内存D区代码 - public final static byte MEMORY_WORK_AREA = 0x31; //31内存W区代码 + public final static byte MEMORY_WORK_AREA_WORD = (byte) 0xB1; //B1内存W区代码(按字操作) + public final static byte MEMORY_WORK_AREA_BIT = 0x31; //31内存W区代码(按位操作) /******** 控制域 ********/ public final static byte ICF_COMMAND = (byte) 0x80; //ICF字节代表命令 diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index a11ae12..a65488e 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -19,12 +19,14 @@ import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; import com.szpg.plc.protocol.DTProtocolInterface; import com.szpg.plc.protocol.fins.frame.FINSByteFrame; import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; @@ -115,19 +117,18 @@ // 读写命令的响应 if (commandStr.equalsIgnoreCase("00000002")) { String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); + String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 if (commandCode.equalsIgnoreCase("0101")) { // 读内存命令响应的解析 // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - int count = FINSByteFrameTool.getDataWithoutEndCode(byteMessage).length / 2; //1WORD=2BYTE +// int count = FINSByteFrameTool.getDataWithoutEndCode(byteMessage).length / 2; //1WORD=2BYTE // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 PgAcuRdcmdDao readCmdDao = new PgAcuRdcmdDaoImpl(); - PgAcuRdcmd readCmd = readCmdDao.findLatestCmdByDestAndCount(dest, count); + PgAcuRdcmd readCmd = readCmdDao.findLatestCmdByDestAndType(dest, commandType); if (null != readCmd) { - String commandType = readCmd.getCmd_type(); - // 3根据参数类型调用相应的方法进行解析 switch(commandType) { case AppMessageConstants.CMD_TYPE_READCH4VALUE: @@ -164,6 +165,14 @@ case AppMessageConstants.CMD_TYPE_READHSSTATUS: received = bytesToReadHSStatusCommandResponse(finsFrame, readCmd); break; + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + received = bytesToReadYWStatusCommandResponse(finsFrame, readCmd); + break; + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + received = bytesToReadDSStatusCommandResponse(finsFrame, readCmd); + break; } // 4将已响应的命令删除 @@ -260,7 +269,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int chct = cmd.getCount_sensor(); //甲烷监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < chct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -402,7 +417,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int chct = cmd.getCount_sensor(); //一氧化碳监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < chct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -462,7 +483,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int o2ct = cmd.getCount_sensor(); //氧气监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < o2ct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -522,7 +549,12 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int hsct = cmd.getCount_sensor(); //硫化氢监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } for (int i = 0; i < hsct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -534,6 +566,69 @@ return rhscr; } + + /** + * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int ysct = cmd.getCount_sensor(); //爆管液位监测点的数量 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < ysct; i++) { + char bjBit = dataStr.charAt(dataStr.length() - i - 1); + + ryscr.getYwbj().add(bjBit == '1' ? true : false); + } + } + + return ryscr; + } + + /** + * 将查询对射报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int dsct = cmd.getCount_sensor(); //对射监测点的数量 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + + for (int i = 0; i < dsct; i++) { + char bjBit = dataStr.charAt(dataStr.length() - i * 3 - 1); + + rdscr.getDsbj().add(bjBit == '1' ? true : false); + } + } + + return rdscr; + } /** * 将消息对象解析为字节数组 @@ -601,6 +696,7 @@ FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), message.getMessageProducerId(), + message.getCommandType(), message.getMemoryArea(), start, message.getCountWord()); diff --git a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java index 639359e..94540d4 100644 --- a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java +++ b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java @@ -135,12 +135,13 @@ * * @param dest 目标地址 * @param sour 源地址 + * @param sid 服务号 * @param memArea 内存区域代码 * @param start 读取的起始地址 * @param count 读取的长度(以word计,长度为2个字节) */ - public FINSByteFrame(String dest, String sour, byte memArea, byte[] start, int count) { - this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour); // 构造控制域 + public FINSByteFrame(String dest, String sour, String sid, byte memArea, byte[] start, int count) { + this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour, sid); // 构造控制域 // 设置读取内存命令的发送命令功能码00000002 this.COMMAND = FINSConstants.COMMAND_COMMAND; @@ -168,13 +169,14 @@ * * @param dest * @param sour + * @param sid * @param memArea * @param start * @param count * @param dataBody */ - public FINSByteFrame(String dest, String sour, byte memArea, byte[] start, int count, byte[] dataBody) { - this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour); // 构造控制域 + public FINSByteFrame(String dest, String sour, String sid, byte memArea, byte[] start, int count, byte[] dataBody) { + this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour, sid); // 构造控制域 // 构造用户数据域的内容 Bytes data = new Bytes(); diff --git a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java index 10be9db..c992b06 100644 --- a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java +++ b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java @@ -144,6 +144,20 @@ } /** + * 获取SID号,作为命令类型使用 + * @param finsBytes + * @return + */ + public static String getControlSID(byte[] finsBytes) { + byte[] text = getText(finsBytes); + + if (null != text && text.length > 10) + return ByteUtil.binToHexString(new byte[] {text[9]}); + else + return "00"; + } + + /** * 获取命令代码 * 0x0101=读取内存,0x0102=写内存 * @@ -228,9 +242,10 @@ * * @param dest 目标地址:网络号+节点号+单元号 * @param sour 源地址:网络号+节点号+单元号 + * @param sid 服务号:用于标识命令类型 * @return */ - public static byte[] buildFrameControl(String dest, String sour) { + public static byte[] buildFrameControl(String dest, String sour, String sid) { byte[] control = new byte[10]; // 命令类型位固定为1,需要响应标志位固定为0,表示从上位机发送给PLC端的消息,需要PLC响应 @@ -249,7 +264,8 @@ control[7] = sourByte[1]; //源节点号 control[8] = sourByte[2]; //源单元号 - control[9] = FINSConstants.SID; // SID字节 +// control[9] = FINSConstants.SID; // SID字节 + control[9] = ByteUtil.hexStringToBytes(sid, 1)[0]; return control; } diff --git a/src/com/szpg/plc/server/ACUClientHandler.java b/src/com/szpg/plc/server/ACUClientHandler.java index b3d7bc9..d7649fd 100644 --- a/src/com/szpg/plc/server/ACUClientHandler.java +++ b/src/com/szpg/plc/server/ACUClientHandler.java @@ -13,6 +13,7 @@ import com.szpg.plc.protocol.ProtocolFactory; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACULinkTask; +import com.szpg.util.Configure; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -36,13 +37,14 @@ // 2生成LinkCommand对象并解析成byte数组 LinkCommand lc = new LinkCommand(); - lc.setMessageProducerId(ByteUtil.binToHexString(ByteUtil.hexStringToBytes(client.getNode(), 4))); +// lc.setMessageProducerId(ByteUtil.binToHexString(ByteUtil.hexStringToBytes(client.getNode(), 4))); + lc.setMessageProducerId(ByteUtil.binToHexString(ByteUtil.hexStringToBytes(Configure.getProperty("sys", "LOCALHOST.NODE"), 4))); byte[] lcBytes = finspi.messageToBytes(lc); // 3延迟10秒发送握手命令 ScheduledExecutorService linkSche = new ScheduledThreadPoolExecutor(1); - linkSche.schedule(new ACULinkTask(client, lcBytes), 10, TimeUnit.SECONDS); + linkSche.schedule(new ACULinkTask(client, lcBytes), 5, TimeUnit.SECONDS); linkSche.shutdown(); //执行完任务之后关闭线程 } } @@ -66,9 +68,10 @@ // 解析消息 AppMessage message = finspi.bytesToMessage((byte[]) bytesList.get(i)); - - // 命令解析后处理 - message.afterAction(); + if (null != message) { + // 命令解析后处理 + message.afterAction(); + } } } diff --git a/src/com/szpg/task/ReadCH4StatusTask.java b/src/com/szpg/task/ReadCH4StatusTask.java index 11b33b4..d861d8b 100644 --- a/src/com/szpg/task/ReadCH4StatusTask.java +++ b/src/com/szpg/task/ReadCH4StatusTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(ch4AlmCmd.getId()); - cmd.setTm(ch4AlmCmd.getTime().getTime()); cmd.setCmd_type(ch4AlmCmd.getCommandType()); cmd.setDest(ch4AlmCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { ch4AlmCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadCH4ValueTask.java b/src/com/szpg/task/ReadCH4ValueTask.java index 73d957f..4cb658e 100644 --- a/src/com/szpg/task/ReadCH4ValueTask.java +++ b/src/com/szpg/task/ReadCH4ValueTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(ch4Cmd.getId()); - cmd.setTm(ch4Cmd.getTime().getTime()); cmd.setCmd_type(ch4Cmd.getCommandType()); cmd.setDest(ch4Cmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { ch4Cmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadCOStatusTask.java b/src/com/szpg/task/ReadCOStatusTask.java index 11eca56..c01765c 100644 --- a/src/com/szpg/task/ReadCOStatusTask.java +++ b/src/com/szpg/task/ReadCOStatusTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(coAlmCmd.getId()); - cmd.setTm(coAlmCmd.getTime().getTime()); cmd.setCmd_type(coAlmCmd.getCommandType()); cmd.setDest(coAlmCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { coAlmCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadCOValueTask.java b/src/com/szpg/task/ReadCOValueTask.java index 6ff413e..76b9a1b 100644 --- a/src/com/szpg/task/ReadCOValueTask.java +++ b/src/com/szpg/task/ReadCOValueTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(coCmd.getId()); - cmd.setTm(coCmd.getTime().getTime()); cmd.setCmd_type(coCmd.getCommandType()); cmd.setDest(coCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { coCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadDSStatusTask.java b/src/com/szpg/task/ReadDSStatusTask.java new file mode 100644 index 0000000..2437096 --- /dev/null +++ b/src/com/szpg/task/ReadDSStatusTask.java @@ -0,0 +1,47 @@ +package com.szpg.task; + +import com.szpg.db.dao.impl.PgAcuRdcmdDaoImpl; +import com.szpg.db.data.PgAcuRdcmd; +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.command.read.ReadDSStatusCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; + +public class ReadDSStatusTask implements Runnable { + + private ACUClient client; + private AppCommand appCommand; + + public ReadDSStatusTask(ACUClient client, AppCommand command) { + this.client = client; + this.appCommand = command; + } + + @Override + public void run() { + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(appCommand); + + // 发送读取对射报警状态内存命令 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + ReadDSStatusCommand dsAlmCmd = (ReadDSStatusCommand) appCommand; + + // 发送完成之后将命令保存在数据库中 + PgAcuRdcmd cmd = new PgAcuRdcmd(); + cmd.setCmd_type(dsAlmCmd.getCommandType()); + cmd.setDest(dsAlmCmd.getDestinationId()); + cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { dsAlmCmd.getMemoryArea() })); + cmd.setStart_mem_word(dsAlmCmd.getStartAddress().substring(0, 4)); + cmd.setStart_mem_bit(dsAlmCmd.getStartAddress().substring(4)); + cmd.setCount_word(dsAlmCmd.getCountWord()); + cmd.setCount_bit(dsAlmCmd.getCountBit()); + cmd.setCount_sensor(dsAlmCmd.getCountSensor()); + + new PgAcuRdcmdDaoImpl().addCmdRecord(cmd); + } + +} diff --git a/src/com/szpg/task/ReadHSStatusTask.java b/src/com/szpg/task/ReadHSStatusTask.java index 5fc4528..3771f2f 100644 --- a/src/com/szpg/task/ReadHSStatusTask.java +++ b/src/com/szpg/task/ReadHSStatusTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(hsAlmCmd.getId()); - cmd.setTm(hsAlmCmd.getTime().getTime()); cmd.setCmd_type(hsAlmCmd.getCommandType()); cmd.setDest(hsAlmCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { hsAlmCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadHSValueTask.java b/src/com/szpg/task/ReadHSValueTask.java index 2b7591f..bd7b72d 100644 --- a/src/com/szpg/task/ReadHSValueTask.java +++ b/src/com/szpg/task/ReadHSValueTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(hsCmd.getId()); - cmd.setTm(hsCmd.getTime().getTime()); cmd.setCmd_type(hsCmd.getCommandType()); cmd.setDest(hsCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { hsCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadO2StatusTask.java b/src/com/szpg/task/ReadO2StatusTask.java index d947bda..ece2f4c 100644 --- a/src/com/szpg/task/ReadO2StatusTask.java +++ b/src/com/szpg/task/ReadO2StatusTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(coAlmCmd.getId()); - cmd.setTm(coAlmCmd.getTime().getTime()); cmd.setCmd_type(coAlmCmd.getCommandType()); cmd.setDest(coAlmCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { coAlmCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadO2ValueTask.java b/src/com/szpg/task/ReadO2ValueTask.java index 8591dbe..c8aa1a4 100644 --- a/src/com/szpg/task/ReadO2ValueTask.java +++ b/src/com/szpg/task/ReadO2ValueTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(coCmd.getId()); - cmd.setTm(coCmd.getTime().getTime()); cmd.setCmd_type(coCmd.getCommandType()); cmd.setDest(coCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { coCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadWSStatusTask.java b/src/com/szpg/task/ReadWSStatusTask.java index 94506d4..4c33e98 100644 --- a/src/com/szpg/task/ReadWSStatusTask.java +++ b/src/com/szpg/task/ReadWSStatusTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(wsAlmCmd.getId()); - cmd.setTm(wsAlmCmd.getTime().getTime()); cmd.setCmd_type(wsAlmCmd.getCommandType()); cmd.setDest(wsAlmCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { wsAlmCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadWSValueTask.java b/src/com/szpg/task/ReadWSValueTask.java index 1dbe5ad..386b493 100644 --- a/src/com/szpg/task/ReadWSValueTask.java +++ b/src/com/szpg/task/ReadWSValueTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(wsCmd.getId()); - cmd.setTm(wsCmd.getTime().getTime()); cmd.setCmd_type(wsCmd.getCommandType()); cmd.setDest(wsCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { wsCmd.getMemoryArea() })); diff --git a/src/ACUBL.properties b/src/ACUBL.properties index ae086d4..99e858d 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -46,7 +46,7 @@ #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2.START = 0500 #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 -YXL.ACU001.O2.WORDCOUNT = 24 +YXL.ACU001.O2.WORDCOUNT = 4 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2ALM.START = 0036 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -66,3 +66,22 @@ YXL.ACU001.HSALM.WORDCOUNT = 1 #\u786b\u5316\u6c22\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 YXL.ACU001.HSALM.BITCOUNT = 12 + +#\u7206\u7ba1\u6db2\u4f4d\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.YW.COUNT = 2 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.YWALM.START = 0025 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.YWALM.WORDCOUNT = 1 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.YWALM.BITCOUNT = 2 + +#\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.DS.COUNT = 15 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.DSALM.START = 0038 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.DSALM.WORDCOUNT = 3 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.DSALM.BITCOUNT = 45 + diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 5e6edbc..8d5ab08 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -16,12 +16,14 @@ import com.szpg.task.ReadCH4ValueTask; import com.szpg.task.ReadCOStatusTask; import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; import com.szpg.task.ReadHSStatusTask; import com.szpg.task.ReadHSValueTask; import com.szpg.task.ReadO2StatusTask; import com.szpg.task.ReadO2ValueTask; import com.szpg.task.ReadWSStatusTask; import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -30,11 +32,12 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.103", 6800); + // PLC设备地址和端口 + ACUClient client = new ACUClient("192.168.0.244", 6800); - client.setNet("00"); - client.setNode("6B"); - client.setUnit("00"); + client.setNet("00"); //网络号 + client.setNode("F4"); //节点号 + client.setUnit("00"); //单元号 // 3将ACU的信息加入到map中 ACUClientUtil.getInstance().addClient(client); @@ -44,33 +47,34 @@ // 测试发送查询甲烷参数命令 // dsc.testSendCH4Command(client); - // 测试发送查询甲烷报警状态命令 -// dsc.testSendCH4StatsuCommand(client); +// // 测试发送查询甲烷报警状态命令 +// dsc.testSendCH4StatusCommand(client); // 测试发送查询温湿度监测值命令 // dsc.testSendWSCommand(client); // 测试发送查询温湿度报警状态命令 // dsc.testSendWSStatusCommand(client); - // 测试发送查询一氧化碳参数命令 +// // 测试发送查询一氧化碳参数命令 // dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 +// // 测试发送查询一氧化碳报警状态命令 // dsc.testSendCOStatusCommand(client); - - // 测试发送查询一氧化碳参数命令 -// dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 -// dsc.testSendCOStatusCommand(client); - +// // 测试发送查询氧气参数命令 // dsc.testSendO2Command(client); // 测试发送查询氧气报警状态命令 // dsc.testSendO2StatusCommand(client); +// +// // 测试发送查询硫化氢参数命令 +// dsc.testSendHSCommand(client); +// // 测试发送查询硫化氢报警状态命令 +// dsc.testSendHSStatusCommand(client); - // 测试发送查询硫化氢参数命令 - dsc.testSendHSCommand(client); - // 测试发送查询硫化氢报警状态命令 - dsc.testSendHSStatusCommand(client); + // 测试发送查询爆管液位报警状态命令 + dsc.testSendYWStatusCommand(client); + + // 测试发送查询对射报警状态命令 +// dsc.testSendDSStatusCommand(client); } /** @@ -97,8 +101,9 @@ ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(client, ch4), 10, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -116,7 +121,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); ch4alm.setDestinationId(dest); - ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); @@ -124,8 +129,9 @@ ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4StatusTask(client, ch4alm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -153,8 +159,9 @@ ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSValueTask(client, ws), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -172,7 +179,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); wsalm.setDestinationId(dest); - wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); @@ -180,8 +187,9 @@ wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSStatusTask(client, wsalm), 25, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -208,8 +216,9 @@ co.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOValueTask(client, co), 30, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -227,7 +236,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); coalm.setDestinationId(dest); - coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); coalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.START")), 2)) + "00"); coalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.WORDCOUNT"))); @@ -235,8 +244,9 @@ coalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOStatusTask(client, coalm), 35, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -263,8 +273,9 @@ o2.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2ValueTask(client, o2), 40, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -282,7 +293,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); o2alm.setDestinationId(dest); - o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); o2alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.START")), 2)) + "00"); o2alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.WORDCOUNT"))); @@ -290,8 +301,9 @@ o2alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2StatusTask(client, o2alm), 45, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -318,8 +330,9 @@ hs.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSValueTask(client, hs), 50, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -337,7 +350,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); hsalm.setDestinationId(dest); - hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); hsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.START")), 2)) + "00"); hsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.WORDCOUNT"))); @@ -345,7 +358,65 @@ hsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSStatusTask(client, hsalm), 55, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询爆管液位报警状态命令 + * @param client + */ + public void testSendYWStatusCommand(ACUClient client) { + ReadMemoryCommand ywalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READYWSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ywalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ywalm.setDestinationId(dest); + + ywalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + ywalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.START")), 2)) + "00"); + ywalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.WORDCOUNT"))); + ywalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.BITCOUNT"))); + ywalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YW.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadYWStatusTask(client, ywalm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + + /** + * 发送查询对射报警状态命令 + * @param client + */ + public void testSendDSStatusCommand(ACUClient client) { + ReadMemoryCommand dsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READDSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + dsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + dsalm.setDestinationId(dest); + + dsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + dsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.START")), 2)) + "00"); + dsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.WORDCOUNT"))); + dsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.BITCOUNT"))); + dsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadDSStatusTask(client, dsalm), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index 70fb6dc..a9d5686 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -10,6 +10,7 @@ public PgAcuRdcmd findById(String id); public PgAcuRdcmd findLatestCmdByDestAndCount(String dest, int count); + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type); public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); diff --git a/src/com/szpg/db/dao/PgDSDao.java b/src/com/szpg/db/dao/PgDSDao.java new file mode 100644 index 0000000..b731af9 --- /dev/null +++ b/src/com/szpg/db/dao/PgDSDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgDSAlm; + +/** + * 对射报警相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgDSDao { + + /******** 对射报警状态 ********/ + public List findAllSbjz(); + public PgDSAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgDSAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/PgYWDao.java b/src/com/szpg/db/dao/PgYWDao.java new file mode 100644 index 0000000..bb27bbf --- /dev/null +++ b/src/com/szpg/db/dao/PgYWDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgYWAlm; + +/** + * 爆管液位相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgYWDao { + + /******** 爆管液位浓度报警状态 ********/ + public List findAllSbjz(); + public PgYWAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgYWAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index b693939..16b2285 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -114,6 +114,41 @@ } return null; } + + + @Override + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ACU_RDCMD WHERE RESPONSED='0' AND TIMEOUT='0' AND DEST=? AND CMD_TYPE=? ORDER BY TM DESC"; + Object[] params = new Object[2]; + params[0] = dest; + params[1] = type; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAcuRdcmd.class), params); + + if (null != list && list.isEmpty() == false) { + logger.debug("根据目的地址和命令类型查询内存读取命令成功[" + list.size() + "]"); + + return list.get(0); + } else + return null; + } catch (Exception ex) { + logger.error("根据目的地址和命令类型查询内存读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } @Override public int addCmdRecord(PgAcuRdcmd cmd) { diff --git a/src/com/szpg/db/dao/impl/PgDSDaoImpl.java b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java new file mode 100644 index 0000000..e9d18cd --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.data.PgDSAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgDSDaoImpl implements PgDSDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgDSAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(0); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询对射报警状态成功" + dsalm + "]"); + + return dsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgDSAlm dsalm) { + return addSbjzRecord(dsalm.getDsalm(), dsalm.getTmStr(), dsalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_DS_ALM " + + "(DSALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入对射报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入对射报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 657281c..7706852 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -39,6 +39,12 @@ case "HS": key = "%硫化氢%"; break; + case "YW": + key = "%液位%"; + break; + case "DS": + key = "%对射%"; + break; } String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '" + key + "' ORDER BY D.ID"; diff --git a/src/com/szpg/db/dao/impl/PgYWDaoImpl.java b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java new file mode 100644 index 0000000..613c4c0 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.data.PgYWAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgYWDaoImpl implements PgYWDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgYWAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(0); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询爆管液位报警状态成功" + ywalm + "]"); + + return ywalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgYWAlm ywalm) { + return addSbjzRecord(ywalm.getYwalm(), ywalm.getTmStr(), ywalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_YW_ALM " + + "(YWALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入爆管液位报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入爆管液位报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index f4ecfe5..2d46bfc 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -1,6 +1,8 @@ package com.szpg.db.data; +import java.util.Calendar; import java.util.Date; +import java.util.UUID; import com.szpg.util.TimeFormat; @@ -31,6 +33,11 @@ private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 + public PgAcuRdcmd() { + this.setId(UUID.randomUUID().toString().replace("-", "")); + this.setTm(Calendar.getInstance().getTime()); + } + public String getId() { return id; } diff --git a/src/com/szpg/db/data/PgDSAlm.java b/src/com/szpg/db/data/PgDSAlm.java new file mode 100644 index 0000000..86e28bb --- /dev/null +++ b/src/com/szpg/db/data/PgDSAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 对射报警状态数据表 + * + * @author admin + * + */ +public class PgDSAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = -8336945265752238748L; + + private Integer id; + private Boolean dsalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getDsalm() { + return dsalm; + } + + public void setDsalm(Boolean dsalm) { + this.dsalm = dsalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgDSAlm[dsalm=" + dsalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/data/PgYWAlm.java b/src/com/szpg/db/data/PgYWAlm.java new file mode 100644 index 0000000..9d9572f --- /dev/null +++ b/src/com/szpg/db/data/PgYWAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 爆管液位浓度报警状态数据表 + * + * @author admin + * + */ +public class PgYWAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 3882791834818808488L; + + private Integer id; + private Boolean ywalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getYwalm() { + return ywalm; + } + + public void setYwalm(Boolean ywalm) { + this.ywalm = ywalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgYWAlm[ywalm=" + ywalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/plc/message/AppMessageConstants.java b/src/com/szpg/plc/message/AppMessageConstants.java index 25db6ab..1c84086 100644 --- a/src/com/szpg/plc/message/AppMessageConstants.java +++ b/src/com/szpg/plc/message/AppMessageConstants.java @@ -13,4 +13,7 @@ public final static String CMD_TYPE_READO2STATUS = "17"; //读取氧气报警状态命令 public final static String CMD_TYPE_READHSVALUE = "18"; //读取硫化氢监测值命令 public final static String CMD_TYPE_READHSSTATUS = "19"; //读取硫化氢报警状态命令 + + public final static String CMD_TYPE_READYWSTATUS = "21"; //读取爆管液位报警状态命令 + public final static String CMD_TYPE_READDSSTATUS = "22"; //读取对射报警状态命令 } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index acf2859..3678a16 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -5,12 +5,14 @@ import com.szpg.plc.message.command.read.ReadCH4ValueCommand; import com.szpg.plc.message.command.read.ReadCOStatusCommand; import com.szpg.plc.message.command.read.ReadCOValueCommand; +import com.szpg.plc.message.command.read.ReadDSStatusCommand; import com.szpg.plc.message.command.read.ReadHSStatusCommand; import com.szpg.plc.message.command.read.ReadHSValueCommand; import com.szpg.plc.message.command.read.ReadO2StatusCommand; import com.szpg.plc.message.command.read.ReadO2ValueCommand; import com.szpg.plc.message.command.read.ReadWSStatusCommand; import com.szpg.plc.message.command.read.ReadWSValueCommand; +import com.szpg.plc.message.command.read.ReadYWStatusCommand; import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -101,6 +103,12 @@ return new ReadHSValueCommand(); case AppMessageConstants.CMD_TYPE_READHSSTATUS: return new ReadHSStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + return new ReadYWStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + return new ReadDSStatusCommand(); default: return null; diff --git a/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java new file mode 100644 index 0000000..eda271f --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; + +public class ReadDSStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = -1668388238102375069L; + + @Override + public Class getResponseClass() { + return ReadDSStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询对射报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READDSSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java new file mode 100644 index 0000000..73c54b3 --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; + +public class ReadYWStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 1019982176997717896L; + + @Override + public Class getResponseClass() { + return ReadYWStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询爆管液位报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READYWSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java new file mode 100644 index 0000000..e2b476b --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java @@ -0,0 +1,57 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgDSDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadDSStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 4047613496835657828L; + + private List dsbj; // 对射报警状态 + + public ReadDSStatusCommandResponse() { + dsbj = new ArrayList(); + } + + public List getDsbj() { + return dsbj; + } + + public void setDsbj(List dsbj) { + this.dsbj = dsbj; + } + + @Override + public void afterAction() { + // 1将对射报警数据存入数据库 + PgDSDao dsDao = new PgDSDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findDeviceIdByDestAndType(this.getMessageProducerId(), "DS"); + + for (int i = 0; i < dsbj.size(); i++) { + if (i < ids.size()) { + dsDao.addSbjzRecord(dsbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (dsbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + + } + } + } + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java new file mode 100644 index 0000000..c2674f2 --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java @@ -0,0 +1,57 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgYWDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadYWStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 8088340048416088978L; + + private List ywbj; // 爆管液位报警状态 + + public ReadYWStatusCommandResponse() { + ywbj = new ArrayList(); + } + + public List getYwbj() { + return ywbj; + } + + public void setYwbj(List ywbj) { + this.ywbj = ywbj; + } + + @Override + public void afterAction() { + // 1将爆管液位浓度数据存入数据库 + PgYWDao ywDao = new PgYWDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findDeviceIdByDestAndType(this.getMessageProducerId(), "YW"); + + for (int i = 0; i < ywbj.size(); i++) { + if (i < ids.size()) { + ywDao.addSbjzRecord(ywbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (ywbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + + } + } + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSConstants.java b/src/com/szpg/plc/protocol/fins/FINSConstants.java index 2697e74..f565b8b 100644 --- a/src/com/szpg/plc/protocol/fins/FINSConstants.java +++ b/src/com/szpg/plc/protocol/fins/FINSConstants.java @@ -21,7 +21,8 @@ /******** 内存区域代码 ********/ public final static byte MEMORY_DM_AREA = (byte) 0x82; //82内存D区代码 - public final static byte MEMORY_WORK_AREA = 0x31; //31内存W区代码 + public final static byte MEMORY_WORK_AREA_WORD = (byte) 0xB1; //B1内存W区代码(按字操作) + public final static byte MEMORY_WORK_AREA_BIT = 0x31; //31内存W区代码(按位操作) /******** 控制域 ********/ public final static byte ICF_COMMAND = (byte) 0x80; //ICF字节代表命令 diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index a11ae12..a65488e 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -19,12 +19,14 @@ import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; import com.szpg.plc.protocol.DTProtocolInterface; import com.szpg.plc.protocol.fins.frame.FINSByteFrame; import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; @@ -115,19 +117,18 @@ // 读写命令的响应 if (commandStr.equalsIgnoreCase("00000002")) { String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); + String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 if (commandCode.equalsIgnoreCase("0101")) { // 读内存命令响应的解析 // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - int count = FINSByteFrameTool.getDataWithoutEndCode(byteMessage).length / 2; //1WORD=2BYTE +// int count = FINSByteFrameTool.getDataWithoutEndCode(byteMessage).length / 2; //1WORD=2BYTE // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 PgAcuRdcmdDao readCmdDao = new PgAcuRdcmdDaoImpl(); - PgAcuRdcmd readCmd = readCmdDao.findLatestCmdByDestAndCount(dest, count); + PgAcuRdcmd readCmd = readCmdDao.findLatestCmdByDestAndType(dest, commandType); if (null != readCmd) { - String commandType = readCmd.getCmd_type(); - // 3根据参数类型调用相应的方法进行解析 switch(commandType) { case AppMessageConstants.CMD_TYPE_READCH4VALUE: @@ -164,6 +165,14 @@ case AppMessageConstants.CMD_TYPE_READHSSTATUS: received = bytesToReadHSStatusCommandResponse(finsFrame, readCmd); break; + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + received = bytesToReadYWStatusCommandResponse(finsFrame, readCmd); + break; + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + received = bytesToReadDSStatusCommandResponse(finsFrame, readCmd); + break; } // 4将已响应的命令删除 @@ -260,7 +269,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int chct = cmd.getCount_sensor(); //甲烷监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < chct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -402,7 +417,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int chct = cmd.getCount_sensor(); //一氧化碳监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < chct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -462,7 +483,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int o2ct = cmd.getCount_sensor(); //氧气监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < o2ct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -522,7 +549,12 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int hsct = cmd.getCount_sensor(); //硫化氢监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } for (int i = 0; i < hsct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -534,6 +566,69 @@ return rhscr; } + + /** + * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int ysct = cmd.getCount_sensor(); //爆管液位监测点的数量 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < ysct; i++) { + char bjBit = dataStr.charAt(dataStr.length() - i - 1); + + ryscr.getYwbj().add(bjBit == '1' ? true : false); + } + } + + return ryscr; + } + + /** + * 将查询对射报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int dsct = cmd.getCount_sensor(); //对射监测点的数量 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + + for (int i = 0; i < dsct; i++) { + char bjBit = dataStr.charAt(dataStr.length() - i * 3 - 1); + + rdscr.getDsbj().add(bjBit == '1' ? true : false); + } + } + + return rdscr; + } /** * 将消息对象解析为字节数组 @@ -601,6 +696,7 @@ FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), message.getMessageProducerId(), + message.getCommandType(), message.getMemoryArea(), start, message.getCountWord()); diff --git a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java index 639359e..94540d4 100644 --- a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java +++ b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java @@ -135,12 +135,13 @@ * * @param dest 目标地址 * @param sour 源地址 + * @param sid 服务号 * @param memArea 内存区域代码 * @param start 读取的起始地址 * @param count 读取的长度(以word计,长度为2个字节) */ - public FINSByteFrame(String dest, String sour, byte memArea, byte[] start, int count) { - this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour); // 构造控制域 + public FINSByteFrame(String dest, String sour, String sid, byte memArea, byte[] start, int count) { + this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour, sid); // 构造控制域 // 设置读取内存命令的发送命令功能码00000002 this.COMMAND = FINSConstants.COMMAND_COMMAND; @@ -168,13 +169,14 @@ * * @param dest * @param sour + * @param sid * @param memArea * @param start * @param count * @param dataBody */ - public FINSByteFrame(String dest, String sour, byte memArea, byte[] start, int count, byte[] dataBody) { - this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour); // 构造控制域 + public FINSByteFrame(String dest, String sour, String sid, byte memArea, byte[] start, int count, byte[] dataBody) { + this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour, sid); // 构造控制域 // 构造用户数据域的内容 Bytes data = new Bytes(); diff --git a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java index 10be9db..c992b06 100644 --- a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java +++ b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java @@ -144,6 +144,20 @@ } /** + * 获取SID号,作为命令类型使用 + * @param finsBytes + * @return + */ + public static String getControlSID(byte[] finsBytes) { + byte[] text = getText(finsBytes); + + if (null != text && text.length > 10) + return ByteUtil.binToHexString(new byte[] {text[9]}); + else + return "00"; + } + + /** * 获取命令代码 * 0x0101=读取内存,0x0102=写内存 * @@ -228,9 +242,10 @@ * * @param dest 目标地址:网络号+节点号+单元号 * @param sour 源地址:网络号+节点号+单元号 + * @param sid 服务号:用于标识命令类型 * @return */ - public static byte[] buildFrameControl(String dest, String sour) { + public static byte[] buildFrameControl(String dest, String sour, String sid) { byte[] control = new byte[10]; // 命令类型位固定为1,需要响应标志位固定为0,表示从上位机发送给PLC端的消息,需要PLC响应 @@ -249,7 +264,8 @@ control[7] = sourByte[1]; //源节点号 control[8] = sourByte[2]; //源单元号 - control[9] = FINSConstants.SID; // SID字节 +// control[9] = FINSConstants.SID; // SID字节 + control[9] = ByteUtil.hexStringToBytes(sid, 1)[0]; return control; } diff --git a/src/com/szpg/plc/server/ACUClientHandler.java b/src/com/szpg/plc/server/ACUClientHandler.java index b3d7bc9..d7649fd 100644 --- a/src/com/szpg/plc/server/ACUClientHandler.java +++ b/src/com/szpg/plc/server/ACUClientHandler.java @@ -13,6 +13,7 @@ import com.szpg.plc.protocol.ProtocolFactory; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACULinkTask; +import com.szpg.util.Configure; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -36,13 +37,14 @@ // 2生成LinkCommand对象并解析成byte数组 LinkCommand lc = new LinkCommand(); - lc.setMessageProducerId(ByteUtil.binToHexString(ByteUtil.hexStringToBytes(client.getNode(), 4))); +// lc.setMessageProducerId(ByteUtil.binToHexString(ByteUtil.hexStringToBytes(client.getNode(), 4))); + lc.setMessageProducerId(ByteUtil.binToHexString(ByteUtil.hexStringToBytes(Configure.getProperty("sys", "LOCALHOST.NODE"), 4))); byte[] lcBytes = finspi.messageToBytes(lc); // 3延迟10秒发送握手命令 ScheduledExecutorService linkSche = new ScheduledThreadPoolExecutor(1); - linkSche.schedule(new ACULinkTask(client, lcBytes), 10, TimeUnit.SECONDS); + linkSche.schedule(new ACULinkTask(client, lcBytes), 5, TimeUnit.SECONDS); linkSche.shutdown(); //执行完任务之后关闭线程 } } @@ -66,9 +68,10 @@ // 解析消息 AppMessage message = finspi.bytesToMessage((byte[]) bytesList.get(i)); - - // 命令解析后处理 - message.afterAction(); + if (null != message) { + // 命令解析后处理 + message.afterAction(); + } } } diff --git a/src/com/szpg/task/ReadCH4StatusTask.java b/src/com/szpg/task/ReadCH4StatusTask.java index 11b33b4..d861d8b 100644 --- a/src/com/szpg/task/ReadCH4StatusTask.java +++ b/src/com/szpg/task/ReadCH4StatusTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(ch4AlmCmd.getId()); - cmd.setTm(ch4AlmCmd.getTime().getTime()); cmd.setCmd_type(ch4AlmCmd.getCommandType()); cmd.setDest(ch4AlmCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { ch4AlmCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadCH4ValueTask.java b/src/com/szpg/task/ReadCH4ValueTask.java index 73d957f..4cb658e 100644 --- a/src/com/szpg/task/ReadCH4ValueTask.java +++ b/src/com/szpg/task/ReadCH4ValueTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(ch4Cmd.getId()); - cmd.setTm(ch4Cmd.getTime().getTime()); cmd.setCmd_type(ch4Cmd.getCommandType()); cmd.setDest(ch4Cmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { ch4Cmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadCOStatusTask.java b/src/com/szpg/task/ReadCOStatusTask.java index 11eca56..c01765c 100644 --- a/src/com/szpg/task/ReadCOStatusTask.java +++ b/src/com/szpg/task/ReadCOStatusTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(coAlmCmd.getId()); - cmd.setTm(coAlmCmd.getTime().getTime()); cmd.setCmd_type(coAlmCmd.getCommandType()); cmd.setDest(coAlmCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { coAlmCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadCOValueTask.java b/src/com/szpg/task/ReadCOValueTask.java index 6ff413e..76b9a1b 100644 --- a/src/com/szpg/task/ReadCOValueTask.java +++ b/src/com/szpg/task/ReadCOValueTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(coCmd.getId()); - cmd.setTm(coCmd.getTime().getTime()); cmd.setCmd_type(coCmd.getCommandType()); cmd.setDest(coCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { coCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadDSStatusTask.java b/src/com/szpg/task/ReadDSStatusTask.java new file mode 100644 index 0000000..2437096 --- /dev/null +++ b/src/com/szpg/task/ReadDSStatusTask.java @@ -0,0 +1,47 @@ +package com.szpg.task; + +import com.szpg.db.dao.impl.PgAcuRdcmdDaoImpl; +import com.szpg.db.data.PgAcuRdcmd; +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.command.read.ReadDSStatusCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; + +public class ReadDSStatusTask implements Runnable { + + private ACUClient client; + private AppCommand appCommand; + + public ReadDSStatusTask(ACUClient client, AppCommand command) { + this.client = client; + this.appCommand = command; + } + + @Override + public void run() { + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(appCommand); + + // 发送读取对射报警状态内存命令 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + ReadDSStatusCommand dsAlmCmd = (ReadDSStatusCommand) appCommand; + + // 发送完成之后将命令保存在数据库中 + PgAcuRdcmd cmd = new PgAcuRdcmd(); + cmd.setCmd_type(dsAlmCmd.getCommandType()); + cmd.setDest(dsAlmCmd.getDestinationId()); + cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { dsAlmCmd.getMemoryArea() })); + cmd.setStart_mem_word(dsAlmCmd.getStartAddress().substring(0, 4)); + cmd.setStart_mem_bit(dsAlmCmd.getStartAddress().substring(4)); + cmd.setCount_word(dsAlmCmd.getCountWord()); + cmd.setCount_bit(dsAlmCmd.getCountBit()); + cmd.setCount_sensor(dsAlmCmd.getCountSensor()); + + new PgAcuRdcmdDaoImpl().addCmdRecord(cmd); + } + +} diff --git a/src/com/szpg/task/ReadHSStatusTask.java b/src/com/szpg/task/ReadHSStatusTask.java index 5fc4528..3771f2f 100644 --- a/src/com/szpg/task/ReadHSStatusTask.java +++ b/src/com/szpg/task/ReadHSStatusTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(hsAlmCmd.getId()); - cmd.setTm(hsAlmCmd.getTime().getTime()); cmd.setCmd_type(hsAlmCmd.getCommandType()); cmd.setDest(hsAlmCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { hsAlmCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadHSValueTask.java b/src/com/szpg/task/ReadHSValueTask.java index 2b7591f..bd7b72d 100644 --- a/src/com/szpg/task/ReadHSValueTask.java +++ b/src/com/szpg/task/ReadHSValueTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(hsCmd.getId()); - cmd.setTm(hsCmd.getTime().getTime()); cmd.setCmd_type(hsCmd.getCommandType()); cmd.setDest(hsCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { hsCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadO2StatusTask.java b/src/com/szpg/task/ReadO2StatusTask.java index d947bda..ece2f4c 100644 --- a/src/com/szpg/task/ReadO2StatusTask.java +++ b/src/com/szpg/task/ReadO2StatusTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(coAlmCmd.getId()); - cmd.setTm(coAlmCmd.getTime().getTime()); cmd.setCmd_type(coAlmCmd.getCommandType()); cmd.setDest(coAlmCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { coAlmCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadO2ValueTask.java b/src/com/szpg/task/ReadO2ValueTask.java index 8591dbe..c8aa1a4 100644 --- a/src/com/szpg/task/ReadO2ValueTask.java +++ b/src/com/szpg/task/ReadO2ValueTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(coCmd.getId()); - cmd.setTm(coCmd.getTime().getTime()); cmd.setCmd_type(coCmd.getCommandType()); cmd.setDest(coCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { coCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadWSStatusTask.java b/src/com/szpg/task/ReadWSStatusTask.java index 94506d4..4c33e98 100644 --- a/src/com/szpg/task/ReadWSStatusTask.java +++ b/src/com/szpg/task/ReadWSStatusTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(wsAlmCmd.getId()); - cmd.setTm(wsAlmCmd.getTime().getTime()); cmd.setCmd_type(wsAlmCmd.getCommandType()); cmd.setDest(wsAlmCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { wsAlmCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadWSValueTask.java b/src/com/szpg/task/ReadWSValueTask.java index 1dbe5ad..386b493 100644 --- a/src/com/szpg/task/ReadWSValueTask.java +++ b/src/com/szpg/task/ReadWSValueTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(wsCmd.getId()); - cmd.setTm(wsCmd.getTime().getTime()); cmd.setCmd_type(wsCmd.getCommandType()); cmd.setDest(wsCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { wsCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadYWStatusTask.java b/src/com/szpg/task/ReadYWStatusTask.java new file mode 100644 index 0000000..f6a733c --- /dev/null +++ b/src/com/szpg/task/ReadYWStatusTask.java @@ -0,0 +1,47 @@ +package com.szpg.task; + +import com.szpg.db.dao.impl.PgAcuRdcmdDaoImpl; +import com.szpg.db.data.PgAcuRdcmd; +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.command.read.ReadYWStatusCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; + +public class ReadYWStatusTask implements Runnable { + + private ACUClient client; + private AppCommand appCommand; + + public ReadYWStatusTask(ACUClient client, AppCommand command) { + this.client = client; + this.appCommand = command; + } + + @Override + public void run() { + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(appCommand); + + // 发送读取爆管液位参数内存命令 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + ReadYWStatusCommand ywAlmCmd = (ReadYWStatusCommand) appCommand; + + // 发送完成之后将命令保存在数据库中 + PgAcuRdcmd cmd = new PgAcuRdcmd(); + cmd.setCmd_type(ywAlmCmd.getCommandType()); + cmd.setDest(ywAlmCmd.getDestinationId()); + cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { ywAlmCmd.getMemoryArea() })); + cmd.setStart_mem_word(ywAlmCmd.getStartAddress().substring(0, 4)); + cmd.setStart_mem_bit(ywAlmCmd.getStartAddress().substring(4)); + cmd.setCount_word(ywAlmCmd.getCountWord()); + cmd.setCount_bit(ywAlmCmd.getCountBit()); + cmd.setCount_sensor(ywAlmCmd.getCountSensor()); + + new PgAcuRdcmdDaoImpl().addCmdRecord(cmd); + } + +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index ae086d4..99e858d 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -46,7 +46,7 @@ #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2.START = 0500 #\u6c27\u6c14\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 -YXL.ACU001.O2.WORDCOUNT = 24 +YXL.ACU001.O2.WORDCOUNT = 4 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 YXL.ACU001.O2ALM.START = 0036 #\u6c27\u6c14\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 @@ -66,3 +66,22 @@ YXL.ACU001.HSALM.WORDCOUNT = 1 #\u786b\u5316\u6c22\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 YXL.ACU001.HSALM.BITCOUNT = 12 + +#\u7206\u7ba1\u6db2\u4f4d\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.YW.COUNT = 2 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.YWALM.START = 0025 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.YWALM.WORDCOUNT = 1 +#\u7206\u7ba1\u6db2\u4f4d\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.YWALM.BITCOUNT = 2 + +#\u5bf9\u5c04\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.DS.COUNT = 15 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.DSALM.START = 0038 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.DSALM.WORDCOUNT = 3 +#\u5bf9\u5c04\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.DSALM.BITCOUNT = 45 + diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index 5e6edbc..8d5ab08 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -16,12 +16,14 @@ import com.szpg.task.ReadCH4ValueTask; import com.szpg.task.ReadCOStatusTask; import com.szpg.task.ReadCOValueTask; +import com.szpg.task.ReadDSStatusTask; import com.szpg.task.ReadHSStatusTask; import com.szpg.task.ReadHSValueTask; import com.szpg.task.ReadO2StatusTask; import com.szpg.task.ReadO2ValueTask; import com.szpg.task.ReadWSStatusTask; import com.szpg.task.ReadWSValueTask; +import com.szpg.task.ReadYWStatusTask; import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; @@ -30,11 +32,12 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.103", 6800); + // PLC设备地址和端口 + ACUClient client = new ACUClient("192.168.0.244", 6800); - client.setNet("00"); - client.setNode("6B"); - client.setUnit("00"); + client.setNet("00"); //网络号 + client.setNode("F4"); //节点号 + client.setUnit("00"); //单元号 // 3将ACU的信息加入到map中 ACUClientUtil.getInstance().addClient(client); @@ -44,33 +47,34 @@ // 测试发送查询甲烷参数命令 // dsc.testSendCH4Command(client); - // 测试发送查询甲烷报警状态命令 -// dsc.testSendCH4StatsuCommand(client); +// // 测试发送查询甲烷报警状态命令 +// dsc.testSendCH4StatusCommand(client); // 测试发送查询温湿度监测值命令 // dsc.testSendWSCommand(client); // 测试发送查询温湿度报警状态命令 // dsc.testSendWSStatusCommand(client); - // 测试发送查询一氧化碳参数命令 +// // 测试发送查询一氧化碳参数命令 // dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 +// // 测试发送查询一氧化碳报警状态命令 // dsc.testSendCOStatusCommand(client); - - // 测试发送查询一氧化碳参数命令 -// dsc.testSendCOCommand(client); - // 测试发送查询一氧化碳报警状态命令 -// dsc.testSendCOStatusCommand(client); - +// // 测试发送查询氧气参数命令 // dsc.testSendO2Command(client); // 测试发送查询氧气报警状态命令 // dsc.testSendO2StatusCommand(client); +// +// // 测试发送查询硫化氢参数命令 +// dsc.testSendHSCommand(client); +// // 测试发送查询硫化氢报警状态命令 +// dsc.testSendHSStatusCommand(client); - // 测试发送查询硫化氢参数命令 - dsc.testSendHSCommand(client); - // 测试发送查询硫化氢报警状态命令 - dsc.testSendHSStatusCommand(client); + // 测试发送查询爆管液位报警状态命令 + dsc.testSendYWStatusCommand(client); + + // 测试发送查询对射报警状态命令 +// dsc.testSendDSStatusCommand(client); } /** @@ -97,8 +101,9 @@ ch4.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4ValueTask(client, ch4), 10, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4ValueTask(client, ch4), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -116,7 +121,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); ch4alm.setDestinationId(dest); - ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); ch4alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.START")), 2)) + "00"); ch4alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.WORDCOUNT"))); @@ -124,8 +129,9 @@ ch4alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCH4StatusTask(client, ch4alm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -153,8 +159,9 @@ ws.setOffset(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".SD.OFFSET"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSValueTask(client, ws), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSValueTask(client, ws), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -172,7 +179,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); wsalm.setDestinationId(dest); - wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + wsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); wsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.START")), 2)) + "00"); wsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WSALM.WORDCOUNT"))); @@ -180,8 +187,9 @@ wsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".WS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadWSStatusTask(client, wsalm), 25, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadWSStatusTask(client, wsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -208,8 +216,9 @@ co.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOValueTask(client, co), 30, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOValueTask(client, co), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -227,7 +236,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); coalm.setDestinationId(dest); - coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + coalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); coalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.START")), 2)) + "00"); coalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".COALM.WORDCOUNT"))); @@ -235,8 +244,9 @@ coalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CO.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadCOStatusTask(client, coalm), 35, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadCOStatusTask(client, coalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -263,8 +273,9 @@ o2.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2ValueTask(client, o2), 40, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2ValueTask(client, o2), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -282,7 +293,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); o2alm.setDestinationId(dest); - o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + o2alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); o2alm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.START")), 2)) + "00"); o2alm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2ALM.WORDCOUNT"))); @@ -290,8 +301,9 @@ o2alm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".O2.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadO2StatusTask(client, o2alm), 45, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadO2StatusTask(client, o2alm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -318,8 +330,9 @@ hs.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSValueTask(client, hs), 50, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSValueTask(client, hs), 12, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } /** @@ -337,7 +350,7 @@ String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); hsalm.setDestinationId(dest); - hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + hsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); hsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.START")), 2)) + "00"); hsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HSALM.WORDCOUNT"))); @@ -345,7 +358,65 @@ hsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".HS.COUNT"))); ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); - sche.shutdown(); //执行完任务之后关闭线程 + sche.scheduleWithFixedDelay(new ReadHSStatusTask(client, hsalm), 55, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询爆管液位报警状态命令 + * @param client + */ + public void testSendYWStatusCommand(ACUClient client) { + ReadMemoryCommand ywalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READYWSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ywalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ywalm.setDestinationId(dest); + + ywalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + ywalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.START")), 2)) + "00"); + ywalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.WORDCOUNT"))); + ywalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YWALM.BITCOUNT"))); + ywalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".YW.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadYWStatusTask(client, ywalm), 15, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 + } + + + /** + * 发送查询对射报警状态命令 + * @param client + */ + public void testSendDSStatusCommand(ACUClient client) { + ReadMemoryCommand dsalm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READDSSTATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + dsalm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + dsalm.setDestinationId(dest); + + dsalm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA_WORD); + + dsalm.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.START")), 2)) + "00"); + dsalm.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.WORDCOUNT"))); + dsalm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DSALM.BITCOUNT"))); + dsalm.setCountSensor(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".DS.COUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.scheduleWithFixedDelay(new ReadDSStatusTask(client, dsalm), 20, 300, TimeUnit.SECONDS); +// sche.schedule(new ReadHSStatusTask(client, hsalm), 15, TimeUnit.SECONDS); +// sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgAcuRdcmdDao.java b/src/com/szpg/db/dao/PgAcuRdcmdDao.java index 70fb6dc..a9d5686 100644 --- a/src/com/szpg/db/dao/PgAcuRdcmdDao.java +++ b/src/com/szpg/db/dao/PgAcuRdcmdDao.java @@ -10,6 +10,7 @@ public PgAcuRdcmd findById(String id); public PgAcuRdcmd findLatestCmdByDestAndCount(String dest, int count); + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type); public int addCmdRecord(PgAcuRdcmd cmd); public int updateCmdRecordResponsed(String cmdId); diff --git a/src/com/szpg/db/dao/PgDSDao.java b/src/com/szpg/db/dao/PgDSDao.java new file mode 100644 index 0000000..b731af9 --- /dev/null +++ b/src/com/szpg/db/dao/PgDSDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgDSAlm; + +/** + * 对射报警相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgDSDao { + + /******** 对射报警状态 ********/ + public List findAllSbjz(); + public PgDSAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgDSAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/PgYWDao.java b/src/com/szpg/db/dao/PgYWDao.java new file mode 100644 index 0000000..bb27bbf --- /dev/null +++ b/src/com/szpg/db/dao/PgYWDao.java @@ -0,0 +1,23 @@ +package com.szpg.db.dao; + +import java.util.List; + +import com.szpg.db.data.PgYWAlm; + +/** + * 爆管液位相关参数读写的数据库接口 + * @author admin + * + */ +public interface PgYWDao { + + /******** 爆管液位浓度报警状态 ********/ + public List findAllSbjz(); + public PgYWAlm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgYWAlm hsalm); + public int addSbjzRecord(boolean status, String tm, int deviceid); +} diff --git a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java index b693939..16b2285 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -114,6 +114,41 @@ } return null; } + + + @Override + public PgAcuRdcmd findLatestCmdByDestAndType(String dest, String type) { + Connection conn = null; + + String queryStr = "SELECT * FROM PG_ACU_RDCMD WHERE RESPONSED='0' AND TIMEOUT='0' AND DEST=? AND CMD_TYPE=? ORDER BY TM DESC"; + Object[] params = new Object[2]; + params[0] = dest; + params[1] = type; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List list = (List) runner.query(conn, queryStr, new BeanListHandler(PgAcuRdcmd.class), params); + + if (null != list && list.isEmpty() == false) { + logger.debug("根据目的地址和命令类型查询内存读取命令成功[" + list.size() + "]"); + + return list.get(0); + } else + return null; + } catch (Exception ex) { + logger.error("根据目的地址和命令类型查询内存读取命令异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } @Override public int addCmdRecord(PgAcuRdcmd cmd) { diff --git a/src/com/szpg/db/dao/impl/PgDSDaoImpl.java b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java new file mode 100644 index 0000000..e9d18cd --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgDSDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.data.PgDSAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgDSDaoImpl implements PgDSDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgDSAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(0); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询对射报警状态成功" + dsalm + "]"); + + return dsalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, DSALM, LOGTIME, PGDEVICEID FROM PG_DS_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询对射报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgDSAlm dsalm = new PgDSAlm(); + Object[] item = tempList.get(i); + + dsalm.setId(((Number) item[0]).intValue()); + dsalm.setDsalm(Boolean.parseBoolean((String) item[1])); + dsalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + dsalm.setLogtime(cal.getTime()); + dsalm.setUptime(cal.getTime()); + + list.add(dsalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgDSAlm dsalm) { + return addSbjzRecord(dsalm.getDsalm(), dsalm.getTmStr(), dsalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_DS_ALM " + + "(DSALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入对射报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入对射报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入对射报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java index 657281c..7706852 100644 --- a/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgDeviceDaoImpl.java @@ -39,6 +39,12 @@ case "HS": key = "%硫化氢%"; break; + case "YW": + key = "%液位%"; + break; + case "DS": + key = "%对射%"; + break; } String queryStr = "SELECT D.ID FROM PG_DEVICE D, PG_ACU A WHERE D.PARTITION = A.ACU_CODE AND A.ACU_DEST = ? AND D.DEVCODE LIKE '" + key + "' ORDER BY D.ID"; diff --git a/src/com/szpg/db/dao/impl/PgYWDaoImpl.java b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java new file mode 100644 index 0000000..613c4c0 --- /dev/null +++ b/src/com/szpg/db/dao/impl/PgYWDaoImpl.java @@ -0,0 +1,261 @@ +package com.szpg.db.dao.impl; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import org.apache.commons.dbutils.DbUtils; +import org.apache.commons.dbutils.QueryRunner; +import org.apache.commons.dbutils.handlers.ArrayListHandler; +import org.apache.log4j.Logger; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.data.PgYWAlm; +import com.szpg.db.util.ConnectionManager; + +public class PgYWDaoImpl implements PgYWDao { + + private final Logger logger = Logger.getLogger(this.getClass().getName()); + + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM"; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("查询所有爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("查询所有爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public PgYWAlm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE ID = ?"; + Object[] param = new Object[1]; + param[0] = id; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler(), param); + + if (null != tempList && tempList.size() == 1) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(0); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + logger.debug("根据ID查询爆管液位报警状态成功" + ywalm + "]"); + + return ywalm; + } + else + return null; + } catch (Exception ex) { + logger.error("根据ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDevice(Integer deviceid) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ?"; + Object[] param = new Object[1]; + param[0] = deviceid; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end) { + Connection conn = null; + + String queryStr = "SELECT ID, YWALM, LOGTIME, PGDEVICEID FROM PG_YW_ALM WHERE PGDEVICEID = ? AND LOGTIME >= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS') AND LOGTIME <= TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS')"; + Object[] params = new Object[3]; + params[0] = deviceid; + params[1] = start; + params[2] = end; + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + List tempList = (List) runner.query(conn, queryStr, new ArrayListHandler()); + + if (null != tempList && tempList.isEmpty() == false) { + logger.debug("根据设备ID和时间查询爆管液位报警状态成功[" + tempList.size() + "]"); + + List list = new ArrayList(); + for (int i = 0; i < tempList.size(); i++) { + PgYWAlm ywalm = new PgYWAlm(); + Object[] item = tempList.get(i); + + ywalm.setId(((Number) item[0]).intValue()); + ywalm.setYwalm(Boolean.parseBoolean((String) item[1])); + ywalm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ywalm.setLogtime(cal.getTime()); + ywalm.setUptime(cal.getTime()); + + list.add(ywalm); + } + return list; + } + else + return null; + } catch (Exception ex) { + logger.error("根据设备ID和时间查询爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return null; + } + + @Override + public int addSbjzRecord(PgYWAlm ywalm) { + return addSbjzRecord(ywalm.getYwalm(), ywalm.getTmStr(), ywalm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_YW_ALM " + + "(YWALM, LOGTIME, UPTIME, PGDEVICEID) " + + "VALUES (?, TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), TO_DATE(?, 'YYYY-MM-DD HH24:MI:SS'), ?)"; + Object[] params = new Object[4]; + params[0] = status; + params[1] = tm; + params[2] = tm; + params[3] = deviceid; + + try { + conn = ConnectionManager.getConnectionFromC3P0(); + conn.setAutoCommit(false); + + QueryRunner runner = new QueryRunner(); + int count = runner.update(conn, insertStr, params); + + if (count > 0) + logger.debug("插入爆管液位报警状态成功[tm=" + tm + ", status=" + status + ", deviceid=" + deviceid + "]"); + else + logger.error("插入爆管液位报警状态失败!"); + + return count; + } catch (Exception ex) { + logger.error("插入爆管液位报警状态异常", ex); + } finally { + try { + DbUtils.commitAndClose(conn); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return 0; + } + +} diff --git a/src/com/szpg/db/data/PgAcuRdcmd.java b/src/com/szpg/db/data/PgAcuRdcmd.java index f4ecfe5..2d46bfc 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -1,6 +1,8 @@ package com.szpg.db.data; +import java.util.Calendar; import java.util.Date; +import java.util.UUID; import com.szpg.util.TimeFormat; @@ -31,6 +33,11 @@ private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 + public PgAcuRdcmd() { + this.setId(UUID.randomUUID().toString().replace("-", "")); + this.setTm(Calendar.getInstance().getTime()); + } + public String getId() { return id; } diff --git a/src/com/szpg/db/data/PgDSAlm.java b/src/com/szpg/db/data/PgDSAlm.java new file mode 100644 index 0000000..86e28bb --- /dev/null +++ b/src/com/szpg/db/data/PgDSAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 对射报警状态数据表 + * + * @author admin + * + */ +public class PgDSAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = -8336945265752238748L; + + private Integer id; + private Boolean dsalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getDsalm() { + return dsalm; + } + + public void setDsalm(Boolean dsalm) { + this.dsalm = dsalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgDSAlm[dsalm=" + dsalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/data/PgYWAlm.java b/src/com/szpg/db/data/PgYWAlm.java new file mode 100644 index 0000000..9d9572f --- /dev/null +++ b/src/com/szpg/db/data/PgYWAlm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 爆管液位浓度报警状态数据表 + * + * @author admin + * + */ +public class PgYWAlm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = 3882791834818808488L; + + private Integer id; + private Boolean ywalm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getYwalm() { + return ywalm; + } + + public void setYwalm(Boolean ywalm) { + this.ywalm = ywalm; + } + + public Date getLogtime() { + return logtime; + } + + public void setLogtime(Date logtime) { + this.logtime = logtime; + } + + public Date getUptime() { + return uptime; + } + + public void setUptime(Date uptime) { + this.uptime = uptime; + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + public void setTm(Date tm) { + this.logtime = tm; + this.uptime = tm; + } + + public String getTmStr() { + if (null != this.logtime) { + return TimeFormat.formatTimestamp(logtime); + } else { + return ""; + } + } + + public String getTmStrGB() { + if (null != this.logtime) { + return TimeFormat.format(logtime, "yyyyMMddHHmmss"); + } else { + return ""; + } + } + + @Override + public String toString() { + return "PgYWAlm[ywalm=" + ywalm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/plc/message/AppMessageConstants.java b/src/com/szpg/plc/message/AppMessageConstants.java index 25db6ab..1c84086 100644 --- a/src/com/szpg/plc/message/AppMessageConstants.java +++ b/src/com/szpg/plc/message/AppMessageConstants.java @@ -13,4 +13,7 @@ public final static String CMD_TYPE_READO2STATUS = "17"; //读取氧气报警状态命令 public final static String CMD_TYPE_READHSVALUE = "18"; //读取硫化氢监测值命令 public final static String CMD_TYPE_READHSSTATUS = "19"; //读取硫化氢报警状态命令 + + public final static String CMD_TYPE_READYWSTATUS = "21"; //读取爆管液位报警状态命令 + public final static String CMD_TYPE_READDSSTATUS = "22"; //读取对射报警状态命令 } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index acf2859..3678a16 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -5,12 +5,14 @@ import com.szpg.plc.message.command.read.ReadCH4ValueCommand; import com.szpg.plc.message.command.read.ReadCOStatusCommand; import com.szpg.plc.message.command.read.ReadCOValueCommand; +import com.szpg.plc.message.command.read.ReadDSStatusCommand; import com.szpg.plc.message.command.read.ReadHSStatusCommand; import com.szpg.plc.message.command.read.ReadHSValueCommand; import com.szpg.plc.message.command.read.ReadO2StatusCommand; import com.szpg.plc.message.command.read.ReadO2ValueCommand; import com.szpg.plc.message.command.read.ReadWSStatusCommand; import com.szpg.plc.message.command.read.ReadWSValueCommand; +import com.szpg.plc.message.command.read.ReadYWStatusCommand; import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -101,6 +103,12 @@ return new ReadHSValueCommand(); case AppMessageConstants.CMD_TYPE_READHSSTATUS: return new ReadHSStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + return new ReadYWStatusCommand(); + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + return new ReadDSStatusCommand(); default: return null; diff --git a/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java new file mode 100644 index 0000000..eda271f --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadDSStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; + +public class ReadDSStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = -1668388238102375069L; + + @Override + public Class getResponseClass() { + return ReadDSStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询对射报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READDSSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java b/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java new file mode 100644 index 0000000..73c54b3 --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadYWStatusCommand.java @@ -0,0 +1,29 @@ +package com.szpg.plc.message.command.read; + +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; + +public class ReadYWStatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 1019982176997717896L; + + @Override + public Class getResponseClass() { + return ReadYWStatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询爆管液位报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READYWSTATUS; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java new file mode 100644 index 0000000..e2b476b --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadDSStatusCommandResponse.java @@ -0,0 +1,57 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgDSDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgDSDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadDSStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 4047613496835657828L; + + private List dsbj; // 对射报警状态 + + public ReadDSStatusCommandResponse() { + dsbj = new ArrayList(); + } + + public List getDsbj() { + return dsbj; + } + + public void setDsbj(List dsbj) { + this.dsbj = dsbj; + } + + @Override + public void afterAction() { + // 1将对射报警数据存入数据库 + PgDSDao dsDao = new PgDSDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findDeviceIdByDestAndType(this.getMessageProducerId(), "DS"); + + for (int i = 0; i < dsbj.size(); i++) { + if (i < ids.size()) { + dsDao.addSbjzRecord(dsbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (dsbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + + } + } + } + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java new file mode 100644 index 0000000..c2674f2 --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadYWStatusCommandResponse.java @@ -0,0 +1,57 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgYWDao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgYWDaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadYWStatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = 8088340048416088978L; + + private List ywbj; // 爆管液位报警状态 + + public ReadYWStatusCommandResponse() { + ywbj = new ArrayList(); + } + + public List getYwbj() { + return ywbj; + } + + public void setYwbj(List ywbj) { + this.ywbj = ywbj; + } + + @Override + public void afterAction() { + // 1将爆管液位浓度数据存入数据库 + PgYWDao ywDao = new PgYWDaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findDeviceIdByDestAndType(this.getMessageProducerId(), "YW"); + + for (int i = 0; i < ywbj.size(); i++) { + if (i < ids.size()) { + ywDao.addSbjzRecord(ywbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (ywbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + + } + } + } + } + +} diff --git a/src/com/szpg/plc/protocol/fins/FINSConstants.java b/src/com/szpg/plc/protocol/fins/FINSConstants.java index 2697e74..f565b8b 100644 --- a/src/com/szpg/plc/protocol/fins/FINSConstants.java +++ b/src/com/szpg/plc/protocol/fins/FINSConstants.java @@ -21,7 +21,8 @@ /******** 内存区域代码 ********/ public final static byte MEMORY_DM_AREA = (byte) 0x82; //82内存D区代码 - public final static byte MEMORY_WORK_AREA = 0x31; //31内存W区代码 + public final static byte MEMORY_WORK_AREA_WORD = (byte) 0xB1; //B1内存W区代码(按字操作) + public final static byte MEMORY_WORK_AREA_BIT = 0x31; //31内存W区代码(按位操作) /******** 控制域 ********/ public final static byte ICF_COMMAND = (byte) 0x80; //ICF字节代表命令 diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index a11ae12..a65488e 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -19,12 +19,14 @@ import com.szpg.plc.message.response.read.ReadCH4ValueCommandResponse; import com.szpg.plc.message.response.read.ReadCOStatusCommandResponse; import com.szpg.plc.message.response.read.ReadCOValueCommandResponse; +import com.szpg.plc.message.response.read.ReadDSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadHSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadHSValueCommandResponse; import com.szpg.plc.message.response.read.ReadO2StatusCommandResponse; import com.szpg.plc.message.response.read.ReadO2ValueCommandResponse; import com.szpg.plc.message.response.read.ReadWSStatusCommandResponse; import com.szpg.plc.message.response.read.ReadWSValueCommandResponse; +import com.szpg.plc.message.response.read.ReadYWStatusCommandResponse; import com.szpg.plc.protocol.DTProtocolInterface; import com.szpg.plc.protocol.fins.frame.FINSByteFrame; import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; @@ -115,19 +117,18 @@ // 读写命令的响应 if (commandStr.equalsIgnoreCase("00000002")) { String commandCode = FINSByteFrameTool.getFinsCommandCode(byteMessage); + String commandType = FINSByteFrameTool.getControlSID(byteMessage); //用SID字节来代表命令类型,与APPMessageConstants中的命令类型值保持一致 if (commandCode.equalsIgnoreCase("0101")) { // 读内存命令响应的解析 // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - int count = FINSByteFrameTool.getDataWithoutEndCode(byteMessage).length / 2; //1WORD=2BYTE +// int count = FINSByteFrameTool.getDataWithoutEndCode(byteMessage).length / 2; //1WORD=2BYTE // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 PgAcuRdcmdDao readCmdDao = new PgAcuRdcmdDaoImpl(); - PgAcuRdcmd readCmd = readCmdDao.findLatestCmdByDestAndCount(dest, count); + PgAcuRdcmd readCmd = readCmdDao.findLatestCmdByDestAndType(dest, commandType); if (null != readCmd) { - String commandType = readCmd.getCmd_type(); - // 3根据参数类型调用相应的方法进行解析 switch(commandType) { case AppMessageConstants.CMD_TYPE_READCH4VALUE: @@ -164,6 +165,14 @@ case AppMessageConstants.CMD_TYPE_READHSSTATUS: received = bytesToReadHSStatusCommandResponse(finsFrame, readCmd); break; + + case AppMessageConstants.CMD_TYPE_READYWSTATUS: + received = bytesToReadYWStatusCommandResponse(finsFrame, readCmd); + break; + + case AppMessageConstants.CMD_TYPE_READDSSTATUS: + received = bytesToReadDSStatusCommandResponse(finsFrame, readCmd); + break; } // 4将已响应的命令删除 @@ -260,7 +269,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int chct = cmd.getCount_sensor(); //甲烷监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < chct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -402,7 +417,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int chct = cmd.getCount_sensor(); //一氧化碳监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < chct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -462,7 +483,13 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int o2ct = cmd.getCount_sensor(); //氧气监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < o2ct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -522,7 +549,12 @@ // 正常返回 byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 int hsct = cmd.getCount_sensor(); //硫化氢监测点的数量 - String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //D15-D0顺序 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } for (int i = 0; i < hsct; i++) { char ldBit = dataStr.charAt(dataStr.length() - 2 * i - 1); char bjBit = dataStr.charAt(dataStr.length() - 2 * i - 2); @@ -534,6 +566,69 @@ return rhscr; } + + /** + * 将查询爆管液位报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadYWStatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadYWStatusCommandResponse ryscr = new ReadYWStatusCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + ryscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int ysct = cmd.getCount_sensor(); //爆管液位监测点的数量 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + for (int i = 0; i < ysct; i++) { + char bjBit = dataStr.charAt(dataStr.length() - i - 1); + + ryscr.getYwbj().add(bjBit == '1' ? true : false); + } + } + + return ryscr; + } + + /** + * 将查询对射报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadDSStatusCommandResponse(FINSByteFrame finsFrame, PgAcuRdcmd cmd) { + ReadDSStatusCommandResponse rdscr = new ReadDSStatusCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rdscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int dsct = cmd.getCount_sensor(); //对射监测点的数量 + int bitct = cmd.getCount_bit(); //读取的位的数量,用于计算字节数 + int bytect = (bitct % 16 == 0 ? bitct / 16 : bitct / 16 + 1) * 2; + String dataStr = ""; + for (int i = 0; i < bytect - 1; i = i + 2) { + dataStr = ByteUtil.binToBinString(new byte[] { data[i], data[i + 1] }) + dataStr; //D15-D0顺序 + } + + for (int i = 0; i < dsct; i++) { + char bjBit = dataStr.charAt(dataStr.length() - i * 3 - 1); + + rdscr.getDsbj().add(bjBit == '1' ? true : false); + } + } + + return rdscr; + } /** * 将消息对象解析为字节数组 @@ -601,6 +696,7 @@ FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), message.getMessageProducerId(), + message.getCommandType(), message.getMemoryArea(), start, message.getCountWord()); diff --git a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java index 639359e..94540d4 100644 --- a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java +++ b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrame.java @@ -135,12 +135,13 @@ * * @param dest 目标地址 * @param sour 源地址 + * @param sid 服务号 * @param memArea 内存区域代码 * @param start 读取的起始地址 * @param count 读取的长度(以word计,长度为2个字节) */ - public FINSByteFrame(String dest, String sour, byte memArea, byte[] start, int count) { - this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour); // 构造控制域 + public FINSByteFrame(String dest, String sour, String sid, byte memArea, byte[] start, int count) { + this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour, sid); // 构造控制域 // 设置读取内存命令的发送命令功能码00000002 this.COMMAND = FINSConstants.COMMAND_COMMAND; @@ -168,13 +169,14 @@ * * @param dest * @param sour + * @param sid * @param memArea * @param start * @param count * @param dataBody */ - public FINSByteFrame(String dest, String sour, byte memArea, byte[] start, int count, byte[] dataBody) { - this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour); // 构造控制域 + public FINSByteFrame(String dest, String sour, String sid, byte memArea, byte[] start, int count, byte[] dataBody) { + this.TEXT_CONTROL_BODY = FINSByteFrameTool.buildFrameControl(dest, sour, sid); // 构造控制域 // 构造用户数据域的内容 Bytes data = new Bytes(); diff --git a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java index 10be9db..c992b06 100644 --- a/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java +++ b/src/com/szpg/plc/protocol/fins/frame/FINSByteFrameTool.java @@ -144,6 +144,20 @@ } /** + * 获取SID号,作为命令类型使用 + * @param finsBytes + * @return + */ + public static String getControlSID(byte[] finsBytes) { + byte[] text = getText(finsBytes); + + if (null != text && text.length > 10) + return ByteUtil.binToHexString(new byte[] {text[9]}); + else + return "00"; + } + + /** * 获取命令代码 * 0x0101=读取内存,0x0102=写内存 * @@ -228,9 +242,10 @@ * * @param dest 目标地址:网络号+节点号+单元号 * @param sour 源地址:网络号+节点号+单元号 + * @param sid 服务号:用于标识命令类型 * @return */ - public static byte[] buildFrameControl(String dest, String sour) { + public static byte[] buildFrameControl(String dest, String sour, String sid) { byte[] control = new byte[10]; // 命令类型位固定为1,需要响应标志位固定为0,表示从上位机发送给PLC端的消息,需要PLC响应 @@ -249,7 +264,8 @@ control[7] = sourByte[1]; //源节点号 control[8] = sourByte[2]; //源单元号 - control[9] = FINSConstants.SID; // SID字节 +// control[9] = FINSConstants.SID; // SID字节 + control[9] = ByteUtil.hexStringToBytes(sid, 1)[0]; return control; } diff --git a/src/com/szpg/plc/server/ACUClientHandler.java b/src/com/szpg/plc/server/ACUClientHandler.java index b3d7bc9..d7649fd 100644 --- a/src/com/szpg/plc/server/ACUClientHandler.java +++ b/src/com/szpg/plc/server/ACUClientHandler.java @@ -13,6 +13,7 @@ import com.szpg.plc.protocol.ProtocolFactory; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACULinkTask; +import com.szpg.util.Configure; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; @@ -36,13 +37,14 @@ // 2生成LinkCommand对象并解析成byte数组 LinkCommand lc = new LinkCommand(); - lc.setMessageProducerId(ByteUtil.binToHexString(ByteUtil.hexStringToBytes(client.getNode(), 4))); +// lc.setMessageProducerId(ByteUtil.binToHexString(ByteUtil.hexStringToBytes(client.getNode(), 4))); + lc.setMessageProducerId(ByteUtil.binToHexString(ByteUtil.hexStringToBytes(Configure.getProperty("sys", "LOCALHOST.NODE"), 4))); byte[] lcBytes = finspi.messageToBytes(lc); // 3延迟10秒发送握手命令 ScheduledExecutorService linkSche = new ScheduledThreadPoolExecutor(1); - linkSche.schedule(new ACULinkTask(client, lcBytes), 10, TimeUnit.SECONDS); + linkSche.schedule(new ACULinkTask(client, lcBytes), 5, TimeUnit.SECONDS); linkSche.shutdown(); //执行完任务之后关闭线程 } } @@ -66,9 +68,10 @@ // 解析消息 AppMessage message = finspi.bytesToMessage((byte[]) bytesList.get(i)); - - // 命令解析后处理 - message.afterAction(); + if (null != message) { + // 命令解析后处理 + message.afterAction(); + } } } diff --git a/src/com/szpg/task/ReadCH4StatusTask.java b/src/com/szpg/task/ReadCH4StatusTask.java index 11b33b4..d861d8b 100644 --- a/src/com/szpg/task/ReadCH4StatusTask.java +++ b/src/com/szpg/task/ReadCH4StatusTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(ch4AlmCmd.getId()); - cmd.setTm(ch4AlmCmd.getTime().getTime()); cmd.setCmd_type(ch4AlmCmd.getCommandType()); cmd.setDest(ch4AlmCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { ch4AlmCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadCH4ValueTask.java b/src/com/szpg/task/ReadCH4ValueTask.java index 73d957f..4cb658e 100644 --- a/src/com/szpg/task/ReadCH4ValueTask.java +++ b/src/com/szpg/task/ReadCH4ValueTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(ch4Cmd.getId()); - cmd.setTm(ch4Cmd.getTime().getTime()); cmd.setCmd_type(ch4Cmd.getCommandType()); cmd.setDest(ch4Cmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { ch4Cmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadCOStatusTask.java b/src/com/szpg/task/ReadCOStatusTask.java index 11eca56..c01765c 100644 --- a/src/com/szpg/task/ReadCOStatusTask.java +++ b/src/com/szpg/task/ReadCOStatusTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(coAlmCmd.getId()); - cmd.setTm(coAlmCmd.getTime().getTime()); cmd.setCmd_type(coAlmCmd.getCommandType()); cmd.setDest(coAlmCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { coAlmCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadCOValueTask.java b/src/com/szpg/task/ReadCOValueTask.java index 6ff413e..76b9a1b 100644 --- a/src/com/szpg/task/ReadCOValueTask.java +++ b/src/com/szpg/task/ReadCOValueTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(coCmd.getId()); - cmd.setTm(coCmd.getTime().getTime()); cmd.setCmd_type(coCmd.getCommandType()); cmd.setDest(coCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { coCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadDSStatusTask.java b/src/com/szpg/task/ReadDSStatusTask.java new file mode 100644 index 0000000..2437096 --- /dev/null +++ b/src/com/szpg/task/ReadDSStatusTask.java @@ -0,0 +1,47 @@ +package com.szpg.task; + +import com.szpg.db.dao.impl.PgAcuRdcmdDaoImpl; +import com.szpg.db.data.PgAcuRdcmd; +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.command.read.ReadDSStatusCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; + +public class ReadDSStatusTask implements Runnable { + + private ACUClient client; + private AppCommand appCommand; + + public ReadDSStatusTask(ACUClient client, AppCommand command) { + this.client = client; + this.appCommand = command; + } + + @Override + public void run() { + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(appCommand); + + // 发送读取对射报警状态内存命令 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + ReadDSStatusCommand dsAlmCmd = (ReadDSStatusCommand) appCommand; + + // 发送完成之后将命令保存在数据库中 + PgAcuRdcmd cmd = new PgAcuRdcmd(); + cmd.setCmd_type(dsAlmCmd.getCommandType()); + cmd.setDest(dsAlmCmd.getDestinationId()); + cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { dsAlmCmd.getMemoryArea() })); + cmd.setStart_mem_word(dsAlmCmd.getStartAddress().substring(0, 4)); + cmd.setStart_mem_bit(dsAlmCmd.getStartAddress().substring(4)); + cmd.setCount_word(dsAlmCmd.getCountWord()); + cmd.setCount_bit(dsAlmCmd.getCountBit()); + cmd.setCount_sensor(dsAlmCmd.getCountSensor()); + + new PgAcuRdcmdDaoImpl().addCmdRecord(cmd); + } + +} diff --git a/src/com/szpg/task/ReadHSStatusTask.java b/src/com/szpg/task/ReadHSStatusTask.java index 5fc4528..3771f2f 100644 --- a/src/com/szpg/task/ReadHSStatusTask.java +++ b/src/com/szpg/task/ReadHSStatusTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(hsAlmCmd.getId()); - cmd.setTm(hsAlmCmd.getTime().getTime()); cmd.setCmd_type(hsAlmCmd.getCommandType()); cmd.setDest(hsAlmCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { hsAlmCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadHSValueTask.java b/src/com/szpg/task/ReadHSValueTask.java index 2b7591f..bd7b72d 100644 --- a/src/com/szpg/task/ReadHSValueTask.java +++ b/src/com/szpg/task/ReadHSValueTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(hsCmd.getId()); - cmd.setTm(hsCmd.getTime().getTime()); cmd.setCmd_type(hsCmd.getCommandType()); cmd.setDest(hsCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { hsCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadO2StatusTask.java b/src/com/szpg/task/ReadO2StatusTask.java index d947bda..ece2f4c 100644 --- a/src/com/szpg/task/ReadO2StatusTask.java +++ b/src/com/szpg/task/ReadO2StatusTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(coAlmCmd.getId()); - cmd.setTm(coAlmCmd.getTime().getTime()); cmd.setCmd_type(coAlmCmd.getCommandType()); cmd.setDest(coAlmCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { coAlmCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadO2ValueTask.java b/src/com/szpg/task/ReadO2ValueTask.java index 8591dbe..c8aa1a4 100644 --- a/src/com/szpg/task/ReadO2ValueTask.java +++ b/src/com/szpg/task/ReadO2ValueTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(coCmd.getId()); - cmd.setTm(coCmd.getTime().getTime()); cmd.setCmd_type(coCmd.getCommandType()); cmd.setDest(coCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { coCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadWSStatusTask.java b/src/com/szpg/task/ReadWSStatusTask.java index 94506d4..4c33e98 100644 --- a/src/com/szpg/task/ReadWSStatusTask.java +++ b/src/com/szpg/task/ReadWSStatusTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(wsAlmCmd.getId()); - cmd.setTm(wsAlmCmd.getTime().getTime()); cmd.setCmd_type(wsAlmCmd.getCommandType()); cmd.setDest(wsAlmCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { wsAlmCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadWSValueTask.java b/src/com/szpg/task/ReadWSValueTask.java index 1dbe5ad..386b493 100644 --- a/src/com/szpg/task/ReadWSValueTask.java +++ b/src/com/szpg/task/ReadWSValueTask.java @@ -32,8 +32,6 @@ // 发送完成之后将命令保存在数据库中 PgAcuRdcmd cmd = new PgAcuRdcmd(); - cmd.setId(wsCmd.getId()); - cmd.setTm(wsCmd.getTime().getTime()); cmd.setCmd_type(wsCmd.getCommandType()); cmd.setDest(wsCmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { wsCmd.getMemoryArea() })); diff --git a/src/com/szpg/task/ReadYWStatusTask.java b/src/com/szpg/task/ReadYWStatusTask.java new file mode 100644 index 0000000..f6a733c --- /dev/null +++ b/src/com/szpg/task/ReadYWStatusTask.java @@ -0,0 +1,47 @@ +package com.szpg.task; + +import com.szpg.db.dao.impl.PgAcuRdcmdDaoImpl; +import com.szpg.db.data.PgAcuRdcmd; +import com.szpg.plc.message.AppCommand; +import com.szpg.plc.message.command.read.ReadYWStatusCommand; +import com.szpg.plc.protocol.DTProtocolInterface; +import com.szpg.plc.protocol.ProtocolFactory; +import com.szpg.plc.server.ACUClient; +import com.szpg.plc.server.ACUClientUtil; +import com.szpg.plc.util.ByteUtil; + +public class ReadYWStatusTask implements Runnable { + + private ACUClient client; + private AppCommand appCommand; + + public ReadYWStatusTask(ACUClient client, AppCommand command) { + this.client = client; + this.appCommand = command; + } + + @Override + public void run() { + DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); + byte[] content = finspi.messageToBytes(appCommand); + + // 发送读取爆管液位参数内存命令 + ACUClientUtil.getInstance().sendACUCommand(client, content); + + ReadYWStatusCommand ywAlmCmd = (ReadYWStatusCommand) appCommand; + + // 发送完成之后将命令保存在数据库中 + PgAcuRdcmd cmd = new PgAcuRdcmd(); + cmd.setCmd_type(ywAlmCmd.getCommandType()); + cmd.setDest(ywAlmCmd.getDestinationId()); + cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { ywAlmCmd.getMemoryArea() })); + cmd.setStart_mem_word(ywAlmCmd.getStartAddress().substring(0, 4)); + cmd.setStart_mem_bit(ywAlmCmd.getStartAddress().substring(4)); + cmd.setCount_word(ywAlmCmd.getCountWord()); + cmd.setCount_bit(ywAlmCmd.getCountBit()); + cmd.setCount_sensor(ywAlmCmd.getCountSensor()); + + new PgAcuRdcmdDaoImpl().addCmdRecord(cmd); + } + +} diff --git a/src/sys.properties b/src/sys.properties index 221ed1e..684c7f7 100644 --- a/src/sys.properties +++ b/src/sys.properties @@ -3,9 +3,9 @@ DB.PASSWORD = szpg DB.HOST = 192.168.0.203 DB.PORT = 1521 -DB.SERVICE = EYDB2 +DB.SERVICE = eydb2 #\u672c\u673aIP\u5730\u5740 LOCALHOST.NET = 00 -LOCALHOST.NODE = F4 +LOCALHOST.NODE = 6B LOCALHOST.UNIT = 00 \ No newline at end of file