diff --git a/src/ACUBL.properties b/src/ACUBL.properties index d3be57b..12a50a2 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -1,3 +1,28 @@ #ACU\u53d8\u91cf\u8868\u914d\u7f6e\u6587\u4ef6 -YXL.ACU001.DCH.START = 0300 -YXL.ACU001.DCH.COUNT = 48 \ No newline at end of file + +######## YXL.ACU001 ######## +#\u7532\u70f7\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.CH.COUNT = 6 +#\u7532\u70f7\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 +YXL.ACU001.CH.START = 0300 +#\u7532\u70f7\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 +YXL.ACU001.CH.WORDCOUNT = 24 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.CHALM.START = 0026 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.CHALM.WORDCOUNT = 1 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.CHALM.BITCOUNT = 12 + +#\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.WS.COUNT = 6 +#\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 +YXL.ACU001.WS.START = 0400 +#\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 +YXL.ACU001.WS.WORDCOUNT = 74 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.WSALM.START = 0030 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.WSALM.WORDCOUNT = 3 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.WSALM.BITCOUNT = 12 diff --git a/src/ACUBL.properties b/src/ACUBL.properties index d3be57b..12a50a2 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -1,3 +1,28 @@ #ACU\u53d8\u91cf\u8868\u914d\u7f6e\u6587\u4ef6 -YXL.ACU001.DCH.START = 0300 -YXL.ACU001.DCH.COUNT = 48 \ No newline at end of file + +######## YXL.ACU001 ######## +#\u7532\u70f7\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.CH.COUNT = 6 +#\u7532\u70f7\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 +YXL.ACU001.CH.START = 0300 +#\u7532\u70f7\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 +YXL.ACU001.CH.WORDCOUNT = 24 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.CHALM.START = 0026 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.CHALM.WORDCOUNT = 1 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.CHALM.BITCOUNT = 12 + +#\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.WS.COUNT = 6 +#\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 +YXL.ACU001.WS.START = 0400 +#\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 +YXL.ACU001.WS.WORDCOUNT = 74 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.WSALM.START = 0030 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.WSALM.WORDCOUNT = 3 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.WSALM.BITCOUNT = 12 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index bacf942..46e331c 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -6,13 +6,15 @@ import com.szpg.db.dao.impl.PgAcuDaoImpl; import com.szpg.db.data.PgAcu; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; public class DSCTest { @@ -20,7 +22,7 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.107", 6800); + ACUClient client = new ACUClient("192.168.8.105", 6800); client.setNet("00"); client.setNode("6B"); @@ -33,13 +35,21 @@ new ScheduledThreadPoolExecutor(1).scheduleAtFixedRate(new ACUSocketCheckTask(client), 0, 30, TimeUnit.SECONDS); // 测试发送查询甲烷参数命令 - dsc.testSendCH4Command(client); +// dsc.testSendCH4Command(client); + + // 测试发送查询甲烷报警状态命令 + dsc.testSendCH4StatsuCommand(client); // System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); } - private void testSendCH4Command(ACUClient client) { - ReadCH4ParamCommand ch4 = new ReadCH4ParamCommand(); + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + public void testSendCH4Command(ACUClient client) { + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -51,11 +61,38 @@ ch4.setMemoryArea(FINSConstants.MEMORY_DM_AREA); - ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.DCH.START")))) + "00"); - ch4.setCount(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.DCH.COUNT"))); + ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); + ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); + ch4.setCountBit(0); //读取监测值时位数量无效 ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 15, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + public void testSendCH4StatsuCommand(ACUClient client) { + ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ch4alm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ch4alm.setDestinationId(dest); + + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + 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"))); + ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/ACUBL.properties b/src/ACUBL.properties index d3be57b..12a50a2 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -1,3 +1,28 @@ #ACU\u53d8\u91cf\u8868\u914d\u7f6e\u6587\u4ef6 -YXL.ACU001.DCH.START = 0300 -YXL.ACU001.DCH.COUNT = 48 \ No newline at end of file + +######## YXL.ACU001 ######## +#\u7532\u70f7\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.CH.COUNT = 6 +#\u7532\u70f7\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 +YXL.ACU001.CH.START = 0300 +#\u7532\u70f7\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 +YXL.ACU001.CH.WORDCOUNT = 24 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.CHALM.START = 0026 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.CHALM.WORDCOUNT = 1 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.CHALM.BITCOUNT = 12 + +#\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.WS.COUNT = 6 +#\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 +YXL.ACU001.WS.START = 0400 +#\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 +YXL.ACU001.WS.WORDCOUNT = 74 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.WSALM.START = 0030 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.WSALM.WORDCOUNT = 3 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.WSALM.BITCOUNT = 12 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index bacf942..46e331c 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -6,13 +6,15 @@ import com.szpg.db.dao.impl.PgAcuDaoImpl; import com.szpg.db.data.PgAcu; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; public class DSCTest { @@ -20,7 +22,7 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.107", 6800); + ACUClient client = new ACUClient("192.168.8.105", 6800); client.setNet("00"); client.setNode("6B"); @@ -33,13 +35,21 @@ new ScheduledThreadPoolExecutor(1).scheduleAtFixedRate(new ACUSocketCheckTask(client), 0, 30, TimeUnit.SECONDS); // 测试发送查询甲烷参数命令 - dsc.testSendCH4Command(client); +// dsc.testSendCH4Command(client); + + // 测试发送查询甲烷报警状态命令 + dsc.testSendCH4StatsuCommand(client); // System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); } - private void testSendCH4Command(ACUClient client) { - ReadCH4ParamCommand ch4 = new ReadCH4ParamCommand(); + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + public void testSendCH4Command(ACUClient client) { + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -51,11 +61,38 @@ ch4.setMemoryArea(FINSConstants.MEMORY_DM_AREA); - ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.DCH.START")))) + "00"); - ch4.setCount(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.DCH.COUNT"))); + ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); + ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); + ch4.setCountBit(0); //读取监测值时位数量无效 ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 15, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + public void testSendCH4StatsuCommand(ACUClient client) { + ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ch4alm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ch4alm.setDestinationId(dest); + + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + 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"))); + ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index e5e8175..5c81046 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -3,6 +3,7 @@ import java.util.List; import com.szpg.db.data.PgCh4; +import com.szpg.db.data.PgCh4Alm; /** * 甲烷相关参数读写的数据库接口 @@ -11,6 +12,7 @@ */ public interface PgCh4Dao { + /******** 甲烷浓度变量值 ********/ public List findAllPblz(); public PgCh4 findPblzById(Integer id); @@ -19,4 +21,15 @@ public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); + + + /******** 甲烷浓度报警状态 ********/ + public List findAllSbjz(); + public PgCh4Alm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgCh4Alm ch4alm); + public int addSbjzRecord(boolean status, String tm, int deviceid); } diff --git a/src/ACUBL.properties b/src/ACUBL.properties index d3be57b..12a50a2 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -1,3 +1,28 @@ #ACU\u53d8\u91cf\u8868\u914d\u7f6e\u6587\u4ef6 -YXL.ACU001.DCH.START = 0300 -YXL.ACU001.DCH.COUNT = 48 \ No newline at end of file + +######## YXL.ACU001 ######## +#\u7532\u70f7\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.CH.COUNT = 6 +#\u7532\u70f7\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 +YXL.ACU001.CH.START = 0300 +#\u7532\u70f7\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 +YXL.ACU001.CH.WORDCOUNT = 24 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.CHALM.START = 0026 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.CHALM.WORDCOUNT = 1 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.CHALM.BITCOUNT = 12 + +#\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.WS.COUNT = 6 +#\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 +YXL.ACU001.WS.START = 0400 +#\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 +YXL.ACU001.WS.WORDCOUNT = 74 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.WSALM.START = 0030 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.WSALM.WORDCOUNT = 3 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.WSALM.BITCOUNT = 12 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index bacf942..46e331c 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -6,13 +6,15 @@ import com.szpg.db.dao.impl.PgAcuDaoImpl; import com.szpg.db.data.PgAcu; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; public class DSCTest { @@ -20,7 +22,7 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.107", 6800); + ACUClient client = new ACUClient("192.168.8.105", 6800); client.setNet("00"); client.setNode("6B"); @@ -33,13 +35,21 @@ new ScheduledThreadPoolExecutor(1).scheduleAtFixedRate(new ACUSocketCheckTask(client), 0, 30, TimeUnit.SECONDS); // 测试发送查询甲烷参数命令 - dsc.testSendCH4Command(client); +// dsc.testSendCH4Command(client); + + // 测试发送查询甲烷报警状态命令 + dsc.testSendCH4StatsuCommand(client); // System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); } - private void testSendCH4Command(ACUClient client) { - ReadCH4ParamCommand ch4 = new ReadCH4ParamCommand(); + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + public void testSendCH4Command(ACUClient client) { + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -51,11 +61,38 @@ ch4.setMemoryArea(FINSConstants.MEMORY_DM_AREA); - ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.DCH.START")))) + "00"); - ch4.setCount(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.DCH.COUNT"))); + ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); + ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); + ch4.setCountBit(0); //读取监测值时位数量无效 ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 15, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + public void testSendCH4StatsuCommand(ACUClient client) { + ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ch4alm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ch4alm.setDestinationId(dest); + + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + 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"))); + ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index e5e8175..5c81046 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -3,6 +3,7 @@ import java.util.List; import com.szpg.db.data.PgCh4; +import com.szpg.db.data.PgCh4Alm; /** * 甲烷相关参数读写的数据库接口 @@ -11,6 +12,7 @@ */ public interface PgCh4Dao { + /******** 甲烷浓度变量值 ********/ public List findAllPblz(); public PgCh4 findPblzById(Integer id); @@ -19,4 +21,15 @@ public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); + + + /******** 甲烷浓度报警状态 ********/ + public List findAllSbjz(); + public PgCh4Alm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgCh4Alm ch4alm); + 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 3db493e..3c7e9e3 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -120,9 +120,9 @@ Connection conn = null; String insertStr = "INSERT INTO PG_ACU_RDCMD " + - "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, RESPONSED, TIMEOUT) " + - "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, '0', '0')"; - Object[] params = new Object[8]; + "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, RESPONSED, TIMEOUT) " + + "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, '0', '0')"; + Object[] params = new Object[9]; params[0] = cmd.getId(); params[1] = TimeFormat.format(cmd.getTm(), "yyyyMMddHHmmss"); params[2] = cmd.getCmd_type(); @@ -131,6 +131,7 @@ params[5] = cmd.getStart_mem_word(); params[6] = cmd.getStart_mem_bit(); params[7] = cmd.getCount_word(); + params[8] = cmd.getCount_bit(); try { conn = ConnectionManager.getConnectionFromC3P0(); diff --git a/src/ACUBL.properties b/src/ACUBL.properties index d3be57b..12a50a2 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -1,3 +1,28 @@ #ACU\u53d8\u91cf\u8868\u914d\u7f6e\u6587\u4ef6 -YXL.ACU001.DCH.START = 0300 -YXL.ACU001.DCH.COUNT = 48 \ No newline at end of file + +######## YXL.ACU001 ######## +#\u7532\u70f7\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.CH.COUNT = 6 +#\u7532\u70f7\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 +YXL.ACU001.CH.START = 0300 +#\u7532\u70f7\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 +YXL.ACU001.CH.WORDCOUNT = 24 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.CHALM.START = 0026 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.CHALM.WORDCOUNT = 1 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.CHALM.BITCOUNT = 12 + +#\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.WS.COUNT = 6 +#\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 +YXL.ACU001.WS.START = 0400 +#\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 +YXL.ACU001.WS.WORDCOUNT = 74 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.WSALM.START = 0030 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.WSALM.WORDCOUNT = 3 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.WSALM.BITCOUNT = 12 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index bacf942..46e331c 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -6,13 +6,15 @@ import com.szpg.db.dao.impl.PgAcuDaoImpl; import com.szpg.db.data.PgAcu; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; public class DSCTest { @@ -20,7 +22,7 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.107", 6800); + ACUClient client = new ACUClient("192.168.8.105", 6800); client.setNet("00"); client.setNode("6B"); @@ -33,13 +35,21 @@ new ScheduledThreadPoolExecutor(1).scheduleAtFixedRate(new ACUSocketCheckTask(client), 0, 30, TimeUnit.SECONDS); // 测试发送查询甲烷参数命令 - dsc.testSendCH4Command(client); +// dsc.testSendCH4Command(client); + + // 测试发送查询甲烷报警状态命令 + dsc.testSendCH4StatsuCommand(client); // System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); } - private void testSendCH4Command(ACUClient client) { - ReadCH4ParamCommand ch4 = new ReadCH4ParamCommand(); + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + public void testSendCH4Command(ACUClient client) { + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -51,11 +61,38 @@ ch4.setMemoryArea(FINSConstants.MEMORY_DM_AREA); - ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.DCH.START")))) + "00"); - ch4.setCount(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.DCH.COUNT"))); + ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); + ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); + ch4.setCountBit(0); //读取监测值时位数量无效 ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 15, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + public void testSendCH4StatsuCommand(ACUClient client) { + ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ch4alm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ch4alm.setDestinationId(dest); + + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + 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"))); + ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index e5e8175..5c81046 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -3,6 +3,7 @@ import java.util.List; import com.szpg.db.data.PgCh4; +import com.szpg.db.data.PgCh4Alm; /** * 甲烷相关参数读写的数据库接口 @@ -11,6 +12,7 @@ */ public interface PgCh4Dao { + /******** 甲烷浓度变量值 ********/ public List findAllPblz(); public PgCh4 findPblzById(Integer id); @@ -19,4 +21,15 @@ public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); + + + /******** 甲烷浓度报警状态 ********/ + public List findAllSbjz(); + public PgCh4Alm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgCh4Alm ch4alm); + 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 3db493e..3c7e9e3 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -120,9 +120,9 @@ Connection conn = null; String insertStr = "INSERT INTO PG_ACU_RDCMD " + - "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, RESPONSED, TIMEOUT) " + - "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, '0', '0')"; - Object[] params = new Object[8]; + "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, RESPONSED, TIMEOUT) " + + "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, '0', '0')"; + Object[] params = new Object[9]; params[0] = cmd.getId(); params[1] = TimeFormat.format(cmd.getTm(), "yyyyMMddHHmmss"); params[2] = cmd.getCmd_type(); @@ -131,6 +131,7 @@ params[5] = cmd.getStart_mem_word(); params[6] = cmd.getStart_mem_bit(); params[7] = cmd.getCount_word(); + params[8] = cmd.getCount_bit(); try { conn = ConnectionManager.getConnectionFromC3P0(); diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 9d693a8..aac45e6 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -13,6 +13,7 @@ import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.data.PgCh4; +import com.szpg.db.data.PgCh4Alm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -259,4 +260,243 @@ return 0; } + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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++) { + PgCh4Alm ch4alm = new PgCh4Alm(); + Object[] item = tempList.get(i); + + ch4alm.setId(((Number) item[0]).intValue()); + ch4alm.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4alm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4alm.setLogtime(cal.getTime()); + ch4alm.setUptime(cal.getTime()); + + list.add(ch4alm); + } + 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 PgCh4Alm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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) { + PgCh4Alm ch4 = new PgCh4Alm(); + Object[] item = tempList.get(0); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + logger.debug("根据ID查询甲烷报警状态成功" + ch4 + "]"); + + return ch4; + } + 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, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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++) { + PgCh4Alm ch4 = new PgCh4Alm(); + Object[] item = tempList.get(i); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + list.add(ch4); + } + 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, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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++) { + PgCh4Alm ch4 = new PgCh4Alm(); + Object[] item = tempList.get(i); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + list.add(ch4); + } + 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(PgCh4Alm ch4alm) { + return addSbjzRecord(ch4alm.getCh4alm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_CH4_ALM " + + "(CH4ALM, 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 d3be57b..12a50a2 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -1,3 +1,28 @@ #ACU\u53d8\u91cf\u8868\u914d\u7f6e\u6587\u4ef6 -YXL.ACU001.DCH.START = 0300 -YXL.ACU001.DCH.COUNT = 48 \ No newline at end of file + +######## YXL.ACU001 ######## +#\u7532\u70f7\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.CH.COUNT = 6 +#\u7532\u70f7\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 +YXL.ACU001.CH.START = 0300 +#\u7532\u70f7\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 +YXL.ACU001.CH.WORDCOUNT = 24 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.CHALM.START = 0026 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.CHALM.WORDCOUNT = 1 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.CHALM.BITCOUNT = 12 + +#\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.WS.COUNT = 6 +#\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 +YXL.ACU001.WS.START = 0400 +#\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 +YXL.ACU001.WS.WORDCOUNT = 74 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.WSALM.START = 0030 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.WSALM.WORDCOUNT = 3 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.WSALM.BITCOUNT = 12 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index bacf942..46e331c 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -6,13 +6,15 @@ import com.szpg.db.dao.impl.PgAcuDaoImpl; import com.szpg.db.data.PgAcu; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; public class DSCTest { @@ -20,7 +22,7 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.107", 6800); + ACUClient client = new ACUClient("192.168.8.105", 6800); client.setNet("00"); client.setNode("6B"); @@ -33,13 +35,21 @@ new ScheduledThreadPoolExecutor(1).scheduleAtFixedRate(new ACUSocketCheckTask(client), 0, 30, TimeUnit.SECONDS); // 测试发送查询甲烷参数命令 - dsc.testSendCH4Command(client); +// dsc.testSendCH4Command(client); + + // 测试发送查询甲烷报警状态命令 + dsc.testSendCH4StatsuCommand(client); // System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); } - private void testSendCH4Command(ACUClient client) { - ReadCH4ParamCommand ch4 = new ReadCH4ParamCommand(); + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + public void testSendCH4Command(ACUClient client) { + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -51,11 +61,38 @@ ch4.setMemoryArea(FINSConstants.MEMORY_DM_AREA); - ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.DCH.START")))) + "00"); - ch4.setCount(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.DCH.COUNT"))); + ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); + ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); + ch4.setCountBit(0); //读取监测值时位数量无效 ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 15, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + public void testSendCH4StatsuCommand(ACUClient client) { + ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ch4alm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ch4alm.setDestinationId(dest); + + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + 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"))); + ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index e5e8175..5c81046 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -3,6 +3,7 @@ import java.util.List; import com.szpg.db.data.PgCh4; +import com.szpg.db.data.PgCh4Alm; /** * 甲烷相关参数读写的数据库接口 @@ -11,6 +12,7 @@ */ public interface PgCh4Dao { + /******** 甲烷浓度变量值 ********/ public List findAllPblz(); public PgCh4 findPblzById(Integer id); @@ -19,4 +21,15 @@ public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); + + + /******** 甲烷浓度报警状态 ********/ + public List findAllSbjz(); + public PgCh4Alm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgCh4Alm ch4alm); + 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 3db493e..3c7e9e3 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -120,9 +120,9 @@ Connection conn = null; String insertStr = "INSERT INTO PG_ACU_RDCMD " + - "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, RESPONSED, TIMEOUT) " + - "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, '0', '0')"; - Object[] params = new Object[8]; + "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, RESPONSED, TIMEOUT) " + + "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, '0', '0')"; + Object[] params = new Object[9]; params[0] = cmd.getId(); params[1] = TimeFormat.format(cmd.getTm(), "yyyyMMddHHmmss"); params[2] = cmd.getCmd_type(); @@ -131,6 +131,7 @@ params[5] = cmd.getStart_mem_word(); params[6] = cmd.getStart_mem_bit(); params[7] = cmd.getCount_word(); + params[8] = cmd.getCount_bit(); try { conn = ConnectionManager.getConnectionFromC3P0(); diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 9d693a8..aac45e6 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -13,6 +13,7 @@ import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.data.PgCh4; +import com.szpg.db.data.PgCh4Alm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -259,4 +260,243 @@ return 0; } + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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++) { + PgCh4Alm ch4alm = new PgCh4Alm(); + Object[] item = tempList.get(i); + + ch4alm.setId(((Number) item[0]).intValue()); + ch4alm.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4alm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4alm.setLogtime(cal.getTime()); + ch4alm.setUptime(cal.getTime()); + + list.add(ch4alm); + } + 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 PgCh4Alm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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) { + PgCh4Alm ch4 = new PgCh4Alm(); + Object[] item = tempList.get(0); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + logger.debug("根据ID查询甲烷报警状态成功" + ch4 + "]"); + + return ch4; + } + 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, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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++) { + PgCh4Alm ch4 = new PgCh4Alm(); + Object[] item = tempList.get(i); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + list.add(ch4); + } + 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, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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++) { + PgCh4Alm ch4 = new PgCh4Alm(); + Object[] item = tempList.get(i); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + list.add(ch4); + } + 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(PgCh4Alm ch4alm) { + return addSbjzRecord(ch4alm.getCh4alm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_CH4_ALM " + + "(CH4ALM, 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 38f8667..095bbb8 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -11,11 +11,11 @@ * */ public class PgAcuRdcmd implements java.io.Serializable { - + /** * */ - private static final long serialVersionUID = -3187227934289186463L; + private static final long serialVersionUID = -605179003596292814L; private String id; // ID private Date tm; // 命令发送时间 @@ -25,6 +25,7 @@ private String start_mem_word; // 起始内存字地址 private String start_mem_bit; // 起始内存位地址 private Integer count_word; // 读取的字数量 + private Integer count_bit; //读取的位数量 private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 @@ -92,6 +93,14 @@ this.count_word = count_word; } + public Integer getCount_bit() { + return count_bit; + } + + public void setCount_bit(Integer count_bit) { + this.count_bit = count_bit; + } + public boolean isResponsed() { return responsed; } diff --git a/src/ACUBL.properties b/src/ACUBL.properties index d3be57b..12a50a2 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -1,3 +1,28 @@ #ACU\u53d8\u91cf\u8868\u914d\u7f6e\u6587\u4ef6 -YXL.ACU001.DCH.START = 0300 -YXL.ACU001.DCH.COUNT = 48 \ No newline at end of file + +######## YXL.ACU001 ######## +#\u7532\u70f7\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.CH.COUNT = 6 +#\u7532\u70f7\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 +YXL.ACU001.CH.START = 0300 +#\u7532\u70f7\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 +YXL.ACU001.CH.WORDCOUNT = 24 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.CHALM.START = 0026 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.CHALM.WORDCOUNT = 1 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.CHALM.BITCOUNT = 12 + +#\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.WS.COUNT = 6 +#\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 +YXL.ACU001.WS.START = 0400 +#\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 +YXL.ACU001.WS.WORDCOUNT = 74 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.WSALM.START = 0030 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.WSALM.WORDCOUNT = 3 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.WSALM.BITCOUNT = 12 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index bacf942..46e331c 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -6,13 +6,15 @@ import com.szpg.db.dao.impl.PgAcuDaoImpl; import com.szpg.db.data.PgAcu; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; public class DSCTest { @@ -20,7 +22,7 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.107", 6800); + ACUClient client = new ACUClient("192.168.8.105", 6800); client.setNet("00"); client.setNode("6B"); @@ -33,13 +35,21 @@ new ScheduledThreadPoolExecutor(1).scheduleAtFixedRate(new ACUSocketCheckTask(client), 0, 30, TimeUnit.SECONDS); // 测试发送查询甲烷参数命令 - dsc.testSendCH4Command(client); +// dsc.testSendCH4Command(client); + + // 测试发送查询甲烷报警状态命令 + dsc.testSendCH4StatsuCommand(client); // System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); } - private void testSendCH4Command(ACUClient client) { - ReadCH4ParamCommand ch4 = new ReadCH4ParamCommand(); + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + public void testSendCH4Command(ACUClient client) { + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -51,11 +61,38 @@ ch4.setMemoryArea(FINSConstants.MEMORY_DM_AREA); - ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.DCH.START")))) + "00"); - ch4.setCount(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.DCH.COUNT"))); + ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); + ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); + ch4.setCountBit(0); //读取监测值时位数量无效 ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 15, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + public void testSendCH4StatsuCommand(ACUClient client) { + ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ch4alm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ch4alm.setDestinationId(dest); + + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + 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"))); + ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index e5e8175..5c81046 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -3,6 +3,7 @@ import java.util.List; import com.szpg.db.data.PgCh4; +import com.szpg.db.data.PgCh4Alm; /** * 甲烷相关参数读写的数据库接口 @@ -11,6 +12,7 @@ */ public interface PgCh4Dao { + /******** 甲烷浓度变量值 ********/ public List findAllPblz(); public PgCh4 findPblzById(Integer id); @@ -19,4 +21,15 @@ public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); + + + /******** 甲烷浓度报警状态 ********/ + public List findAllSbjz(); + public PgCh4Alm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgCh4Alm ch4alm); + 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 3db493e..3c7e9e3 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -120,9 +120,9 @@ Connection conn = null; String insertStr = "INSERT INTO PG_ACU_RDCMD " + - "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, RESPONSED, TIMEOUT) " + - "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, '0', '0')"; - Object[] params = new Object[8]; + "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, RESPONSED, TIMEOUT) " + + "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, '0', '0')"; + Object[] params = new Object[9]; params[0] = cmd.getId(); params[1] = TimeFormat.format(cmd.getTm(), "yyyyMMddHHmmss"); params[2] = cmd.getCmd_type(); @@ -131,6 +131,7 @@ params[5] = cmd.getStart_mem_word(); params[6] = cmd.getStart_mem_bit(); params[7] = cmd.getCount_word(); + params[8] = cmd.getCount_bit(); try { conn = ConnectionManager.getConnectionFromC3P0(); diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 9d693a8..aac45e6 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -13,6 +13,7 @@ import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.data.PgCh4; +import com.szpg.db.data.PgCh4Alm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -259,4 +260,243 @@ return 0; } + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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++) { + PgCh4Alm ch4alm = new PgCh4Alm(); + Object[] item = tempList.get(i); + + ch4alm.setId(((Number) item[0]).intValue()); + ch4alm.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4alm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4alm.setLogtime(cal.getTime()); + ch4alm.setUptime(cal.getTime()); + + list.add(ch4alm); + } + 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 PgCh4Alm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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) { + PgCh4Alm ch4 = new PgCh4Alm(); + Object[] item = tempList.get(0); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + logger.debug("根据ID查询甲烷报警状态成功" + ch4 + "]"); + + return ch4; + } + 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, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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++) { + PgCh4Alm ch4 = new PgCh4Alm(); + Object[] item = tempList.get(i); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + list.add(ch4); + } + 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, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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++) { + PgCh4Alm ch4 = new PgCh4Alm(); + Object[] item = tempList.get(i); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + list.add(ch4); + } + 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(PgCh4Alm ch4alm) { + return addSbjzRecord(ch4alm.getCh4alm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_CH4_ALM " + + "(CH4ALM, 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 38f8667..095bbb8 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -11,11 +11,11 @@ * */ public class PgAcuRdcmd implements java.io.Serializable { - + /** * */ - private static final long serialVersionUID = -3187227934289186463L; + private static final long serialVersionUID = -605179003596292814L; private String id; // ID private Date tm; // 命令发送时间 @@ -25,6 +25,7 @@ private String start_mem_word; // 起始内存字地址 private String start_mem_bit; // 起始内存位地址 private Integer count_word; // 读取的字数量 + private Integer count_bit; //读取的位数量 private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 @@ -92,6 +93,14 @@ this.count_word = count_word; } + public Integer getCount_bit() { + return count_bit; + } + + public void setCount_bit(Integer count_bit) { + this.count_bit = count_bit; + } + public boolean isResponsed() { return responsed; } diff --git a/src/com/szpg/db/data/PgCh4Alm.java b/src/com/szpg/db/data/PgCh4Alm.java new file mode 100644 index 0000000..392a567 --- /dev/null +++ b/src/com/szpg/db/data/PgCh4Alm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 甲烷浓度报警状态数据表 + * + * @author admin + * + */ +public class PgCh4Alm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = -109172405679187040L; + + private Integer id; + private Boolean ch4alm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getCh4alm() { + return ch4alm; + } + + public void setCh4alm(Boolean ch4alm) { + this.ch4alm = ch4alm; + } + + 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 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 ""; + } + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgCh4[ch4=" + ch4alm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index d3be57b..12a50a2 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -1,3 +1,28 @@ #ACU\u53d8\u91cf\u8868\u914d\u7f6e\u6587\u4ef6 -YXL.ACU001.DCH.START = 0300 -YXL.ACU001.DCH.COUNT = 48 \ No newline at end of file + +######## YXL.ACU001 ######## +#\u7532\u70f7\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.CH.COUNT = 6 +#\u7532\u70f7\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 +YXL.ACU001.CH.START = 0300 +#\u7532\u70f7\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 +YXL.ACU001.CH.WORDCOUNT = 24 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.CHALM.START = 0026 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.CHALM.WORDCOUNT = 1 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.CHALM.BITCOUNT = 12 + +#\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.WS.COUNT = 6 +#\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 +YXL.ACU001.WS.START = 0400 +#\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 +YXL.ACU001.WS.WORDCOUNT = 74 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.WSALM.START = 0030 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.WSALM.WORDCOUNT = 3 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.WSALM.BITCOUNT = 12 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index bacf942..46e331c 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -6,13 +6,15 @@ import com.szpg.db.dao.impl.PgAcuDaoImpl; import com.szpg.db.data.PgAcu; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; public class DSCTest { @@ -20,7 +22,7 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.107", 6800); + ACUClient client = new ACUClient("192.168.8.105", 6800); client.setNet("00"); client.setNode("6B"); @@ -33,13 +35,21 @@ new ScheduledThreadPoolExecutor(1).scheduleAtFixedRate(new ACUSocketCheckTask(client), 0, 30, TimeUnit.SECONDS); // 测试发送查询甲烷参数命令 - dsc.testSendCH4Command(client); +// dsc.testSendCH4Command(client); + + // 测试发送查询甲烷报警状态命令 + dsc.testSendCH4StatsuCommand(client); // System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); } - private void testSendCH4Command(ACUClient client) { - ReadCH4ParamCommand ch4 = new ReadCH4ParamCommand(); + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + public void testSendCH4Command(ACUClient client) { + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -51,11 +61,38 @@ ch4.setMemoryArea(FINSConstants.MEMORY_DM_AREA); - ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.DCH.START")))) + "00"); - ch4.setCount(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.DCH.COUNT"))); + ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); + ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); + ch4.setCountBit(0); //读取监测值时位数量无效 ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 15, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + public void testSendCH4StatsuCommand(ACUClient client) { + ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ch4alm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ch4alm.setDestinationId(dest); + + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + 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"))); + ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index e5e8175..5c81046 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -3,6 +3,7 @@ import java.util.List; import com.szpg.db.data.PgCh4; +import com.szpg.db.data.PgCh4Alm; /** * 甲烷相关参数读写的数据库接口 @@ -11,6 +12,7 @@ */ public interface PgCh4Dao { + /******** 甲烷浓度变量值 ********/ public List findAllPblz(); public PgCh4 findPblzById(Integer id); @@ -19,4 +21,15 @@ public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); + + + /******** 甲烷浓度报警状态 ********/ + public List findAllSbjz(); + public PgCh4Alm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgCh4Alm ch4alm); + 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 3db493e..3c7e9e3 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -120,9 +120,9 @@ Connection conn = null; String insertStr = "INSERT INTO PG_ACU_RDCMD " + - "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, RESPONSED, TIMEOUT) " + - "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, '0', '0')"; - Object[] params = new Object[8]; + "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, RESPONSED, TIMEOUT) " + + "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, '0', '0')"; + Object[] params = new Object[9]; params[0] = cmd.getId(); params[1] = TimeFormat.format(cmd.getTm(), "yyyyMMddHHmmss"); params[2] = cmd.getCmd_type(); @@ -131,6 +131,7 @@ params[5] = cmd.getStart_mem_word(); params[6] = cmd.getStart_mem_bit(); params[7] = cmd.getCount_word(); + params[8] = cmd.getCount_bit(); try { conn = ConnectionManager.getConnectionFromC3P0(); diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 9d693a8..aac45e6 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -13,6 +13,7 @@ import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.data.PgCh4; +import com.szpg.db.data.PgCh4Alm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -259,4 +260,243 @@ return 0; } + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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++) { + PgCh4Alm ch4alm = new PgCh4Alm(); + Object[] item = tempList.get(i); + + ch4alm.setId(((Number) item[0]).intValue()); + ch4alm.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4alm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4alm.setLogtime(cal.getTime()); + ch4alm.setUptime(cal.getTime()); + + list.add(ch4alm); + } + 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 PgCh4Alm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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) { + PgCh4Alm ch4 = new PgCh4Alm(); + Object[] item = tempList.get(0); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + logger.debug("根据ID查询甲烷报警状态成功" + ch4 + "]"); + + return ch4; + } + 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, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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++) { + PgCh4Alm ch4 = new PgCh4Alm(); + Object[] item = tempList.get(i); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + list.add(ch4); + } + 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, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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++) { + PgCh4Alm ch4 = new PgCh4Alm(); + Object[] item = tempList.get(i); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + list.add(ch4); + } + 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(PgCh4Alm ch4alm) { + return addSbjzRecord(ch4alm.getCh4alm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_CH4_ALM " + + "(CH4ALM, 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 38f8667..095bbb8 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -11,11 +11,11 @@ * */ public class PgAcuRdcmd implements java.io.Serializable { - + /** * */ - private static final long serialVersionUID = -3187227934289186463L; + private static final long serialVersionUID = -605179003596292814L; private String id; // ID private Date tm; // 命令发送时间 @@ -25,6 +25,7 @@ private String start_mem_word; // 起始内存字地址 private String start_mem_bit; // 起始内存位地址 private Integer count_word; // 读取的字数量 + private Integer count_bit; //读取的位数量 private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 @@ -92,6 +93,14 @@ this.count_word = count_word; } + public Integer getCount_bit() { + return count_bit; + } + + public void setCount_bit(Integer count_bit) { + this.count_bit = count_bit; + } + public boolean isResponsed() { return responsed; } diff --git a/src/com/szpg/db/data/PgCh4Alm.java b/src/com/szpg/db/data/PgCh4Alm.java new file mode 100644 index 0000000..392a567 --- /dev/null +++ b/src/com/szpg/db/data/PgCh4Alm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 甲烷浓度报警状态数据表 + * + * @author admin + * + */ +public class PgCh4Alm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = -109172405679187040L; + + private Integer id; + private Boolean ch4alm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getCh4alm() { + return ch4alm; + } + + public void setCh4alm(Boolean ch4alm) { + this.ch4alm = ch4alm; + } + + 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 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 ""; + } + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgCh4[ch4=" + ch4alm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java index 96dc762..8422d1b 100644 --- a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java +++ b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java @@ -2,8 +2,6 @@ import static org.junit.Assert.assertEquals; -import java.util.Calendar; - import org.junit.Before; import org.junit.Test; @@ -11,8 +9,9 @@ import com.szpg.db.dao.impl.PgAcuRdcmdDaoImpl; import com.szpg.db.data.PgAcuRdcmd; import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.util.ByteUtil; +import com.szpg.util.Configure; public class PgAcuRdcmdDaoTest { @@ -25,38 +24,40 @@ // @Test public void testAdd() { - ReadCH4ParamCommand ch4 = new ReadCH4ParamCommand(); + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); ch4.setDestinationId("006B00"); ch4.setMessageProducerId("00F400"); - ch4.setMemoryArea((byte) 0x82); - ch4.setStartAddress("012C00"); - ch4.setCount(24); + ch4.setMemoryArea((byte) 0x31); + ch4.setStartAddress("001A00"); + ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.CHALM.WORDCOUNT"))); + ch4.setCountBit(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.CHALM.BITCOUNT"))); PgAcuRdcmd cmd = new PgAcuRdcmd(); cmd.setId(ch4.getId()); - cmd.setTm(Calendar.getInstance().getTime()); - cmd.setCmd_type(AppMessageConstants.CMD_TYPE_READCH4STATUS); + cmd.setTm(ch4.getTime().getTime()); + cmd.setCmd_type(ch4.getCommandType()); cmd.setDest(ch4.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] {ch4.getMemoryArea()})); cmd.setStart_mem_word(ch4.getStartAddress().substring(0, 4)); cmd.setStart_mem_bit(ch4.getStartAddress().substring(4)); - cmd.setCount_word(ch4.getCount()); + cmd.setCount_word(ch4.getCountWord()); + cmd.setCount_bit(ch4.getCountBit()); assertEquals(1, dao.addCmdRecord(cmd)); } -// @Test + @Test public void testFindAll() { - assertEquals(1, dao.findAll()); + assertEquals(1, dao.findAll().size()); } @Test public void testFindByDestAndCount() { - assertEquals("11", dao.findLatestCmdByDestAndCount("006B00", 24).getCmd_type()); + assertEquals("12", dao.findLatestCmdByDestAndCount("006B00", 1).getCmd_type()); } - @Test +// @Test public void testUpdateResponsed() { assertEquals(1, dao.updateCmdRecordResponsed("23ff9e2987e64f248823254f0dfe1528")); } diff --git a/src/ACUBL.properties b/src/ACUBL.properties index d3be57b..12a50a2 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -1,3 +1,28 @@ #ACU\u53d8\u91cf\u8868\u914d\u7f6e\u6587\u4ef6 -YXL.ACU001.DCH.START = 0300 -YXL.ACU001.DCH.COUNT = 48 \ No newline at end of file + +######## YXL.ACU001 ######## +#\u7532\u70f7\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.CH.COUNT = 6 +#\u7532\u70f7\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 +YXL.ACU001.CH.START = 0300 +#\u7532\u70f7\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 +YXL.ACU001.CH.WORDCOUNT = 24 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.CHALM.START = 0026 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.CHALM.WORDCOUNT = 1 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.CHALM.BITCOUNT = 12 + +#\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.WS.COUNT = 6 +#\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 +YXL.ACU001.WS.START = 0400 +#\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 +YXL.ACU001.WS.WORDCOUNT = 74 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.WSALM.START = 0030 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.WSALM.WORDCOUNT = 3 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.WSALM.BITCOUNT = 12 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index bacf942..46e331c 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -6,13 +6,15 @@ import com.szpg.db.dao.impl.PgAcuDaoImpl; import com.szpg.db.data.PgAcu; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; public class DSCTest { @@ -20,7 +22,7 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.107", 6800); + ACUClient client = new ACUClient("192.168.8.105", 6800); client.setNet("00"); client.setNode("6B"); @@ -33,13 +35,21 @@ new ScheduledThreadPoolExecutor(1).scheduleAtFixedRate(new ACUSocketCheckTask(client), 0, 30, TimeUnit.SECONDS); // 测试发送查询甲烷参数命令 - dsc.testSendCH4Command(client); +// dsc.testSendCH4Command(client); + + // 测试发送查询甲烷报警状态命令 + dsc.testSendCH4StatsuCommand(client); // System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); } - private void testSendCH4Command(ACUClient client) { - ReadCH4ParamCommand ch4 = new ReadCH4ParamCommand(); + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + public void testSendCH4Command(ACUClient client) { + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -51,11 +61,38 @@ ch4.setMemoryArea(FINSConstants.MEMORY_DM_AREA); - ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.DCH.START")))) + "00"); - ch4.setCount(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.DCH.COUNT"))); + ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); + ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); + ch4.setCountBit(0); //读取监测值时位数量无效 ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 15, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + public void testSendCH4StatsuCommand(ACUClient client) { + ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ch4alm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ch4alm.setDestinationId(dest); + + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + 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"))); + ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index e5e8175..5c81046 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -3,6 +3,7 @@ import java.util.List; import com.szpg.db.data.PgCh4; +import com.szpg.db.data.PgCh4Alm; /** * 甲烷相关参数读写的数据库接口 @@ -11,6 +12,7 @@ */ public interface PgCh4Dao { + /******** 甲烷浓度变量值 ********/ public List findAllPblz(); public PgCh4 findPblzById(Integer id); @@ -19,4 +21,15 @@ public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); + + + /******** 甲烷浓度报警状态 ********/ + public List findAllSbjz(); + public PgCh4Alm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgCh4Alm ch4alm); + 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 3db493e..3c7e9e3 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -120,9 +120,9 @@ Connection conn = null; String insertStr = "INSERT INTO PG_ACU_RDCMD " + - "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, RESPONSED, TIMEOUT) " + - "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, '0', '0')"; - Object[] params = new Object[8]; + "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, RESPONSED, TIMEOUT) " + + "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, '0', '0')"; + Object[] params = new Object[9]; params[0] = cmd.getId(); params[1] = TimeFormat.format(cmd.getTm(), "yyyyMMddHHmmss"); params[2] = cmd.getCmd_type(); @@ -131,6 +131,7 @@ params[5] = cmd.getStart_mem_word(); params[6] = cmd.getStart_mem_bit(); params[7] = cmd.getCount_word(); + params[8] = cmd.getCount_bit(); try { conn = ConnectionManager.getConnectionFromC3P0(); diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 9d693a8..aac45e6 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -13,6 +13,7 @@ import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.data.PgCh4; +import com.szpg.db.data.PgCh4Alm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -259,4 +260,243 @@ return 0; } + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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++) { + PgCh4Alm ch4alm = new PgCh4Alm(); + Object[] item = tempList.get(i); + + ch4alm.setId(((Number) item[0]).intValue()); + ch4alm.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4alm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4alm.setLogtime(cal.getTime()); + ch4alm.setUptime(cal.getTime()); + + list.add(ch4alm); + } + 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 PgCh4Alm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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) { + PgCh4Alm ch4 = new PgCh4Alm(); + Object[] item = tempList.get(0); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + logger.debug("根据ID查询甲烷报警状态成功" + ch4 + "]"); + + return ch4; + } + 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, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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++) { + PgCh4Alm ch4 = new PgCh4Alm(); + Object[] item = tempList.get(i); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + list.add(ch4); + } + 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, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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++) { + PgCh4Alm ch4 = new PgCh4Alm(); + Object[] item = tempList.get(i); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + list.add(ch4); + } + 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(PgCh4Alm ch4alm) { + return addSbjzRecord(ch4alm.getCh4alm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_CH4_ALM " + + "(CH4ALM, 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 38f8667..095bbb8 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -11,11 +11,11 @@ * */ public class PgAcuRdcmd implements java.io.Serializable { - + /** * */ - private static final long serialVersionUID = -3187227934289186463L; + private static final long serialVersionUID = -605179003596292814L; private String id; // ID private Date tm; // 命令发送时间 @@ -25,6 +25,7 @@ private String start_mem_word; // 起始内存字地址 private String start_mem_bit; // 起始内存位地址 private Integer count_word; // 读取的字数量 + private Integer count_bit; //读取的位数量 private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 @@ -92,6 +93,14 @@ this.count_word = count_word; } + public Integer getCount_bit() { + return count_bit; + } + + public void setCount_bit(Integer count_bit) { + this.count_bit = count_bit; + } + public boolean isResponsed() { return responsed; } diff --git a/src/com/szpg/db/data/PgCh4Alm.java b/src/com/szpg/db/data/PgCh4Alm.java new file mode 100644 index 0000000..392a567 --- /dev/null +++ b/src/com/szpg/db/data/PgCh4Alm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 甲烷浓度报警状态数据表 + * + * @author admin + * + */ +public class PgCh4Alm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = -109172405679187040L; + + private Integer id; + private Boolean ch4alm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getCh4alm() { + return ch4alm; + } + + public void setCh4alm(Boolean ch4alm) { + this.ch4alm = ch4alm; + } + + 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 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 ""; + } + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgCh4[ch4=" + ch4alm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java index 96dc762..8422d1b 100644 --- a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java +++ b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java @@ -2,8 +2,6 @@ import static org.junit.Assert.assertEquals; -import java.util.Calendar; - import org.junit.Before; import org.junit.Test; @@ -11,8 +9,9 @@ import com.szpg.db.dao.impl.PgAcuRdcmdDaoImpl; import com.szpg.db.data.PgAcuRdcmd; import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.util.ByteUtil; +import com.szpg.util.Configure; public class PgAcuRdcmdDaoTest { @@ -25,38 +24,40 @@ // @Test public void testAdd() { - ReadCH4ParamCommand ch4 = new ReadCH4ParamCommand(); + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); ch4.setDestinationId("006B00"); ch4.setMessageProducerId("00F400"); - ch4.setMemoryArea((byte) 0x82); - ch4.setStartAddress("012C00"); - ch4.setCount(24); + ch4.setMemoryArea((byte) 0x31); + ch4.setStartAddress("001A00"); + ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.CHALM.WORDCOUNT"))); + ch4.setCountBit(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.CHALM.BITCOUNT"))); PgAcuRdcmd cmd = new PgAcuRdcmd(); cmd.setId(ch4.getId()); - cmd.setTm(Calendar.getInstance().getTime()); - cmd.setCmd_type(AppMessageConstants.CMD_TYPE_READCH4STATUS); + cmd.setTm(ch4.getTime().getTime()); + cmd.setCmd_type(ch4.getCommandType()); cmd.setDest(ch4.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] {ch4.getMemoryArea()})); cmd.setStart_mem_word(ch4.getStartAddress().substring(0, 4)); cmd.setStart_mem_bit(ch4.getStartAddress().substring(4)); - cmd.setCount_word(ch4.getCount()); + cmd.setCount_word(ch4.getCountWord()); + cmd.setCount_bit(ch4.getCountBit()); assertEquals(1, dao.addCmdRecord(cmd)); } -// @Test + @Test public void testFindAll() { - assertEquals(1, dao.findAll()); + assertEquals(1, dao.findAll().size()); } @Test public void testFindByDestAndCount() { - assertEquals("11", dao.findLatestCmdByDestAndCount("006B00", 24).getCmd_type()); + assertEquals("12", dao.findLatestCmdByDestAndCount("006B00", 1).getCmd_type()); } - @Test +// @Test public void testUpdateResponsed() { assertEquals(1, dao.updateCmdRecordResponsed("23ff9e2987e64f248823254f0dfe1528")); } diff --git a/src/com/szpg/db/test/PgCH4DaoTest.java b/src/com/szpg/db/test/PgCH4DaoTest.java index 8c1c49f..8377965 100644 --- a/src/com/szpg/db/test/PgCH4DaoTest.java +++ b/src/com/szpg/db/test/PgCH4DaoTest.java @@ -28,12 +28,27 @@ @Test public void testFindAllParam() { - assertEquals("20180115131918", dao.findAllPblz().get(0).getTmStrGB()); + assertEquals("20180115171555", dao.findAllPblz().get(0).getTmStrGB()); } @Test public void testFindParamById() { - Assert.assertEquals(dao.findPblzById(1).getTmStrGB(), "20180115131918"); + Assert.assertEquals(dao.findPblzById(2).getTmStrGB(), "20180115171555"); + } + +// @Test + public void testAddStatusRecord() { + assertEquals(2, dao.addSbjzRecord(false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 1)); + } + + @Test + public void testFindAllStatus() { + assertEquals("20180115183307", dao.findAllSbjz().get(0).getTmStrGB()); + } + + @Test + public void testFindStatusById() { + Assert.assertEquals(dao.findSbjzById(1).getTmStrGB(), "20180115183307"); } } diff --git a/src/ACUBL.properties b/src/ACUBL.properties index d3be57b..12a50a2 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -1,3 +1,28 @@ #ACU\u53d8\u91cf\u8868\u914d\u7f6e\u6587\u4ef6 -YXL.ACU001.DCH.START = 0300 -YXL.ACU001.DCH.COUNT = 48 \ No newline at end of file + +######## YXL.ACU001 ######## +#\u7532\u70f7\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.CH.COUNT = 6 +#\u7532\u70f7\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 +YXL.ACU001.CH.START = 0300 +#\u7532\u70f7\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 +YXL.ACU001.CH.WORDCOUNT = 24 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.CHALM.START = 0026 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.CHALM.WORDCOUNT = 1 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.CHALM.BITCOUNT = 12 + +#\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.WS.COUNT = 6 +#\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 +YXL.ACU001.WS.START = 0400 +#\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 +YXL.ACU001.WS.WORDCOUNT = 74 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.WSALM.START = 0030 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.WSALM.WORDCOUNT = 3 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.WSALM.BITCOUNT = 12 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index bacf942..46e331c 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -6,13 +6,15 @@ import com.szpg.db.dao.impl.PgAcuDaoImpl; import com.szpg.db.data.PgAcu; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; public class DSCTest { @@ -20,7 +22,7 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.107", 6800); + ACUClient client = new ACUClient("192.168.8.105", 6800); client.setNet("00"); client.setNode("6B"); @@ -33,13 +35,21 @@ new ScheduledThreadPoolExecutor(1).scheduleAtFixedRate(new ACUSocketCheckTask(client), 0, 30, TimeUnit.SECONDS); // 测试发送查询甲烷参数命令 - dsc.testSendCH4Command(client); +// dsc.testSendCH4Command(client); + + // 测试发送查询甲烷报警状态命令 + dsc.testSendCH4StatsuCommand(client); // System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); } - private void testSendCH4Command(ACUClient client) { - ReadCH4ParamCommand ch4 = new ReadCH4ParamCommand(); + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + public void testSendCH4Command(ACUClient client) { + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -51,11 +61,38 @@ ch4.setMemoryArea(FINSConstants.MEMORY_DM_AREA); - ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.DCH.START")))) + "00"); - ch4.setCount(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.DCH.COUNT"))); + ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); + ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); + ch4.setCountBit(0); //读取监测值时位数量无效 ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 15, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + public void testSendCH4StatsuCommand(ACUClient client) { + ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ch4alm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ch4alm.setDestinationId(dest); + + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + 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"))); + ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index e5e8175..5c81046 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -3,6 +3,7 @@ import java.util.List; import com.szpg.db.data.PgCh4; +import com.szpg.db.data.PgCh4Alm; /** * 甲烷相关参数读写的数据库接口 @@ -11,6 +12,7 @@ */ public interface PgCh4Dao { + /******** 甲烷浓度变量值 ********/ public List findAllPblz(); public PgCh4 findPblzById(Integer id); @@ -19,4 +21,15 @@ public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); + + + /******** 甲烷浓度报警状态 ********/ + public List findAllSbjz(); + public PgCh4Alm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgCh4Alm ch4alm); + 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 3db493e..3c7e9e3 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -120,9 +120,9 @@ Connection conn = null; String insertStr = "INSERT INTO PG_ACU_RDCMD " + - "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, RESPONSED, TIMEOUT) " + - "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, '0', '0')"; - Object[] params = new Object[8]; + "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, RESPONSED, TIMEOUT) " + + "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, '0', '0')"; + Object[] params = new Object[9]; params[0] = cmd.getId(); params[1] = TimeFormat.format(cmd.getTm(), "yyyyMMddHHmmss"); params[2] = cmd.getCmd_type(); @@ -131,6 +131,7 @@ params[5] = cmd.getStart_mem_word(); params[6] = cmd.getStart_mem_bit(); params[7] = cmd.getCount_word(); + params[8] = cmd.getCount_bit(); try { conn = ConnectionManager.getConnectionFromC3P0(); diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 9d693a8..aac45e6 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -13,6 +13,7 @@ import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.data.PgCh4; +import com.szpg.db.data.PgCh4Alm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -259,4 +260,243 @@ return 0; } + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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++) { + PgCh4Alm ch4alm = new PgCh4Alm(); + Object[] item = tempList.get(i); + + ch4alm.setId(((Number) item[0]).intValue()); + ch4alm.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4alm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4alm.setLogtime(cal.getTime()); + ch4alm.setUptime(cal.getTime()); + + list.add(ch4alm); + } + 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 PgCh4Alm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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) { + PgCh4Alm ch4 = new PgCh4Alm(); + Object[] item = tempList.get(0); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + logger.debug("根据ID查询甲烷报警状态成功" + ch4 + "]"); + + return ch4; + } + 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, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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++) { + PgCh4Alm ch4 = new PgCh4Alm(); + Object[] item = tempList.get(i); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + list.add(ch4); + } + 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, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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++) { + PgCh4Alm ch4 = new PgCh4Alm(); + Object[] item = tempList.get(i); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + list.add(ch4); + } + 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(PgCh4Alm ch4alm) { + return addSbjzRecord(ch4alm.getCh4alm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_CH4_ALM " + + "(CH4ALM, 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 38f8667..095bbb8 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -11,11 +11,11 @@ * */ public class PgAcuRdcmd implements java.io.Serializable { - + /** * */ - private static final long serialVersionUID = -3187227934289186463L; + private static final long serialVersionUID = -605179003596292814L; private String id; // ID private Date tm; // 命令发送时间 @@ -25,6 +25,7 @@ private String start_mem_word; // 起始内存字地址 private String start_mem_bit; // 起始内存位地址 private Integer count_word; // 读取的字数量 + private Integer count_bit; //读取的位数量 private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 @@ -92,6 +93,14 @@ this.count_word = count_word; } + public Integer getCount_bit() { + return count_bit; + } + + public void setCount_bit(Integer count_bit) { + this.count_bit = count_bit; + } + public boolean isResponsed() { return responsed; } diff --git a/src/com/szpg/db/data/PgCh4Alm.java b/src/com/szpg/db/data/PgCh4Alm.java new file mode 100644 index 0000000..392a567 --- /dev/null +++ b/src/com/szpg/db/data/PgCh4Alm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 甲烷浓度报警状态数据表 + * + * @author admin + * + */ +public class PgCh4Alm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = -109172405679187040L; + + private Integer id; + private Boolean ch4alm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getCh4alm() { + return ch4alm; + } + + public void setCh4alm(Boolean ch4alm) { + this.ch4alm = ch4alm; + } + + 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 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 ""; + } + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgCh4[ch4=" + ch4alm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java index 96dc762..8422d1b 100644 --- a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java +++ b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java @@ -2,8 +2,6 @@ import static org.junit.Assert.assertEquals; -import java.util.Calendar; - import org.junit.Before; import org.junit.Test; @@ -11,8 +9,9 @@ import com.szpg.db.dao.impl.PgAcuRdcmdDaoImpl; import com.szpg.db.data.PgAcuRdcmd; import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.util.ByteUtil; +import com.szpg.util.Configure; public class PgAcuRdcmdDaoTest { @@ -25,38 +24,40 @@ // @Test public void testAdd() { - ReadCH4ParamCommand ch4 = new ReadCH4ParamCommand(); + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); ch4.setDestinationId("006B00"); ch4.setMessageProducerId("00F400"); - ch4.setMemoryArea((byte) 0x82); - ch4.setStartAddress("012C00"); - ch4.setCount(24); + ch4.setMemoryArea((byte) 0x31); + ch4.setStartAddress("001A00"); + ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.CHALM.WORDCOUNT"))); + ch4.setCountBit(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.CHALM.BITCOUNT"))); PgAcuRdcmd cmd = new PgAcuRdcmd(); cmd.setId(ch4.getId()); - cmd.setTm(Calendar.getInstance().getTime()); - cmd.setCmd_type(AppMessageConstants.CMD_TYPE_READCH4STATUS); + cmd.setTm(ch4.getTime().getTime()); + cmd.setCmd_type(ch4.getCommandType()); cmd.setDest(ch4.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] {ch4.getMemoryArea()})); cmd.setStart_mem_word(ch4.getStartAddress().substring(0, 4)); cmd.setStart_mem_bit(ch4.getStartAddress().substring(4)); - cmd.setCount_word(ch4.getCount()); + cmd.setCount_word(ch4.getCountWord()); + cmd.setCount_bit(ch4.getCountBit()); assertEquals(1, dao.addCmdRecord(cmd)); } -// @Test + @Test public void testFindAll() { - assertEquals(1, dao.findAll()); + assertEquals(1, dao.findAll().size()); } @Test public void testFindByDestAndCount() { - assertEquals("11", dao.findLatestCmdByDestAndCount("006B00", 24).getCmd_type()); + assertEquals("12", dao.findLatestCmdByDestAndCount("006B00", 1).getCmd_type()); } - @Test +// @Test public void testUpdateResponsed() { assertEquals(1, dao.updateCmdRecordResponsed("23ff9e2987e64f248823254f0dfe1528")); } diff --git a/src/com/szpg/db/test/PgCH4DaoTest.java b/src/com/szpg/db/test/PgCH4DaoTest.java index 8c1c49f..8377965 100644 --- a/src/com/szpg/db/test/PgCH4DaoTest.java +++ b/src/com/szpg/db/test/PgCH4DaoTest.java @@ -28,12 +28,27 @@ @Test public void testFindAllParam() { - assertEquals("20180115131918", dao.findAllPblz().get(0).getTmStrGB()); + assertEquals("20180115171555", dao.findAllPblz().get(0).getTmStrGB()); } @Test public void testFindParamById() { - Assert.assertEquals(dao.findPblzById(1).getTmStrGB(), "20180115131918"); + Assert.assertEquals(dao.findPblzById(2).getTmStrGB(), "20180115171555"); + } + +// @Test + public void testAddStatusRecord() { + assertEquals(2, dao.addSbjzRecord(false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 1)); + } + + @Test + public void testFindAllStatus() { + assertEquals("20180115183307", dao.findAllSbjz().get(0).getTmStrGB()); + } + + @Test + public void testFindStatusById() { + Assert.assertEquals(dao.findSbjzById(1).getTmStrGB(), "20180115183307"); } } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index 7e9c937..15ccc72 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -3,6 +3,7 @@ import com.szpg.plc.message.AppCommand; import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -13,7 +14,8 @@ private byte memoryArea; //读取的内存区域代码 private String startAddress; //起始地址 - private int count; //读取的数量,以word(2字节)计算 + private int countWord; //读取的字数量/1WORD=2BYTE + private int countBit; //读取的位数量 public byte getMemoryArea() { return memoryArea; @@ -31,21 +33,34 @@ this.startAddress = startAddress; } - public int getCount() { - return count; + public int getCountWord() { + return countWord; } - public void setCount(int count) { - this.count = count; + public void setCountWord(int countWord) { + this.countWord = countWord; } - public ReadMemoryCommand getInstance(String type) { + public int getCountBit() { + return countBit; + } + + public void setCountBit(int countBit) { + this.countBit = countBit; + } + + public static ReadMemoryCommand getInstance(String type) { switch (type) { case AppMessageConstants.CMD_TYPE_READCH4PARAM: return new ReadCH4ParamCommand(); + + case AppMessageConstants.CMD_TYPE_READCH4STATUS: + return new ReadCH4StatusCommand(); default: return null; } } + + public abstract String getCommandType(); } diff --git a/src/ACUBL.properties b/src/ACUBL.properties index d3be57b..12a50a2 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -1,3 +1,28 @@ #ACU\u53d8\u91cf\u8868\u914d\u7f6e\u6587\u4ef6 -YXL.ACU001.DCH.START = 0300 -YXL.ACU001.DCH.COUNT = 48 \ No newline at end of file + +######## YXL.ACU001 ######## +#\u7532\u70f7\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.CH.COUNT = 6 +#\u7532\u70f7\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 +YXL.ACU001.CH.START = 0300 +#\u7532\u70f7\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 +YXL.ACU001.CH.WORDCOUNT = 24 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.CHALM.START = 0026 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.CHALM.WORDCOUNT = 1 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.CHALM.BITCOUNT = 12 + +#\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.WS.COUNT = 6 +#\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 +YXL.ACU001.WS.START = 0400 +#\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 +YXL.ACU001.WS.WORDCOUNT = 74 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.WSALM.START = 0030 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.WSALM.WORDCOUNT = 3 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.WSALM.BITCOUNT = 12 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index bacf942..46e331c 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -6,13 +6,15 @@ import com.szpg.db.dao.impl.PgAcuDaoImpl; import com.szpg.db.data.PgAcu; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; public class DSCTest { @@ -20,7 +22,7 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.107", 6800); + ACUClient client = new ACUClient("192.168.8.105", 6800); client.setNet("00"); client.setNode("6B"); @@ -33,13 +35,21 @@ new ScheduledThreadPoolExecutor(1).scheduleAtFixedRate(new ACUSocketCheckTask(client), 0, 30, TimeUnit.SECONDS); // 测试发送查询甲烷参数命令 - dsc.testSendCH4Command(client); +// dsc.testSendCH4Command(client); + + // 测试发送查询甲烷报警状态命令 + dsc.testSendCH4StatsuCommand(client); // System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); } - private void testSendCH4Command(ACUClient client) { - ReadCH4ParamCommand ch4 = new ReadCH4ParamCommand(); + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + public void testSendCH4Command(ACUClient client) { + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -51,11 +61,38 @@ ch4.setMemoryArea(FINSConstants.MEMORY_DM_AREA); - ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.DCH.START")))) + "00"); - ch4.setCount(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.DCH.COUNT"))); + ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); + ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); + ch4.setCountBit(0); //读取监测值时位数量无效 ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 15, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + public void testSendCH4StatsuCommand(ACUClient client) { + ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ch4alm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ch4alm.setDestinationId(dest); + + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + 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"))); + ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index e5e8175..5c81046 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -3,6 +3,7 @@ import java.util.List; import com.szpg.db.data.PgCh4; +import com.szpg.db.data.PgCh4Alm; /** * 甲烷相关参数读写的数据库接口 @@ -11,6 +12,7 @@ */ public interface PgCh4Dao { + /******** 甲烷浓度变量值 ********/ public List findAllPblz(); public PgCh4 findPblzById(Integer id); @@ -19,4 +21,15 @@ public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); + + + /******** 甲烷浓度报警状态 ********/ + public List findAllSbjz(); + public PgCh4Alm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgCh4Alm ch4alm); + 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 3db493e..3c7e9e3 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -120,9 +120,9 @@ Connection conn = null; String insertStr = "INSERT INTO PG_ACU_RDCMD " + - "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, RESPONSED, TIMEOUT) " + - "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, '0', '0')"; - Object[] params = new Object[8]; + "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, RESPONSED, TIMEOUT) " + + "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, '0', '0')"; + Object[] params = new Object[9]; params[0] = cmd.getId(); params[1] = TimeFormat.format(cmd.getTm(), "yyyyMMddHHmmss"); params[2] = cmd.getCmd_type(); @@ -131,6 +131,7 @@ params[5] = cmd.getStart_mem_word(); params[6] = cmd.getStart_mem_bit(); params[7] = cmd.getCount_word(); + params[8] = cmd.getCount_bit(); try { conn = ConnectionManager.getConnectionFromC3P0(); diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 9d693a8..aac45e6 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -13,6 +13,7 @@ import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.data.PgCh4; +import com.szpg.db.data.PgCh4Alm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -259,4 +260,243 @@ return 0; } + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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++) { + PgCh4Alm ch4alm = new PgCh4Alm(); + Object[] item = tempList.get(i); + + ch4alm.setId(((Number) item[0]).intValue()); + ch4alm.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4alm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4alm.setLogtime(cal.getTime()); + ch4alm.setUptime(cal.getTime()); + + list.add(ch4alm); + } + 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 PgCh4Alm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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) { + PgCh4Alm ch4 = new PgCh4Alm(); + Object[] item = tempList.get(0); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + logger.debug("根据ID查询甲烷报警状态成功" + ch4 + "]"); + + return ch4; + } + 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, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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++) { + PgCh4Alm ch4 = new PgCh4Alm(); + Object[] item = tempList.get(i); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + list.add(ch4); + } + 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, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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++) { + PgCh4Alm ch4 = new PgCh4Alm(); + Object[] item = tempList.get(i); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + list.add(ch4); + } + 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(PgCh4Alm ch4alm) { + return addSbjzRecord(ch4alm.getCh4alm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_CH4_ALM " + + "(CH4ALM, 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 38f8667..095bbb8 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -11,11 +11,11 @@ * */ public class PgAcuRdcmd implements java.io.Serializable { - + /** * */ - private static final long serialVersionUID = -3187227934289186463L; + private static final long serialVersionUID = -605179003596292814L; private String id; // ID private Date tm; // 命令发送时间 @@ -25,6 +25,7 @@ private String start_mem_word; // 起始内存字地址 private String start_mem_bit; // 起始内存位地址 private Integer count_word; // 读取的字数量 + private Integer count_bit; //读取的位数量 private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 @@ -92,6 +93,14 @@ this.count_word = count_word; } + public Integer getCount_bit() { + return count_bit; + } + + public void setCount_bit(Integer count_bit) { + this.count_bit = count_bit; + } + public boolean isResponsed() { return responsed; } diff --git a/src/com/szpg/db/data/PgCh4Alm.java b/src/com/szpg/db/data/PgCh4Alm.java new file mode 100644 index 0000000..392a567 --- /dev/null +++ b/src/com/szpg/db/data/PgCh4Alm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 甲烷浓度报警状态数据表 + * + * @author admin + * + */ +public class PgCh4Alm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = -109172405679187040L; + + private Integer id; + private Boolean ch4alm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getCh4alm() { + return ch4alm; + } + + public void setCh4alm(Boolean ch4alm) { + this.ch4alm = ch4alm; + } + + 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 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 ""; + } + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgCh4[ch4=" + ch4alm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java index 96dc762..8422d1b 100644 --- a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java +++ b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java @@ -2,8 +2,6 @@ import static org.junit.Assert.assertEquals; -import java.util.Calendar; - import org.junit.Before; import org.junit.Test; @@ -11,8 +9,9 @@ import com.szpg.db.dao.impl.PgAcuRdcmdDaoImpl; import com.szpg.db.data.PgAcuRdcmd; import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.util.ByteUtil; +import com.szpg.util.Configure; public class PgAcuRdcmdDaoTest { @@ -25,38 +24,40 @@ // @Test public void testAdd() { - ReadCH4ParamCommand ch4 = new ReadCH4ParamCommand(); + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); ch4.setDestinationId("006B00"); ch4.setMessageProducerId("00F400"); - ch4.setMemoryArea((byte) 0x82); - ch4.setStartAddress("012C00"); - ch4.setCount(24); + ch4.setMemoryArea((byte) 0x31); + ch4.setStartAddress("001A00"); + ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.CHALM.WORDCOUNT"))); + ch4.setCountBit(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.CHALM.BITCOUNT"))); PgAcuRdcmd cmd = new PgAcuRdcmd(); cmd.setId(ch4.getId()); - cmd.setTm(Calendar.getInstance().getTime()); - cmd.setCmd_type(AppMessageConstants.CMD_TYPE_READCH4STATUS); + cmd.setTm(ch4.getTime().getTime()); + cmd.setCmd_type(ch4.getCommandType()); cmd.setDest(ch4.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] {ch4.getMemoryArea()})); cmd.setStart_mem_word(ch4.getStartAddress().substring(0, 4)); cmd.setStart_mem_bit(ch4.getStartAddress().substring(4)); - cmd.setCount_word(ch4.getCount()); + cmd.setCount_word(ch4.getCountWord()); + cmd.setCount_bit(ch4.getCountBit()); assertEquals(1, dao.addCmdRecord(cmd)); } -// @Test + @Test public void testFindAll() { - assertEquals(1, dao.findAll()); + assertEquals(1, dao.findAll().size()); } @Test public void testFindByDestAndCount() { - assertEquals("11", dao.findLatestCmdByDestAndCount("006B00", 24).getCmd_type()); + assertEquals("12", dao.findLatestCmdByDestAndCount("006B00", 1).getCmd_type()); } - @Test +// @Test public void testUpdateResponsed() { assertEquals(1, dao.updateCmdRecordResponsed("23ff9e2987e64f248823254f0dfe1528")); } diff --git a/src/com/szpg/db/test/PgCH4DaoTest.java b/src/com/szpg/db/test/PgCH4DaoTest.java index 8c1c49f..8377965 100644 --- a/src/com/szpg/db/test/PgCH4DaoTest.java +++ b/src/com/szpg/db/test/PgCH4DaoTest.java @@ -28,12 +28,27 @@ @Test public void testFindAllParam() { - assertEquals("20180115131918", dao.findAllPblz().get(0).getTmStrGB()); + assertEquals("20180115171555", dao.findAllPblz().get(0).getTmStrGB()); } @Test public void testFindParamById() { - Assert.assertEquals(dao.findPblzById(1).getTmStrGB(), "20180115131918"); + Assert.assertEquals(dao.findPblzById(2).getTmStrGB(), "20180115171555"); + } + +// @Test + public void testAddStatusRecord() { + assertEquals(2, dao.addSbjzRecord(false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 1)); + } + + @Test + public void testFindAllStatus() { + assertEquals("20180115183307", dao.findAllSbjz().get(0).getTmStrGB()); + } + + @Test + public void testFindStatusById() { + Assert.assertEquals(dao.findSbjzById(1).getTmStrGB(), "20180115183307"); } } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index 7e9c937..15ccc72 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -3,6 +3,7 @@ import com.szpg.plc.message.AppCommand; import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -13,7 +14,8 @@ private byte memoryArea; //读取的内存区域代码 private String startAddress; //起始地址 - private int count; //读取的数量,以word(2字节)计算 + private int countWord; //读取的字数量/1WORD=2BYTE + private int countBit; //读取的位数量 public byte getMemoryArea() { return memoryArea; @@ -31,21 +33,34 @@ this.startAddress = startAddress; } - public int getCount() { - return count; + public int getCountWord() { + return countWord; } - public void setCount(int count) { - this.count = count; + public void setCountWord(int countWord) { + this.countWord = countWord; } - public ReadMemoryCommand getInstance(String type) { + public int getCountBit() { + return countBit; + } + + public void setCountBit(int countBit) { + this.countBit = countBit; + } + + public static ReadMemoryCommand getInstance(String type) { switch (type) { case AppMessageConstants.CMD_TYPE_READCH4PARAM: return new ReadCH4ParamCommand(); + + case AppMessageConstants.CMD_TYPE_READCH4STATUS: + return new ReadCH4StatusCommand(); default: return null; } } + + public abstract String getCommandType(); } diff --git a/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java b/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java index 73e5395..5b573f5 100644 --- a/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java +++ b/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java @@ -1,15 +1,16 @@ 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.ReadCH4ParamCommandResponse; public class ReadCH4ParamCommand extends ReadMemoryCommand { - + /** * */ - private static final long serialVersionUID = -8356882767656717757L; - + private static final long serialVersionUID = -4042536900405234254L; + @Override public Class getResponseClass() { return ReadCH4ParamCommandResponse.class; @@ -17,7 +18,12 @@ @Override public String toString() { - return "向终端[" + getDestinationId() + "]发送查询甲烷参数命令"; + return "向终端[" + getDestinationId() + "]发送查询甲烷监测值命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READCH4PARAM; } } diff --git a/src/ACUBL.properties b/src/ACUBL.properties index d3be57b..12a50a2 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -1,3 +1,28 @@ #ACU\u53d8\u91cf\u8868\u914d\u7f6e\u6587\u4ef6 -YXL.ACU001.DCH.START = 0300 -YXL.ACU001.DCH.COUNT = 48 \ No newline at end of file + +######## YXL.ACU001 ######## +#\u7532\u70f7\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.CH.COUNT = 6 +#\u7532\u70f7\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 +YXL.ACU001.CH.START = 0300 +#\u7532\u70f7\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 +YXL.ACU001.CH.WORDCOUNT = 24 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.CHALM.START = 0026 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.CHALM.WORDCOUNT = 1 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.CHALM.BITCOUNT = 12 + +#\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.WS.COUNT = 6 +#\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 +YXL.ACU001.WS.START = 0400 +#\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 +YXL.ACU001.WS.WORDCOUNT = 74 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.WSALM.START = 0030 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.WSALM.WORDCOUNT = 3 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.WSALM.BITCOUNT = 12 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index bacf942..46e331c 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -6,13 +6,15 @@ import com.szpg.db.dao.impl.PgAcuDaoImpl; import com.szpg.db.data.PgAcu; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; public class DSCTest { @@ -20,7 +22,7 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.107", 6800); + ACUClient client = new ACUClient("192.168.8.105", 6800); client.setNet("00"); client.setNode("6B"); @@ -33,13 +35,21 @@ new ScheduledThreadPoolExecutor(1).scheduleAtFixedRate(new ACUSocketCheckTask(client), 0, 30, TimeUnit.SECONDS); // 测试发送查询甲烷参数命令 - dsc.testSendCH4Command(client); +// dsc.testSendCH4Command(client); + + // 测试发送查询甲烷报警状态命令 + dsc.testSendCH4StatsuCommand(client); // System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); } - private void testSendCH4Command(ACUClient client) { - ReadCH4ParamCommand ch4 = new ReadCH4ParamCommand(); + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + public void testSendCH4Command(ACUClient client) { + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -51,11 +61,38 @@ ch4.setMemoryArea(FINSConstants.MEMORY_DM_AREA); - ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.DCH.START")))) + "00"); - ch4.setCount(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.DCH.COUNT"))); + ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); + ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); + ch4.setCountBit(0); //读取监测值时位数量无效 ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 15, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + public void testSendCH4StatsuCommand(ACUClient client) { + ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ch4alm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ch4alm.setDestinationId(dest); + + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + 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"))); + ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index e5e8175..5c81046 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -3,6 +3,7 @@ import java.util.List; import com.szpg.db.data.PgCh4; +import com.szpg.db.data.PgCh4Alm; /** * 甲烷相关参数读写的数据库接口 @@ -11,6 +12,7 @@ */ public interface PgCh4Dao { + /******** 甲烷浓度变量值 ********/ public List findAllPblz(); public PgCh4 findPblzById(Integer id); @@ -19,4 +21,15 @@ public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); + + + /******** 甲烷浓度报警状态 ********/ + public List findAllSbjz(); + public PgCh4Alm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgCh4Alm ch4alm); + 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 3db493e..3c7e9e3 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -120,9 +120,9 @@ Connection conn = null; String insertStr = "INSERT INTO PG_ACU_RDCMD " + - "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, RESPONSED, TIMEOUT) " + - "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, '0', '0')"; - Object[] params = new Object[8]; + "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, RESPONSED, TIMEOUT) " + + "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, '0', '0')"; + Object[] params = new Object[9]; params[0] = cmd.getId(); params[1] = TimeFormat.format(cmd.getTm(), "yyyyMMddHHmmss"); params[2] = cmd.getCmd_type(); @@ -131,6 +131,7 @@ params[5] = cmd.getStart_mem_word(); params[6] = cmd.getStart_mem_bit(); params[7] = cmd.getCount_word(); + params[8] = cmd.getCount_bit(); try { conn = ConnectionManager.getConnectionFromC3P0(); diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 9d693a8..aac45e6 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -13,6 +13,7 @@ import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.data.PgCh4; +import com.szpg.db.data.PgCh4Alm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -259,4 +260,243 @@ return 0; } + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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++) { + PgCh4Alm ch4alm = new PgCh4Alm(); + Object[] item = tempList.get(i); + + ch4alm.setId(((Number) item[0]).intValue()); + ch4alm.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4alm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4alm.setLogtime(cal.getTime()); + ch4alm.setUptime(cal.getTime()); + + list.add(ch4alm); + } + 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 PgCh4Alm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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) { + PgCh4Alm ch4 = new PgCh4Alm(); + Object[] item = tempList.get(0); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + logger.debug("根据ID查询甲烷报警状态成功" + ch4 + "]"); + + return ch4; + } + 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, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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++) { + PgCh4Alm ch4 = new PgCh4Alm(); + Object[] item = tempList.get(i); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + list.add(ch4); + } + 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, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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++) { + PgCh4Alm ch4 = new PgCh4Alm(); + Object[] item = tempList.get(i); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + list.add(ch4); + } + 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(PgCh4Alm ch4alm) { + return addSbjzRecord(ch4alm.getCh4alm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_CH4_ALM " + + "(CH4ALM, 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 38f8667..095bbb8 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -11,11 +11,11 @@ * */ public class PgAcuRdcmd implements java.io.Serializable { - + /** * */ - private static final long serialVersionUID = -3187227934289186463L; + private static final long serialVersionUID = -605179003596292814L; private String id; // ID private Date tm; // 命令发送时间 @@ -25,6 +25,7 @@ private String start_mem_word; // 起始内存字地址 private String start_mem_bit; // 起始内存位地址 private Integer count_word; // 读取的字数量 + private Integer count_bit; //读取的位数量 private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 @@ -92,6 +93,14 @@ this.count_word = count_word; } + public Integer getCount_bit() { + return count_bit; + } + + public void setCount_bit(Integer count_bit) { + this.count_bit = count_bit; + } + public boolean isResponsed() { return responsed; } diff --git a/src/com/szpg/db/data/PgCh4Alm.java b/src/com/szpg/db/data/PgCh4Alm.java new file mode 100644 index 0000000..392a567 --- /dev/null +++ b/src/com/szpg/db/data/PgCh4Alm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 甲烷浓度报警状态数据表 + * + * @author admin + * + */ +public class PgCh4Alm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = -109172405679187040L; + + private Integer id; + private Boolean ch4alm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getCh4alm() { + return ch4alm; + } + + public void setCh4alm(Boolean ch4alm) { + this.ch4alm = ch4alm; + } + + 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 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 ""; + } + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgCh4[ch4=" + ch4alm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java index 96dc762..8422d1b 100644 --- a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java +++ b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java @@ -2,8 +2,6 @@ import static org.junit.Assert.assertEquals; -import java.util.Calendar; - import org.junit.Before; import org.junit.Test; @@ -11,8 +9,9 @@ import com.szpg.db.dao.impl.PgAcuRdcmdDaoImpl; import com.szpg.db.data.PgAcuRdcmd; import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.util.ByteUtil; +import com.szpg.util.Configure; public class PgAcuRdcmdDaoTest { @@ -25,38 +24,40 @@ // @Test public void testAdd() { - ReadCH4ParamCommand ch4 = new ReadCH4ParamCommand(); + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); ch4.setDestinationId("006B00"); ch4.setMessageProducerId("00F400"); - ch4.setMemoryArea((byte) 0x82); - ch4.setStartAddress("012C00"); - ch4.setCount(24); + ch4.setMemoryArea((byte) 0x31); + ch4.setStartAddress("001A00"); + ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.CHALM.WORDCOUNT"))); + ch4.setCountBit(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.CHALM.BITCOUNT"))); PgAcuRdcmd cmd = new PgAcuRdcmd(); cmd.setId(ch4.getId()); - cmd.setTm(Calendar.getInstance().getTime()); - cmd.setCmd_type(AppMessageConstants.CMD_TYPE_READCH4STATUS); + cmd.setTm(ch4.getTime().getTime()); + cmd.setCmd_type(ch4.getCommandType()); cmd.setDest(ch4.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] {ch4.getMemoryArea()})); cmd.setStart_mem_word(ch4.getStartAddress().substring(0, 4)); cmd.setStart_mem_bit(ch4.getStartAddress().substring(4)); - cmd.setCount_word(ch4.getCount()); + cmd.setCount_word(ch4.getCountWord()); + cmd.setCount_bit(ch4.getCountBit()); assertEquals(1, dao.addCmdRecord(cmd)); } -// @Test + @Test public void testFindAll() { - assertEquals(1, dao.findAll()); + assertEquals(1, dao.findAll().size()); } @Test public void testFindByDestAndCount() { - assertEquals("11", dao.findLatestCmdByDestAndCount("006B00", 24).getCmd_type()); + assertEquals("12", dao.findLatestCmdByDestAndCount("006B00", 1).getCmd_type()); } - @Test +// @Test public void testUpdateResponsed() { assertEquals(1, dao.updateCmdRecordResponsed("23ff9e2987e64f248823254f0dfe1528")); } diff --git a/src/com/szpg/db/test/PgCH4DaoTest.java b/src/com/szpg/db/test/PgCH4DaoTest.java index 8c1c49f..8377965 100644 --- a/src/com/szpg/db/test/PgCH4DaoTest.java +++ b/src/com/szpg/db/test/PgCH4DaoTest.java @@ -28,12 +28,27 @@ @Test public void testFindAllParam() { - assertEquals("20180115131918", dao.findAllPblz().get(0).getTmStrGB()); + assertEquals("20180115171555", dao.findAllPblz().get(0).getTmStrGB()); } @Test public void testFindParamById() { - Assert.assertEquals(dao.findPblzById(1).getTmStrGB(), "20180115131918"); + Assert.assertEquals(dao.findPblzById(2).getTmStrGB(), "20180115171555"); + } + +// @Test + public void testAddStatusRecord() { + assertEquals(2, dao.addSbjzRecord(false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 1)); + } + + @Test + public void testFindAllStatus() { + assertEquals("20180115183307", dao.findAllSbjz().get(0).getTmStrGB()); + } + + @Test + public void testFindStatusById() { + Assert.assertEquals(dao.findSbjzById(1).getTmStrGB(), "20180115183307"); } } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index 7e9c937..15ccc72 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -3,6 +3,7 @@ import com.szpg.plc.message.AppCommand; import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -13,7 +14,8 @@ private byte memoryArea; //读取的内存区域代码 private String startAddress; //起始地址 - private int count; //读取的数量,以word(2字节)计算 + private int countWord; //读取的字数量/1WORD=2BYTE + private int countBit; //读取的位数量 public byte getMemoryArea() { return memoryArea; @@ -31,21 +33,34 @@ this.startAddress = startAddress; } - public int getCount() { - return count; + public int getCountWord() { + return countWord; } - public void setCount(int count) { - this.count = count; + public void setCountWord(int countWord) { + this.countWord = countWord; } - public ReadMemoryCommand getInstance(String type) { + public int getCountBit() { + return countBit; + } + + public void setCountBit(int countBit) { + this.countBit = countBit; + } + + public static ReadMemoryCommand getInstance(String type) { switch (type) { case AppMessageConstants.CMD_TYPE_READCH4PARAM: return new ReadCH4ParamCommand(); + + case AppMessageConstants.CMD_TYPE_READCH4STATUS: + return new ReadCH4StatusCommand(); default: return null; } } + + public abstract String getCommandType(); } diff --git a/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java b/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java index 73e5395..5b573f5 100644 --- a/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java +++ b/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java @@ -1,15 +1,16 @@ 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.ReadCH4ParamCommandResponse; public class ReadCH4ParamCommand extends ReadMemoryCommand { - + /** * */ - private static final long serialVersionUID = -8356882767656717757L; - + private static final long serialVersionUID = -4042536900405234254L; + @Override public Class getResponseClass() { return ReadCH4ParamCommandResponse.class; @@ -17,7 +18,12 @@ @Override public String toString() { - return "向终端[" + getDestinationId() + "]发送查询甲烷参数命令"; + return "向终端[" + getDestinationId() + "]发送查询甲烷监测值命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READCH4PARAM; } } diff --git a/src/com/szpg/plc/message/command/read/ReadCH4StatusCommand.java b/src/com/szpg/plc/message/command/read/ReadCH4StatusCommand.java new file mode 100644 index 0000000..790e7ff --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadCH4StatusCommand.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.ReadCH4StatusCommandResponse; + +public class ReadCH4StatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 6508070196810920169L; + + @Override + public Class getResponseClass() { + return ReadCH4StatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询甲烷报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READCH4STATUS; + } + +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index d3be57b..12a50a2 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -1,3 +1,28 @@ #ACU\u53d8\u91cf\u8868\u914d\u7f6e\u6587\u4ef6 -YXL.ACU001.DCH.START = 0300 -YXL.ACU001.DCH.COUNT = 48 \ No newline at end of file + +######## YXL.ACU001 ######## +#\u7532\u70f7\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.CH.COUNT = 6 +#\u7532\u70f7\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 +YXL.ACU001.CH.START = 0300 +#\u7532\u70f7\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 +YXL.ACU001.CH.WORDCOUNT = 24 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.CHALM.START = 0026 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.CHALM.WORDCOUNT = 1 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.CHALM.BITCOUNT = 12 + +#\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.WS.COUNT = 6 +#\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 +YXL.ACU001.WS.START = 0400 +#\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 +YXL.ACU001.WS.WORDCOUNT = 74 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.WSALM.START = 0030 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.WSALM.WORDCOUNT = 3 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.WSALM.BITCOUNT = 12 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index bacf942..46e331c 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -6,13 +6,15 @@ import com.szpg.db.dao.impl.PgAcuDaoImpl; import com.szpg.db.data.PgAcu; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; public class DSCTest { @@ -20,7 +22,7 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.107", 6800); + ACUClient client = new ACUClient("192.168.8.105", 6800); client.setNet("00"); client.setNode("6B"); @@ -33,13 +35,21 @@ new ScheduledThreadPoolExecutor(1).scheduleAtFixedRate(new ACUSocketCheckTask(client), 0, 30, TimeUnit.SECONDS); // 测试发送查询甲烷参数命令 - dsc.testSendCH4Command(client); +// dsc.testSendCH4Command(client); + + // 测试发送查询甲烷报警状态命令 + dsc.testSendCH4StatsuCommand(client); // System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); } - private void testSendCH4Command(ACUClient client) { - ReadCH4ParamCommand ch4 = new ReadCH4ParamCommand(); + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + public void testSendCH4Command(ACUClient client) { + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -51,11 +61,38 @@ ch4.setMemoryArea(FINSConstants.MEMORY_DM_AREA); - ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.DCH.START")))) + "00"); - ch4.setCount(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.DCH.COUNT"))); + ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); + ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); + ch4.setCountBit(0); //读取监测值时位数量无效 ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 15, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + public void testSendCH4StatsuCommand(ACUClient client) { + ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ch4alm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ch4alm.setDestinationId(dest); + + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + 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"))); + ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index e5e8175..5c81046 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -3,6 +3,7 @@ import java.util.List; import com.szpg.db.data.PgCh4; +import com.szpg.db.data.PgCh4Alm; /** * 甲烷相关参数读写的数据库接口 @@ -11,6 +12,7 @@ */ public interface PgCh4Dao { + /******** 甲烷浓度变量值 ********/ public List findAllPblz(); public PgCh4 findPblzById(Integer id); @@ -19,4 +21,15 @@ public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); + + + /******** 甲烷浓度报警状态 ********/ + public List findAllSbjz(); + public PgCh4Alm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgCh4Alm ch4alm); + 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 3db493e..3c7e9e3 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -120,9 +120,9 @@ Connection conn = null; String insertStr = "INSERT INTO PG_ACU_RDCMD " + - "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, RESPONSED, TIMEOUT) " + - "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, '0', '0')"; - Object[] params = new Object[8]; + "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, RESPONSED, TIMEOUT) " + + "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, '0', '0')"; + Object[] params = new Object[9]; params[0] = cmd.getId(); params[1] = TimeFormat.format(cmd.getTm(), "yyyyMMddHHmmss"); params[2] = cmd.getCmd_type(); @@ -131,6 +131,7 @@ params[5] = cmd.getStart_mem_word(); params[6] = cmd.getStart_mem_bit(); params[7] = cmd.getCount_word(); + params[8] = cmd.getCount_bit(); try { conn = ConnectionManager.getConnectionFromC3P0(); diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 9d693a8..aac45e6 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -13,6 +13,7 @@ import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.data.PgCh4; +import com.szpg.db.data.PgCh4Alm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -259,4 +260,243 @@ return 0; } + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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++) { + PgCh4Alm ch4alm = new PgCh4Alm(); + Object[] item = tempList.get(i); + + ch4alm.setId(((Number) item[0]).intValue()); + ch4alm.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4alm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4alm.setLogtime(cal.getTime()); + ch4alm.setUptime(cal.getTime()); + + list.add(ch4alm); + } + 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 PgCh4Alm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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) { + PgCh4Alm ch4 = new PgCh4Alm(); + Object[] item = tempList.get(0); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + logger.debug("根据ID查询甲烷报警状态成功" + ch4 + "]"); + + return ch4; + } + 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, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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++) { + PgCh4Alm ch4 = new PgCh4Alm(); + Object[] item = tempList.get(i); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + list.add(ch4); + } + 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, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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++) { + PgCh4Alm ch4 = new PgCh4Alm(); + Object[] item = tempList.get(i); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + list.add(ch4); + } + 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(PgCh4Alm ch4alm) { + return addSbjzRecord(ch4alm.getCh4alm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_CH4_ALM " + + "(CH4ALM, 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 38f8667..095bbb8 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -11,11 +11,11 @@ * */ public class PgAcuRdcmd implements java.io.Serializable { - + /** * */ - private static final long serialVersionUID = -3187227934289186463L; + private static final long serialVersionUID = -605179003596292814L; private String id; // ID private Date tm; // 命令发送时间 @@ -25,6 +25,7 @@ private String start_mem_word; // 起始内存字地址 private String start_mem_bit; // 起始内存位地址 private Integer count_word; // 读取的字数量 + private Integer count_bit; //读取的位数量 private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 @@ -92,6 +93,14 @@ this.count_word = count_word; } + public Integer getCount_bit() { + return count_bit; + } + + public void setCount_bit(Integer count_bit) { + this.count_bit = count_bit; + } + public boolean isResponsed() { return responsed; } diff --git a/src/com/szpg/db/data/PgCh4Alm.java b/src/com/szpg/db/data/PgCh4Alm.java new file mode 100644 index 0000000..392a567 --- /dev/null +++ b/src/com/szpg/db/data/PgCh4Alm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 甲烷浓度报警状态数据表 + * + * @author admin + * + */ +public class PgCh4Alm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = -109172405679187040L; + + private Integer id; + private Boolean ch4alm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getCh4alm() { + return ch4alm; + } + + public void setCh4alm(Boolean ch4alm) { + this.ch4alm = ch4alm; + } + + 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 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 ""; + } + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgCh4[ch4=" + ch4alm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java index 96dc762..8422d1b 100644 --- a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java +++ b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java @@ -2,8 +2,6 @@ import static org.junit.Assert.assertEquals; -import java.util.Calendar; - import org.junit.Before; import org.junit.Test; @@ -11,8 +9,9 @@ import com.szpg.db.dao.impl.PgAcuRdcmdDaoImpl; import com.szpg.db.data.PgAcuRdcmd; import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.util.ByteUtil; +import com.szpg.util.Configure; public class PgAcuRdcmdDaoTest { @@ -25,38 +24,40 @@ // @Test public void testAdd() { - ReadCH4ParamCommand ch4 = new ReadCH4ParamCommand(); + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); ch4.setDestinationId("006B00"); ch4.setMessageProducerId("00F400"); - ch4.setMemoryArea((byte) 0x82); - ch4.setStartAddress("012C00"); - ch4.setCount(24); + ch4.setMemoryArea((byte) 0x31); + ch4.setStartAddress("001A00"); + ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.CHALM.WORDCOUNT"))); + ch4.setCountBit(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.CHALM.BITCOUNT"))); PgAcuRdcmd cmd = new PgAcuRdcmd(); cmd.setId(ch4.getId()); - cmd.setTm(Calendar.getInstance().getTime()); - cmd.setCmd_type(AppMessageConstants.CMD_TYPE_READCH4STATUS); + cmd.setTm(ch4.getTime().getTime()); + cmd.setCmd_type(ch4.getCommandType()); cmd.setDest(ch4.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] {ch4.getMemoryArea()})); cmd.setStart_mem_word(ch4.getStartAddress().substring(0, 4)); cmd.setStart_mem_bit(ch4.getStartAddress().substring(4)); - cmd.setCount_word(ch4.getCount()); + cmd.setCount_word(ch4.getCountWord()); + cmd.setCount_bit(ch4.getCountBit()); assertEquals(1, dao.addCmdRecord(cmd)); } -// @Test + @Test public void testFindAll() { - assertEquals(1, dao.findAll()); + assertEquals(1, dao.findAll().size()); } @Test public void testFindByDestAndCount() { - assertEquals("11", dao.findLatestCmdByDestAndCount("006B00", 24).getCmd_type()); + assertEquals("12", dao.findLatestCmdByDestAndCount("006B00", 1).getCmd_type()); } - @Test +// @Test public void testUpdateResponsed() { assertEquals(1, dao.updateCmdRecordResponsed("23ff9e2987e64f248823254f0dfe1528")); } diff --git a/src/com/szpg/db/test/PgCH4DaoTest.java b/src/com/szpg/db/test/PgCH4DaoTest.java index 8c1c49f..8377965 100644 --- a/src/com/szpg/db/test/PgCH4DaoTest.java +++ b/src/com/szpg/db/test/PgCH4DaoTest.java @@ -28,12 +28,27 @@ @Test public void testFindAllParam() { - assertEquals("20180115131918", dao.findAllPblz().get(0).getTmStrGB()); + assertEquals("20180115171555", dao.findAllPblz().get(0).getTmStrGB()); } @Test public void testFindParamById() { - Assert.assertEquals(dao.findPblzById(1).getTmStrGB(), "20180115131918"); + Assert.assertEquals(dao.findPblzById(2).getTmStrGB(), "20180115171555"); + } + +// @Test + public void testAddStatusRecord() { + assertEquals(2, dao.addSbjzRecord(false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 1)); + } + + @Test + public void testFindAllStatus() { + assertEquals("20180115183307", dao.findAllSbjz().get(0).getTmStrGB()); + } + + @Test + public void testFindStatusById() { + Assert.assertEquals(dao.findSbjzById(1).getTmStrGB(), "20180115183307"); } } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index 7e9c937..15ccc72 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -3,6 +3,7 @@ import com.szpg.plc.message.AppCommand; import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -13,7 +14,8 @@ private byte memoryArea; //读取的内存区域代码 private String startAddress; //起始地址 - private int count; //读取的数量,以word(2字节)计算 + private int countWord; //读取的字数量/1WORD=2BYTE + private int countBit; //读取的位数量 public byte getMemoryArea() { return memoryArea; @@ -31,21 +33,34 @@ this.startAddress = startAddress; } - public int getCount() { - return count; + public int getCountWord() { + return countWord; } - public void setCount(int count) { - this.count = count; + public void setCountWord(int countWord) { + this.countWord = countWord; } - public ReadMemoryCommand getInstance(String type) { + public int getCountBit() { + return countBit; + } + + public void setCountBit(int countBit) { + this.countBit = countBit; + } + + public static ReadMemoryCommand getInstance(String type) { switch (type) { case AppMessageConstants.CMD_TYPE_READCH4PARAM: return new ReadCH4ParamCommand(); + + case AppMessageConstants.CMD_TYPE_READCH4STATUS: + return new ReadCH4StatusCommand(); default: return null; } } + + public abstract String getCommandType(); } diff --git a/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java b/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java index 73e5395..5b573f5 100644 --- a/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java +++ b/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java @@ -1,15 +1,16 @@ 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.ReadCH4ParamCommandResponse; public class ReadCH4ParamCommand extends ReadMemoryCommand { - + /** * */ - private static final long serialVersionUID = -8356882767656717757L; - + private static final long serialVersionUID = -4042536900405234254L; + @Override public Class getResponseClass() { return ReadCH4ParamCommandResponse.class; @@ -17,7 +18,12 @@ @Override public String toString() { - return "向终端[" + getDestinationId() + "]发送查询甲烷参数命令"; + return "向终端[" + getDestinationId() + "]发送查询甲烷监测值命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READCH4PARAM; } } diff --git a/src/com/szpg/plc/message/command/read/ReadCH4StatusCommand.java b/src/com/szpg/plc/message/command/read/ReadCH4StatusCommand.java new file mode 100644 index 0000000..790e7ff --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadCH4StatusCommand.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.ReadCH4StatusCommandResponse; + +public class ReadCH4StatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 6508070196810920169L; + + @Override + public Class getResponseClass() { + return ReadCH4StatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询甲烷报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READCH4STATUS; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4StatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4StatusCommandResponse.java new file mode 100644 index 0000000..0d35015 --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadCH4StatusCommandResponse.java @@ -0,0 +1,69 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgCh4Dao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgCh4DaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadCH4StatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = -4647640298404084468L; + + private List jwbj; // 甲烷浓度报警状态 + private List jwldbj; // 甲烷是否联动报警 + + public ReadCH4StatusCommandResponse() { + jwbj = new ArrayList(); + jwldbj = new ArrayList(); + } + + public List getJwbj() { + return jwbj; + } + + public void setJwbj(List jwbj) { + this.jwbj = jwbj; + } + + public List getJwldbj() { + return jwldbj; + } + + public void setJwldbj(List jwldbj) { + this.jwldbj = jwldbj; + } + + @Override + public void afterAction() { + // 1将甲烷浓度数据存入数据库 + PgCh4Dao ch4Dao = new PgCh4DaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findCH4DeviceIdByDest(this.getMessageProducerId()); + + for (int i = 0; i < jwbj.size(); i++) { + if (i < ids.size()) { + ch4Dao.addSbjzRecord(jwbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (jwbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + + // 2发送查询报警值的命令 + + } + } + } + } + +} diff --git a/src/ACUBL.properties b/src/ACUBL.properties index d3be57b..12a50a2 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -1,3 +1,28 @@ #ACU\u53d8\u91cf\u8868\u914d\u7f6e\u6587\u4ef6 -YXL.ACU001.DCH.START = 0300 -YXL.ACU001.DCH.COUNT = 48 \ No newline at end of file + +######## YXL.ACU001 ######## +#\u7532\u70f7\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.CH.COUNT = 6 +#\u7532\u70f7\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 +YXL.ACU001.CH.START = 0300 +#\u7532\u70f7\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 +YXL.ACU001.CH.WORDCOUNT = 24 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.CHALM.START = 0026 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.CHALM.WORDCOUNT = 1 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.CHALM.BITCOUNT = 12 + +#\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.WS.COUNT = 6 +#\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 +YXL.ACU001.WS.START = 0400 +#\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 +YXL.ACU001.WS.WORDCOUNT = 74 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.WSALM.START = 0030 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.WSALM.WORDCOUNT = 3 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.WSALM.BITCOUNT = 12 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index bacf942..46e331c 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -6,13 +6,15 @@ import com.szpg.db.dao.impl.PgAcuDaoImpl; import com.szpg.db.data.PgAcu; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; public class DSCTest { @@ -20,7 +22,7 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.107", 6800); + ACUClient client = new ACUClient("192.168.8.105", 6800); client.setNet("00"); client.setNode("6B"); @@ -33,13 +35,21 @@ new ScheduledThreadPoolExecutor(1).scheduleAtFixedRate(new ACUSocketCheckTask(client), 0, 30, TimeUnit.SECONDS); // 测试发送查询甲烷参数命令 - dsc.testSendCH4Command(client); +// dsc.testSendCH4Command(client); + + // 测试发送查询甲烷报警状态命令 + dsc.testSendCH4StatsuCommand(client); // System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); } - private void testSendCH4Command(ACUClient client) { - ReadCH4ParamCommand ch4 = new ReadCH4ParamCommand(); + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + public void testSendCH4Command(ACUClient client) { + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -51,11 +61,38 @@ ch4.setMemoryArea(FINSConstants.MEMORY_DM_AREA); - ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.DCH.START")))) + "00"); - ch4.setCount(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.DCH.COUNT"))); + ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); + ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); + ch4.setCountBit(0); //读取监测值时位数量无效 ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 15, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + public void testSendCH4StatsuCommand(ACUClient client) { + ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ch4alm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ch4alm.setDestinationId(dest); + + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + 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"))); + ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index e5e8175..5c81046 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -3,6 +3,7 @@ import java.util.List; import com.szpg.db.data.PgCh4; +import com.szpg.db.data.PgCh4Alm; /** * 甲烷相关参数读写的数据库接口 @@ -11,6 +12,7 @@ */ public interface PgCh4Dao { + /******** 甲烷浓度变量值 ********/ public List findAllPblz(); public PgCh4 findPblzById(Integer id); @@ -19,4 +21,15 @@ public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); + + + /******** 甲烷浓度报警状态 ********/ + public List findAllSbjz(); + public PgCh4Alm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgCh4Alm ch4alm); + 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 3db493e..3c7e9e3 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -120,9 +120,9 @@ Connection conn = null; String insertStr = "INSERT INTO PG_ACU_RDCMD " + - "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, RESPONSED, TIMEOUT) " + - "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, '0', '0')"; - Object[] params = new Object[8]; + "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, RESPONSED, TIMEOUT) " + + "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, '0', '0')"; + Object[] params = new Object[9]; params[0] = cmd.getId(); params[1] = TimeFormat.format(cmd.getTm(), "yyyyMMddHHmmss"); params[2] = cmd.getCmd_type(); @@ -131,6 +131,7 @@ params[5] = cmd.getStart_mem_word(); params[6] = cmd.getStart_mem_bit(); params[7] = cmd.getCount_word(); + params[8] = cmd.getCount_bit(); try { conn = ConnectionManager.getConnectionFromC3P0(); diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 9d693a8..aac45e6 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -13,6 +13,7 @@ import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.data.PgCh4; +import com.szpg.db.data.PgCh4Alm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -259,4 +260,243 @@ return 0; } + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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++) { + PgCh4Alm ch4alm = new PgCh4Alm(); + Object[] item = tempList.get(i); + + ch4alm.setId(((Number) item[0]).intValue()); + ch4alm.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4alm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4alm.setLogtime(cal.getTime()); + ch4alm.setUptime(cal.getTime()); + + list.add(ch4alm); + } + 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 PgCh4Alm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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) { + PgCh4Alm ch4 = new PgCh4Alm(); + Object[] item = tempList.get(0); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + logger.debug("根据ID查询甲烷报警状态成功" + ch4 + "]"); + + return ch4; + } + 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, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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++) { + PgCh4Alm ch4 = new PgCh4Alm(); + Object[] item = tempList.get(i); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + list.add(ch4); + } + 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, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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++) { + PgCh4Alm ch4 = new PgCh4Alm(); + Object[] item = tempList.get(i); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + list.add(ch4); + } + 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(PgCh4Alm ch4alm) { + return addSbjzRecord(ch4alm.getCh4alm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_CH4_ALM " + + "(CH4ALM, 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 38f8667..095bbb8 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -11,11 +11,11 @@ * */ public class PgAcuRdcmd implements java.io.Serializable { - + /** * */ - private static final long serialVersionUID = -3187227934289186463L; + private static final long serialVersionUID = -605179003596292814L; private String id; // ID private Date tm; // 命令发送时间 @@ -25,6 +25,7 @@ private String start_mem_word; // 起始内存字地址 private String start_mem_bit; // 起始内存位地址 private Integer count_word; // 读取的字数量 + private Integer count_bit; //读取的位数量 private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 @@ -92,6 +93,14 @@ this.count_word = count_word; } + public Integer getCount_bit() { + return count_bit; + } + + public void setCount_bit(Integer count_bit) { + this.count_bit = count_bit; + } + public boolean isResponsed() { return responsed; } diff --git a/src/com/szpg/db/data/PgCh4Alm.java b/src/com/szpg/db/data/PgCh4Alm.java new file mode 100644 index 0000000..392a567 --- /dev/null +++ b/src/com/szpg/db/data/PgCh4Alm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 甲烷浓度报警状态数据表 + * + * @author admin + * + */ +public class PgCh4Alm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = -109172405679187040L; + + private Integer id; + private Boolean ch4alm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getCh4alm() { + return ch4alm; + } + + public void setCh4alm(Boolean ch4alm) { + this.ch4alm = ch4alm; + } + + 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 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 ""; + } + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgCh4[ch4=" + ch4alm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java index 96dc762..8422d1b 100644 --- a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java +++ b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java @@ -2,8 +2,6 @@ import static org.junit.Assert.assertEquals; -import java.util.Calendar; - import org.junit.Before; import org.junit.Test; @@ -11,8 +9,9 @@ import com.szpg.db.dao.impl.PgAcuRdcmdDaoImpl; import com.szpg.db.data.PgAcuRdcmd; import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.util.ByteUtil; +import com.szpg.util.Configure; public class PgAcuRdcmdDaoTest { @@ -25,38 +24,40 @@ // @Test public void testAdd() { - ReadCH4ParamCommand ch4 = new ReadCH4ParamCommand(); + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); ch4.setDestinationId("006B00"); ch4.setMessageProducerId("00F400"); - ch4.setMemoryArea((byte) 0x82); - ch4.setStartAddress("012C00"); - ch4.setCount(24); + ch4.setMemoryArea((byte) 0x31); + ch4.setStartAddress("001A00"); + ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.CHALM.WORDCOUNT"))); + ch4.setCountBit(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.CHALM.BITCOUNT"))); PgAcuRdcmd cmd = new PgAcuRdcmd(); cmd.setId(ch4.getId()); - cmd.setTm(Calendar.getInstance().getTime()); - cmd.setCmd_type(AppMessageConstants.CMD_TYPE_READCH4STATUS); + cmd.setTm(ch4.getTime().getTime()); + cmd.setCmd_type(ch4.getCommandType()); cmd.setDest(ch4.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] {ch4.getMemoryArea()})); cmd.setStart_mem_word(ch4.getStartAddress().substring(0, 4)); cmd.setStart_mem_bit(ch4.getStartAddress().substring(4)); - cmd.setCount_word(ch4.getCount()); + cmd.setCount_word(ch4.getCountWord()); + cmd.setCount_bit(ch4.getCountBit()); assertEquals(1, dao.addCmdRecord(cmd)); } -// @Test + @Test public void testFindAll() { - assertEquals(1, dao.findAll()); + assertEquals(1, dao.findAll().size()); } @Test public void testFindByDestAndCount() { - assertEquals("11", dao.findLatestCmdByDestAndCount("006B00", 24).getCmd_type()); + assertEquals("12", dao.findLatestCmdByDestAndCount("006B00", 1).getCmd_type()); } - @Test +// @Test public void testUpdateResponsed() { assertEquals(1, dao.updateCmdRecordResponsed("23ff9e2987e64f248823254f0dfe1528")); } diff --git a/src/com/szpg/db/test/PgCH4DaoTest.java b/src/com/szpg/db/test/PgCH4DaoTest.java index 8c1c49f..8377965 100644 --- a/src/com/szpg/db/test/PgCH4DaoTest.java +++ b/src/com/szpg/db/test/PgCH4DaoTest.java @@ -28,12 +28,27 @@ @Test public void testFindAllParam() { - assertEquals("20180115131918", dao.findAllPblz().get(0).getTmStrGB()); + assertEquals("20180115171555", dao.findAllPblz().get(0).getTmStrGB()); } @Test public void testFindParamById() { - Assert.assertEquals(dao.findPblzById(1).getTmStrGB(), "20180115131918"); + Assert.assertEquals(dao.findPblzById(2).getTmStrGB(), "20180115171555"); + } + +// @Test + public void testAddStatusRecord() { + assertEquals(2, dao.addSbjzRecord(false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 1)); + } + + @Test + public void testFindAllStatus() { + assertEquals("20180115183307", dao.findAllSbjz().get(0).getTmStrGB()); + } + + @Test + public void testFindStatusById() { + Assert.assertEquals(dao.findSbjzById(1).getTmStrGB(), "20180115183307"); } } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index 7e9c937..15ccc72 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -3,6 +3,7 @@ import com.szpg.plc.message.AppCommand; import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -13,7 +14,8 @@ private byte memoryArea; //读取的内存区域代码 private String startAddress; //起始地址 - private int count; //读取的数量,以word(2字节)计算 + private int countWord; //读取的字数量/1WORD=2BYTE + private int countBit; //读取的位数量 public byte getMemoryArea() { return memoryArea; @@ -31,21 +33,34 @@ this.startAddress = startAddress; } - public int getCount() { - return count; + public int getCountWord() { + return countWord; } - public void setCount(int count) { - this.count = count; + public void setCountWord(int countWord) { + this.countWord = countWord; } - public ReadMemoryCommand getInstance(String type) { + public int getCountBit() { + return countBit; + } + + public void setCountBit(int countBit) { + this.countBit = countBit; + } + + public static ReadMemoryCommand getInstance(String type) { switch (type) { case AppMessageConstants.CMD_TYPE_READCH4PARAM: return new ReadCH4ParamCommand(); + + case AppMessageConstants.CMD_TYPE_READCH4STATUS: + return new ReadCH4StatusCommand(); default: return null; } } + + public abstract String getCommandType(); } diff --git a/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java b/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java index 73e5395..5b573f5 100644 --- a/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java +++ b/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java @@ -1,15 +1,16 @@ 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.ReadCH4ParamCommandResponse; public class ReadCH4ParamCommand extends ReadMemoryCommand { - + /** * */ - private static final long serialVersionUID = -8356882767656717757L; - + private static final long serialVersionUID = -4042536900405234254L; + @Override public Class getResponseClass() { return ReadCH4ParamCommandResponse.class; @@ -17,7 +18,12 @@ @Override public String toString() { - return "向终端[" + getDestinationId() + "]发送查询甲烷参数命令"; + return "向终端[" + getDestinationId() + "]发送查询甲烷监测值命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READCH4PARAM; } } diff --git a/src/com/szpg/plc/message/command/read/ReadCH4StatusCommand.java b/src/com/szpg/plc/message/command/read/ReadCH4StatusCommand.java new file mode 100644 index 0000000..790e7ff --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadCH4StatusCommand.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.ReadCH4StatusCommandResponse; + +public class ReadCH4StatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 6508070196810920169L; + + @Override + public Class getResponseClass() { + return ReadCH4StatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询甲烷报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READCH4STATUS; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4StatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4StatusCommandResponse.java new file mode 100644 index 0000000..0d35015 --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadCH4StatusCommandResponse.java @@ -0,0 +1,69 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgCh4Dao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgCh4DaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadCH4StatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = -4647640298404084468L; + + private List jwbj; // 甲烷浓度报警状态 + private List jwldbj; // 甲烷是否联动报警 + + public ReadCH4StatusCommandResponse() { + jwbj = new ArrayList(); + jwldbj = new ArrayList(); + } + + public List getJwbj() { + return jwbj; + } + + public void setJwbj(List jwbj) { + this.jwbj = jwbj; + } + + public List getJwldbj() { + return jwldbj; + } + + public void setJwldbj(List jwldbj) { + this.jwldbj = jwldbj; + } + + @Override + public void afterAction() { + // 1将甲烷浓度数据存入数据库 + PgCh4Dao ch4Dao = new PgCh4DaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findCH4DeviceIdByDest(this.getMessageProducerId()); + + for (int i = 0; i < jwbj.size(); i++) { + if (i < ids.size()) { + ch4Dao.addSbjzRecord(jwbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (jwbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + + // 2发送查询报警值的命令 + + } + } + } + } + +} diff --git a/src/com/szpg/plc/protocol/DTProtocolInterface.java b/src/com/szpg/plc/protocol/DTProtocolInterface.java index 0a65694..f50a3e3 100644 --- a/src/com/szpg/plc/protocol/DTProtocolInterface.java +++ b/src/com/szpg/plc/protocol/DTProtocolInterface.java @@ -6,6 +6,13 @@ public interface DTProtocolInterface { + + /** + * 从字节流中提取符合规范的消息字节 + * @param byteMessage + * @return + */ + public List extractByteMessage(byte[] byteMessage); /** * 解析消息为应用对象 @@ -22,12 +29,5 @@ * @return */ public byte[] messageToBytes(AppMessage message); - - - /** - * 从字节流中提取符合规范的消息字节 - * @param byteMessage - * @return - */ - public List extractByteMessage(byte[] byteMessage); + } diff --git a/src/ACUBL.properties b/src/ACUBL.properties index d3be57b..12a50a2 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -1,3 +1,28 @@ #ACU\u53d8\u91cf\u8868\u914d\u7f6e\u6587\u4ef6 -YXL.ACU001.DCH.START = 0300 -YXL.ACU001.DCH.COUNT = 48 \ No newline at end of file + +######## YXL.ACU001 ######## +#\u7532\u70f7\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.CH.COUNT = 6 +#\u7532\u70f7\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 +YXL.ACU001.CH.START = 0300 +#\u7532\u70f7\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 +YXL.ACU001.CH.WORDCOUNT = 24 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.CHALM.START = 0026 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.CHALM.WORDCOUNT = 1 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.CHALM.BITCOUNT = 12 + +#\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.WS.COUNT = 6 +#\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 +YXL.ACU001.WS.START = 0400 +#\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 +YXL.ACU001.WS.WORDCOUNT = 74 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.WSALM.START = 0030 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.WSALM.WORDCOUNT = 3 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.WSALM.BITCOUNT = 12 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index bacf942..46e331c 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -6,13 +6,15 @@ import com.szpg.db.dao.impl.PgAcuDaoImpl; import com.szpg.db.data.PgAcu; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; public class DSCTest { @@ -20,7 +22,7 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.107", 6800); + ACUClient client = new ACUClient("192.168.8.105", 6800); client.setNet("00"); client.setNode("6B"); @@ -33,13 +35,21 @@ new ScheduledThreadPoolExecutor(1).scheduleAtFixedRate(new ACUSocketCheckTask(client), 0, 30, TimeUnit.SECONDS); // 测试发送查询甲烷参数命令 - dsc.testSendCH4Command(client); +// dsc.testSendCH4Command(client); + + // 测试发送查询甲烷报警状态命令 + dsc.testSendCH4StatsuCommand(client); // System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); } - private void testSendCH4Command(ACUClient client) { - ReadCH4ParamCommand ch4 = new ReadCH4ParamCommand(); + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + public void testSendCH4Command(ACUClient client) { + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -51,11 +61,38 @@ ch4.setMemoryArea(FINSConstants.MEMORY_DM_AREA); - ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.DCH.START")))) + "00"); - ch4.setCount(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.DCH.COUNT"))); + ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); + ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); + ch4.setCountBit(0); //读取监测值时位数量无效 ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 15, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + public void testSendCH4StatsuCommand(ACUClient client) { + ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ch4alm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ch4alm.setDestinationId(dest); + + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + 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"))); + ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index e5e8175..5c81046 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -3,6 +3,7 @@ import java.util.List; import com.szpg.db.data.PgCh4; +import com.szpg.db.data.PgCh4Alm; /** * 甲烷相关参数读写的数据库接口 @@ -11,6 +12,7 @@ */ public interface PgCh4Dao { + /******** 甲烷浓度变量值 ********/ public List findAllPblz(); public PgCh4 findPblzById(Integer id); @@ -19,4 +21,15 @@ public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); + + + /******** 甲烷浓度报警状态 ********/ + public List findAllSbjz(); + public PgCh4Alm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgCh4Alm ch4alm); + 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 3db493e..3c7e9e3 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -120,9 +120,9 @@ Connection conn = null; String insertStr = "INSERT INTO PG_ACU_RDCMD " + - "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, RESPONSED, TIMEOUT) " + - "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, '0', '0')"; - Object[] params = new Object[8]; + "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, RESPONSED, TIMEOUT) " + + "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, '0', '0')"; + Object[] params = new Object[9]; params[0] = cmd.getId(); params[1] = TimeFormat.format(cmd.getTm(), "yyyyMMddHHmmss"); params[2] = cmd.getCmd_type(); @@ -131,6 +131,7 @@ params[5] = cmd.getStart_mem_word(); params[6] = cmd.getStart_mem_bit(); params[7] = cmd.getCount_word(); + params[8] = cmd.getCount_bit(); try { conn = ConnectionManager.getConnectionFromC3P0(); diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 9d693a8..aac45e6 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -13,6 +13,7 @@ import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.data.PgCh4; +import com.szpg.db.data.PgCh4Alm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -259,4 +260,243 @@ return 0; } + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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++) { + PgCh4Alm ch4alm = new PgCh4Alm(); + Object[] item = tempList.get(i); + + ch4alm.setId(((Number) item[0]).intValue()); + ch4alm.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4alm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4alm.setLogtime(cal.getTime()); + ch4alm.setUptime(cal.getTime()); + + list.add(ch4alm); + } + 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 PgCh4Alm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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) { + PgCh4Alm ch4 = new PgCh4Alm(); + Object[] item = tempList.get(0); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + logger.debug("根据ID查询甲烷报警状态成功" + ch4 + "]"); + + return ch4; + } + 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, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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++) { + PgCh4Alm ch4 = new PgCh4Alm(); + Object[] item = tempList.get(i); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + list.add(ch4); + } + 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, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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++) { + PgCh4Alm ch4 = new PgCh4Alm(); + Object[] item = tempList.get(i); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + list.add(ch4); + } + 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(PgCh4Alm ch4alm) { + return addSbjzRecord(ch4alm.getCh4alm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_CH4_ALM " + + "(CH4ALM, 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 38f8667..095bbb8 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -11,11 +11,11 @@ * */ public class PgAcuRdcmd implements java.io.Serializable { - + /** * */ - private static final long serialVersionUID = -3187227934289186463L; + private static final long serialVersionUID = -605179003596292814L; private String id; // ID private Date tm; // 命令发送时间 @@ -25,6 +25,7 @@ private String start_mem_word; // 起始内存字地址 private String start_mem_bit; // 起始内存位地址 private Integer count_word; // 读取的字数量 + private Integer count_bit; //读取的位数量 private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 @@ -92,6 +93,14 @@ this.count_word = count_word; } + public Integer getCount_bit() { + return count_bit; + } + + public void setCount_bit(Integer count_bit) { + this.count_bit = count_bit; + } + public boolean isResponsed() { return responsed; } diff --git a/src/com/szpg/db/data/PgCh4Alm.java b/src/com/szpg/db/data/PgCh4Alm.java new file mode 100644 index 0000000..392a567 --- /dev/null +++ b/src/com/szpg/db/data/PgCh4Alm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 甲烷浓度报警状态数据表 + * + * @author admin + * + */ +public class PgCh4Alm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = -109172405679187040L; + + private Integer id; + private Boolean ch4alm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getCh4alm() { + return ch4alm; + } + + public void setCh4alm(Boolean ch4alm) { + this.ch4alm = ch4alm; + } + + 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 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 ""; + } + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgCh4[ch4=" + ch4alm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java index 96dc762..8422d1b 100644 --- a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java +++ b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java @@ -2,8 +2,6 @@ import static org.junit.Assert.assertEquals; -import java.util.Calendar; - import org.junit.Before; import org.junit.Test; @@ -11,8 +9,9 @@ import com.szpg.db.dao.impl.PgAcuRdcmdDaoImpl; import com.szpg.db.data.PgAcuRdcmd; import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.util.ByteUtil; +import com.szpg.util.Configure; public class PgAcuRdcmdDaoTest { @@ -25,38 +24,40 @@ // @Test public void testAdd() { - ReadCH4ParamCommand ch4 = new ReadCH4ParamCommand(); + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); ch4.setDestinationId("006B00"); ch4.setMessageProducerId("00F400"); - ch4.setMemoryArea((byte) 0x82); - ch4.setStartAddress("012C00"); - ch4.setCount(24); + ch4.setMemoryArea((byte) 0x31); + ch4.setStartAddress("001A00"); + ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.CHALM.WORDCOUNT"))); + ch4.setCountBit(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.CHALM.BITCOUNT"))); PgAcuRdcmd cmd = new PgAcuRdcmd(); cmd.setId(ch4.getId()); - cmd.setTm(Calendar.getInstance().getTime()); - cmd.setCmd_type(AppMessageConstants.CMD_TYPE_READCH4STATUS); + cmd.setTm(ch4.getTime().getTime()); + cmd.setCmd_type(ch4.getCommandType()); cmd.setDest(ch4.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] {ch4.getMemoryArea()})); cmd.setStart_mem_word(ch4.getStartAddress().substring(0, 4)); cmd.setStart_mem_bit(ch4.getStartAddress().substring(4)); - cmd.setCount_word(ch4.getCount()); + cmd.setCount_word(ch4.getCountWord()); + cmd.setCount_bit(ch4.getCountBit()); assertEquals(1, dao.addCmdRecord(cmd)); } -// @Test + @Test public void testFindAll() { - assertEquals(1, dao.findAll()); + assertEquals(1, dao.findAll().size()); } @Test public void testFindByDestAndCount() { - assertEquals("11", dao.findLatestCmdByDestAndCount("006B00", 24).getCmd_type()); + assertEquals("12", dao.findLatestCmdByDestAndCount("006B00", 1).getCmd_type()); } - @Test +// @Test public void testUpdateResponsed() { assertEquals(1, dao.updateCmdRecordResponsed("23ff9e2987e64f248823254f0dfe1528")); } diff --git a/src/com/szpg/db/test/PgCH4DaoTest.java b/src/com/szpg/db/test/PgCH4DaoTest.java index 8c1c49f..8377965 100644 --- a/src/com/szpg/db/test/PgCH4DaoTest.java +++ b/src/com/szpg/db/test/PgCH4DaoTest.java @@ -28,12 +28,27 @@ @Test public void testFindAllParam() { - assertEquals("20180115131918", dao.findAllPblz().get(0).getTmStrGB()); + assertEquals("20180115171555", dao.findAllPblz().get(0).getTmStrGB()); } @Test public void testFindParamById() { - Assert.assertEquals(dao.findPblzById(1).getTmStrGB(), "20180115131918"); + Assert.assertEquals(dao.findPblzById(2).getTmStrGB(), "20180115171555"); + } + +// @Test + public void testAddStatusRecord() { + assertEquals(2, dao.addSbjzRecord(false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 1)); + } + + @Test + public void testFindAllStatus() { + assertEquals("20180115183307", dao.findAllSbjz().get(0).getTmStrGB()); + } + + @Test + public void testFindStatusById() { + Assert.assertEquals(dao.findSbjzById(1).getTmStrGB(), "20180115183307"); } } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index 7e9c937..15ccc72 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -3,6 +3,7 @@ import com.szpg.plc.message.AppCommand; import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -13,7 +14,8 @@ private byte memoryArea; //读取的内存区域代码 private String startAddress; //起始地址 - private int count; //读取的数量,以word(2字节)计算 + private int countWord; //读取的字数量/1WORD=2BYTE + private int countBit; //读取的位数量 public byte getMemoryArea() { return memoryArea; @@ -31,21 +33,34 @@ this.startAddress = startAddress; } - public int getCount() { - return count; + public int getCountWord() { + return countWord; } - public void setCount(int count) { - this.count = count; + public void setCountWord(int countWord) { + this.countWord = countWord; } - public ReadMemoryCommand getInstance(String type) { + public int getCountBit() { + return countBit; + } + + public void setCountBit(int countBit) { + this.countBit = countBit; + } + + public static ReadMemoryCommand getInstance(String type) { switch (type) { case AppMessageConstants.CMD_TYPE_READCH4PARAM: return new ReadCH4ParamCommand(); + + case AppMessageConstants.CMD_TYPE_READCH4STATUS: + return new ReadCH4StatusCommand(); default: return null; } } + + public abstract String getCommandType(); } diff --git a/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java b/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java index 73e5395..5b573f5 100644 --- a/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java +++ b/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java @@ -1,15 +1,16 @@ 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.ReadCH4ParamCommandResponse; public class ReadCH4ParamCommand extends ReadMemoryCommand { - + /** * */ - private static final long serialVersionUID = -8356882767656717757L; - + private static final long serialVersionUID = -4042536900405234254L; + @Override public Class getResponseClass() { return ReadCH4ParamCommandResponse.class; @@ -17,7 +18,12 @@ @Override public String toString() { - return "向终端[" + getDestinationId() + "]发送查询甲烷参数命令"; + return "向终端[" + getDestinationId() + "]发送查询甲烷监测值命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READCH4PARAM; } } diff --git a/src/com/szpg/plc/message/command/read/ReadCH4StatusCommand.java b/src/com/szpg/plc/message/command/read/ReadCH4StatusCommand.java new file mode 100644 index 0000000..790e7ff --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadCH4StatusCommand.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.ReadCH4StatusCommandResponse; + +public class ReadCH4StatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 6508070196810920169L; + + @Override + public Class getResponseClass() { + return ReadCH4StatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询甲烷报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READCH4STATUS; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4StatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4StatusCommandResponse.java new file mode 100644 index 0000000..0d35015 --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadCH4StatusCommandResponse.java @@ -0,0 +1,69 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgCh4Dao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgCh4DaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadCH4StatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = -4647640298404084468L; + + private List jwbj; // 甲烷浓度报警状态 + private List jwldbj; // 甲烷是否联动报警 + + public ReadCH4StatusCommandResponse() { + jwbj = new ArrayList(); + jwldbj = new ArrayList(); + } + + public List getJwbj() { + return jwbj; + } + + public void setJwbj(List jwbj) { + this.jwbj = jwbj; + } + + public List getJwldbj() { + return jwldbj; + } + + public void setJwldbj(List jwldbj) { + this.jwldbj = jwldbj; + } + + @Override + public void afterAction() { + // 1将甲烷浓度数据存入数据库 + PgCh4Dao ch4Dao = new PgCh4DaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findCH4DeviceIdByDest(this.getMessageProducerId()); + + for (int i = 0; i < jwbj.size(); i++) { + if (i < ids.size()) { + ch4Dao.addSbjzRecord(jwbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (jwbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + + // 2发送查询报警值的命令 + + } + } + } + } + +} diff --git a/src/com/szpg/plc/protocol/DTProtocolInterface.java b/src/com/szpg/plc/protocol/DTProtocolInterface.java index 0a65694..f50a3e3 100644 --- a/src/com/szpg/plc/protocol/DTProtocolInterface.java +++ b/src/com/szpg/plc/protocol/DTProtocolInterface.java @@ -6,6 +6,13 @@ public interface DTProtocolInterface { + + /** + * 从字节流中提取符合规范的消息字节 + * @param byteMessage + * @return + */ + public List extractByteMessage(byte[] byteMessage); /** * 解析消息为应用对象 @@ -22,12 +29,5 @@ * @return */ public byte[] messageToBytes(AppMessage message); - - - /** - * 从字节流中提取符合规范的消息字节 - * @param byteMessage - * @return - */ - public List extractByteMessage(byte[] byteMessage); + } diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index b0bb4a3..12d1c18 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -14,8 +14,10 @@ import com.szpg.plc.message.UnKnownMessage; import com.szpg.plc.message.command.LinkCommand; import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.command.read.ReadCH4StatusCommand; import com.szpg.plc.message.response.LinkCommandResponse; import com.szpg.plc.message.response.read.ReadCH4ParamCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; import com.szpg.plc.protocol.DTProtocolInterface; import com.szpg.plc.protocol.fins.frame.FINSByteFrame; import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; @@ -25,6 +27,58 @@ public class FINSDTProtocolImp implements DTProtocolInterface { private final Logger logger = Logger.getLogger(this.getClass().getName()); // 输出到message + + /** + * 从重叠消息中提取规范消息 + */ + @Override + public List extractByteMessage(byte[] byteMessage) { + List bytesList = new ArrayList(); + int count = 0; + + try { + int i = 0; + while (i < byteMessage.length) { + if (byteMessage[i] == FINSByteFrame.HEADER[0] && + byteMessage[i + 1] == FINSByteFrame.HEADER[1] && + byteMessage[i + 2] == FINSByteFrame.HEADER[2] && + byteMessage[i + 3] == FINSByteFrame.HEADER[3]) { + + // 匹配上FINS帧头 + int length = ByteUtil.binToInt(new byte[]{byteMessage[i + 4], byteMessage[i + 5], byteMessage[i + 6], byteMessage[i + 7]}); + if (i + length + 8 <= byteMessage.length) { + Bytes bytes = new Bytes(); + bytes.append(byteMessage[i]).append(byteMessage[i + 1]).append(byteMessage[i + 2]).append(byteMessage[i + 3]); //FINS帧头 + bytes.append(byteMessage[i + 4]).append(byteMessage[i + 5]).append(byteMessage[i + 6]).append(byteMessage[i + 7]); //FINS长度 + + // FINS的数据区 + for (int j = 0; j < length; j++) { + bytes.append(byteMessage[i + 8 + j]); + } + + i = i + length + 8; + bytesList.add(bytes.toBytes()); + count++; + } else { + i++; + } + } else { + i++; + } + } + } catch (Exception e) { + e.printStackTrace(); + bytesList.clear(); + bytesList.add(byteMessage); + return bytesList; + } + + if (count == 0) { + bytesList.add(byteMessage); + } + + return bytesList; + } /** * 将字节数组解析为收到的消息对象 @@ -59,7 +113,7 @@ // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - int count = FINSByteFrameTool.getDataWithoutEndCode(byteMessage).length; + int count = FINSByteFrameTool.getDataWithoutEndCode(byteMessage).length / 2; //1WORD=2BYTE // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 PgAcuRdcmdDao readCmdDao = new PgAcuRdcmdDaoImpl(); @@ -71,6 +125,11 @@ switch(commandType) { case AppMessageConstants.CMD_TYPE_READCH4PARAM: received = bytesToReadCH4ParamCommand(finsFrame); + break; + + case AppMessageConstants.CMD_TYPE_READCH4STATUS: + received = bytesToReadCH4StatusCommand(finsFrame, readCmd.getCount_bit()); + break; } // 4将有效的命令的是否有响应字段置1 @@ -260,6 +319,7 @@ return received; } + /** * 将握手响应字节数组转换为消息对象 * @@ -315,6 +375,35 @@ return rcpcr; } + + + /** + * 将查询甲烷报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4StatusCommand(FINSByteFrame finsFrame, int countBit) { + ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int chct = countBit / 2; //甲烷监测点的数量/每个甲烷点位的参数包括2个变量、每个变量占1个位 + String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //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); + + rcscr.getJwbj().add(bjBit == '1' ? true : false); + rcscr.getJwldbj().add(ldBit == '1' ? true : false); + } + } + + return rcscr; + } // // /** // * 将查询终端地址响应消息字节数组解析为消息对象AFN=50H @@ -3421,6 +3510,8 @@ // 读取甲烷参数内存命令 if (message instanceof ReadCH4ParamCommand) { frame = ReadCH4ParamCommandToBytes((ReadCH4ParamCommand) message); + } else if (message instanceof ReadCH4StatusCommand) { + frame = ReadCH4StatusCommandToBytes((ReadCH4StatusCommand) message); } // // 读内存命令 @@ -3449,7 +3540,7 @@ } /** - * 将读取甲烷参数内存命令转换为字节数组 + * 将读取甲烷监测值命令转换为字节数组 * @param read * @return */ @@ -3460,62 +3551,28 @@ read.getMessageProducerId(), read.getMemoryArea(), start, - read.getCount()); + read.getCountWord()); return finsFrame.toBytes(); } /** - * 从重叠消息中提取规范消息 + * 将读取甲烷报警状态命令转换为字节数组 + * @param message + * @return */ - @Override - public List extractByteMessage(byte[] byteMessage) { - List bytesList = new ArrayList(); - int count = 0; + private byte[] ReadCH4StatusCommandToBytes(ReadCH4StatusCommand message) { + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - try { - int i = 0; - while (i < byteMessage.length) { - if (byteMessage[i] == FINSByteFrame.HEADER[0] && - byteMessage[i + 1] == FINSByteFrame.HEADER[1] && - byteMessage[i + 2] == FINSByteFrame.HEADER[2] && - byteMessage[i + 3] == FINSByteFrame.HEADER[3]) { - - // 匹配上FINS帧头 - int length = ByteUtil.binToInt(new byte[]{byteMessage[i + 4], byteMessage[i + 5], byteMessage[i + 6], byteMessage[i + 7]}); - if (i + length + 8 <= byteMessage.length) { - Bytes bytes = new Bytes(); - bytes.append(byteMessage[i]).append(byteMessage[i + 1]).append(byteMessage[i + 2]).append(byteMessage[i + 3]); //FINS帧头 - bytes.append(byteMessage[i + 4]).append(byteMessage[i + 5]).append(byteMessage[i + 6]).append(byteMessage[i + 7]); //FINS长度 - - // FINS的数据区 - for (int j = 0; j < length; j++) { - bytes.append(byteMessage[i + 8 + j]); - } - - i = i + length + 8; - bytesList.add(bytes.toBytes()); - count++; - } else { - i++; - } - } else { - i++; - } - } - } catch (Exception e) { - e.printStackTrace(); - bytesList.clear(); - bytesList.add(byteMessage); - return bytesList; - } - - if (count == 0) { - bytesList.add(byteMessage); - } - - return bytesList; + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getMemoryArea(), + start, + message.getCountWord()); + + return finsFrame.toBytes(); } + // /** // * 将退出登录命令对象转换为字节数组AFN=02H diff --git a/src/ACUBL.properties b/src/ACUBL.properties index d3be57b..12a50a2 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -1,3 +1,28 @@ #ACU\u53d8\u91cf\u8868\u914d\u7f6e\u6587\u4ef6 -YXL.ACU001.DCH.START = 0300 -YXL.ACU001.DCH.COUNT = 48 \ No newline at end of file + +######## YXL.ACU001 ######## +#\u7532\u70f7\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.CH.COUNT = 6 +#\u7532\u70f7\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 +YXL.ACU001.CH.START = 0300 +#\u7532\u70f7\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 +YXL.ACU001.CH.WORDCOUNT = 24 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.CHALM.START = 0026 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.CHALM.WORDCOUNT = 1 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.CHALM.BITCOUNT = 12 + +#\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.WS.COUNT = 6 +#\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 +YXL.ACU001.WS.START = 0400 +#\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 +YXL.ACU001.WS.WORDCOUNT = 74 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.WSALM.START = 0030 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.WSALM.WORDCOUNT = 3 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.WSALM.BITCOUNT = 12 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index bacf942..46e331c 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -6,13 +6,15 @@ import com.szpg.db.dao.impl.PgAcuDaoImpl; import com.szpg.db.data.PgAcu; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; public class DSCTest { @@ -20,7 +22,7 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.107", 6800); + ACUClient client = new ACUClient("192.168.8.105", 6800); client.setNet("00"); client.setNode("6B"); @@ -33,13 +35,21 @@ new ScheduledThreadPoolExecutor(1).scheduleAtFixedRate(new ACUSocketCheckTask(client), 0, 30, TimeUnit.SECONDS); // 测试发送查询甲烷参数命令 - dsc.testSendCH4Command(client); +// dsc.testSendCH4Command(client); + + // 测试发送查询甲烷报警状态命令 + dsc.testSendCH4StatsuCommand(client); // System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); } - private void testSendCH4Command(ACUClient client) { - ReadCH4ParamCommand ch4 = new ReadCH4ParamCommand(); + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + public void testSendCH4Command(ACUClient client) { + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -51,11 +61,38 @@ ch4.setMemoryArea(FINSConstants.MEMORY_DM_AREA); - ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.DCH.START")))) + "00"); - ch4.setCount(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.DCH.COUNT"))); + ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); + ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); + ch4.setCountBit(0); //读取监测值时位数量无效 ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 15, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + public void testSendCH4StatsuCommand(ACUClient client) { + ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ch4alm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ch4alm.setDestinationId(dest); + + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + 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"))); + ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index e5e8175..5c81046 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -3,6 +3,7 @@ import java.util.List; import com.szpg.db.data.PgCh4; +import com.szpg.db.data.PgCh4Alm; /** * 甲烷相关参数读写的数据库接口 @@ -11,6 +12,7 @@ */ public interface PgCh4Dao { + /******** 甲烷浓度变量值 ********/ public List findAllPblz(); public PgCh4 findPblzById(Integer id); @@ -19,4 +21,15 @@ public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); + + + /******** 甲烷浓度报警状态 ********/ + public List findAllSbjz(); + public PgCh4Alm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgCh4Alm ch4alm); + 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 3db493e..3c7e9e3 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -120,9 +120,9 @@ Connection conn = null; String insertStr = "INSERT INTO PG_ACU_RDCMD " + - "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, RESPONSED, TIMEOUT) " + - "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, '0', '0')"; - Object[] params = new Object[8]; + "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, RESPONSED, TIMEOUT) " + + "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, '0', '0')"; + Object[] params = new Object[9]; params[0] = cmd.getId(); params[1] = TimeFormat.format(cmd.getTm(), "yyyyMMddHHmmss"); params[2] = cmd.getCmd_type(); @@ -131,6 +131,7 @@ params[5] = cmd.getStart_mem_word(); params[6] = cmd.getStart_mem_bit(); params[7] = cmd.getCount_word(); + params[8] = cmd.getCount_bit(); try { conn = ConnectionManager.getConnectionFromC3P0(); diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 9d693a8..aac45e6 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -13,6 +13,7 @@ import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.data.PgCh4; +import com.szpg.db.data.PgCh4Alm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -259,4 +260,243 @@ return 0; } + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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++) { + PgCh4Alm ch4alm = new PgCh4Alm(); + Object[] item = tempList.get(i); + + ch4alm.setId(((Number) item[0]).intValue()); + ch4alm.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4alm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4alm.setLogtime(cal.getTime()); + ch4alm.setUptime(cal.getTime()); + + list.add(ch4alm); + } + 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 PgCh4Alm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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) { + PgCh4Alm ch4 = new PgCh4Alm(); + Object[] item = tempList.get(0); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + logger.debug("根据ID查询甲烷报警状态成功" + ch4 + "]"); + + return ch4; + } + 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, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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++) { + PgCh4Alm ch4 = new PgCh4Alm(); + Object[] item = tempList.get(i); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + list.add(ch4); + } + 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, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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++) { + PgCh4Alm ch4 = new PgCh4Alm(); + Object[] item = tempList.get(i); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + list.add(ch4); + } + 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(PgCh4Alm ch4alm) { + return addSbjzRecord(ch4alm.getCh4alm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_CH4_ALM " + + "(CH4ALM, 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 38f8667..095bbb8 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -11,11 +11,11 @@ * */ public class PgAcuRdcmd implements java.io.Serializable { - + /** * */ - private static final long serialVersionUID = -3187227934289186463L; + private static final long serialVersionUID = -605179003596292814L; private String id; // ID private Date tm; // 命令发送时间 @@ -25,6 +25,7 @@ private String start_mem_word; // 起始内存字地址 private String start_mem_bit; // 起始内存位地址 private Integer count_word; // 读取的字数量 + private Integer count_bit; //读取的位数量 private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 @@ -92,6 +93,14 @@ this.count_word = count_word; } + public Integer getCount_bit() { + return count_bit; + } + + public void setCount_bit(Integer count_bit) { + this.count_bit = count_bit; + } + public boolean isResponsed() { return responsed; } diff --git a/src/com/szpg/db/data/PgCh4Alm.java b/src/com/szpg/db/data/PgCh4Alm.java new file mode 100644 index 0000000..392a567 --- /dev/null +++ b/src/com/szpg/db/data/PgCh4Alm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 甲烷浓度报警状态数据表 + * + * @author admin + * + */ +public class PgCh4Alm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = -109172405679187040L; + + private Integer id; + private Boolean ch4alm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getCh4alm() { + return ch4alm; + } + + public void setCh4alm(Boolean ch4alm) { + this.ch4alm = ch4alm; + } + + 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 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 ""; + } + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgCh4[ch4=" + ch4alm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java index 96dc762..8422d1b 100644 --- a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java +++ b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java @@ -2,8 +2,6 @@ import static org.junit.Assert.assertEquals; -import java.util.Calendar; - import org.junit.Before; import org.junit.Test; @@ -11,8 +9,9 @@ import com.szpg.db.dao.impl.PgAcuRdcmdDaoImpl; import com.szpg.db.data.PgAcuRdcmd; import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.util.ByteUtil; +import com.szpg.util.Configure; public class PgAcuRdcmdDaoTest { @@ -25,38 +24,40 @@ // @Test public void testAdd() { - ReadCH4ParamCommand ch4 = new ReadCH4ParamCommand(); + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); ch4.setDestinationId("006B00"); ch4.setMessageProducerId("00F400"); - ch4.setMemoryArea((byte) 0x82); - ch4.setStartAddress("012C00"); - ch4.setCount(24); + ch4.setMemoryArea((byte) 0x31); + ch4.setStartAddress("001A00"); + ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.CHALM.WORDCOUNT"))); + ch4.setCountBit(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.CHALM.BITCOUNT"))); PgAcuRdcmd cmd = new PgAcuRdcmd(); cmd.setId(ch4.getId()); - cmd.setTm(Calendar.getInstance().getTime()); - cmd.setCmd_type(AppMessageConstants.CMD_TYPE_READCH4STATUS); + cmd.setTm(ch4.getTime().getTime()); + cmd.setCmd_type(ch4.getCommandType()); cmd.setDest(ch4.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] {ch4.getMemoryArea()})); cmd.setStart_mem_word(ch4.getStartAddress().substring(0, 4)); cmd.setStart_mem_bit(ch4.getStartAddress().substring(4)); - cmd.setCount_word(ch4.getCount()); + cmd.setCount_word(ch4.getCountWord()); + cmd.setCount_bit(ch4.getCountBit()); assertEquals(1, dao.addCmdRecord(cmd)); } -// @Test + @Test public void testFindAll() { - assertEquals(1, dao.findAll()); + assertEquals(1, dao.findAll().size()); } @Test public void testFindByDestAndCount() { - assertEquals("11", dao.findLatestCmdByDestAndCount("006B00", 24).getCmd_type()); + assertEquals("12", dao.findLatestCmdByDestAndCount("006B00", 1).getCmd_type()); } - @Test +// @Test public void testUpdateResponsed() { assertEquals(1, dao.updateCmdRecordResponsed("23ff9e2987e64f248823254f0dfe1528")); } diff --git a/src/com/szpg/db/test/PgCH4DaoTest.java b/src/com/szpg/db/test/PgCH4DaoTest.java index 8c1c49f..8377965 100644 --- a/src/com/szpg/db/test/PgCH4DaoTest.java +++ b/src/com/szpg/db/test/PgCH4DaoTest.java @@ -28,12 +28,27 @@ @Test public void testFindAllParam() { - assertEquals("20180115131918", dao.findAllPblz().get(0).getTmStrGB()); + assertEquals("20180115171555", dao.findAllPblz().get(0).getTmStrGB()); } @Test public void testFindParamById() { - Assert.assertEquals(dao.findPblzById(1).getTmStrGB(), "20180115131918"); + Assert.assertEquals(dao.findPblzById(2).getTmStrGB(), "20180115171555"); + } + +// @Test + public void testAddStatusRecord() { + assertEquals(2, dao.addSbjzRecord(false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 1)); + } + + @Test + public void testFindAllStatus() { + assertEquals("20180115183307", dao.findAllSbjz().get(0).getTmStrGB()); + } + + @Test + public void testFindStatusById() { + Assert.assertEquals(dao.findSbjzById(1).getTmStrGB(), "20180115183307"); } } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index 7e9c937..15ccc72 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -3,6 +3,7 @@ import com.szpg.plc.message.AppCommand; import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -13,7 +14,8 @@ private byte memoryArea; //读取的内存区域代码 private String startAddress; //起始地址 - private int count; //读取的数量,以word(2字节)计算 + private int countWord; //读取的字数量/1WORD=2BYTE + private int countBit; //读取的位数量 public byte getMemoryArea() { return memoryArea; @@ -31,21 +33,34 @@ this.startAddress = startAddress; } - public int getCount() { - return count; + public int getCountWord() { + return countWord; } - public void setCount(int count) { - this.count = count; + public void setCountWord(int countWord) { + this.countWord = countWord; } - public ReadMemoryCommand getInstance(String type) { + public int getCountBit() { + return countBit; + } + + public void setCountBit(int countBit) { + this.countBit = countBit; + } + + public static ReadMemoryCommand getInstance(String type) { switch (type) { case AppMessageConstants.CMD_TYPE_READCH4PARAM: return new ReadCH4ParamCommand(); + + case AppMessageConstants.CMD_TYPE_READCH4STATUS: + return new ReadCH4StatusCommand(); default: return null; } } + + public abstract String getCommandType(); } diff --git a/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java b/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java index 73e5395..5b573f5 100644 --- a/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java +++ b/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java @@ -1,15 +1,16 @@ 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.ReadCH4ParamCommandResponse; public class ReadCH4ParamCommand extends ReadMemoryCommand { - + /** * */ - private static final long serialVersionUID = -8356882767656717757L; - + private static final long serialVersionUID = -4042536900405234254L; + @Override public Class getResponseClass() { return ReadCH4ParamCommandResponse.class; @@ -17,7 +18,12 @@ @Override public String toString() { - return "向终端[" + getDestinationId() + "]发送查询甲烷参数命令"; + return "向终端[" + getDestinationId() + "]发送查询甲烷监测值命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READCH4PARAM; } } diff --git a/src/com/szpg/plc/message/command/read/ReadCH4StatusCommand.java b/src/com/szpg/plc/message/command/read/ReadCH4StatusCommand.java new file mode 100644 index 0000000..790e7ff --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadCH4StatusCommand.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.ReadCH4StatusCommandResponse; + +public class ReadCH4StatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 6508070196810920169L; + + @Override + public Class getResponseClass() { + return ReadCH4StatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询甲烷报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READCH4STATUS; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4StatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4StatusCommandResponse.java new file mode 100644 index 0000000..0d35015 --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadCH4StatusCommandResponse.java @@ -0,0 +1,69 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgCh4Dao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgCh4DaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadCH4StatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = -4647640298404084468L; + + private List jwbj; // 甲烷浓度报警状态 + private List jwldbj; // 甲烷是否联动报警 + + public ReadCH4StatusCommandResponse() { + jwbj = new ArrayList(); + jwldbj = new ArrayList(); + } + + public List getJwbj() { + return jwbj; + } + + public void setJwbj(List jwbj) { + this.jwbj = jwbj; + } + + public List getJwldbj() { + return jwldbj; + } + + public void setJwldbj(List jwldbj) { + this.jwldbj = jwldbj; + } + + @Override + public void afterAction() { + // 1将甲烷浓度数据存入数据库 + PgCh4Dao ch4Dao = new PgCh4DaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findCH4DeviceIdByDest(this.getMessageProducerId()); + + for (int i = 0; i < jwbj.size(); i++) { + if (i < ids.size()) { + ch4Dao.addSbjzRecord(jwbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (jwbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + + // 2发送查询报警值的命令 + + } + } + } + } + +} diff --git a/src/com/szpg/plc/protocol/DTProtocolInterface.java b/src/com/szpg/plc/protocol/DTProtocolInterface.java index 0a65694..f50a3e3 100644 --- a/src/com/szpg/plc/protocol/DTProtocolInterface.java +++ b/src/com/szpg/plc/protocol/DTProtocolInterface.java @@ -6,6 +6,13 @@ public interface DTProtocolInterface { + + /** + * 从字节流中提取符合规范的消息字节 + * @param byteMessage + * @return + */ + public List extractByteMessage(byte[] byteMessage); /** * 解析消息为应用对象 @@ -22,12 +29,5 @@ * @return */ public byte[] messageToBytes(AppMessage message); - - - /** - * 从字节流中提取符合规范的消息字节 - * @param byteMessage - * @return - */ - public List extractByteMessage(byte[] byteMessage); + } diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index b0bb4a3..12d1c18 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -14,8 +14,10 @@ import com.szpg.plc.message.UnKnownMessage; import com.szpg.plc.message.command.LinkCommand; import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.command.read.ReadCH4StatusCommand; import com.szpg.plc.message.response.LinkCommandResponse; import com.szpg.plc.message.response.read.ReadCH4ParamCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; import com.szpg.plc.protocol.DTProtocolInterface; import com.szpg.plc.protocol.fins.frame.FINSByteFrame; import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; @@ -25,6 +27,58 @@ public class FINSDTProtocolImp implements DTProtocolInterface { private final Logger logger = Logger.getLogger(this.getClass().getName()); // 输出到message + + /** + * 从重叠消息中提取规范消息 + */ + @Override + public List extractByteMessage(byte[] byteMessage) { + List bytesList = new ArrayList(); + int count = 0; + + try { + int i = 0; + while (i < byteMessage.length) { + if (byteMessage[i] == FINSByteFrame.HEADER[0] && + byteMessage[i + 1] == FINSByteFrame.HEADER[1] && + byteMessage[i + 2] == FINSByteFrame.HEADER[2] && + byteMessage[i + 3] == FINSByteFrame.HEADER[3]) { + + // 匹配上FINS帧头 + int length = ByteUtil.binToInt(new byte[]{byteMessage[i + 4], byteMessage[i + 5], byteMessage[i + 6], byteMessage[i + 7]}); + if (i + length + 8 <= byteMessage.length) { + Bytes bytes = new Bytes(); + bytes.append(byteMessage[i]).append(byteMessage[i + 1]).append(byteMessage[i + 2]).append(byteMessage[i + 3]); //FINS帧头 + bytes.append(byteMessage[i + 4]).append(byteMessage[i + 5]).append(byteMessage[i + 6]).append(byteMessage[i + 7]); //FINS长度 + + // FINS的数据区 + for (int j = 0; j < length; j++) { + bytes.append(byteMessage[i + 8 + j]); + } + + i = i + length + 8; + bytesList.add(bytes.toBytes()); + count++; + } else { + i++; + } + } else { + i++; + } + } + } catch (Exception e) { + e.printStackTrace(); + bytesList.clear(); + bytesList.add(byteMessage); + return bytesList; + } + + if (count == 0) { + bytesList.add(byteMessage); + } + + return bytesList; + } /** * 将字节数组解析为收到的消息对象 @@ -59,7 +113,7 @@ // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - int count = FINSByteFrameTool.getDataWithoutEndCode(byteMessage).length; + int count = FINSByteFrameTool.getDataWithoutEndCode(byteMessage).length / 2; //1WORD=2BYTE // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 PgAcuRdcmdDao readCmdDao = new PgAcuRdcmdDaoImpl(); @@ -71,6 +125,11 @@ switch(commandType) { case AppMessageConstants.CMD_TYPE_READCH4PARAM: received = bytesToReadCH4ParamCommand(finsFrame); + break; + + case AppMessageConstants.CMD_TYPE_READCH4STATUS: + received = bytesToReadCH4StatusCommand(finsFrame, readCmd.getCount_bit()); + break; } // 4将有效的命令的是否有响应字段置1 @@ -260,6 +319,7 @@ return received; } + /** * 将握手响应字节数组转换为消息对象 * @@ -315,6 +375,35 @@ return rcpcr; } + + + /** + * 将查询甲烷报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4StatusCommand(FINSByteFrame finsFrame, int countBit) { + ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int chct = countBit / 2; //甲烷监测点的数量/每个甲烷点位的参数包括2个变量、每个变量占1个位 + String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //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); + + rcscr.getJwbj().add(bjBit == '1' ? true : false); + rcscr.getJwldbj().add(ldBit == '1' ? true : false); + } + } + + return rcscr; + } // // /** // * 将查询终端地址响应消息字节数组解析为消息对象AFN=50H @@ -3421,6 +3510,8 @@ // 读取甲烷参数内存命令 if (message instanceof ReadCH4ParamCommand) { frame = ReadCH4ParamCommandToBytes((ReadCH4ParamCommand) message); + } else if (message instanceof ReadCH4StatusCommand) { + frame = ReadCH4StatusCommandToBytes((ReadCH4StatusCommand) message); } // // 读内存命令 @@ -3449,7 +3540,7 @@ } /** - * 将读取甲烷参数内存命令转换为字节数组 + * 将读取甲烷监测值命令转换为字节数组 * @param read * @return */ @@ -3460,62 +3551,28 @@ read.getMessageProducerId(), read.getMemoryArea(), start, - read.getCount()); + read.getCountWord()); return finsFrame.toBytes(); } /** - * 从重叠消息中提取规范消息 + * 将读取甲烷报警状态命令转换为字节数组 + * @param message + * @return */ - @Override - public List extractByteMessage(byte[] byteMessage) { - List bytesList = new ArrayList(); - int count = 0; + private byte[] ReadCH4StatusCommandToBytes(ReadCH4StatusCommand message) { + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - try { - int i = 0; - while (i < byteMessage.length) { - if (byteMessage[i] == FINSByteFrame.HEADER[0] && - byteMessage[i + 1] == FINSByteFrame.HEADER[1] && - byteMessage[i + 2] == FINSByteFrame.HEADER[2] && - byteMessage[i + 3] == FINSByteFrame.HEADER[3]) { - - // 匹配上FINS帧头 - int length = ByteUtil.binToInt(new byte[]{byteMessage[i + 4], byteMessage[i + 5], byteMessage[i + 6], byteMessage[i + 7]}); - if (i + length + 8 <= byteMessage.length) { - Bytes bytes = new Bytes(); - bytes.append(byteMessage[i]).append(byteMessage[i + 1]).append(byteMessage[i + 2]).append(byteMessage[i + 3]); //FINS帧头 - bytes.append(byteMessage[i + 4]).append(byteMessage[i + 5]).append(byteMessage[i + 6]).append(byteMessage[i + 7]); //FINS长度 - - // FINS的数据区 - for (int j = 0; j < length; j++) { - bytes.append(byteMessage[i + 8 + j]); - } - - i = i + length + 8; - bytesList.add(bytes.toBytes()); - count++; - } else { - i++; - } - } else { - i++; - } - } - } catch (Exception e) { - e.printStackTrace(); - bytesList.clear(); - bytesList.add(byteMessage); - return bytesList; - } - - if (count == 0) { - bytesList.add(byteMessage); - } - - return bytesList; + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getMemoryArea(), + start, + message.getCountWord()); + + return finsFrame.toBytes(); } + // /** // * 将退出登录命令对象转换为字节数组AFN=02H diff --git a/src/com/szpg/plc/server/ACUClientUtil.java b/src/com/szpg/plc/server/ACUClientUtil.java index f3f8f0e..576cb3f 100644 --- a/src/com/szpg/plc/server/ACUClientUtil.java +++ b/src/com/szpg/plc/server/ACUClientUtil.java @@ -84,8 +84,6 @@ public void sendACUCommand(ACUClient client, byte[] content) { // 判断channel并发送消息 if (null != client.getChannel() && client.getChannel().isActive() == true) { -// pool.pushMessage(content); - // 通过socket发送消息并记录日志 ACUClientUtil.send.info(ByteUtil.binToHexString(content)); diff --git a/src/ACUBL.properties b/src/ACUBL.properties index d3be57b..12a50a2 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -1,3 +1,28 @@ #ACU\u53d8\u91cf\u8868\u914d\u7f6e\u6587\u4ef6 -YXL.ACU001.DCH.START = 0300 -YXL.ACU001.DCH.COUNT = 48 \ No newline at end of file + +######## YXL.ACU001 ######## +#\u7532\u70f7\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.CH.COUNT = 6 +#\u7532\u70f7\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 +YXL.ACU001.CH.START = 0300 +#\u7532\u70f7\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 +YXL.ACU001.CH.WORDCOUNT = 24 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.CHALM.START = 0026 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.CHALM.WORDCOUNT = 1 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.CHALM.BITCOUNT = 12 + +#\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.WS.COUNT = 6 +#\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 +YXL.ACU001.WS.START = 0400 +#\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 +YXL.ACU001.WS.WORDCOUNT = 74 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.WSALM.START = 0030 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.WSALM.WORDCOUNT = 3 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.WSALM.BITCOUNT = 12 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index bacf942..46e331c 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -6,13 +6,15 @@ import com.szpg.db.dao.impl.PgAcuDaoImpl; import com.szpg.db.data.PgAcu; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; public class DSCTest { @@ -20,7 +22,7 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.107", 6800); + ACUClient client = new ACUClient("192.168.8.105", 6800); client.setNet("00"); client.setNode("6B"); @@ -33,13 +35,21 @@ new ScheduledThreadPoolExecutor(1).scheduleAtFixedRate(new ACUSocketCheckTask(client), 0, 30, TimeUnit.SECONDS); // 测试发送查询甲烷参数命令 - dsc.testSendCH4Command(client); +// dsc.testSendCH4Command(client); + + // 测试发送查询甲烷报警状态命令 + dsc.testSendCH4StatsuCommand(client); // System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); } - private void testSendCH4Command(ACUClient client) { - ReadCH4ParamCommand ch4 = new ReadCH4ParamCommand(); + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + public void testSendCH4Command(ACUClient client) { + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -51,11 +61,38 @@ ch4.setMemoryArea(FINSConstants.MEMORY_DM_AREA); - ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.DCH.START")))) + "00"); - ch4.setCount(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.DCH.COUNT"))); + ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); + ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); + ch4.setCountBit(0); //读取监测值时位数量无效 ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 15, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + public void testSendCH4StatsuCommand(ACUClient client) { + ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ch4alm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ch4alm.setDestinationId(dest); + + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + 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"))); + ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index e5e8175..5c81046 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -3,6 +3,7 @@ import java.util.List; import com.szpg.db.data.PgCh4; +import com.szpg.db.data.PgCh4Alm; /** * 甲烷相关参数读写的数据库接口 @@ -11,6 +12,7 @@ */ public interface PgCh4Dao { + /******** 甲烷浓度变量值 ********/ public List findAllPblz(); public PgCh4 findPblzById(Integer id); @@ -19,4 +21,15 @@ public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); + + + /******** 甲烷浓度报警状态 ********/ + public List findAllSbjz(); + public PgCh4Alm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgCh4Alm ch4alm); + 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 3db493e..3c7e9e3 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -120,9 +120,9 @@ Connection conn = null; String insertStr = "INSERT INTO PG_ACU_RDCMD " + - "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, RESPONSED, TIMEOUT) " + - "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, '0', '0')"; - Object[] params = new Object[8]; + "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, RESPONSED, TIMEOUT) " + + "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, '0', '0')"; + Object[] params = new Object[9]; params[0] = cmd.getId(); params[1] = TimeFormat.format(cmd.getTm(), "yyyyMMddHHmmss"); params[2] = cmd.getCmd_type(); @@ -131,6 +131,7 @@ params[5] = cmd.getStart_mem_word(); params[6] = cmd.getStart_mem_bit(); params[7] = cmd.getCount_word(); + params[8] = cmd.getCount_bit(); try { conn = ConnectionManager.getConnectionFromC3P0(); diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 9d693a8..aac45e6 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -13,6 +13,7 @@ import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.data.PgCh4; +import com.szpg.db.data.PgCh4Alm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -259,4 +260,243 @@ return 0; } + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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++) { + PgCh4Alm ch4alm = new PgCh4Alm(); + Object[] item = tempList.get(i); + + ch4alm.setId(((Number) item[0]).intValue()); + ch4alm.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4alm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4alm.setLogtime(cal.getTime()); + ch4alm.setUptime(cal.getTime()); + + list.add(ch4alm); + } + 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 PgCh4Alm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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) { + PgCh4Alm ch4 = new PgCh4Alm(); + Object[] item = tempList.get(0); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + logger.debug("根据ID查询甲烷报警状态成功" + ch4 + "]"); + + return ch4; + } + 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, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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++) { + PgCh4Alm ch4 = new PgCh4Alm(); + Object[] item = tempList.get(i); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + list.add(ch4); + } + 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, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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++) { + PgCh4Alm ch4 = new PgCh4Alm(); + Object[] item = tempList.get(i); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + list.add(ch4); + } + 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(PgCh4Alm ch4alm) { + return addSbjzRecord(ch4alm.getCh4alm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_CH4_ALM " + + "(CH4ALM, 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 38f8667..095bbb8 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -11,11 +11,11 @@ * */ public class PgAcuRdcmd implements java.io.Serializable { - + /** * */ - private static final long serialVersionUID = -3187227934289186463L; + private static final long serialVersionUID = -605179003596292814L; private String id; // ID private Date tm; // 命令发送时间 @@ -25,6 +25,7 @@ private String start_mem_word; // 起始内存字地址 private String start_mem_bit; // 起始内存位地址 private Integer count_word; // 读取的字数量 + private Integer count_bit; //读取的位数量 private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 @@ -92,6 +93,14 @@ this.count_word = count_word; } + public Integer getCount_bit() { + return count_bit; + } + + public void setCount_bit(Integer count_bit) { + this.count_bit = count_bit; + } + public boolean isResponsed() { return responsed; } diff --git a/src/com/szpg/db/data/PgCh4Alm.java b/src/com/szpg/db/data/PgCh4Alm.java new file mode 100644 index 0000000..392a567 --- /dev/null +++ b/src/com/szpg/db/data/PgCh4Alm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 甲烷浓度报警状态数据表 + * + * @author admin + * + */ +public class PgCh4Alm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = -109172405679187040L; + + private Integer id; + private Boolean ch4alm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getCh4alm() { + return ch4alm; + } + + public void setCh4alm(Boolean ch4alm) { + this.ch4alm = ch4alm; + } + + 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 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 ""; + } + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgCh4[ch4=" + ch4alm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java index 96dc762..8422d1b 100644 --- a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java +++ b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java @@ -2,8 +2,6 @@ import static org.junit.Assert.assertEquals; -import java.util.Calendar; - import org.junit.Before; import org.junit.Test; @@ -11,8 +9,9 @@ import com.szpg.db.dao.impl.PgAcuRdcmdDaoImpl; import com.szpg.db.data.PgAcuRdcmd; import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.util.ByteUtil; +import com.szpg.util.Configure; public class PgAcuRdcmdDaoTest { @@ -25,38 +24,40 @@ // @Test public void testAdd() { - ReadCH4ParamCommand ch4 = new ReadCH4ParamCommand(); + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); ch4.setDestinationId("006B00"); ch4.setMessageProducerId("00F400"); - ch4.setMemoryArea((byte) 0x82); - ch4.setStartAddress("012C00"); - ch4.setCount(24); + ch4.setMemoryArea((byte) 0x31); + ch4.setStartAddress("001A00"); + ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.CHALM.WORDCOUNT"))); + ch4.setCountBit(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.CHALM.BITCOUNT"))); PgAcuRdcmd cmd = new PgAcuRdcmd(); cmd.setId(ch4.getId()); - cmd.setTm(Calendar.getInstance().getTime()); - cmd.setCmd_type(AppMessageConstants.CMD_TYPE_READCH4STATUS); + cmd.setTm(ch4.getTime().getTime()); + cmd.setCmd_type(ch4.getCommandType()); cmd.setDest(ch4.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] {ch4.getMemoryArea()})); cmd.setStart_mem_word(ch4.getStartAddress().substring(0, 4)); cmd.setStart_mem_bit(ch4.getStartAddress().substring(4)); - cmd.setCount_word(ch4.getCount()); + cmd.setCount_word(ch4.getCountWord()); + cmd.setCount_bit(ch4.getCountBit()); assertEquals(1, dao.addCmdRecord(cmd)); } -// @Test + @Test public void testFindAll() { - assertEquals(1, dao.findAll()); + assertEquals(1, dao.findAll().size()); } @Test public void testFindByDestAndCount() { - assertEquals("11", dao.findLatestCmdByDestAndCount("006B00", 24).getCmd_type()); + assertEquals("12", dao.findLatestCmdByDestAndCount("006B00", 1).getCmd_type()); } - @Test +// @Test public void testUpdateResponsed() { assertEquals(1, dao.updateCmdRecordResponsed("23ff9e2987e64f248823254f0dfe1528")); } diff --git a/src/com/szpg/db/test/PgCH4DaoTest.java b/src/com/szpg/db/test/PgCH4DaoTest.java index 8c1c49f..8377965 100644 --- a/src/com/szpg/db/test/PgCH4DaoTest.java +++ b/src/com/szpg/db/test/PgCH4DaoTest.java @@ -28,12 +28,27 @@ @Test public void testFindAllParam() { - assertEquals("20180115131918", dao.findAllPblz().get(0).getTmStrGB()); + assertEquals("20180115171555", dao.findAllPblz().get(0).getTmStrGB()); } @Test public void testFindParamById() { - Assert.assertEquals(dao.findPblzById(1).getTmStrGB(), "20180115131918"); + Assert.assertEquals(dao.findPblzById(2).getTmStrGB(), "20180115171555"); + } + +// @Test + public void testAddStatusRecord() { + assertEquals(2, dao.addSbjzRecord(false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 1)); + } + + @Test + public void testFindAllStatus() { + assertEquals("20180115183307", dao.findAllSbjz().get(0).getTmStrGB()); + } + + @Test + public void testFindStatusById() { + Assert.assertEquals(dao.findSbjzById(1).getTmStrGB(), "20180115183307"); } } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index 7e9c937..15ccc72 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -3,6 +3,7 @@ import com.szpg.plc.message.AppCommand; import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -13,7 +14,8 @@ private byte memoryArea; //读取的内存区域代码 private String startAddress; //起始地址 - private int count; //读取的数量,以word(2字节)计算 + private int countWord; //读取的字数量/1WORD=2BYTE + private int countBit; //读取的位数量 public byte getMemoryArea() { return memoryArea; @@ -31,21 +33,34 @@ this.startAddress = startAddress; } - public int getCount() { - return count; + public int getCountWord() { + return countWord; } - public void setCount(int count) { - this.count = count; + public void setCountWord(int countWord) { + this.countWord = countWord; } - public ReadMemoryCommand getInstance(String type) { + public int getCountBit() { + return countBit; + } + + public void setCountBit(int countBit) { + this.countBit = countBit; + } + + public static ReadMemoryCommand getInstance(String type) { switch (type) { case AppMessageConstants.CMD_TYPE_READCH4PARAM: return new ReadCH4ParamCommand(); + + case AppMessageConstants.CMD_TYPE_READCH4STATUS: + return new ReadCH4StatusCommand(); default: return null; } } + + public abstract String getCommandType(); } diff --git a/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java b/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java index 73e5395..5b573f5 100644 --- a/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java +++ b/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java @@ -1,15 +1,16 @@ 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.ReadCH4ParamCommandResponse; public class ReadCH4ParamCommand extends ReadMemoryCommand { - + /** * */ - private static final long serialVersionUID = -8356882767656717757L; - + private static final long serialVersionUID = -4042536900405234254L; + @Override public Class getResponseClass() { return ReadCH4ParamCommandResponse.class; @@ -17,7 +18,12 @@ @Override public String toString() { - return "向终端[" + getDestinationId() + "]发送查询甲烷参数命令"; + return "向终端[" + getDestinationId() + "]发送查询甲烷监测值命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READCH4PARAM; } } diff --git a/src/com/szpg/plc/message/command/read/ReadCH4StatusCommand.java b/src/com/szpg/plc/message/command/read/ReadCH4StatusCommand.java new file mode 100644 index 0000000..790e7ff --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadCH4StatusCommand.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.ReadCH4StatusCommandResponse; + +public class ReadCH4StatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 6508070196810920169L; + + @Override + public Class getResponseClass() { + return ReadCH4StatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询甲烷报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READCH4STATUS; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4StatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4StatusCommandResponse.java new file mode 100644 index 0000000..0d35015 --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadCH4StatusCommandResponse.java @@ -0,0 +1,69 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgCh4Dao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgCh4DaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadCH4StatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = -4647640298404084468L; + + private List jwbj; // 甲烷浓度报警状态 + private List jwldbj; // 甲烷是否联动报警 + + public ReadCH4StatusCommandResponse() { + jwbj = new ArrayList(); + jwldbj = new ArrayList(); + } + + public List getJwbj() { + return jwbj; + } + + public void setJwbj(List jwbj) { + this.jwbj = jwbj; + } + + public List getJwldbj() { + return jwldbj; + } + + public void setJwldbj(List jwldbj) { + this.jwldbj = jwldbj; + } + + @Override + public void afterAction() { + // 1将甲烷浓度数据存入数据库 + PgCh4Dao ch4Dao = new PgCh4DaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findCH4DeviceIdByDest(this.getMessageProducerId()); + + for (int i = 0; i < jwbj.size(); i++) { + if (i < ids.size()) { + ch4Dao.addSbjzRecord(jwbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (jwbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + + // 2发送查询报警值的命令 + + } + } + } + } + +} diff --git a/src/com/szpg/plc/protocol/DTProtocolInterface.java b/src/com/szpg/plc/protocol/DTProtocolInterface.java index 0a65694..f50a3e3 100644 --- a/src/com/szpg/plc/protocol/DTProtocolInterface.java +++ b/src/com/szpg/plc/protocol/DTProtocolInterface.java @@ -6,6 +6,13 @@ public interface DTProtocolInterface { + + /** + * 从字节流中提取符合规范的消息字节 + * @param byteMessage + * @return + */ + public List extractByteMessage(byte[] byteMessage); /** * 解析消息为应用对象 @@ -22,12 +29,5 @@ * @return */ public byte[] messageToBytes(AppMessage message); - - - /** - * 从字节流中提取符合规范的消息字节 - * @param byteMessage - * @return - */ - public List extractByteMessage(byte[] byteMessage); + } diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index b0bb4a3..12d1c18 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -14,8 +14,10 @@ import com.szpg.plc.message.UnKnownMessage; import com.szpg.plc.message.command.LinkCommand; import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.command.read.ReadCH4StatusCommand; import com.szpg.plc.message.response.LinkCommandResponse; import com.szpg.plc.message.response.read.ReadCH4ParamCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; import com.szpg.plc.protocol.DTProtocolInterface; import com.szpg.plc.protocol.fins.frame.FINSByteFrame; import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; @@ -25,6 +27,58 @@ public class FINSDTProtocolImp implements DTProtocolInterface { private final Logger logger = Logger.getLogger(this.getClass().getName()); // 输出到message + + /** + * 从重叠消息中提取规范消息 + */ + @Override + public List extractByteMessage(byte[] byteMessage) { + List bytesList = new ArrayList(); + int count = 0; + + try { + int i = 0; + while (i < byteMessage.length) { + if (byteMessage[i] == FINSByteFrame.HEADER[0] && + byteMessage[i + 1] == FINSByteFrame.HEADER[1] && + byteMessage[i + 2] == FINSByteFrame.HEADER[2] && + byteMessage[i + 3] == FINSByteFrame.HEADER[3]) { + + // 匹配上FINS帧头 + int length = ByteUtil.binToInt(new byte[]{byteMessage[i + 4], byteMessage[i + 5], byteMessage[i + 6], byteMessage[i + 7]}); + if (i + length + 8 <= byteMessage.length) { + Bytes bytes = new Bytes(); + bytes.append(byteMessage[i]).append(byteMessage[i + 1]).append(byteMessage[i + 2]).append(byteMessage[i + 3]); //FINS帧头 + bytes.append(byteMessage[i + 4]).append(byteMessage[i + 5]).append(byteMessage[i + 6]).append(byteMessage[i + 7]); //FINS长度 + + // FINS的数据区 + for (int j = 0; j < length; j++) { + bytes.append(byteMessage[i + 8 + j]); + } + + i = i + length + 8; + bytesList.add(bytes.toBytes()); + count++; + } else { + i++; + } + } else { + i++; + } + } + } catch (Exception e) { + e.printStackTrace(); + bytesList.clear(); + bytesList.add(byteMessage); + return bytesList; + } + + if (count == 0) { + bytesList.add(byteMessage); + } + + return bytesList; + } /** * 将字节数组解析为收到的消息对象 @@ -59,7 +113,7 @@ // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - int count = FINSByteFrameTool.getDataWithoutEndCode(byteMessage).length; + int count = FINSByteFrameTool.getDataWithoutEndCode(byteMessage).length / 2; //1WORD=2BYTE // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 PgAcuRdcmdDao readCmdDao = new PgAcuRdcmdDaoImpl(); @@ -71,6 +125,11 @@ switch(commandType) { case AppMessageConstants.CMD_TYPE_READCH4PARAM: received = bytesToReadCH4ParamCommand(finsFrame); + break; + + case AppMessageConstants.CMD_TYPE_READCH4STATUS: + received = bytesToReadCH4StatusCommand(finsFrame, readCmd.getCount_bit()); + break; } // 4将有效的命令的是否有响应字段置1 @@ -260,6 +319,7 @@ return received; } + /** * 将握手响应字节数组转换为消息对象 * @@ -315,6 +375,35 @@ return rcpcr; } + + + /** + * 将查询甲烷报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4StatusCommand(FINSByteFrame finsFrame, int countBit) { + ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int chct = countBit / 2; //甲烷监测点的数量/每个甲烷点位的参数包括2个变量、每个变量占1个位 + String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //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); + + rcscr.getJwbj().add(bjBit == '1' ? true : false); + rcscr.getJwldbj().add(ldBit == '1' ? true : false); + } + } + + return rcscr; + } // // /** // * 将查询终端地址响应消息字节数组解析为消息对象AFN=50H @@ -3421,6 +3510,8 @@ // 读取甲烷参数内存命令 if (message instanceof ReadCH4ParamCommand) { frame = ReadCH4ParamCommandToBytes((ReadCH4ParamCommand) message); + } else if (message instanceof ReadCH4StatusCommand) { + frame = ReadCH4StatusCommandToBytes((ReadCH4StatusCommand) message); } // // 读内存命令 @@ -3449,7 +3540,7 @@ } /** - * 将读取甲烷参数内存命令转换为字节数组 + * 将读取甲烷监测值命令转换为字节数组 * @param read * @return */ @@ -3460,62 +3551,28 @@ read.getMessageProducerId(), read.getMemoryArea(), start, - read.getCount()); + read.getCountWord()); return finsFrame.toBytes(); } /** - * 从重叠消息中提取规范消息 + * 将读取甲烷报警状态命令转换为字节数组 + * @param message + * @return */ - @Override - public List extractByteMessage(byte[] byteMessage) { - List bytesList = new ArrayList(); - int count = 0; + private byte[] ReadCH4StatusCommandToBytes(ReadCH4StatusCommand message) { + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - try { - int i = 0; - while (i < byteMessage.length) { - if (byteMessage[i] == FINSByteFrame.HEADER[0] && - byteMessage[i + 1] == FINSByteFrame.HEADER[1] && - byteMessage[i + 2] == FINSByteFrame.HEADER[2] && - byteMessage[i + 3] == FINSByteFrame.HEADER[3]) { - - // 匹配上FINS帧头 - int length = ByteUtil.binToInt(new byte[]{byteMessage[i + 4], byteMessage[i + 5], byteMessage[i + 6], byteMessage[i + 7]}); - if (i + length + 8 <= byteMessage.length) { - Bytes bytes = new Bytes(); - bytes.append(byteMessage[i]).append(byteMessage[i + 1]).append(byteMessage[i + 2]).append(byteMessage[i + 3]); //FINS帧头 - bytes.append(byteMessage[i + 4]).append(byteMessage[i + 5]).append(byteMessage[i + 6]).append(byteMessage[i + 7]); //FINS长度 - - // FINS的数据区 - for (int j = 0; j < length; j++) { - bytes.append(byteMessage[i + 8 + j]); - } - - i = i + length + 8; - bytesList.add(bytes.toBytes()); - count++; - } else { - i++; - } - } else { - i++; - } - } - } catch (Exception e) { - e.printStackTrace(); - bytesList.clear(); - bytesList.add(byteMessage); - return bytesList; - } - - if (count == 0) { - bytesList.add(byteMessage); - } - - return bytesList; + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getMemoryArea(), + start, + message.getCountWord()); + + return finsFrame.toBytes(); } + // /** // * 将退出登录命令对象转换为字节数组AFN=02H diff --git a/src/com/szpg/plc/server/ACUClientUtil.java b/src/com/szpg/plc/server/ACUClientUtil.java index f3f8f0e..576cb3f 100644 --- a/src/com/szpg/plc/server/ACUClientUtil.java +++ b/src/com/szpg/plc/server/ACUClientUtil.java @@ -84,8 +84,6 @@ public void sendACUCommand(ACUClient client, byte[] content) { // 判断channel并发送消息 if (null != client.getChannel() && client.getChannel().isActive() == true) { -// pool.pushMessage(content); - // 通过socket发送消息并记录日志 ACUClientUtil.send.info(ByteUtil.binToHexString(content)); diff --git a/src/com/szpg/task/ReadCH4ParamTask.java b/src/com/szpg/task/ReadCH4ParamTask.java index b4276ec..3570a07 100644 --- a/src/com/szpg/task/ReadCH4ParamTask.java +++ b/src/com/szpg/task/ReadCH4ParamTask.java @@ -3,7 +3,6 @@ import com.szpg.db.dao.impl.PgAcuRdcmdDaoImpl; import com.szpg.db.data.PgAcuRdcmd; import com.szpg.plc.message.AppCommand; -import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.read.ReadCH4ParamCommand; import com.szpg.plc.protocol.DTProtocolInterface; import com.szpg.plc.protocol.ProtocolFactory; @@ -25,7 +24,7 @@ public void run() { DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); byte[] content = finspi.messageToBytes(appCommand); - + // 发送读取甲烷参数内存命令 ACUClientUtil.getInstance().sendACUCommand(client, content); @@ -35,12 +34,13 @@ PgAcuRdcmd cmd = new PgAcuRdcmd(); cmd.setId(ch4Cmd.getId()); cmd.setTm(ch4Cmd.getTime().getTime()); - cmd.setCmd_type(AppMessageConstants.CMD_TYPE_READCH4PARAM); + cmd.setCmd_type(ch4Cmd.getCommandType()); cmd.setDest(ch4Cmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { ch4Cmd.getMemoryArea() })); cmd.setStart_mem_word(ch4Cmd.getStartAddress().substring(0, 4)); cmd.setStart_mem_bit(ch4Cmd.getStartAddress().substring(4)); - cmd.setCount_word(ch4Cmd.getCount()); + cmd.setCount_word(ch4Cmd.getCountWord()); + cmd.setCount_bit(ch4Cmd.getCountBit()); new PgAcuRdcmdDaoImpl().addCmdRecord(cmd); } diff --git a/src/ACUBL.properties b/src/ACUBL.properties index d3be57b..12a50a2 100644 --- a/src/ACUBL.properties +++ b/src/ACUBL.properties @@ -1,3 +1,28 @@ #ACU\u53d8\u91cf\u8868\u914d\u7f6e\u6587\u4ef6 -YXL.ACU001.DCH.START = 0300 -YXL.ACU001.DCH.COUNT = 48 \ No newline at end of file + +######## YXL.ACU001 ######## +#\u7532\u70f7\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.CH.COUNT = 6 +#\u7532\u70f7\u6d53\u5ea6\u53c2\u6570\u8d77\u59cb\u5730\u5740 +YXL.ACU001.CH.START = 0300 +#\u7532\u70f7\u6d53\u5ea6\u53c2\u6570\u6240\u5360\u5b57\u6570 +YXL.ACU001.CH.WORDCOUNT = 24 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.CHALM.START = 0026 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.CHALM.WORDCOUNT = 1 +#\u7532\u70f7\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.CHALM.BITCOUNT = 12 + +#\u6e29\u6e7f\u5ea6\u4f20\u611f\u5668\u6570\u91cf +YXL.ACU001.WS.COUNT = 6 +#\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u8d77\u59cb\u5730\u5740 +YXL.ACU001.WS.START = 0400 +#\u6e29\u6e7f\u5ea6\u76d1\u6d4b\u503c\u6240\u5360\u5b57\u6570 +YXL.ACU001.WS.WORDCOUNT = 74 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u8d77\u59cb\u5730\u5740 +YXL.ACU001.WSALM.START = 0030 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u6240\u5360\u5b57\u6570 +YXL.ACU001.WSALM.WORDCOUNT = 3 +#\u6e29\u6e7f\u5ea6\u62a5\u8b66\u72b6\u6001\u6240\u5360\u4f4d\u6570 +YXL.ACU001.WSALM.BITCOUNT = 12 diff --git a/src/com/szpg/DSCTest.java b/src/com/szpg/DSCTest.java index bacf942..46e331c 100644 --- a/src/com/szpg/DSCTest.java +++ b/src/com/szpg/DSCTest.java @@ -6,13 +6,15 @@ import com.szpg.db.dao.impl.PgAcuDaoImpl; import com.szpg.db.data.PgAcu; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.AppMessageConstants; +import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.protocol.fins.FINSConstants; import com.szpg.plc.server.ACUClient; import com.szpg.plc.server.ACUClientUtil; import com.szpg.plc.util.ByteUtil; import com.szpg.task.ACUSocketCheckTask; import com.szpg.task.ReadCH4ParamTask; +import com.szpg.task.ReadCH4StatusTask; import com.szpg.util.Configure; public class DSCTest { @@ -20,7 +22,7 @@ private static DSCTest dsc = new DSCTest(); public static void main(String[] args) { - ACUClient client = new ACUClient("192.168.8.107", 6800); + ACUClient client = new ACUClient("192.168.8.105", 6800); client.setNet("00"); client.setNode("6B"); @@ -33,13 +35,21 @@ new ScheduledThreadPoolExecutor(1).scheduleAtFixedRate(new ACUSocketCheckTask(client), 0, 30, TimeUnit.SECONDS); // 测试发送查询甲烷参数命令 - dsc.testSendCH4Command(client); +// dsc.testSendCH4Command(client); + + // 测试发送查询甲烷报警状态命令 + dsc.testSendCH4StatsuCommand(client); // System.out.println(Float.intBitsToFloat(Integer.parseInt("3F4054F5",16))); } - private void testSendCH4Command(ACUClient client) { - ReadCH4ParamCommand ch4 = new ReadCH4ParamCommand(); + /** + * 发送查询甲烷监测值命令 + * + * @param client + */ + public void testSendCH4Command(ACUClient client) { + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4PARAM); String sour = Configure.getProperty("sys", "LOCALHOST.NET") + Configure.getProperty("sys", "LOCALHOST.NODE") + Configure.getProperty("sys", "LOCALHOST.UNIT"); @@ -51,11 +61,38 @@ ch4.setMemoryArea(FINSConstants.MEMORY_DM_AREA); - ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.DCH.START")))) + "00"); - ch4.setCount(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.DCH.COUNT"))); + ch4.setStartAddress(ByteUtil.binToHexString(ByteUtil.intToBins(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.START")), 2)) + "00"); + ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CH.WORDCOUNT"))); + ch4.setCountBit(0); //读取监测值时位数量无效 ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); - sche.schedule(new ReadCH4ParamTask(client, ch4), 15, TimeUnit.SECONDS); + sche.schedule(new ReadCH4ParamTask(client, ch4), 12, TimeUnit.SECONDS); + sche.shutdown(); //执行完任务之后关闭线程 + } + + /** + * 发送查询甲烷报警状态命令 + * @param client + */ + public void testSendCH4StatsuCommand(ACUClient client) { + ReadMemoryCommand ch4alm = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); + String sour = Configure.getProperty("sys", "LOCALHOST.NET") + + Configure.getProperty("sys", "LOCALHOST.NODE") + + Configure.getProperty("sys", "LOCALHOST.UNIT"); + ch4alm.setMessageProducerId(sour); + + PgAcu acu = new PgAcuDaoImpl().findACUById(1); + String dest = acu.getAcu_net() + acu.getAcu_node() + acu.getAcu_unit(); + ch4alm.setDestinationId(dest); + + ch4alm.setMemoryArea(FINSConstants.MEMORY_WORK_AREA); + + 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"))); + ch4alm.setCountBit(Integer.parseInt(Configure.getProperty("acubl", acu.getAcu_code() + ".CHALM.BITCOUNT"))); + + ScheduledExecutorService sche = new ScheduledThreadPoolExecutor(1); + sche.schedule(new ReadCH4StatusTask(client, ch4alm), 15, TimeUnit.SECONDS); sche.shutdown(); //执行完任务之后关闭线程 } } diff --git a/src/com/szpg/db/dao/PgCh4Dao.java b/src/com/szpg/db/dao/PgCh4Dao.java index e5e8175..5c81046 100644 --- a/src/com/szpg/db/dao/PgCh4Dao.java +++ b/src/com/szpg/db/dao/PgCh4Dao.java @@ -3,6 +3,7 @@ import java.util.List; import com.szpg.db.data.PgCh4; +import com.szpg.db.data.PgCh4Alm; /** * 甲烷相关参数读写的数据库接口 @@ -11,6 +12,7 @@ */ public interface PgCh4Dao { + /******** 甲烷浓度变量值 ********/ public List findAllPblz(); public PgCh4 findPblzById(Integer id); @@ -19,4 +21,15 @@ public int addPblzRecord(PgCh4 ch4); public int addPblzRecord(float value, String tm, int deviceid); + + + /******** 甲烷浓度报警状态 ********/ + public List findAllSbjz(); + public PgCh4Alm findSbjzById(Integer id); + + public List findSbjzByDevice(Integer deviceid); + public List findSbjzByDeviceAndTm(Integer deviceid, String start, String end); + + public int addSbjzRecord(PgCh4Alm ch4alm); + 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 3db493e..3c7e9e3 100644 --- a/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgAcuRdcmdDaoImpl.java @@ -120,9 +120,9 @@ Connection conn = null; String insertStr = "INSERT INTO PG_ACU_RDCMD " + - "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, RESPONSED, TIMEOUT) " + - "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, '0', '0')"; - Object[] params = new Object[8]; + "(ID, TM, CMD_TYPE, DEST, MEM_AREA_CD, START_MEM_WORD, START_MEM_BIT, COUNT_WORD, COUNT_BIT, RESPONSED, TIMEOUT) " + + "VALUES (?, TO_DATE(?, 'YYYYMMDDHH24MISS'), ?, ?, ?, ?, ?, ?, ?, '0', '0')"; + Object[] params = new Object[9]; params[0] = cmd.getId(); params[1] = TimeFormat.format(cmd.getTm(), "yyyyMMddHHmmss"); params[2] = cmd.getCmd_type(); @@ -131,6 +131,7 @@ params[5] = cmd.getStart_mem_word(); params[6] = cmd.getStart_mem_bit(); params[7] = cmd.getCount_word(); + params[8] = cmd.getCount_bit(); try { conn = ConnectionManager.getConnectionFromC3P0(); diff --git a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java index 9d693a8..aac45e6 100644 --- a/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java +++ b/src/com/szpg/db/dao/impl/PgCh4DaoImpl.java @@ -13,6 +13,7 @@ import com.szpg.db.dao.PgCh4Dao; import com.szpg.db.data.PgCh4; +import com.szpg.db.data.PgCh4Alm; import com.szpg.db.util.ConnectionManager; import com.szpg.util.NumberFormat; @@ -259,4 +260,243 @@ return 0; } + @Override + public List findAllSbjz() { + Connection conn = null; + + String queryStr = "SELECT ID, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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++) { + PgCh4Alm ch4alm = new PgCh4Alm(); + Object[] item = tempList.get(i); + + ch4alm.setId(((Number) item[0]).intValue()); + ch4alm.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4alm.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4alm.setLogtime(cal.getTime()); + ch4alm.setUptime(cal.getTime()); + + list.add(ch4alm); + } + 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 PgCh4Alm findSbjzById(Integer id) { + Connection conn = null; + + String queryStr = "SELECT ID, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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) { + PgCh4Alm ch4 = new PgCh4Alm(); + Object[] item = tempList.get(0); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + logger.debug("根据ID查询甲烷报警状态成功" + ch4 + "]"); + + return ch4; + } + 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, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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++) { + PgCh4Alm ch4 = new PgCh4Alm(); + Object[] item = tempList.get(i); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + list.add(ch4); + } + 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, CH4ALM, LOGTIME, PGDEVICEID FROM PG_CH4_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++) { + PgCh4Alm ch4 = new PgCh4Alm(); + Object[] item = tempList.get(i); + + ch4.setId(((Number) item[0]).intValue()); + ch4.setCh4alm(Boolean.parseBoolean((String) item[1])); + ch4.setPgdeviceid(((Number) item[3]).intValue()); + + long tmValue = ((java.sql.Timestamp) ((oracle.sql.TIMESTAMP) item[2]).toJdbc()).getTime(); + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(tmValue); + ch4.setLogtime(cal.getTime()); + ch4.setUptime(cal.getTime()); + + list.add(ch4); + } + 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(PgCh4Alm ch4alm) { + return addSbjzRecord(ch4alm.getCh4alm(), ch4alm.getTmStr(), ch4alm.getPgdeviceid()); + } + + @Override + public int addSbjzRecord(boolean status, String tm, int deviceid) { + Connection conn = null; + + String insertStr = "INSERT INTO PG_CH4_ALM " + + "(CH4ALM, 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 38f8667..095bbb8 100644 --- a/src/com/szpg/db/data/PgAcuRdcmd.java +++ b/src/com/szpg/db/data/PgAcuRdcmd.java @@ -11,11 +11,11 @@ * */ public class PgAcuRdcmd implements java.io.Serializable { - + /** * */ - private static final long serialVersionUID = -3187227934289186463L; + private static final long serialVersionUID = -605179003596292814L; private String id; // ID private Date tm; // 命令发送时间 @@ -25,6 +25,7 @@ private String start_mem_word; // 起始内存字地址 private String start_mem_bit; // 起始内存位地址 private Integer count_word; // 读取的字数量 + private Integer count_bit; //读取的位数量 private boolean responsed; // 是否收到响应 private boolean timeout; // 是否超时 @@ -92,6 +93,14 @@ this.count_word = count_word; } + public Integer getCount_bit() { + return count_bit; + } + + public void setCount_bit(Integer count_bit) { + this.count_bit = count_bit; + } + public boolean isResponsed() { return responsed; } diff --git a/src/com/szpg/db/data/PgCh4Alm.java b/src/com/szpg/db/data/PgCh4Alm.java new file mode 100644 index 0000000..392a567 --- /dev/null +++ b/src/com/szpg/db/data/PgCh4Alm.java @@ -0,0 +1,91 @@ +package com.szpg.db.data; + +import java.util.Date; + +import com.szpg.util.TimeFormat; + +/** + * 甲烷浓度报警状态数据表 + * + * @author admin + * + */ +public class PgCh4Alm implements java.io.Serializable { + + /** + * + */ + private static final long serialVersionUID = -109172405679187040L; + + private Integer id; + private Boolean ch4alm; + private Date logtime; + private Date uptime; + private Integer pgdeviceid; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public Boolean getCh4alm() { + return ch4alm; + } + + public void setCh4alm(Boolean ch4alm) { + this.ch4alm = ch4alm; + } + + 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 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 ""; + } + } + + public Integer getPgdeviceid() { + return pgdeviceid; + } + + public void setPgdeviceid(Integer pgdeviceid) { + this.pgdeviceid = pgdeviceid; + } + + @Override + public String toString() { + return "PgCh4[ch4=" + ch4alm + ", logtime=" + TimeFormat.formatTimestamp(logtime) + "]"; + } +} diff --git a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java index 96dc762..8422d1b 100644 --- a/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java +++ b/src/com/szpg/db/test/PgAcuRdcmdDaoTest.java @@ -2,8 +2,6 @@ import static org.junit.Assert.assertEquals; -import java.util.Calendar; - import org.junit.Before; import org.junit.Test; @@ -11,8 +9,9 @@ import com.szpg.db.dao.impl.PgAcuRdcmdDaoImpl; import com.szpg.db.data.PgAcuRdcmd; import com.szpg.plc.message.AppMessageConstants; -import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.command.ReadMemoryCommand; import com.szpg.plc.util.ByteUtil; +import com.szpg.util.Configure; public class PgAcuRdcmdDaoTest { @@ -25,38 +24,40 @@ // @Test public void testAdd() { - ReadCH4ParamCommand ch4 = new ReadCH4ParamCommand(); + ReadMemoryCommand ch4 = ReadMemoryCommand.getInstance(AppMessageConstants.CMD_TYPE_READCH4STATUS); ch4.setDestinationId("006B00"); ch4.setMessageProducerId("00F400"); - ch4.setMemoryArea((byte) 0x82); - ch4.setStartAddress("012C00"); - ch4.setCount(24); + ch4.setMemoryArea((byte) 0x31); + ch4.setStartAddress("001A00"); + ch4.setCountWord(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.CHALM.WORDCOUNT"))); + ch4.setCountBit(Integer.parseInt(Configure.getProperty("acubl", "YXL.ACU001.CHALM.BITCOUNT"))); PgAcuRdcmd cmd = new PgAcuRdcmd(); cmd.setId(ch4.getId()); - cmd.setTm(Calendar.getInstance().getTime()); - cmd.setCmd_type(AppMessageConstants.CMD_TYPE_READCH4STATUS); + cmd.setTm(ch4.getTime().getTime()); + cmd.setCmd_type(ch4.getCommandType()); cmd.setDest(ch4.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] {ch4.getMemoryArea()})); cmd.setStart_mem_word(ch4.getStartAddress().substring(0, 4)); cmd.setStart_mem_bit(ch4.getStartAddress().substring(4)); - cmd.setCount_word(ch4.getCount()); + cmd.setCount_word(ch4.getCountWord()); + cmd.setCount_bit(ch4.getCountBit()); assertEquals(1, dao.addCmdRecord(cmd)); } -// @Test + @Test public void testFindAll() { - assertEquals(1, dao.findAll()); + assertEquals(1, dao.findAll().size()); } @Test public void testFindByDestAndCount() { - assertEquals("11", dao.findLatestCmdByDestAndCount("006B00", 24).getCmd_type()); + assertEquals("12", dao.findLatestCmdByDestAndCount("006B00", 1).getCmd_type()); } - @Test +// @Test public void testUpdateResponsed() { assertEquals(1, dao.updateCmdRecordResponsed("23ff9e2987e64f248823254f0dfe1528")); } diff --git a/src/com/szpg/db/test/PgCH4DaoTest.java b/src/com/szpg/db/test/PgCH4DaoTest.java index 8c1c49f..8377965 100644 --- a/src/com/szpg/db/test/PgCH4DaoTest.java +++ b/src/com/szpg/db/test/PgCH4DaoTest.java @@ -28,12 +28,27 @@ @Test public void testFindAllParam() { - assertEquals("20180115131918", dao.findAllPblz().get(0).getTmStrGB()); + assertEquals("20180115171555", dao.findAllPblz().get(0).getTmStrGB()); } @Test public void testFindParamById() { - Assert.assertEquals(dao.findPblzById(1).getTmStrGB(), "20180115131918"); + Assert.assertEquals(dao.findPblzById(2).getTmStrGB(), "20180115171555"); + } + +// @Test + public void testAddStatusRecord() { + assertEquals(2, dao.addSbjzRecord(false, TimeFormat.formatTimestamp(Calendar.getInstance().getTime()), 1)); + } + + @Test + public void testFindAllStatus() { + assertEquals("20180115183307", dao.findAllSbjz().get(0).getTmStrGB()); + } + + @Test + public void testFindStatusById() { + Assert.assertEquals(dao.findSbjzById(1).getTmStrGB(), "20180115183307"); } } diff --git a/src/com/szpg/plc/message/command/ReadMemoryCommand.java b/src/com/szpg/plc/message/command/ReadMemoryCommand.java index 7e9c937..15ccc72 100644 --- a/src/com/szpg/plc/message/command/ReadMemoryCommand.java +++ b/src/com/szpg/plc/message/command/ReadMemoryCommand.java @@ -3,6 +3,7 @@ import com.szpg.plc.message.AppCommand; import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.command.read.ReadCH4StatusCommand; public abstract class ReadMemoryCommand extends AppCommand { @@ -13,7 +14,8 @@ private byte memoryArea; //读取的内存区域代码 private String startAddress; //起始地址 - private int count; //读取的数量,以word(2字节)计算 + private int countWord; //读取的字数量/1WORD=2BYTE + private int countBit; //读取的位数量 public byte getMemoryArea() { return memoryArea; @@ -31,21 +33,34 @@ this.startAddress = startAddress; } - public int getCount() { - return count; + public int getCountWord() { + return countWord; } - public void setCount(int count) { - this.count = count; + public void setCountWord(int countWord) { + this.countWord = countWord; } - public ReadMemoryCommand getInstance(String type) { + public int getCountBit() { + return countBit; + } + + public void setCountBit(int countBit) { + this.countBit = countBit; + } + + public static ReadMemoryCommand getInstance(String type) { switch (type) { case AppMessageConstants.CMD_TYPE_READCH4PARAM: return new ReadCH4ParamCommand(); + + case AppMessageConstants.CMD_TYPE_READCH4STATUS: + return new ReadCH4StatusCommand(); default: return null; } } + + public abstract String getCommandType(); } diff --git a/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java b/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java index 73e5395..5b573f5 100644 --- a/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java +++ b/src/com/szpg/plc/message/command/read/ReadCH4ParamCommand.java @@ -1,15 +1,16 @@ 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.ReadCH4ParamCommandResponse; public class ReadCH4ParamCommand extends ReadMemoryCommand { - + /** * */ - private static final long serialVersionUID = -8356882767656717757L; - + private static final long serialVersionUID = -4042536900405234254L; + @Override public Class getResponseClass() { return ReadCH4ParamCommandResponse.class; @@ -17,7 +18,12 @@ @Override public String toString() { - return "向终端[" + getDestinationId() + "]发送查询甲烷参数命令"; + return "向终端[" + getDestinationId() + "]发送查询甲烷监测值命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READCH4PARAM; } } diff --git a/src/com/szpg/plc/message/command/read/ReadCH4StatusCommand.java b/src/com/szpg/plc/message/command/read/ReadCH4StatusCommand.java new file mode 100644 index 0000000..790e7ff --- /dev/null +++ b/src/com/szpg/plc/message/command/read/ReadCH4StatusCommand.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.ReadCH4StatusCommandResponse; + +public class ReadCH4StatusCommand extends ReadMemoryCommand { + + /** + * + */ + private static final long serialVersionUID = 6508070196810920169L; + + @Override + public Class getResponseClass() { + return ReadCH4StatusCommandResponse.class; + } + + @Override + public String toString() { + return "向终端[" + getDestinationId() + "]发送查询甲烷报警状态命令"; + } + + @Override + public String getCommandType() { + return AppMessageConstants.CMD_TYPE_READCH4STATUS; + } + +} diff --git a/src/com/szpg/plc/message/response/read/ReadCH4StatusCommandResponse.java b/src/com/szpg/plc/message/response/read/ReadCH4StatusCommandResponse.java new file mode 100644 index 0000000..0d35015 --- /dev/null +++ b/src/com/szpg/plc/message/response/read/ReadCH4StatusCommandResponse.java @@ -0,0 +1,69 @@ +package com.szpg.plc.message.response.read; + +import java.util.ArrayList; +import java.util.List; + +import com.szpg.db.dao.PgCh4Dao; +import com.szpg.db.dao.PgDeviceDao; +import com.szpg.db.dao.impl.PgCh4DaoImpl; +import com.szpg.db.dao.impl.PgDeviceDaoImpl; +import com.szpg.plc.message.response.ReadMemoryCommandResponse; +import com.szpg.util.TimeFormat; + +public class ReadCH4StatusCommandResponse extends ReadMemoryCommandResponse { + + /** + * + */ + private static final long serialVersionUID = -4647640298404084468L; + + private List jwbj; // 甲烷浓度报警状态 + private List jwldbj; // 甲烷是否联动报警 + + public ReadCH4StatusCommandResponse() { + jwbj = new ArrayList(); + jwldbj = new ArrayList(); + } + + public List getJwbj() { + return jwbj; + } + + public void setJwbj(List jwbj) { + this.jwbj = jwbj; + } + + public List getJwldbj() { + return jwldbj; + } + + public void setJwldbj(List jwldbj) { + this.jwldbj = jwldbj; + } + + @Override + public void afterAction() { + // 1将甲烷浓度数据存入数据库 + PgCh4Dao ch4Dao = new PgCh4DaoImpl(); + PgDeviceDao deviceDao = new PgDeviceDaoImpl(); + + List ids = deviceDao.findCH4DeviceIdByDest(this.getMessageProducerId()); + + for (int i = 0; i < jwbj.size(); i++) { + if (i < ids.size()) { + ch4Dao.addSbjzRecord(jwbj.get(i), TimeFormat.formatTimestamp(this.getTime().getTime()), ids.get(i)); + + // 有报警状态 + if (jwbj.get(i) == true) { + // TODO + // 1存入报警管理表 + + + // 2发送查询报警值的命令 + + } + } + } + } + +} diff --git a/src/com/szpg/plc/protocol/DTProtocolInterface.java b/src/com/szpg/plc/protocol/DTProtocolInterface.java index 0a65694..f50a3e3 100644 --- a/src/com/szpg/plc/protocol/DTProtocolInterface.java +++ b/src/com/szpg/plc/protocol/DTProtocolInterface.java @@ -6,6 +6,13 @@ public interface DTProtocolInterface { + + /** + * 从字节流中提取符合规范的消息字节 + * @param byteMessage + * @return + */ + public List extractByteMessage(byte[] byteMessage); /** * 解析消息为应用对象 @@ -22,12 +29,5 @@ * @return */ public byte[] messageToBytes(AppMessage message); - - - /** - * 从字节流中提取符合规范的消息字节 - * @param byteMessage - * @return - */ - public List extractByteMessage(byte[] byteMessage); + } diff --git a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java index b0bb4a3..12d1c18 100644 --- a/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java +++ b/src/com/szpg/plc/protocol/fins/FINSDTProtocolImp.java @@ -14,8 +14,10 @@ import com.szpg.plc.message.UnKnownMessage; import com.szpg.plc.message.command.LinkCommand; import com.szpg.plc.message.command.read.ReadCH4ParamCommand; +import com.szpg.plc.message.command.read.ReadCH4StatusCommand; import com.szpg.plc.message.response.LinkCommandResponse; import com.szpg.plc.message.response.read.ReadCH4ParamCommandResponse; +import com.szpg.plc.message.response.read.ReadCH4StatusCommandResponse; import com.szpg.plc.protocol.DTProtocolInterface; import com.szpg.plc.protocol.fins.frame.FINSByteFrame; import com.szpg.plc.protocol.fins.frame.FINSByteFrameTool; @@ -25,6 +27,58 @@ public class FINSDTProtocolImp implements DTProtocolInterface { private final Logger logger = Logger.getLogger(this.getClass().getName()); // 输出到message + + /** + * 从重叠消息中提取规范消息 + */ + @Override + public List extractByteMessage(byte[] byteMessage) { + List bytesList = new ArrayList(); + int count = 0; + + try { + int i = 0; + while (i < byteMessage.length) { + if (byteMessage[i] == FINSByteFrame.HEADER[0] && + byteMessage[i + 1] == FINSByteFrame.HEADER[1] && + byteMessage[i + 2] == FINSByteFrame.HEADER[2] && + byteMessage[i + 3] == FINSByteFrame.HEADER[3]) { + + // 匹配上FINS帧头 + int length = ByteUtil.binToInt(new byte[]{byteMessage[i + 4], byteMessage[i + 5], byteMessage[i + 6], byteMessage[i + 7]}); + if (i + length + 8 <= byteMessage.length) { + Bytes bytes = new Bytes(); + bytes.append(byteMessage[i]).append(byteMessage[i + 1]).append(byteMessage[i + 2]).append(byteMessage[i + 3]); //FINS帧头 + bytes.append(byteMessage[i + 4]).append(byteMessage[i + 5]).append(byteMessage[i + 6]).append(byteMessage[i + 7]); //FINS长度 + + // FINS的数据区 + for (int j = 0; j < length; j++) { + bytes.append(byteMessage[i + 8 + j]); + } + + i = i + length + 8; + bytesList.add(bytes.toBytes()); + count++; + } else { + i++; + } + } else { + i++; + } + } + } catch (Exception e) { + e.printStackTrace(); + bytesList.clear(); + bytesList.add(byteMessage); + return bytesList; + } + + if (count == 0) { + bytesList.add(byteMessage); + } + + return bytesList; + } /** * 将字节数组解析为收到的消息对象 @@ -59,7 +113,7 @@ // 1首先解析出消息的PLC端地址(即响应消息的源地址)和返回的内存内容的字数 String dest = FINSByteFrameTool.getControlSour(byteMessage); //命令的目标地址即响应消息的源地址 - int count = FINSByteFrameTool.getDataWithoutEndCode(byteMessage).length; + int count = FINSByteFrameTool.getDataWithoutEndCode(byteMessage).length / 2; //1WORD=2BYTE // 2查询数据中最近的有效的读内存命令,获取其读取的参数类型 PgAcuRdcmdDao readCmdDao = new PgAcuRdcmdDaoImpl(); @@ -71,6 +125,11 @@ switch(commandType) { case AppMessageConstants.CMD_TYPE_READCH4PARAM: received = bytesToReadCH4ParamCommand(finsFrame); + break; + + case AppMessageConstants.CMD_TYPE_READCH4STATUS: + received = bytesToReadCH4StatusCommand(finsFrame, readCmd.getCount_bit()); + break; } // 4将有效的命令的是否有响应字段置1 @@ -260,6 +319,7 @@ return received; } + /** * 将握手响应字节数组转换为消息对象 * @@ -315,6 +375,35 @@ return rcpcr; } + + + /** + * 将查询甲烷报警状态响应消息字节数组转换为消息对象 + * + * @param byteMessage + * @return + */ + private AppMessage bytesToReadCH4StatusCommand(FINSByteFrame finsFrame, int countBit) { + ReadCH4StatusCommandResponse rcscr = new ReadCH4StatusCommandResponse(); + + byte[] body = finsFrame.TEXT_DATA_BODY; + rcscr.setMessageProducerId(FINSByteFrameTool.getControlDest(finsFrame)); + if (body[2] == 0x00 && body[3] == 0x00) { + // 正常返回 + byte[] data = FINSByteFrameTool.getDataWithoutEndCode(finsFrame); //获取返回的内存 + int chct = countBit / 2; //甲烷监测点的数量/每个甲烷点位的参数包括2个变量、每个变量占1个位 + String dataStr = ByteUtil.binToBinString(new byte[] { data[0], data[1] }); //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); + + rcscr.getJwbj().add(bjBit == '1' ? true : false); + rcscr.getJwldbj().add(ldBit == '1' ? true : false); + } + } + + return rcscr; + } // // /** // * 将查询终端地址响应消息字节数组解析为消息对象AFN=50H @@ -3421,6 +3510,8 @@ // 读取甲烷参数内存命令 if (message instanceof ReadCH4ParamCommand) { frame = ReadCH4ParamCommandToBytes((ReadCH4ParamCommand) message); + } else if (message instanceof ReadCH4StatusCommand) { + frame = ReadCH4StatusCommandToBytes((ReadCH4StatusCommand) message); } // // 读内存命令 @@ -3449,7 +3540,7 @@ } /** - * 将读取甲烷参数内存命令转换为字节数组 + * 将读取甲烷监测值命令转换为字节数组 * @param read * @return */ @@ -3460,62 +3551,28 @@ read.getMessageProducerId(), read.getMemoryArea(), start, - read.getCount()); + read.getCountWord()); return finsFrame.toBytes(); } /** - * 从重叠消息中提取规范消息 + * 将读取甲烷报警状态命令转换为字节数组 + * @param message + * @return */ - @Override - public List extractByteMessage(byte[] byteMessage) { - List bytesList = new ArrayList(); - int count = 0; + private byte[] ReadCH4StatusCommandToBytes(ReadCH4StatusCommand message) { + byte[] start = ByteUtil.hexStringToBytes(message.getStartAddress(), 3); - try { - int i = 0; - while (i < byteMessage.length) { - if (byteMessage[i] == FINSByteFrame.HEADER[0] && - byteMessage[i + 1] == FINSByteFrame.HEADER[1] && - byteMessage[i + 2] == FINSByteFrame.HEADER[2] && - byteMessage[i + 3] == FINSByteFrame.HEADER[3]) { - - // 匹配上FINS帧头 - int length = ByteUtil.binToInt(new byte[]{byteMessage[i + 4], byteMessage[i + 5], byteMessage[i + 6], byteMessage[i + 7]}); - if (i + length + 8 <= byteMessage.length) { - Bytes bytes = new Bytes(); - bytes.append(byteMessage[i]).append(byteMessage[i + 1]).append(byteMessage[i + 2]).append(byteMessage[i + 3]); //FINS帧头 - bytes.append(byteMessage[i + 4]).append(byteMessage[i + 5]).append(byteMessage[i + 6]).append(byteMessage[i + 7]); //FINS长度 - - // FINS的数据区 - for (int j = 0; j < length; j++) { - bytes.append(byteMessage[i + 8 + j]); - } - - i = i + length + 8; - bytesList.add(bytes.toBytes()); - count++; - } else { - i++; - } - } else { - i++; - } - } - } catch (Exception e) { - e.printStackTrace(); - bytesList.clear(); - bytesList.add(byteMessage); - return bytesList; - } - - if (count == 0) { - bytesList.add(byteMessage); - } - - return bytesList; + FINSByteFrame finsFrame = new FINSByteFrame(message.getDestinationId(), + message.getMessageProducerId(), + message.getMemoryArea(), + start, + message.getCountWord()); + + return finsFrame.toBytes(); } + // /** // * 将退出登录命令对象转换为字节数组AFN=02H diff --git a/src/com/szpg/plc/server/ACUClientUtil.java b/src/com/szpg/plc/server/ACUClientUtil.java index f3f8f0e..576cb3f 100644 --- a/src/com/szpg/plc/server/ACUClientUtil.java +++ b/src/com/szpg/plc/server/ACUClientUtil.java @@ -84,8 +84,6 @@ public void sendACUCommand(ACUClient client, byte[] content) { // 判断channel并发送消息 if (null != client.getChannel() && client.getChannel().isActive() == true) { -// pool.pushMessage(content); - // 通过socket发送消息并记录日志 ACUClientUtil.send.info(ByteUtil.binToHexString(content)); diff --git a/src/com/szpg/task/ReadCH4ParamTask.java b/src/com/szpg/task/ReadCH4ParamTask.java index b4276ec..3570a07 100644 --- a/src/com/szpg/task/ReadCH4ParamTask.java +++ b/src/com/szpg/task/ReadCH4ParamTask.java @@ -3,7 +3,6 @@ import com.szpg.db.dao.impl.PgAcuRdcmdDaoImpl; import com.szpg.db.data.PgAcuRdcmd; import com.szpg.plc.message.AppCommand; -import com.szpg.plc.message.AppMessageConstants; import com.szpg.plc.message.command.read.ReadCH4ParamCommand; import com.szpg.plc.protocol.DTProtocolInterface; import com.szpg.plc.protocol.ProtocolFactory; @@ -25,7 +24,7 @@ public void run() { DTProtocolInterface finspi = ProtocolFactory.getDefaultDTProtocol(); byte[] content = finspi.messageToBytes(appCommand); - + // 发送读取甲烷参数内存命令 ACUClientUtil.getInstance().sendACUCommand(client, content); @@ -35,12 +34,13 @@ PgAcuRdcmd cmd = new PgAcuRdcmd(); cmd.setId(ch4Cmd.getId()); cmd.setTm(ch4Cmd.getTime().getTime()); - cmd.setCmd_type(AppMessageConstants.CMD_TYPE_READCH4PARAM); + cmd.setCmd_type(ch4Cmd.getCommandType()); cmd.setDest(ch4Cmd.getDestinationId()); cmd.setMem_area_cd(ByteUtil.binToHexString(new byte[] { ch4Cmd.getMemoryArea() })); cmd.setStart_mem_word(ch4Cmd.getStartAddress().substring(0, 4)); cmd.setStart_mem_bit(ch4Cmd.getStartAddress().substring(4)); - cmd.setCount_word(ch4Cmd.getCount()); + cmd.setCount_word(ch4Cmd.getCountWord()); + cmd.setCount_bit(ch4Cmd.getCountBit()); new PgAcuRdcmdDaoImpl().addCmdRecord(cmd); } diff --git a/src/com/szpg/task/ReadCH4StatusTask.java b/src/com/szpg/task/ReadCH4StatusTask.java new file mode 100644 index 0000000..196d7e3 --- /dev/null +++ b/src/com/szpg/task/ReadCH4StatusTask.java @@ -0,0 +1,48 @@ +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.ReadCH4StatusCommand; +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 ReadCH4StatusTask implements Runnable { + + private ACUClient client; + private AppCommand appCommand; + + public ReadCH4StatusTask(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); + + ReadCH4StatusCommand ch4AlmCmd = (ReadCH4StatusCommand) appCommand; + + // 发送完成之后将命令保存在数据库中 + 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() })); + cmd.setStart_mem_word(ch4AlmCmd.getStartAddress().substring(0, 4)); + cmd.setStart_mem_bit(ch4AlmCmd.getStartAddress().substring(4)); + cmd.setCount_word(ch4AlmCmd.getCountWord()); + cmd.setCount_bit(ch4AlmCmd.getCountBit()); + + new PgAcuRdcmdDaoImpl().addCmdRecord(cmd); + } + +}